Простой запрос и ошибка в чтении значения |
Я |
09.06.15 — 01:07
Всем привет! Помогите, пожалуйста, справится с запросом — в консоли запросов всё работает идеально, а на практике выдает ошибку в чтении значения я хз почему:
Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ
| Сотрудники.ДатаРождения КАК ДатаРождения
|ИЗ
| Справочник.Сотрудники КАК Сотрудники
|ГДЕ
| Сотрудники.Наименование = &ФИО»;
Запрос.УстановитьПараметр(«ФИО», ФИО);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
ВыборкаДетальныеЗаписи.Следующий();
ДатаРождения = ВыборкаДетальныеЗаписи.ДатаРождения;
Как я понял, проблема в позиционировании выборки на значении? Как же спозиционировать-то иначе?
1 — 09.06.15 — 01:10
забыл скачать — в 8.3 работаю
2 — 09.06.15 — 01:11
(0)Что у тебя в параметре ФИО?
3 — 09.06.15 — 01:13
в ФИО - Иванов я точку останова поставил - в ФИО точно нормально всё читает
4 — 09.06.15 — 01:14
пока ВыборкаДетальныеЗаписи.Следующий() цикл
здесь песню поешь
конецЦикла.
и не будет ошибки..
5 — 09.06.15 — 01:15
(3)Запрос.УстановитьПараметр(«ФИО», СокрЛП(ФИО));
6 — 09.06.15 — 01:16
у меня одно значение, не нужен цикл. Впрочем, поставил — ноль на массу. Не работает всё равно
7 — 09.06.15 — 01:17
в ФИО сейчас забил не Иванов, а цифру «1» — не работает хоть как ты СокрЛП или не сокр
8 — 09.06.15 — 01:19
(7)Так может нет такого сотрудника с наименованием «1» в базе?
9 — 09.06.15 — 01:19
Сергиус, есть… в консоли же всё верно выводит
10 — 09.06.15 — 01:22
ВыборкаДетальныеЗаписи.Количество() что говорит?
11 — 09.06.15 — 01:24
неопределено
12 — 09.06.15 — 01:29
Сохрани все в обработку, и выложи куда ть.
13 — 09.06.15 — 01:29
или можно по ТимВьюверу)
14 — 09.06.15 — 01:34
(6) сообщение об ошибке есть?.. если да, то текст сюда.
15 — 09.06.15 — 01:36
ошибки нет, просто не дает разницу дат вычислить т.к. дату рождения не может выцепить
16 — 09.06.15 — 01:39
а ФИО как устанавливается?? можно сюда текст??
17 — 09.06.15 — 01:42
в консоли небось параметры автоматически определяешь.. и выбор значения делаешь по кнопке выбора..
18 — 09.06.15 — 01:43
в форме документа делаю:
&НаСервере
Функция ДатаРождения (ФИО)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Сотрудники.ДатаРождения КАК ДатаРождения
|ИЗ
| Справочник.Сотрудники КАК Сотрудники
|ГДЕ
| Сотрудники.Наименование = &ФИО";
Запрос.УстановитьПараметр("ФИО", ФИО);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
ВыборкаДетальныеЗаписи.Следующий();
ДатаРождения = ВыборкаДетальныеЗаписи.ДатаРождения;
Возврат ДатаРождения;
КонецФункции
&НаКлиенте
Процедура ФИОФИОПриИзменении(Элемент)
СтрокаТабличнойЧасти = Элементы.ФИО.ТекущиеДанные;
ДатаРождения = ДатаРождения(СтрокаТабличнойЧасти.ФИО);
ДатаДокумента = Объект.Дата;
Возраст = ДатаДокумента - ДатаРождения;
СтрокаТабличнойЧасти.Возраст = Возраст;
КонецПроцедуры
19 — 09.06.15 — 01:46
смотри что тут » ДатаРождения = ДатаРождения(СтрокаТабличнойЧасти.ФИО);»
20 — 09.06.15 — 01:50
не понял что там?
21 — 09.06.15 — 01:50
(18) ДатаДокумента и ДатаРождения это дата в секундах или что?
22 — 09.06.15 — 01:52
да плевать пока, в секундах наверняка )) у меня запрос не получается — вот что хреново
23 — 09.06.15 — 01:53
(20) тип значения.
24 — 09.06.15 — 01:55
France, объясни, пожалуйста, как для тупого )) ФИО передается в запрос — я это вижу, когда ставлю точку останова
25 — 09.06.15 — 01:59
(24) да, ты видишь фио, но не обязательно что это строка. а в запросе ты со строкой сравниваешь. в отладчике тип значения виден..
26 — 09.06.15 — 02:09
France, ФИО из формы передается как ссылка (тип СправочникСсылка.Сотрудники) чета я не соображаю в чем проблема
27 — 09.06.15 — 02:11
(26) Проблема в том, что в консоли у тебя ФИО строка, а сейчас у ФИО какой тип? посмотри в отладчике, правой тапкой по ФИО во время отладки «Вычислить выражение».
28 — 09.06.15 — 02:14
СправочникСсылка.Сотрудники (27) (26) ДатаРождения = ДатаРождения(СтрокаТабличнойЧасти.ФИО.наименование);»
29 — 09.06.15 — 02:14
в консоли он как раз устанавливал правильное значение, а не строку, так как в консоли 1С-на сама тип определяет..
30 — 09.06.15 — 02:16
всё заработала, спасибо огромное!!
Дейсвительно из-за типа ФИО. Поставил:
31 — 09.06.15 — 02:17
ДатаРождения = ДатаРождения(Строка(СтрокаТабличнойЧасти.ФИО)); и всё заработало
32 — 09.06.15 — 02:24
(31) в другом месте такое преобразование боком вылезти может))
33 — 09.06.15 — 02:37
почему7
34 — 09.06.15 — 02:37
как по-другому сделать, чтобы всё было правильно и работало?
35 — 09.06.15 — 02:39
(33) у спр сотрудники представление «наименование». если бы был код — твой вариант не сработал бы (хотя, представление код вроде и не часто используется). нужно было явно указать ФИО.Наименование, либо в запросе делать фильтр на ссылку, а не на наименование..
36 — 09.06.15 — 06:51
Раньше было «модно» искать через НайтиПоНаименованию(), сейчас это делают через Запросы. Может пора разобраться что такое Ссылка и Объект, и как с ними работать?
37 — 09.06.15 — 07:11
(34) ну, по-нормальному. Выбирать сотрудника из справочника, а не писать вручную фамилию.
38 — 09.06.15 — 07:31
(37) может это особенность нетленки ТС — заполнять ТЧ вручную, хз правда зачем
39 — 09.06.15 — 07:47
У тебя уже ссылка на справочник имеется. Зачем писать целую функцию для получения даты рождения, да еще и с запросом к этому же справочнику?
Не проще ли
ДатаРождения = СтрокаТабличнойЧасти.ФИО.ДатаРождения;
40 — 09.06.15 — 08:47
Выборка и пустой может быть.
Если ВыборкаДетальныеЗаписи.Следующий()= Истина Тогда ДатаРождения = ВыборкаДетальныеЗаписи.ДатаРождения; КонецЕсли;
41 — 09.06.15 — 08:50
"Если ВыборкаДетальныеЗаписи.Следующий()= Истина Тогда " три года. Без конфискации.
42 — 09.06.15 — 09:18
что Пока ВыборкаДетальныеЗаписи.Следующий() Цикл Что если ВыборкаДетальныеЗаписи.Следующий() Цикл
если запрос надо позиционировать на первой записи, как в этом случае, так что я амнистирован.
43 — 09.06.15 — 09:21
его запрос изначально предназначен вернуть одну запись, городить из него цикл нет ни какого смысла.
Ну а теперь расскажи за что в этом случае меня надо на 3 года?
Чем конструкция Пока Выборка.Следующий() Цикл отличается от Если Выборка.Следующий() Тогда
Krolik Bezobraznik
44 — 09.06.15 — 09:29
Чудес не бывает.
Перемудрил с типами значений передаваемых параметров.
Ваш запрос ничего не возвращает. Далее у вас стоит процедура получения значения строки. Строк у вас нет, а вы упорно даете указание чтобы вернуть значение. Тут и проблема. ИМХО.
Используйте конструкцию с циклом. Она более корректная. Если переживаете, что ваш запрос вернет более одной строки, то возвращайте в запросе ПЕРВЫЕ 1. Если результат запроса будет пустым, то ошибок не будет и вы отладчиком увидите, если проблемы будут.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 |
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | дфГосЗаказОбороты.Держатель КАК Держатель, | дфГосЗаказОбороты.ПостащикЛома КАК ПостащикЛома, | дфГосЗаказОбороты.ВидКонтракта КАК ВидКонтракта, | дфГосЗаказОбороты.Статус КАК Статус, | ВложенныйЗапрос.Контрагент КАК Контрагент, | дфГосЗаказОбороты.ЯнварьОборот КАК Январь, | дфГосЗаказОбороты.ФевральОборот КАК Февраль, | дфГосЗаказОбороты.МартОборот КАК Март, | дфГосЗаказОбороты.АпрельОборот КАК Апрель, | дфГосЗаказОбороты.МайОборот КАК Май, | дфГосЗаказОбороты.ИюньОборот КАК Июнь, | дфГосЗаказОбороты.ИюльОборот КАК Июль, | дфГосЗаказОбороты.АвгустОборот КАК Август, | дфГосЗаказОбороты.СентябрьОборот КАК Сентябрь, | дфГосЗаказОбороты.ОктябрьОборот КАК Октябрь, | дфГосЗаказОбороты.НоябрьОборот КАК Ноябрь, | дфГосЗаказОбороты.ДекабрьОборот КАК Декабрь |ИЗ | (ВЫБРАТЬ | ххх_МеталлоломОбороты.Контрагент КАК Контрагент, | ххх_МеталлоломОбороты.ЧистыйВесОборот КАК ЧистыйВесОборот, | ххх_МеталлоломОбороты.Держатель КАК Держатель | ИЗ | РегистрНакопления.ххх_Металлолом.Обороты КАК ххх_МеталлоломОбороты) КАК ВложенныйЗапрос | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.дфГосЗаказ.Обороты КАК дфГосЗаказОбороты | ПО дфГосЗаказОбороты.ПостащикЛома.Наименование = ВложенныйЗапрос.Контрагент.Наименование |ГДЕ | дфГосЗаказОбороты.Статус <> &Статус | И дфГосЗаказОбороты.ВидКонтракта = &ВидКонтракта | И дфГосЗаказОбороты.ПостащикЛома <> дфГосЗаказОбороты.Держатель | И ВложенныйЗапрос.Держатель = &Держатель"; Запрос.УстановитьПараметр("Статус", Перечисления.дфСтатусыГосЗаказа.Расторгнут); Запрос.УстановитьПараметр("ВидКонтракта", Перечисления.дфВидыКонтрактов.Госзаказ); Запрос.УстановитьПараметр("Держатель", Отчет.Организация); //Запрос.УстановитьПараметр("ДатаНачалаПериода", НачалоГода(Отчет.Дата)); //Запрос.УстановитьПараметр("ДатаОкончанияПериода", КонецГода(Отчет.Дата)); //Запрос.УстановитьПараметр("ВыбраннаяОрганизация", Отчет.Организация); РезультатЗапроса = Запрос.Выполнить(); Выгрузка = РезультатЗапроса.Выгрузить(); ВыборкаДетальныеЗаписиОсновнаяЧасть = РезультатЗапроса.Выбрать(); Пока ВыборкаДетальныеЗаписиОсновнаяЧасть.Следующий() Цикл //заполняем остальную таблицу, где Держатель != ПоставщикЛома ОбластьОсновного.Параметры.Заполнить(ВыборкаДетальныеЗаписиОсновнаяЧасть); Если Не ТабличныйДокумент.ПроверитьВывод(ОбластьОсновного) Тогда ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц(); НомерЛиста = НомерЛиста + 1; ОбластьШапки.Параметры.НомерЛиста = НомерЛиста; ТабличныйДокумент.Вывести(ОбластьОсновного); КонецЕсли; ТабличныйДокумент.Вывести(ОбластьОсновного); ОбластьОсновного.Параметры.УНП = ВыборкаДетальныеЗаписиОсновнаяЧасть.Контрагент.ИНН; ОбластьОсновного.Параметры.НаименованиеОрганизации = ВыборкаДетальныеЗаписиОсновнаяЧасть.ПостащикЛома.Наименование; МесяцЧисло = Месяц(Отчет.Дата); //Получаем число месяца из переменной КонецМесяца Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | СУММА(ххх_МеталлоломОбороты.ЧистыйВесОборот) КАК СуммаЧистыйВесЗаМесяц |ИЗ | РегистрНакопления.ххх_Металлолом.Обороты(&НачалоМесяца, &КонецМесяца, Месяц, ) КАК ххх_МеталлоломОбороты |ГДЕ | ххх_МеталлоломОбороты.Период МЕЖДУ &НачалоМесяца И &КонецМесяца | И ххх_МеталлоломОбороты.Партнер = &Партнер"; Запрос.УстановитьПараметр("НачалоМесяца", НачалоМесяца(Отчет.Дата)); Запрос.УстановитьПараметр("КонецМесяца", КонецМесяца(Отчет.Дата)); Запрос.УстановитьПараметр("Партнер", Отчет.Организация); РезультатЗапроса = Запрос.Выполнить(); ВыборкаПоМесяцу = РезультатЗапроса.Выбрать(); Пока ВыборкаПоМесяцу.Следующий() Цикл Если МесяцЧисло = 1 Тогда // определяем число Месяца и считаем план за месяц ОбластьОсновного.Параметры.ПланМесяц = ВыборкаДетальныеЗаписиОсновнаяЧасть.Январь; ОбластьОсновного.Параметры.ФактМесяц = ВыборкаПоМесяцу.СуммаЧистыйВесЗаМесяц; ИначеЕсли МесяцЧисло = 2 Тогда ОбластьОсновного.Параметры.ПланМесяц = ВыборкаДетальныеЗаписиОсновнаяЧасть.Февраль; ОбластьОсновного.Параметры.ФактМесяц = ВыборкаПоМесяцу.СуммаЧистыйВесЗаМесяц; ИначеЕсли МесяцЧисло = 3 Тогда ОбластьОсновного.Параметры.ПланМесяц = ВыборкаДетальныеЗаписиОсновнаяЧасть.Март; ОбластьОсновного.Параметры.ФактМесяц = ВыборкаПоМесяцу.СуммаЧистыйВесЗаМесяц; ИначеЕсли МесяцЧисло = 4 Тогда ОбластьОсновного.Параметры.ПланМесяц = ВыборкаДетальныеЗаписиОсновнаяЧасть.Апрель; ОбластьОсновного.Параметры.ФактМесяц = ВыборкаПоМесяцу.СуммаЧистыйВесЗаМесяц; ИначеЕсли МесяцЧисло = 5 Тогда ОбластьОсновного.Параметры.ПланМесяц = ВыборкаДетальныеЗаписиОсновнаяЧасть.Май; ОбластьОсновного.Параметры.ФактМесяц = ВыборкаПоМесяцу.СуммаЧистыйВесЗаМесяц; ИначеЕсли МесяцЧисло = 6 Тогда ОбластьОсновного.Параметры.ПланМесяц = ВыборкаДетальныеЗаписиОсновнаяЧасть.Июнь; ОбластьОсновного.Параметры.ФактМесяц = ВыборкаПоМесяцу.СуммаЧистыйВесЗаМесяц; ИначеЕсли МесяцЧисло = 7 Тогда ОбластьОсновного.Параметры.ПланМесяц = ВыборкаДетальныеЗаписиОсновнаяЧасть.Июль; ОбластьОсновного.Параметры.ФактМесяц = ВыборкаПоМесяцу.СуммаЧистыйВесЗаМесяц; ИначеЕсли МесяцЧисло = 8 Тогда ОбластьОсновного.Параметры.ПланМесяц = ВыборкаДетальныеЗаписиОсновнаяЧасть.Август; ОбластьОсновного.Параметры.ФактМесяц = ВыборкаПоМесяцу.СуммаЧистыйВесЗаМесяц;; ИначеЕсли МесяцЧисло = 9 Тогда ОбластьОсновного.Параметры.ПланМесяц = ВыборкаДетальныеЗаписиОсновнаяЧасть.Сентябрь; ОбластьОсновного.Параметры.ФактМесяц = ВыборкаПоМесяцу.СуммаЧистыйВесЗаМесяц; ИначеЕсли МесяцЧисло = 10 Тогда ОбластьОсновного.Параметры.ПланМесяц = ВыборкаДетальныеЗаписиОсновнаяЧасть.Октябрь; ОбластьОсновного.Параметры.ФактМесяц = ВыборкаПоМесяцу.СуммаЧистыйВесЗаМесяц; ИначеЕсли МесяцЧисло = 11 Тогда ОбластьОсновного.Параметры.ПланМесяц = ВыборкаДетальныеЗаписиОсновнаяЧасть.Ноябрь; ОбластьОсновного.Параметры.ФактМесяц = ВыборкаПоМесяцу.СуммаЧистыйВесЗаМесяц; ИначеЕсли МесяцЧисло = 12 Тогда ОбластьОсновного.Параметры.ПланМесяц = ВыборкаДетальныеЗаписиОсновнаяЧасть.Декабрь; ОбластьОсновного.Параметры.ФактМесяц = ВыборкаПоМесяцу.СуммаЧистыйВесЗаМесяц; КонецЕсли; ОбластьОсновного.Параметры.ФактМесяц = Формат(ОбластьОсновного.Параметры.ФактМесяц,"ЧДЦ=3"); КонецЦикла; //проверка на пустоту плана за месяц Если НЕ ПустаяСтрока(ОбластьОсновного.Параметры.ПланМесяц) Тогда СуммаПланМесяц = СуммаПланМесяц + ОбластьОсновного.Параметры.ПланМесяц; Иначе СуммаПланМесяц = СуммаПланМесяц + 0; КонецЕсли; //проверка на пустоту факта за месяц Если НЕ ПустаяСтрока(ОбластьОсновного.Параметры.ФактМесяц) Тогда СуммаФактМесяц = СуммаФактМесяц + ОбластьОсновного.Параметры.ФактМесяц; Иначе СуммаФактМесяц = СуммаФактМесяц + 0; КонецЕсли; // подсчёт процента за Месяц и проверка на пустоту Плана и Факта Если НЕ ПустаяСтрока(ОбластьОсновного.Параметры.ПланМесяц) И НЕ ПустаяСтрока(ОбластьОсновного.Параметры.ФактМесяц) Тогда ПроцентЗаМесяц = ОбластьОсновного.Параметры.ФактМесяц/ОбластьОсновного.Параметры.ПланМесяц*100; ОбластьОсновного.Параметры.ПроцентМесяц = Формат(ПроцентЗаМесяц,"ЧДЦ=2"); Иначе ОбластьОсновного.Параметры.ПроцентМесяц = " "; КонецЕсли; //считаем план за квартал Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | СУММА(ххх_МеталлоломОбороты.ЧистыйВесОборот) КАК СуммаЧистыйВесЗаКвартал |ИЗ | РегистрНакопления.ххх_Металлолом.Обороты(&НачалоКвартала, &КонецКвартала, Квартал, ) КАК ххх_МеталлоломОбороты |ГДЕ | ххх_МеталлоломОбороты.Период МЕЖДУ &НачалоКвартала И &КонецКвартала | И ххх_МеталлоломОбороты.Партнер = &Партнер"; Запрос.УстановитьПараметр("НачалоКвартала", НачалоКвартала(Отчет.Дата)); Запрос.УстановитьПараметр("КонецКвартала", КонецКвартала(Отчет.Дата)); Запрос.УстановитьПараметр("Партнер", Отчет.Организация); РезультатЗапроса = Запрос.Выполнить(); ВыборкаПоКварталу = РезультатЗапроса.Выбрать(); Пока ВыборкаПоКварталу.Следующий() Цикл //Определяем число месяца и считаем План за Квартал Если МесяцЧисло = 1 ИЛИ МесяцЧисло = 2 ИЛИ МесяцЧисло = 3 Тогда ОбластьОсновного.Параметры.ПланКвартал = ВыборкаДетальныеЗаписиОсновнаяЧасть.Январь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Февраль + ВыборкаДетальныеЗаписиОсновнаяЧасть.Март; ОбластьОсновного.Параметры.ФактКвартал = ВыборкаПоКварталу.СуммаЧистыйВесЗаКвартал; ИначеЕсли МесяцЧисло = 4 ИЛИ МесяцЧисло = 5 ИЛИ МесяцЧисло = 6 Тогда ОбластьОсновного.Параметры.ПланКвартал = ВыборкаДетальныеЗаписиОсновнаяЧасть.Апрель + ВыборкаДетальныеЗаписиОсновнаяЧасть.Май + ВыборкаДетальныеЗаписиОсновнаяЧасть.Июнь; ОбластьОсновного.Параметры.ФактКвартал = ВыборкаПоКварталу.СуммаЧистыйВесЗаКвартал; ИначеЕсли МесяцЧисло = 7 ИЛИ МесяцЧисло = 8 ИЛИ МесяцЧисло = 9 Тогда ОбластьОсновного.Параметры.ПланКвартал = ВыборкаДетальныеЗаписиОсновнаяЧасть.Июль + ВыборкаДетальныеЗаписиОсновнаяЧасть.Август + ВыборкаДетальныеЗаписиОсновнаяЧасть.Сентябрь; ОбластьОсновного.Параметры.ФактКвартал = ВыборкаПоКварталу.СуммаЧистыйВесЗаКвартал; ИначеЕсли МесяцЧисло = 10 ИЛИ МесяцЧисло = 11 ИЛИ МесяцЧисло = 12 Тогда ОбластьОсновного.Параметры.ПланКвартал = ВыборкаДетальныеЗаписиОсновнаяЧасть.Октябрь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Ноябрь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Декабрь; ОбластьОсновного.Параметры.ФактКвартал = ВыборкаПоКварталу.СуммаЧистыйВесЗаКвартал; КонецЕсли; ОбластьОсновного.Параметры.ФактКвартал = Формат(ОбластьОсновного.Параметры.ФактКвартал,"ЧДЦ=3"); КонецЦикла; //проверка на пустоту плана за квартал Если НЕ ПустаяСтрока(ОбластьОсновного.Параметры.ПланКвартал) Тогда СуммаПланКвартал = СуммаПланКвартал + ОбластьОсновного.Параметры.ПланКвартал; Иначе СуммаПланКвартал = СуммаПланКвартал + 0; КонецЕсли; //проверка на пустоту факта за квартал Если НЕ ПустаяСтрока(ОбластьОсновного.Параметры.ФактКвартал) Тогда СуммаФактКвартал = СуммаФактКвартал + ОбластьОсновного.Параметры.ФактКвартал; Иначе СуммаФактКвартал = СуммаФактКвартал + 0; КонецЕсли; // подсчёт процента за Квартал и проверка на пустоту Плана и Факта Если НЕ ПустаяСтрока(ОбластьОсновного.Параметры.ПланКвартал) И НЕ ПустаяСтрока(ОбластьОсновного.Параметры.ФактКвартал) Тогда ПроцентЗаКвартал = ОбластьОсновного.Параметры.ФактКвартал/ОбластьОсновного.Параметры.ПланКвартал*100; ОбластьОсновного.Параметры.ПроцентКвартал = Формат(ПроцентЗаКвартал,"ЧДЦ=2"); Иначе ОбластьОсновного.Параметры.ПроцентКвартал = " "; КонецЕсли; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | СУММА(ххх_МеталлоломОбороты.ЧистыйВесОборот) КАК СуммаЧистыйВесЗаГод |ИЗ | РегистрНакопления.ххх_Металлолом.Обороты(&НачалоГода, &КонецВыбранногоМесяца, Год, ) КАК ххх_МеталлоломОбороты |ГДЕ | ххх_МеталлоломОбороты.Период МЕЖДУ &НачалоГода И &КонецВыбранногоМесяца | И ххх_МеталлоломОбороты.Партнер = &Партнер"; Запрос.УстановитьПараметр("КонецВыбранногоМесяца", КонецМесяца(Отчет.Дата)); Запрос.УстановитьПараметр("НачалоГода", НачалоГода(Отчет.Дата)); Запрос.УстановитьПараметр("Партнер", Отчет.Организация); РезультатЗапроса = Запрос.Выполнить(); ВыборкаФактЗаГод = РезультатЗапроса.Выбрать(); Пока ВыборкаФактЗаГод.Следующий() Цикл //Определяем число месяца и считаем План за Год Если МесяцЧисло=1 Тогда ОбластьОсновного.Параметры.ПланГод = ВыборкаДетальныеЗаписиОсновнаяЧасть.Январь; ОбластьОсновного.Параметры.ФактГод = ВыборкаФактЗаГод.СуммаЧистыйВесЗаГод; ИначеЕсли МесяцЧисло = 2 Тогда ОбластьОсновного.Параметры.ПланГод = ВыборкаДетальныеЗаписиОсновнаяЧасть.Январь + ВыборкаДетальныеЗаписи.Февраль; ОбластьОсновного.Параметры.ФактГод = ВыборкаФактЗаГод.СуммаЧистыйВесЗаГод; ИначеЕсли МесяцЧисло = 3 Тогда ОбластьОсновного.Параметры.ПланГод = ВыборкаДетальныеЗаписиОсновнаяЧасть.Январь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Февраль + ВыборкаДетальныеЗаписиОсновнаяЧасть.Март; ОбластьОсновного.Параметры.ФактГод = ВыборкаФактЗаГод.СуммаЧистыйВесЗаГод; ИначеЕсли МесяцЧисло = 4 Тогда ОбластьОсновного.Параметры.ПланГод = ВыборкаДетальныеЗаписиОсновнаяЧасть.Январь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Февраль + ВыборкаДетальныеЗаписиОсновнаяЧасть.Март + ВыборкаДетальныеЗаписиОсновнаяЧасть.Апрель; ОбластьОсновного.Параметры.ФактГод = ВыборкаФактЗаГод.СуммаЧистыйВесЗаГод; ИначеЕсли МесяцЧисло = 5 Тогда ОбластьОсновного.Параметры.ПланГод = ВыборкаДетальныеЗаписиОсновнаяЧасть.Январь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Февраль + ВыборкаДетальныеЗаписиОсновнаяЧасть.Март + ВыборкаДетальныеЗаписиОсновнаяЧасть.Апрель + ВыборкаДетальныеЗаписиОсновнаяЧасть.Май; ОбластьОсновного.Параметры.ФактГод = ВыборкаФактЗаГод.СуммаЧистыйВесЗаГод; ИначеЕсли МесяцЧисло = 6 Тогда ОбластьОсновного.Параметры.ПланГод = ВыборкаДетальныеЗаписиОсновнаяЧасть.Январь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Февраль + ВыборкаДетальныеЗаписиОсновнаяЧасть.Март + ВыборкаДетальныеЗаписиОсновнаяЧасть.Апрель + ВыборкаДетальныеЗаписиОсновнаяЧасть.Май + ВыборкаДетальныеЗаписиОсновнаяЧасть.Июнь; ОбластьОсновного.Параметры.ФактГод = ВыборкаФактЗаГод.СуммаЧистыйВесЗаГод; ИначеЕсли МесяцЧисло = 7 Тогда ОбластьОсновного.Параметры.ПланГод = ВыборкаДетальныеЗаписиОсновнаяЧасть.Январь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Февраль + ВыборкаДетальныеЗаписиОсновнаяЧасть.Март + ВыборкаДетальныеЗаписиОсновнаяЧасть.Апрель + ВыборкаДетальныеЗаписиОсновнаяЧасть.Май + ВыборкаДетальныеЗаписиОсновнаяЧасть.Июнь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Июль; ОбластьОсновного.Параметры.ФактГод = ВыборкаФактЗаГод.СуммаЧистыйВесЗаГод; ИначеЕсли МесяцЧисло = 8 Тогда ОбластьОсновного.Параметры.ПланГод = ВыборкаДетальныеЗаписиОсновнаяЧасть.Январь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Февраль + ВыборкаДетальныеЗаписиОсновнаяЧасть.Март + ВыборкаДетальныеЗаписиОсновнаяЧасть.Апрель + ВыборкаДетальныеЗаписиОсновнаяЧасть.Май + ВыборкаДетальныеЗаписиОсновнаяЧасть.Июнь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Июль + ВыборкаДетальныеЗаписиОсновнаяЧасть.Август; ОбластьОсновного.Параметры.ФактГод = ВыборкаФактЗаГод.СуммаЧистыйВесЗаГод; ИначеЕсли МесяцЧисло = 9 Тогда ОбластьОсновного.Параметры.ПланГод = ВыборкаДетальныеЗаписиОсновнаяЧасть.Январь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Февраль + ВыборкаДетальныеЗаписиОсновнаяЧасть.Март + ВыборкаДетальныеЗаписиОсновнаяЧасть.Апрель + ВыборкаДетальныеЗаписиОсновнаяЧасть.Май + ВыборкаДетальныеЗаписиОсновнаяЧасть.Июнь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Июль + ВыборкаДетальныеЗаписиОсновнаяЧасть.Август + ВыборкаДетальныеЗаписиОсновнаяЧасть.Сентябрь; ОбластьОсновного.Параметры.ФактГод = ВыборкаФактЗаГод.СуммаЧистыйВесЗаГод; ИначеЕсли МесяцЧисло = 10 Тогда ОбластьОсновного.Параметры.ПланГод = ВыборкаДетальныеЗаписиОсновнаяЧасть.Январь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Февраль + ВыборкаДетальныеЗаписиОсновнаяЧасть.Март + ВыборкаДетальныеЗаписиОсновнаяЧасть.Апрель + ВыборкаДетальныеЗаписиОсновнаяЧасть.Май + ВыборкаДетальныеЗаписиОсновнаяЧасть.Июнь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Июль + ВыборкаДетальныеЗаписиОсновнаяЧасть.Август + ВыборкаДетальныеЗаписиОсновнаяЧасть.Сентябрь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Октябрь; ОбластьОсновного.Параметры.ФактГод = ВыборкаФактЗаГод.СуммаЧистыйВесЗаГод; ИначеЕсли МесяцЧисло = 11 Тогда ОбластьОсновного.Параметры.ПланГод = ВыборкаДетальныеЗаписиОсновнаяЧасть.Январь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Февраль + ВыборкаДетальныеЗаписиОсновнаяЧасть.Март + ВыборкаДетальныеЗаписиОсновнаяЧасть.Апрель + ВыборкаДетальныеЗаписиОсновнаяЧасть.Май + ВыборкаДетальныеЗаписиОсновнаяЧасть.Июнь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Июль + ВыборкаДетальныеЗаписиОсновнаяЧасть.Август + ВыборкаДетальныеЗаписиОсновнаяЧасть.Сентябрь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Октябрь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Ноябрь; ОбластьОсновного.Параметры.ФактГод = ВыборкаФактЗаГод.СуммаЧистыйВесЗаГод; ИначеЕсли МесяцЧисло = 12 Тогда ОбластьОсновного.Параметры.ПланГод = ВыборкаДетальныеЗаписиОсновнаяЧасть.Январь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Февраль + ВыборкаДетальныеЗаписиОсновнаяЧасть.Март + ВыборкаДетальныеЗаписиОсновнаяЧасть.Апрель + ВыборкаДетальныеЗаписиОсновнаяЧасть.Май + ВыборкаДетальныеЗаписиОсновнаяЧасть.Июнь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Июль + ВыборкаДетальныеЗаписиОсновнаяЧасть.Август + ВыборкаДетальныеЗаписиОсновнаяЧасть.Сентябрь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Октябрь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Ноябрь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Декабрь; ОбластьОсновного.Параметры.ФактГод = ВыборкаФактЗаГод.СуммаЧистыйВесЗаГод; КонецЕсли; ОбластьОсновного.Параметры.ФактГод = Формат(ОбластьОсновного.Параметры.ФактГод,"ЧДЦ=3"); КонецЦикла; //проверка на пустоту плана за год Если НЕ ПустаяСтрока(ОбластьОсновного.Параметры.ПланГод) Тогда СуммаПланГод = СуммаПланГод + ОбластьОсновного.Параметры.ПланГод; Иначе СуммаПланГод = СуммаПланГод + 0; КонецЕсли; //проверка на пустоту факта за год Если НЕ ПустаяСтрока(ОбластьОсновного.Параметры.ФактГод) Тогда СуммаФактГод = СуммаФактГод + ОбластьОсновного.Параметры.ФактГод; Иначе СуммаФактГод = СуммаФактГод + 0; КонецЕсли; // подсчёт процента за Год и проверка на пустоту Плана и Факта Если НЕ ПустаяСтрока(ОбластьОсновного.Параметры.ПланГод) И НЕ ПустаяСтрока(ОбластьОсновного.Параметры.ФактГод) Тогда ПроцентЗаГод = ОбластьОсновного.Параметры.ФактГод/ОбластьОсновного.Параметры.ПланГод*100; ОбластьОсновного.Параметры.ПроцентГод = Формат(ПроцентЗаГод,"ЧДЦ=2"); Иначе ОбластьОсновного.Параметры.ПроцентГод = " "; КонецЕсли; //Продолжить; КонецЦикла; |
Форум консультаций по прикладным решениям и программам фирмы «1С».
Онлайн консультации, вопросы и ответы, бесплатная регистрация, личная страница, twitter и facebook каналы и многое другое ждут Вас здесь.
Зарегистрироваться ← Ваш выбор → Войти на форум
-
Платформа 8.3 Бухгалтерия 3.0 (3.0.37.37) . Надо найти Номенклатуру по реквизиту «Артикул»
Команда Справочники.Номенклатура.НайтаПоРеквизиту(«Артикул»,Артикул) — резульпат пустая ссылка. Справочники.Номенклатура.НайтаПоРеквизиту(«Артикул»,»11108″) — находит. В Артакул строка «11108». Делаю поиск запросом — результат тот же. Помогите!! -
Реклама на форуме
Чтобы убрать:
-
Попробуйте так
Справочники.Номенклатура.НайтаПоРеквизиту(«Артикул»,СокрЛП(Артикул))
Запрос то находит? Или тоже дает пустую ссылку? -
СокЛП пробывал и запросом тоже. Поиск на сервере. 1С:Предприятие 8.3 (8.3.5.138)
-
Код в студию, плюс скриншот справочника и отладчика решил бы ситуацию.
-
Согласен, код в студию….
Имхо, на момент поиска в переменной Артикул, что-то иное, но только не искомый артикул. -
&НаКлиенте
Процедура ПутьКФайлуНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)Товар= ПоискПоАртикулю(Номенклатур);
КонецПроцедуры&НаСервере
Функция ПоискПоАртикулю(Номенклатур)Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ
| Номенклатура.Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Артикул = &Артикул»;Запрос.УстановитьПараметр(«Артикул»,Номенклатур); //См здесь
РезультатЗапроса = Запрос.Выполнить();ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Если ВыборкаДетальныеЗаписи.Следующий() Тогда
Возврат ВыборкаДетальныеЗаписи;
Иначе
Сообщить(«Ненайдена номенклатура с артикулем «+Номенклатур)
КонецЕсли;Возврат 0;
КонецФункции
В отладчеке
Выдаёт Ссылка Ошибка чтения значения
Номенклатур «11 016» Строкаа если конкретно указать артикул т.е
&НаСервере
Функция ПоискПоАртикулю(Номенклатур)Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ
| Номенклатура.Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Артикул = &Артикул»;
Запрос.УстановитьПараметр(«Артикул», «11016»); //См здесь
РезультатЗапроса = Запрос.Выполнить();ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Если ВыборкаДетальныеЗаписи.Следующий() Тогда
Возврат ВыборкаДетальныеЗаписи;
Иначе
Сообщить(«Ненайдена номенклатура с артикулем «+Номенклатур)
КонецЕсли;Возврат 0;
КонецФункции
В отладчике
ВыборкаДетальныеЗаписи.Ссылка 11016 Пружина подвески СправочникСсылка.Номенклатура
т.е всё ищетА теперь возможно ключ к развязке. на сервере присвою полю код.
&НаСервере
Функция ПоискПоАртикулю(Номенклатур)Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ
| Номенклатура.Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Артикул = &Артикул»;
Номенклатур=»11016″; // Возможно отгадкаЗапрос.УстановитьПараметр(«Артикул»,Номенклатур); //См здесь //См здесь
РезультатЗапроса = Запрос.Выполнить();ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Если ВыборкаДетальныеЗаписи.Следующий() Тогда
Возврат ВыборкаДетальныеЗаписи;
Иначе
Сообщить(«Ненайдена номенклатура с артикулем «+Номенклатур)
КонецЕсли;Возврат 0;
КонецФункцииВсё ок
В отладчике
ВыборкаДетальныеЗаписи.Ссылка 11016 Пружина подвески СправочникСсылка.НоменклатураВывод: Дело где-то в передаче данных ч Клиента на Сервер.
Может кто даст ссылку где прочесть про этот механизм. -
Да СокрЛП(Номенклатур) ставил.
-
Вот тут
&НаКлиенте
…..
Товар = ПоискПоАртикулю(Номенклатур)Номенклатур — какое значение?
-
Реклама на форуме
Чтобы убрать:
-
Немного повангую.
Вы открываете некий файл XLS, в котором есть некий перечень номенклатуры с артикулами. Парсите файл и из какой-то колонки дергаете ЧИСЛОВОЕ значение артикула, по которому и ищите номенклатуру. Но тут есть нюанс, в 1С по умолчанию разделитель триад (групп разрядов) числа — неразрывный пробел, что приводит к тому что число «10999» в строку транслируется как «10 999». Используйте функцию СтрЗаменить(ИсходнаяСтрока, Символы.НПП, «») -
Андрей Вы телепат! Но дело в том что Это поле не числовое, а символьное и в нем пробелов не видно. Всё равно спасибо. попробую Используйте функцию СтрЗаменить(ИсходнаяСтрока, Символы.НПП.
-
Загвоздка в том что там только числовые символы, и 1С, скорее всего, интерпретирует значение как число. Как вариант при загрузке значения из данной строки явно идентифицируйте его как строку, через «Строка()». Либо, если данные сначала загружаются в таблицу значений то у соответствующей колонки явно установите строковый тип.
-
Спасибо Андрей. Всё получилось. Сделал как Вы советовали — поставил СтрЗаменить(ИсходнаяСтрока, Символы.НПП,»»)
Резюме:
Очевидно При чтении из Эксель поле с типом»символьное, где все символы числа 1С вставляет пробелы которые невидны. Решение при чтении из Экселя символьных полей всегда вставляйте «СтрЗаменить(ИсходнаяСтрока, Символы.НПП,»»)»
Похожие темы
Почему-то не задействована часть кода, (как узнал, через отладчик) Код Обрывается на
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Вот код, эта часть кода находится в самом конце

Процедура ОбработкаПроведения(Отказ, Режим)
//{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
// регистр Взаиморасчеты Приход
Движения.Взаиморасчеты.Записывать = Истина;
Движение = Движения.Взаиморасчеты.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Контрагент = Клиент;
Движение.Сумма = СуммаДокумента;
// регистр Продажи
Движения.Продажи.Записывать = Истина;
Для Каждого ТекСтрокаТовары Из Товары Цикл
Движение = Движения.Продажи.Добавить();
Движение.Период = Дата;
Движение.Клиент = Клиент;
Движение.Номенклатура = ТекСтрокаТовары.Товар;
Движение.Количество = ТекСтрокаТовары.Количество;
Движение.Сумма = ТекСтрокаТовары.Сумма;
КонецЦикла;
// регистр ТоварыНаСкладах Расход
Движения.ТоварыНаСкладах.Записывать = Истина;
Для Каждого ТекСтрокаТовары Из Товары Цикл
Движение = Движения.ТоварыНаСкладах.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Номенклатура = ТекСтрокаТовары.Товар;
Движение.Склад = Склад;
Движение.Количество = ТекСтрокаТовары.Количество;
КонецЦикла;
Движения.Записать();
Если Режим = РежимПроведенияДокумента.Оперативный Тогда
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
| ТоварыНаСкладахОстатки.Склад КАК Склад,
| -ТоварыНаСкладахОстатки.КоличествоОстаток КАК Количество
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(
| ,
| Склад = &Склад
| И Номенклатура В
| (ВЫБРАТЬ
| РеализацияТоваровИУслугТовары.Товар КАК Товар
| ИЗ
| Документ.РеализацияТоваровИУслуг.Товары КАК РеализацияТоваровИУслугТовары
| ГДЕ
| РеализацияТоваровИУслугТовары.Ссылка = &Ссылка)) КАК ТоварыНаСкладахОстатки
|ГДЕ
| ТоварыНаСкладахОстатки.КоличествоОстаток < 0";
Запрос.УстановитьПараметр("Склад", Склад);
Запрос.УстановитьПараметр("Ссылка", Ссылка);
РезультатЗапроса = Запрос.Выполнить();
Если НЕ РезультатЗапроса.Пустой() Тогда
Отказ = Истина;
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
// Вставить обработку выборки ВыборкаДетальныеЗаписи
Сообщить("Недостаточно товара"+ВыборкаДетальныеЗаписи.Номенклатура+"в колличестве"+ВыборкаДетальныеЗаписи.Количество);
КонецЦикла;
КонецЕсли;
Если НЕ Отказ Тогда
Движения.СебестоимостьТоваров.Записывать = Истина;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СебестоимостьТоваровОстатки.Номенклатура КАК Номенклатура,
| СебестоимостьТоваровОстатки.СуммаОстаток КАК Сумма,
| СебестоимостьТоваровОстатки.КоличествоОстаток КАК Количество
|ИЗ
| РегистрНакопления.СебестоимостьТоваров.Остатки(
| &МоментВремени,
| Номенклатура В
| (ВЫБРАТЬ
| РеализацияТоваровИУслугТовары.Товар КАК Товар
| ИЗ
| Документ.РеализацияТоваровИУслуг.Товары КАК РеализацияТоваровИУслугТовары
| ГДЕ
| РеализацияТоваровИУслугТовары.Ссылка = &Ссылка)) КАК СебестоимостьТоваровОстатки";
Запрос.УстановитьПараметр("МоментВремени", МоментВремени());
Запрос.УстановитьПараметр("Ссылка", Ссылка);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Если ВыборкаДетальныеЗаписи.Количество <> 0 Тогда
СебестоимостьЕдиницы = ВыборкаДетальныеЗаписи.Сумма/ВыборкаДетальныеЗаписи.Количество;
Иначе
СебестоимостьЕдиницы = 0;
КонецЕсли;
Движение = Движения.СебестоимостьТоваров.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
СтрокаТЧ = Товары.Найти(ВыборкаДетальныеЗаписи.Номенклатура, "Товар");
Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура;
Движение.Количество = СтрокаТЧ.Количество;
Движение.Сумма = СебестоимостьЕдиницы * СтрокаТЧ.Количество;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Доброго времени суток, коллеги! Много раз на нашем сайте обсуждалась тема запросов в 1С, например, как получить всех родителей элемента справочника одним запросом. В этой статье вы увидите еще много разных примеров запросов, которые помогут вам решать повседневные задачи. Вот, посмотрите.
Содержание
- Как в запросе 1с8 установить условие проверки периода на конец дня?
- Как правильно обрабатывать значения NULL в запросе 1С8?
- Как вывести результат запроса в табличный документ?
- Как посчитать возраст по дате рождения в запросе 1С8?
- Почему в результате запроса 1С8 появляется ошибка «Ошибка чтения значения» при отладке?
- Как запросом получить все подчиненные документы?
- Как выглядит недокументированный синтаксис оператора ВЫБОР?
- Как составить запрос к табличной части документа?
- Как запросом для документа найти все подчинённые ему документы?
- Как сравнить строки в запросе?
- Как в запросе проверить поле на пустую ссылку?
- Как в запросе убрать фильтр на значение параметра?
Как в запросе 1с8 установить условие проверки периода на конец дня?
В запросе воспользуемся функцией КОНЕЦПЕРИОДА(&ДатаКонец, ДЕНЬ), она приведет дату к виду «23:59:59».
Запрос = Новый Запрос; Запрос.Текст = " |ВЫБРАТЬ | СчетНаОплатуПокупателю.Дата |ИЗ | Документ.СчетНаОплатуПокупателю КАК СчетНаОплатуПокупателю |ГДЕ | СчетНаОплатуПокупателю.Дата МЕЖДУ НАЧАЛОПЕРИОДА(&ДатаНачала, ДЕНЬ) | И КОНЕЦПЕРИОДА(&ДатаКонец, ДЕНЬ)"; Запрос.УстановитьПараметр("ДатаКонец", ДатаКонец); Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала); РезультатЗапроса = Запрос.Выполнить();
Как правильно обрабатывать значения NULL в запросе 1С8?
В запросе значения типа NULL образуются в результате соединений (ЛЕВОЕ, ПРАВОЕ), когда элементу из одной таблицы по условию не находится соответствующего элемента из другой. Значение типа NULL имею специфические особенности:
-
- Cравнение значения NULL с любым другим аргументом всегда возвращает ложь. Например, если в запросе поле «Количество» возвращает NULL, то если использовать операции сравнения «<», «>», или «=» с числом 1000, то результатом всегда будет «Ложь». Даже, если сравнить с самим значением NULL, то все равно результатом будет «Ложь»:
ГДЕ ГТД.Количество = NULL
-
- Применение арифметических операций к значению типа NULL всегда возвращает NULL. Например, если в запросе к полю «Количество», которое возвращает NULL, прибавить числовое значение или отнять от него числовое значение, то будет возвращено значение NULL:
ГТД.Количество+300 КАК Поле1
-
- Для определения значения NULL используется функция конструкция «IS NULL». Чтобы получить записи со значением NULL воспользуемся следующей конструкцией:
ГДЕ ГТД.Регистратор.Организация IS NULL
если нужно получить записи без NULL, тогда:
ГДЕ НЕ ГТД.Регистратор.Организация IS NULL
- Для преобразования типа NULL используется функция «isNULL» или «ЕСТЬNULL». Теперь можно сравнивать с полученным значением или применять к нему арифметические операции, не боясь за конечный результат:
- Для определения значения NULL используется функция конструкция «IS NULL». Чтобы получить записи со значением NULL воспользуемся следующей конструкцией:
ЕСТЬNULL(ГТД.Количество, 0)+300 КАК Поле1
-
- Для того, чтобы в результате запроса отсечь записи, содержащие значения NULL применяются следующие конструкции: «IS NOT NULL», «NOT <поле> is NULL»:
ГДЕ ГТД.Регистратор.Организация IS NOT NULL
или
ГДЕ NOT ГТД.Регистратор.Организация IS NULL
Как вывести результат запроса в табличный документ?
Для этого можно использовать объект ПостроительОтчета:
ТабДок = Новый ТабличныйДокумент; Результат = РезультатЗапроса.Выгрузить(); Построитель = Новый ПостроительОтчета; Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(Результат); Построитель.Вывести(ТабДок); ТабДок.Записать("D:mxlТаблица.mxl");
Как посчитать возраст по дате рождения в запросе 1С8?
Использовать функцию языка запроса РАЗНОСТЬДАТ:
ВЫБРАТЬ Сотрудники.Сотрудник, Сотрудники.Пол, РАЗНОСТЬДАТ(Сотрудники.ДатаРождения, &ТекДата, ГОД) КАК Возраст ИЗ Сотрудники КАК Сотрудники ПОЛНОЕ СОЕДИНЕНИЕ ПриемНаРаботу КАК ПриемНаРаботу ПО Сотрудники.Сотрудник = ПриемНаРаботу.Сотрудник ПОЛНОЕ СОЕДИНЕНИЕ Пенсия КАК Пенсия ПО Сотрудники.Сотрудник = Пенсия.Сотрудник
Почему в результате запроса 1С8 появляется ошибка «Ошибка чтения значения» при отладке?
Бывает, что в консоли запрос отрабатывается нормально, но в рабочем режиме падает с ошибкой «Значение не является значением объектного типа (Сумма)». При этом отладчик показывает, что в коллекции «ВыборкаИзРезультатаЗапроса» находиться сумма со значением «Ошибка чтения значения». При отладке выдается «Ошибка чтения значения», если в функции написать так:
Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Возврат Выборка;
Ошибка чтения значений результата запроса, возникает из-за того, что в выборке еще не осуществлена установка на первый элемент выборки. Для этого существует метод «Следующий()» коллекции «ВыборкаИзРезультатаЗапроса». Поэтому надо писать так:
Если Выборка.Следующий() Тогда ДоговорКонтрагента = Выборка.Наименование; КонецЕсли;
Как запросом получить все подчиненные документы?
С помощью Функции «ПолучитьСписокВводимыхДокументовНаОсновании» получим список документов, которые вводятся на основании заданного документа:
// Параметры: ДокументПоиска: Тип - Метаданные объекта Функция ПолучитьСписокВводимыхДокументовНаОсновании(ДокументПоиска) Экспорт СписокДокументов = Новый СписокЗначений; Для Каждого Документ Из Метаданные.Документы Цикл Если Документ.ВводитсяНаОсновании.Содержит(ДокументПоиска) Тогда СписокДокументов.Добавить(Документ.Имя, Документ.Синоним); КонецЕсли; КонецЦикла; Возврат СписокДокументов; КонецФункции
Теперь, на основании списка документов найдем все подчинённые заданному документу:
Функция ПолучитьПодчиненныеДокументы() СписокЗаполнения = ПолучитьСписокВводимыхДокументовНаОсновании(СсылкаНаОбъект.Метаданные()); ТекстЗапросаПоСтатусу = ""; Для Каждого ЭлементСписка Из СписокЗаполнения Цикл Если НЕ ПустаяСтрока(ТекстЗапросаПоСтатусу) Тогда ТекстЗапросаПоСтатусу = ТекстЗапросаПоСтатусу + " |ОБЪЕДИНИТЬ ВСЕ |"; КонецЕсли; ТекстЗапросаПоСтатусу = ТекстЗапросаПоСтатусу + " |ВЫБРАТЬ " + ?(ПустаяСтрока(ТекстЗапросаПоСтатусу), "РАЗРЕШЕННЫЕ", "") + " | Док.Ссылка КАК ПодчиненныйДокумент |ИЗ | Документ." + ЭлементСписка.Значение + " КАК Док |ГДЕ | Док.ДокументОснование = &парамОснование | И Док.Проведен |"; КонецЦикла; Запрос = Новый Запрос; Запрос.УстановитьПараметр("парамОснование", СсылкаНаОбъект); Запрос.Текст = ТекстЗапросаПоСтатусу; Возврат Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("ПодчиненныйДокумент"); КонецФункции // ПолучитьПодчиненныеДокументы()
Выведем полученные документы:
Процедура ВывестиПодчиненныеДокументы() Массив = ПолучитьПодчиненныеДокументы(); Для каждого Эл Из Массив Цикл Сообщить(Эл); КонецЦикла; КонецПроцедуры
Как выглядит недокументированный синтаксис оператора ВЫБОР?
Вот нестандартный вариант синтаксиса оператора ВЫБОР:
ВЫБРАТЬ ВЫБОР ДЕНЬНЕДЕЛИ(ДАТАВРЕМЯ(2015, 4, 1)) КОГДА 1 ТОГДА "Понедельник" КОГДА 2 ТОГДА "Вторник" КОГДА 3 ТОГДА "Среда" КОГДА 4 ТОГДА "Четверг" КОГДА 5 ТОГДА "Пятница" КОГДА 6 ТОГДА "Суббота" ИНАЧЕ "Воскресенье" КОНЕЦ КАК ДеньНедели
В этом примере показано, как с помощью опрератора ВЫБОР выводить текстовое представление дня недели.
Как составить запрос к табличной части документа?
Пример запроса:
Построитель.Текст = "ВЫБРАТЬ | Товары.Ответственный, | Товары.Ссылка КАК Документ, | Товары.Номенклатура, | СУММА(Товары.Сумма) КАК Сумма |ИЗ | Документ.ЧекККМ.Товары КАК Товары |ГДЕ | Товары.Ссылка.Дата Между &ДатаНач и &ДатаКон |СГРУППИРОВАТЬ ПО | Товары.Ссылка, | Товары.Ответственный, | Товары.Номенклатура";
Особенность этого запроса в том, что мы обращаемся к табличной части «Товары». Поэтому к реквизитам документа «ЧекККМ» мы обращаемся через свойство «Ссылка». Только в этом случае мы сможем получить строки табличной части документа. Если не указать свойство «Ссылка», то появится ошибка, примерно такого вида:
{(7, 5)}: Поле не найдено «Документ.ЧекККМ.Дата»
Как запросом для документа найти все подчинённые ему документы?
Воспользуемся следующим запросом:
Запрос = Новый Запрос; Запрос.Текст = " |ВЫБРАТЬ | СчетФактураВыданный.Ссылка |ИЗ | Документ.СчетФактураВыданный КАК СчетФактураВыданный |ГДЕ | СчетФактураВыданный.ДокументОснование = &ДокументОснование"; Запрос.УстановитьПараметр("ДокументОснование", Накладная); РезультатЗапроса = Запрос.Выполнить(); Выборка = РезультатЗапроса.Выбрать(); Пока Выборка.Следующий() Цикл СФ = Выборка.Ссылка.ПолучитьОбъект(); СФ.ДокументОснование = ""; СФ.Записать(РежимЗаписиДокумента.Запись); КонецЦикла;
Как сравнить строки в запросе?
| ГДЕ (Номер ПОДОБНО &НомерНакладной) Запрос.УстановитьПараметр("НомерНакладной", "%"+НомерНакладной+"%");
Как в запросе проверить поле на пустую ссылку?
ВЫБРАТЬ Начисление.Ссылка, Увольнение.Ссылка КАК Ссылка1, Начисление.ДокументОснование, Увольнение.ДокументОснование КАК ДокументОснование1 ИЗ Документ.НачислениеЗарплатыРаботникамОрганизаций КАК Начисление СОЕДИНЕНИЕ Документ.УвольнениеИзОрганизаций КАК Увольнение ПО Начисление.ДокументОснование = Увольнение.ДокументОснование ГДЕ (Начисление.ДокументОснование<> ЗНАЧЕНИЕ(Документ.ТабельУчетаРабочегоВремениОрганизации.ПустаяСсылка))
Заметим, что в параметре пишем «Документ», а не «Документы» и «ПустаяСсылка» без скобок.
Как в запросе убрать фильтр на значение параметра?
Например, нам нужно вывести данные о продажах, отфильтровав их по значению в поле формы «Товар», если в этом поле выбран нужный нам товар. И если товар не выбран, то вывести данные по всем товарам. Пример запроса такой:
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ПродажиОбороты.Номенклатура, | ПродажиОбороты.СуммаОборот КАК Сумма |ИЗ | РегистрНакопления.Продажи.Обороты(&ДатаНачала, | &ДатаОкончания, , | &Товар) КАК ПродажиОбороты"; Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала); Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания); Запрос.УстановитьПараметр("Товар", Товар);
Рассмотрим четыре способа, как избавится от фильтра в запросе.
- Изменим параметр запроса с помощью функции «СтрЗаменить»:
Если Товар.Пустая() Тогда Запрос.Текст = СтрЗаменить(Запрос.Текст, "&Товар", ""); Иначе Запрос.Текст = СтрЗаменить(Запрос.Текст, "&Товар", "Номенклатура = &Товар"); КонецЕсли;
- В параметре виртуальной таблицы вместо значения «&Товар» запишем следующее выражение:
|&Товар = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) | ИЛИ Номенклатура = &Товар
Если параметр товар не заполнен, то первое выражение примет значение ИСТИНА, тогда значение всего выражения примет значение ИСТИНА. В этом случае как-будто и нет никакого фильтра. Но если товар заполнен, то первое выражение принимает значение ЛОЖЬ. Тогда сработает второе выражение и произойдет фильтрация по товару.
- Еще один способ возможен благодаря новому объекту платформы «СхемаЗапроса (QuerySchema)», который появился в версии 1С 8.3.5:
СхемаЗапроса = Новый СхемаЗапроса; СхемаЗапроса.УстановитьТекстЗапроса(Запрос.Текст); Если ЗначениеЗаполнено(Товар) Тогда СхемаЗапроса.ПакетЗапросов[0].Операторы[0].Источники[0].Источник.Параметры[3].Выражение = Новый ВыражениеСхемыЗапроса("Номенклатура = &Товар"); КонецЕсли; Запрос.Текст = СхемаЗапроса.ПолучитьТекстЗапроса();
- Последний способ очень громоздкий, но его тоже можно использовать:
Если Товар.Пустая() Тогда Запрос.Текст = "ВЫБРАТЬ | ПродажиОбороты.Номенклатура, | ПродажиОбороты.СуммаОборот КАК Сумма |ИЗ | РегистрНакопления.Продажи.Обороты(&ДатаНачала, | &ДатаОкончания, , ) КАК ПродажиОбороты" Иначе Запрос.Текст = "ВЫБРАТЬ | ПродажиОбороты.Номенклатура, | ПродажиОбороты.СуммаОборот КАК Сумма |ИЗ | РегистрНакопления.Продажи.Обороты(&ДатаНачала, | &ДатаОкончания, , Номенклатура = &Товар) КАК ПродажиОбороты"; КонецЕсли;
Как видите, в запросе изменилось только значение условия виртуальной таблицы.