Проверка на заполненность в запросе реквизита составного типа |
Я |
08.02.07 — 09:03
например выбираю «Возвраты товаров от покупателей», там есть реквизит составного типа,поставить Сделка <> &ПустаяСсылка(а в параметрах указать ссылку на пустой документ «ЗаказыПокупателей») не будет правильным , т.к Сделка может быть еще доком «Реализация», что делать ?
1 — 08.02.07 — 09:03
2 — 08.02.07 — 09:11
…
ИЗ
Документ.ВозвратТоваровОтПокупателя КАК ВозвратТоваровОтПокупателя
ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ПО ВозвратТоваровОтПокупателя.Контрагент = РеализацияТоваровУслуг.Контрагент
И (ВозвратТоваровОтПокупателя.Сделка = РеализацияТоваровУслуг.Сделка
ИЛИ ВозвратТоваровОтПокупателя.Сделка = РеализацияТоваровУслуг.Ссылка)
И (ВозвратТоваровОтПокупателя.Сделка ССЫЛКА Документ.РеализацияТоваровУслуг
ИЛИ ВозвратТоваровОтПокупателя.Сделка ССЫЛКА Документ.ЗаказПокупателя)
ГДЕ
ВозвратТоваровОтПокупателя.Дата МЕЖДУ &ДатаНач И &ДатаКон
И РеализацияТоваровУслуг.Проведен = ИСТИНА
И ВозвратТоваровОтПокупателя.Проведен = ИСТИНА
И ВозвратТоваровОтПокупателя.Сделка <> НЕОПРЕДЕЛЕНО // не срабатывает, т.к определено , но с пустой ссылкой
3 — 08.02.07 — 09:12
т.е могут быть ситуации , когда это поле не заполнено, но тип определен и приведен соответственно или заполенно
4 — 08.02.07 — 09:45
NULL?
5 — 08.02.07 — 09:49
не нул, не нул ?
ВЫБРАТЬ РАЗЛИЧНЫЕ
ВозвратТоваровОтПокупателя.Ссылка КАК Возврат,
ВозвратТоваровОтПокупателя.Дата КАК ДатаВозвртата,
ВозвратТоваровОтПокупателя.Организация КАК ОрганизацияВозврата,
ВозвратТоваровОтПокупателя.СуммаДокумента КАК СуммаВозврата,
ВозвратТоваровОтПокупателя.Контрагент КАК Контрагент,
РеализацияТоваровУслуг.Ссылка КАК Реализация,
РеализацияТоваровУслуг.СуммаДокумента КАК СуммаРеализации,
РеализацияТоваровУслуг.Дата КАК ДатаРеализации,
ВЫРАЗИТЬ(РАЗНОСТЬДАТ(РеализацияТоваровУслуг.Дата, ВозвратТоваровОтПокупателя.Дата, СЕКУНДА) / (24 * 60 * 60) КАК ЧИСЛО(3, 0)) КАК РазностьМеждуВозвратомИРеализацией,
ВозвратТоваровОтПокупателя.СкладОрдер КАК СкладВозврата,
РеализацияТоваровУслуг.Склад КАК СкладРеализации,
ВозвратТоваровОтПокупателя.Сделка КАК ОснованиеВозврата
ИЗ
Документ.ВозвратТоваровОтПокупателя КАК ВозвратТоваровОтПокупателя
ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ПО ВозвратТоваровОтПокупателя.Контрагент = РеализацияТоваровУслуг.Контрагент
И (ВозвратТоваровОтПокупателя.Сделка ССЫЛКА Документ.ЗаказПокупателя)
И ВозвратТоваровОтПокупателя.Сделка = РеализацияТоваровУслуг.Сделка
ГДЕ
ВозвратТоваровОтПокупателя.Дата МЕЖДУ &ДатаНач И &ДатаКон
И РеализацияТоваровУслуг.Проведен = ИСТИНА
И ВозвратТоваровОтПокупателя.Проведен = ИСТИНА
И ВозвратТоваровОтПокупателя.Сделка <> &ПустойЗаказ
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ВозвратТоваровОтПокупателя.Ссылка,
ВозвратТоваровОтПокупателя.Дата,
ВозвратТоваровОтПокупателя.Организация,
ВозвратТоваровОтПокупателя.СуммаДокумента,
ВозвратТоваровОтПокупателя.Контрагент,
РеализацияТоваровУслуг.Ссылка,
РеализацияТоваровУслуг.СуммаДокумента,
РеализацияТоваровУслуг.Дата,
ВЫРАЗИТЬ(РАЗНОСТЬДАТ(РеализацияТоваровУслуг.Дата, ВозвратТоваровОтПокупателя.Дата, СЕКУНДА) / (24 * 60 * 60) КАК ЧИСЛО(3, 0)),
ВозвратТоваровОтПокупателя.СкладОрдер,
РеализацияТоваровУслуг.Склад,
ВозвратТоваровОтПокупателя.Сделка
ИЗ
Документ.ВозвратТоваровОтПокупателя КАК ВозвратТоваровОтПокупателя
ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ПО ВозвратТоваровОтПокупателя.Сделка = РеализацияТоваровУслуг.Ссылка
И ВозвратТоваровОтПокупателя.Контрагент = РеализацияТоваровУслуг.Контрагент
И (ВозвратТоваровОтПокупателя.Сделка ССЫЛКА Документ.РеализацияТоваровУслуг)
ГДЕ
ВозвратТоваровОтПокупателя.Дата МЕЖДУ &ДатаНач И &ДатаКон
И ВозвратТоваровОтПокупателя.Проведен = ИСТИНА
И РеализацияТоваровУслуг.Проведен = ИСТИНА
И ВозвратТоваровОтПокупателя.Сделка <> &ПустаяРеализация
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ВозвратТоваровОтПокупателя.Ссылка,
ВозвратТоваровОтПокупателя.Дата,
ВозвратТоваровОтПокупателя.Организация,
ВозвратТоваровОтПокупателя.СуммаДокумента,
ВозвратТоваровОтПокупателя.Контрагент,
NULL,
NULL,
NULL,
NULL,
ВозвратТоваровОтПокупателя.СкладОрдер,
NULL,
NULL
ИЗ
Документ.ВозвратТоваровОтПокупателя КАК ВозвратТоваровОтПокупателя
ГДЕ
ВозвратТоваровОтПокупателя.Дата МЕЖДУ &ДатаНач И &ДатаКон
И ВозвратТоваровОтПокупателя.Проведен = ИСТИНА
И ВозвратТоваровОтПокупателя.Сделка ССЫЛКА Документ.ЗаказПокупателя
И ВозвратТоваровОтПокупателя.Сделка = &ПустойЗаказ
ИТОГИ
СУММА(СуммаВозврата),
СУММА(СуммаРеализации)
ПО
ОБЩИЕ,
Контрагент
6 — 08.02.07 — 09:52
только вот еще одно НО, как обойти тот факт, что если по одному заказу у нас было более одной реализации — в текущем решении задваиваются некоторые строки
7 — 08.02.07 — 09:52
Если у тебя сделка — документ можно сделать так: Сделка.Дата ЕСТЬ NULL
8 — 08.02.07 — 09:53
(7) можно и так :), а по 6 пункту
9 — 08.02.07 — 09:56
(7) не прокатило
10 — 08.02.07 — 09:57
(9) тогда Сделка.Дата=&ПустаяДата
Запрос.УстановитьПараметр(«ПустаяДата»,’00010101′);
11 — 08.02.07 — 09:58
попробуй поменять
И ВозвратТоваровОтПокупателя.Сделка <> НЕОПРЕДЕЛЕНО // не срабатывает, т.к определено , но с пустой ссылкой
на
И ВозвратТоваровОтПокупателя.Сделка.Ссылка ЕСТЬ NULL
12 — 08.02.07 — 09:59
секундочку …
13 — 08.02.07 — 09:59
(6) во внутреннем запросе группировать реализации по заказу.
14 — 08.02.07 — 10:03
(11) не прокатило, вот ведь какая штука у одного и второго дока поле Сделка не заполенено(имеет тип ДокументСсылка.ЗаказаПокупателя), один выводится в отчет , у которого в структуре подчиненности нет ничего, а другой не выводится , у которого есть в структуре и заказ и релизация — что это ???
15 — 08.02.07 — 10:07
(10) вообще не выводит те возвраты, которые с пустыми сделками
16 — 08.02.07 — 10:07
попробуй так
И ВозвратТоваровОтПокупателя.Сделка.Ссылка НЕ В (&СписокСсылок)
СписокСсылок = Новый СписокЗначений;
СписокСсылок.Добавить(Пустаяссылкадокумента1);
…
СписокСсылок.Добавить(ПустаяссылкадокументаN);
Запрос.УстановитьПараметр(«СпискоСсылок»,СписокСсылок)
17 — 08.02.07 — 10:08
(15) для этих добавляешь усливе на NULL как в (7)
18 — 08.02.07 — 10:11
(16) точно, е мое :))
(17) секундочку … ща попробую
19 — 08.02.07 — 10:13
(17),(16) по (11) что можно сказать
20 — 08.02.07 — 10:14
+(19) по (14) извиняюсь
21 — 08.02.07 — 10:15
делаю все в консоли запросов и поэтому пока с типами не определюсь не составляю отчет (14) пункт не могу понять как так получается
22 — 08.02.07 — 10:18
платформа 16, 10.2.11.3 переделанная не в части среды выполнения запроса
23 — 08.02.07 — 10:23
выложи окончательный запрос
24 — 08.02.07 — 10:31
ВЫБРАТЬ РАЗЛИЧНЫЕ
ВозвратТоваровОтПокупателя.Ссылка КАК Возврат,
ВозвратТоваровОтПокупателя.Дата КАК ДатаВозвртата,
ВозвратТоваровОтПокупателя.Организация КАК ОрганизацияВозврата,
ВозвратТоваровОтПокупателя.СуммаДокумента КАК СуммаВозврата,
ВозвратТоваровОтПокупателя.Контрагент КАК Контрагент,
РеализацияТоваровУслуг.Ссылка КАК Реализация,
РеализацияТоваровУслуг.СуммаДокумента КАК СуммаРеализации,
РеализацияТоваровУслуг.Дата КАК ДатаРеализации,
ВЫРАЗИТЬ(РАЗНОСТЬДАТ(РеализацияТоваровУслуг.Дата, ВозвратТоваровОтПокупателя.Дата, СЕКУНДА) / (24 * 60 * 60) КАК ЧИСЛО(3, 0)) КАК РазностьМеждуВозвратомИРеализацией,
ВозвратТоваровОтПокупателя.СкладОрдер КАК СкладВозврата,
РеализацияТоваровУслуг.Склад КАК СкладРеализации,
ВозвратТоваровОтПокупателя.Сделка КАК ОснованиеВозврата
ИЗ
Документ.ВозвратТоваровОтПокупателя КАК ВозвратТоваровОтПокупателя
ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ПО ВозвратТоваровОтПокупателя.Контрагент = РеализацияТоваровУслуг.Контрагент
И (ВозвратТоваровОтПокупателя.Сделка ССЫЛКА Документ.ЗаказПокупателя)
И ВозвратТоваровОтПокупателя.Сделка = РеализацияТоваровУслуг.Сделка
ГДЕ
ВозвратТоваровОтПокупателя.Дата МЕЖДУ &ДатаНач И &ДатаКон
И РеализацияТоваровУслуг.Проведен = ИСТИНА
И ВозвратТоваровОтПокупателя.Проведен = ИСТИНА
И ВозвратТоваровОтПокупателя.Сделка <> &ПустойЗаказ
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ВозвратТоваровОтПокупателя.Ссылка,
ВозвратТоваровОтПокупателя.Дата,
ВозвратТоваровОтПокупателя.Организация,
ВозвратТоваровОтПокупателя.СуммаДокумента,
ВозвратТоваровОтПокупателя.Контрагент,
РеализацияТоваровУслуг.Ссылка,
РеализацияТоваровУслуг.СуммаДокумента,
РеализацияТоваровУслуг.Дата,
ВЫРАЗИТЬ(РАЗНОСТЬДАТ(РеализацияТоваровУслуг.Дата, ВозвратТоваровОтПокупателя.Дата, СЕКУНДА) / (24 * 60 * 60) КАК ЧИСЛО(3, 0)),
ВозвратТоваровОтПокупателя.СкладОрдер,
РеализацияТоваровУслуг.Склад,
ВозвратТоваровОтПокупателя.Сделка
ИЗ
Документ.ВозвратТоваровОтПокупателя КАК ВозвратТоваровОтПокупателя
ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ПО ВозвратТоваровОтПокупателя.Сделка = РеализацияТоваровУслуг.Ссылка
И ВозвратТоваровОтПокупателя.Контрагент = РеализацияТоваровУслуг.Контрагент
И (ВозвратТоваровОтПокупателя.Сделка ССЫЛКА Документ.РеализацияТоваровУслуг)
ГДЕ
ВозвратТоваровОтПокупателя.Дата МЕЖДУ &ДатаНач И &ДатаКон
И ВозвратТоваровОтПокупателя.Проведен = ИСТИНА
И РеализацияТоваровУслуг.Проведен = ИСТИНА
И ВозвратТоваровОтПокупателя.Сделка <> &ПустаяРеализация
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ВозвратТоваровОтПокупателя.Ссылка,
ВозвратТоваровОтПокупателя.Дата,
ВозвратТоваровОтПокупателя.Организация,
ВозвратТоваровОтПокупателя.СуммаДокумента,
ВозвратТоваровОтПокупателя.Контрагент,
NULL,
NULL,
NULL,
NULL,
ВозвратТоваровОтПокупателя.СкладОрдер,
NULL,
NULL
ИЗ
Документ.ВозвратТоваровОтПокупателя КАК ВозвратТоваровОтПокупателя
ГДЕ
ВозвратТоваровОтПокупателя.Дата МЕЖДУ &ДатаНач И &ДатаКон
И ВозвратТоваровОтПокупателя.Проведен = ИСТИНА
И ВозвратТоваровОтПокупателя.Сделка ССЫЛКА Документ.ЗаказПокупателя
И (ВозвратТоваровОтПокупателя.Сделка = &ПустойЗаказ
ИЛИ ВозвратТоваровОтПокупателя.Сделка.Ссылка = НЕОПРЕДЕЛЕНО)// проверял в обработке Сообщить(ТипЗнч(дВозврат.Сделка)); выдавала НЕОПРЕДЕЛЕНО , а тут не срабатывает на те возвраты , у которых ТипЗнч(Сделка) = НЕОПРЕДЕЛЕНО
ИТОГИ
СУММА(СуммаВозврата),
СУММА(СуммаРеализации)
ПО
ОБЩИЕ,
Контрагент
25 — 08.02.07 — 10:39
там где у тебя стоит
И РеализацияТоваровУслуг.Проведен = ИСТИНА
убери «= Истина» и попробуй
26 — 08.02.07 — 10:42
(25) Должна быть так, как не буду же я реализации выводить непроведенными, по последнему
27 — 08.02.07 — 10:44
все этот вопрос закрыл перевыбором «пустого» дока, хотя не понятно, как там вообще неопределено затесалось
28 — 08.02.07 — 10:45
(27) вернее не как оно там оказалось, а почему не реагировало на поиск по «неопределено»
29 — 08.02.07 — 10:45
помоему ты не понял
замени
И РеализацияТоваровУслуг.Проведен = ИСТИНА
на просто
И РеализацияТоваровУслуг.Проведен
30 — 08.02.07 — 10:53
(29) ИМХО никакой разницы, попробовал — ничего, вот ведь какая штука создал копию возврата по одному исследуемому контрагенту, в обработке дает тип ДокументСсылка.ЗаказПокупателя а в отчет где условие на пустой заказ не выводится
31 — 08.02.07 — 11:01
проверяй по частям
возми ту часть запроса и убери условие на пустую ссылку
добавь условие на контрагента
посмотри что вернет и от этого пляши
32 — 08.02.07 — 11:03
ВЫБРАТЬ
ВозвратТоваровОтПокупателя.Ссылка,
ВозвратТоваровОтПокупателя.Дата,
ВозвратТоваровОтПокупателя.Контрагент,
ВозвратТоваровОтПокупателя.СуммаДокумента
ИЗ
Документ.ВозвратТоваровОтПокупателя КАК ВозвратТоваровОтПокупателя
ГДЕ
ВозвратТоваровОтПокупателя.Проведен = ИСТИНА
И ВозвратТоваровОтПокупателя.Контрагент = &Абдрашитов
И ВозвратТоваровОтПокупателя.Сделка = &ПустойЗаказ
отдельный запрос срабатывает, вообще не пойму — крышу уже срывает ((((
33 — 08.02.07 — 11:06
что то ты его сильно упростил
оставь ВСЕ условия кроме проверки на пустой заказ
DK_L
34 — 08.02.07 — 11:39
(33) Извиняюсь покорнейше, с датой ступил ДатаКон — все работает
В этой статье будут рассмотрены способы проверки на пустое значение в зависимости от типа проверяемого реквизита в запросе 1С 8.3, в том числе пустой ссылки.
Проверка на NULL
Значение NULL возвращается в том случае, когда реквизита попросту нет. Тип в этом случае будет тоже NULL. Например, вы объединяете две таблицы через левое соединение. В том случае, когда для левой таблицы не будет найдено ни одного значения в правой, вернется NULL.
Проверку на данное значение можно осуществить при помощи конструкции «ЕСТЬ NULL» и «ЕСТЬNULL()». В первом случае возвращается Истина или Ложь. Во втором случае можно сразу задать другое значение в том случае, когда возвращается NULL.
В приведенном ниже запросе 1С 8.3 будут возвращен список контактных лиц тех партнеров, у кого не задан сегмент.
ВЫБРАТЬ
КонтактныеЛицаПартнеров.Ссылка
ИЗ
Справочник.КонтактныеЛицаПартнеров КАК КонтактныеЛицаПартнеров
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.СегментыПартнеров КАК СегментыПартнеров
ПО КонтактныеЛицаПартнеров.Владелец = СегментыПартнеров.Родитель
ГДЕ
СегментыПартнеров.Ссылка ЕСТЬ NULL
Пустая дата
Наша команда предоставляет услуги по консультированию, настройке и внедрению 1С.
Связаться с нами можно по телефону +7 499 350 29 00.
Услуги и цены можно увидеть по ссылке.
Будем рады помочь Вам!
Проверка значения на пустую дату производится путем сравнения с конструкцией ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0). Пример использования приведен ниже:
ВЫБРАТЬ
Встреча.Ссылка
ИЗ
Документ.Встреча КАК Встреча
ГДЕ
Встреча.Дата = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
Пустая ссылка в запросе 1С
В случае, когда возвращаемый реквизит имеет ссылочный тип, например, это элемент какого-либо справочника, документа и т. п., используется следующая конструкция: ЗНАЧЕНИЕ(Справочник.ИмяСправочника.ПустаяСсылка).
В приведенном ниже примере запрос выбирает всех партнеров, у которых не указан бизнес-регион.
ВЫБРАТЬ
Партнеры.Ссылка
ИЗ
Справочник.Партнеры КАК Партнеры
ГДЕ
Партнеры.БизнесРегион = ЗНАЧЕНИЕ(Справочник.БизнесРегионы.ПустаяСсылка)
Чтобы проверить на «ЗначениеЗаполнено» нужно сделать обратное условие:
Партнеры.БизнесРегион <> ЗНАЧЕНИЕ(Справочник.БизнесРегионы.ПустаяСсылка)
Пустая строка
Для проверки строковых типов производится сравнение с другим образцом. В данном случае – «».
Приведенный ниже запрос отберет всех партнеров с незаполненным наименованием.
ВЫБРАТЬ
Партнеры.Ссылка
ИЗ
Справочник.Партнеры КАК Партнеры
ГДЕ
Партнеры.Наименование = «»
1С: Предприятие 8. Как в запросе проверить заполнение реквизита с составным типом данных
Описание ошибки:
В общем-то откровенно это вопиющей ошибкой не назовешь, но выполнению задачи воспрепятствовало изрядно. Поэтому бросился уточнять, как же в 1С 8 «как в запросе проверить заполнение составной тип данных».
Найденные решения:
Задача была простой — нужно было в запросе выполнять условие при проверке заполнения реквизита документа, который имел составной тип данных, т.е. в реквизите можно было указать разные типы документов. Каковым, к примеру, является реквизит «Сделка» документа «Реализация товаров и услуг» конфигурации 1С: Управление торговлей 8 ред. 10.3.
Был составлен запрос с условием, но условие определенно не хотело работать, данные выводимые в консоли запросов, были неверными. Условие: Реализации.Ссылка.Сделка <> NULL не срабатывало, равно как и Реализации.Ссылка.Сделка <> НЕОПРЕДЕЛЕНО
Поиск решения в интернете подсказал на одной изстраниц обсуждения форума сайта www.forum.mista.ru, что в таком случае слудет дополнительно обратиться к ссылке составного реквизита:
Внимание было обращено на эту мелочь, и приведение текста запроса к виду: Реализации.Ссылка.Сделка.Ссылка <> НЕОПРЕДЕЛЕНО дало положительный рабочий результат.
Оцените, помогло ли Вам предоставленное описание решения ошибки?
© www.azhur-c.ru 2014-2020. Все права защищены. Использование текстов и изображений с данной страницы без письменного разрешения владельца запрещено. При использовании материалов с данной страницы обязательно указание ссылки на данную страницу.
06-02-2017
Журавлев А.С.
(Сайт www.azhur-c.ru)
0
1С 8.x : Условия сравнения и проверки в Запросах. Отбор не заполненного значения
Как задать отбор по Типу документа?
Как указать условие для отбора не определенного значения?
Как в языке запросов 1С отобрать не заполненное значение?
Какое условие указать в запросе после ключевого слова «ГДЕ», когда нужно сделать отбор по не заполненным полям?
Код 1C v 8.х
Запрос.Текст =
"ВЫБРАТЬ
| усЕдиницыХранения.Ссылка
|ИЗ
| Справочник.усЕдиницыХранения КАК усЕдиницыХранения"
// Пример 1. сравнение с не заполненным булевым значением:
|ГДЕ
| усЕдиницыХранения.РазрешитьОтборИзРезервнойЗоны = Ложь
// Пример 2. но если это булево определено, то лучше так: // условие на отрицательное булево:
|ГДЕ
| НЕ усЕдиницыХранения.РазрешитьОтборИзРезервнойЗоны
// Пример 3. выборка по условию не заполненного поля, имеющего тип "справочник конкретного типа"
|ГДЕ
| усЕдиницыХранения.АктивнаяОбластьОтбора = ЗНАЧЕНИЕ(Справочник.усОбластиОтбора.ПустаяСсылка)
// Пример 3а. выборка по условию не заполненного поля, имеющего тип "документ конкретного типа"
|ГДЕ
| НашРегистрСведений.Документ = ЗНАЧЕНИЕ(Документ.НашДокумент.ПустаяСсылка)
// Пример 3б. выборка по условию не заполненного поля, имеющего тип "документы разных типов" (составное поле)
|ГДЕ
| (НашРегистрСведений.Документ = ЗНАЧЕНИЕ(Документ.НашДокумент1.ПустаяСсылка)
| ИЛИ НашРегистрСведений.Документ = ЗНАЧЕНИЕ(Документ.НашДокумент2.ПустаяСсылка)
| ИЛИ ...(и т.д. - последовательно перечисляем условия для всех возможных типов этого составного поля))
// Пример 4. или наоборот, если нужно выбрать заполненное значение типа "строка", то поможет условие:
|ГДЕ
| усЕдиницыХранения.Наименование > """"
// Пример 5. если нужно выбрать документы конкретного типа, при составном типе данных, например в регистре "ВыполняемыеЗадания" ресурс "Задание" имеет составной тип, среди значений которого возможен документ "Отбор"
|ГДЕ
| ВЫРАЗИТЬ(РегистрСведенийВыполняемыеЗадания.Задание КАК Документ.Отбор) ССЫЛКА Документ.Отбор
// Пример 5а. Еще аналогичный пример, когда нужно выбрать документы конкретного типа
| ВЫБОР
| КОГДА ВЫРАЗИТЬ(агСоответствиеДокументов.ДокументБУ КАК Документ.ПоступлениеТоваровУслуг) ССЫЛКА Документ.ПоступлениеТоваровУслуг
| ТОГДА ""ПоступлениеТоваровУслуг""
| КОГДА ВЫРАЗИТЬ(агСоответствиеДокументов.ДокументБУ КАК Документ.РеализацияТоваровУслуг) ССЫЛКА Документ.РеализацияТоваровУслуг
| ТОГДА ""РеализацияТоваровУслуг""
| ИНАЧЕ """"
| КОНЕЦ КАК ВидДокумента
// Пример 6. выбор по условию не определенного значения:
|ГДЕ
| СохраненныеНастройки.Пользователь = НЕОПРЕДЕЛЕНО
// Пример 7. выбор по виду движения "Приход" регистра накопления, "Расход" - аналогично):
|ГДЕ
| РегТоварыВРознице.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
// Пример 8. Как в запросе указать, что выполнять запрос не нужно (например, нужно программно в зависимости от какого-то
// условия вернуть пустой результат запроса -
// Запрос.Текст = СтрЗаменить(Запрос.Текст, "ГДЕ Док.Ссылка = &ДокументСсылка", "ГДЕ ЛОЖЬ");).
// Для этого достаточно добавить условие "Где Ложь".
// Кстати, независимо от объема запрашиваемых в выборке данных, такой запрос будет выполнен мгновенно.
|ГДЕ ЛОЖЬ
// Пример 9. Проверка на то, что результат выполнения запроса содержит данные:
Если НЕ Запрос.Выполнить().Пустой() Тогда
// Пример 10. выбор по условию не заполненной даты:
|ГДЕ
| тбСтроки.ДатаОтмены = ДАТАВРЕМЯ(1, 1, 1)
источник
На чтение 5 мин. Просмотров 3.5k. Опубликовано 15.12.2019
Область применения: управляемое приложение, мобильное приложение, обычное приложение.
1. Проверку того, что результат выполнения запроса не содержит строк следует выполнять с помощью метода Пустой . Поскольку на получение выборки из результата запроса (выгрузка его в таблицу значений) будет затрачиваться дополнительное время.
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;
Возврат НЕ Запрос.Выполнить().Пустой()
Методическая рекомендация (полезный совет)
2. В то же время если требуется выбрать (или выгрузить) результат запроса, то предварительный вызов метода Пустой не требуется.
Например, вместо:
РезультатЗапроса = Запрос.Выполнить();
Если НЕ РезультатЗапроса.Пустой() Тогда // избыточный вызов
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
.
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
.
Рассмотрим основные методы использования пустых значений в условиях запросов 1С 8.3.
Проверка на NULL
выполняется с помощью конструкции ЕСТЬ NULL, например:
ВЫБРАТЬ
ВнутренниеЗаказыОстатки.Заказчик,
ВнутренниеЗаказыОстатки.КоличествоОстаток
ИЗ
РегистрНакопления.ВнутренниеЗаказы.Остатки КАК ВнутренниеЗаказыОстатки
ГДЕ
ВнутренниеЗаказыОстатки.КоличествоОстаток ЕСТЬ NULL
Получите 267 видеоуроков по 1С бесплатно:
Содержание
- Пустая дата в запросе 1С
- Пустая ссылка (значение) в запросе 1С 8.2 и 8.3
- Проверка на пустую строку в запросе 1С
- Проверка на NULL
- Пустая дата
- Пустая ссылка в запросе 1С
- Пустая строка
Пустая дата в запросе 1С
Пустая дата в запросе устанавливается конструкцией ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0), пример:
ВЫБРАТЬ
СчетНаОплатуПокупателю.Ссылка,
СчетНаОплатуПокупателю.ДатаОтгрузки
ИЗ
Документ.СчетНаОплатуПокупателю КАК СчетНаОплатуПокупателю
ГДЕ
СчетНаОплатуПокупателю.ДатаОтгрузки = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
Пустая ссылка (значение) в запросе 1С 8.2 и 8.3
Для ссылочных значений (справочники, документы, перечисления, планы счетов и т.д) для проверки необходимо использовать конструкцию «ЗНАЧЕНИЕ(Справочник.ИмяСправочника.ПустаяСсылка)». Например:
ВЫБРАТЬ
Номенклатура.Ссылка
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
Проверка на пустую строку в запросе 1С
В условиях для нахождения пустой строки необходимо использовать пустое значение строки — «», например:
Если Вы начинаете изучать 1С программирование, рекомендуем наш курс (не забудьте подписаться на YouTube — регулярно выходят новые видео):
К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.
- 5
- 4
- 3
- 2
- 1
(0 голосов, в среднем: 0 из 5)
Поддержите нас, расскажите друзьям!
СПРОСИТЕ в комментариях!
Запрос1.Текст = «ВЫБРАТЬ
|РемонтныйЛист.Номер,
|РемонтныйЛистМатериалыЗамена.ДатаРемонта,
|РемонтныйЛист.Проведен,
|РемонтныйЛист.Водитель1,
|РемонтныйЛист.Водитель2,
|РемонтныйЛист.Водитель3,
|РемонтныйЛистМатериалыЗамена.КолвоЧасов
|ИЗ
|Документ.РемонтныйЛист.МатериалыЗамена КАК РемонтныйЛистМатериалыЗамена
|ЛЕВОЕ СОЕДИНЕНИЕ Документ.РемонтныйЛист КАК РемонтныйЛист
|ПО РемонтныйЛистМатериалыЗамена.Ссылка = РемонтныйЛист.Ссылка
|ГДЕ
//|РемонтныйЛистМатериалыЗамена.ДатаРемонта >= Значение(«ДатаНач») И РемонтныйЛистМатериалыЗамена.ДатаРемонта = Значение(“ДатаНач”)
ПРАВИЛЬНО
//|РемонтныйЛистМатериалыЗамена.ДатаРемонта >= &ДатаНач
НЕ ПРАВИЛЬНО
//|РемонтныйЛист.Водитель3 НЕ ЗНАЧЕНИЕ (РемонтныйЛист.Водитель3.ПустаяСсылка)
ПРАВИЛЬНО
//|РемонтныйЛист.Водитель3 <> Значение(Справочник.Водители.ПустаяСсылка)
Где «Водители» имя справочника, тип которого имеет реквизит «Водитель3» (возможно сотрудники или физические лица)
Синтаксис не правильный так как я тока учусь:) спасибо большое. но водитель это реквизит не справочника а документа. имеет ли это значение?
а еще подскажите пожалуйста как вот на основании этого же запроса заполнить ячейки в отчете на пересечении водителя и даты необходимо поставить колво часов сколько он был в ремонте
РемонтныйЛист.Водитель3 — Это реквизит
Значение(Справочник.Водители.ПустаяСсылка) — это значение, которое вы передаете что бы наложить отбор, а Справочник.Водители — это ТИП реквизита РемонтныйЛист.Водитель3.
В конечном счете суть условия какая? Отобрать только те позиции, для которых выражение будет равняться ИСТИНА.
С этим я уже разобралась. вы правы были что это реквизит справочника Физические лица.у меня теперь проблема в том что он ругается на РемонтныйЛист.Проведен = Истина
В этой статье будут рассмотрены способы проверки на пустое значение в зависимости от типа проверяемого реквизита в запросе 1С 8.3, в том числе пустой ссылки.
Проверка на NULL
Значение NULL возвращается в том случае, когда реквизита попросту нет. Тип в этом случае будет тоже NULL. Например, вы объединяете две таблицы через левое соединение. В том случае, когда для левой таблицы не будет найдено ни одного значения в правой, вернется NULL.
Проверку на данное значение можно осуществить при помощи конструкции «ЕСТЬ NULL» и «ЕСТЬNULL()». В первом случае возвращается Истина или Ложь. Во втором случае можно сразу задать другое значение в том случае, когда возвращается NULL.
В приведенном ниже запросе 1С 8.3 будут возвращен список контактных лиц тех партнеров, у кого не задан сегмент.
ВЫБРАТЬ
КонтактныеЛицаПартнеров.Ссылка
ИЗ
Справочник.КонтактныеЛицаПартнеров КАК КонтактныеЛицаПартнеров
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.СегментыПартнеров КАК СегментыПартнеров
ПО КонтактныеЛицаПартнеров.Владелец = СегментыПартнеров.Родитель
ГДЕ
СегментыПартнеров.Ссылка ЕСТЬ NULL
Пустая дата
Проверка значения на пустую дату производится путем сравнения с конструкцией ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0). Пример использования приведен ниже:
ВЫБРАТЬ
Встреча.Ссылка
ИЗ
Документ.Встреча КАК Встреча
ГДЕ
Встреча.Дата = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
Пустая ссылка в запросе 1С
В случае, когда возвращаемый реквизит имеет ссылочный тип, например, это элемент какого-либо справочника, документа и т. п., используется следующая конструкция: ЗНАЧЕНИЕ(Справочник.ИмяСправочника.ПустаяСсылка).
В приведенном ниже примере запрос выбирает всех партнеров, у которых не указан бизнес-регион.
ВЫБРАТЬ
Партнеры.Ссылка
ИЗ
Справочник.Партнеры КАК Партнеры
ГДЕ
Партнеры.БизнесРегион = ЗНАЧЕНИЕ(Справочник.БизнесРегионы.ПустаяСсылка)
Чтобы проверить на «ЗначениеЗаполнено» нужно сделать обратное условие:
Пустая строка
Для проверки строковых типов производится сравнение с другим образцом. В данном случае – «».
Приведенный ниже запрос отберет всех партнеров с незаполненным наименованием.
ВЫБРАТЬ
Партнеры.Ссылка
ИЗ
Справочник.Партнеры КАК Партнеры
ГДЕ
Партнеры.Наименование = «»
Бывает необходимо получить в запросе пустую ссылку на какой-то объект или выбрать объекты с незаполненным реквизитом, установив отбор по пустой ссылке. Разберем в статье разные варианты получение и отбора по пустой ссылке, а также способы проверки на заполненность. В этой заметке во всех примерах будет устанавливаться отбор или сравнение на пустую ссылку в справочнике и пустую ссылку в документе.
Отбор по пустой ссылке
Для указания пустой ссылки в запросе можно использовать несколько способов:
Пустая ссылка через установить параметр
В примере устанавливаем пустую ссылку с помощью функции запроса УстановитьПараметр.
Запрос = Новый Запрос(" | ... | ГДЕ РеквизитСправочника = &ПустаяСсылкаСправочник | И РеквизитДокумента = &ПустаяСсылкаДокумент)"; Запрос.УстановитьПараметр("ПустаяСсылкаСправочник",Справочники.Номенклатура.ПустаяСсылка()); Запрос.УстановитьПараметр("ПустаяСсылкаДокумент",Документы.ЗаказКлиента.ПустаяСсылка());
Пустая ссылка в запросе
Пустую ссылку можно указать в запросе или в соединении, с помощью команды ЗНАЧЕНИЕ.
Запрос = Новый Запрос(" | ... | ГДЕ РеквизитСправочника = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) | И РеализацияТоваровУслуг.ДокументОснование = ЗНАЧЕНИЕ(Документ.Заказ.ПустаяСсылка)
Отбор объектов с не заполненными ссылками
Иногда в объекте может быть не пустая ссылка, а не заполненное значение в запросе отобрать их можно, с помощью оператора ЕСТЬ NULL.
Запрос = Новый Запрос(" | ... | ГДЕ ТоварыНаСкладах.Регистратор.ДокументОснование.Ссылка ЕСТЬ NULL";
Отбор объектов с заполненными значениями. Обратная ситуация и с ней есть особенности. В этом случае нужно использовать оператор “ЕСТЬ НЕ NULL”, а не ставить НЕ в начало условия.
Запрос = Новый Запрос(" | ... | ГДЕ РеализацияТоваровУслуг.Сделка.Ссылка ЕСТЬ НЕ NULL";
Получение пустого значения в запросе
Получение пустой ссылки в запросе аналогично отбору по пустой ссылке, работает по формуле:
- ЗНАЧЕНИЕ(Справочник.НаименованиеСправочника.ПустаяСсылка)
- ЗНАЧЕНИЕ(Документ.НаименованиеДокумента.ПустаяСсылка)
Запрос.Текст = "ВЫБРАТЬ | ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) КАК ПустаяСсылкаНоменклатура, | ЗНАЧЕНИЕ(Документ.ЗаказКлиента.ПустаяСсылка) КАК ПустаяСсылкаЗаказ, | """" КАК ПустаяСтрока, | 0 КАК Число0, | Истина КАК БулевоИстина, | Ложь КАК БулевоЛожь, |ИЗ | РегистрСведений.Расш1_ТестовыйРегистр КАК Расш1_ТестовыйРегистр |";
Материалы по теме:
- Про пустые значения на ИТС – ссылка
- Больше материалов по программирование на 1с – ссылка
Составной тип — коварный тип!
Список значений в составном типе. Задание типа значения списка.
1) Проверка заполнения реквизита.
Если реквизит составного типа, то проверка реквизита на заполненность значением выполняем только с помощью функции ЗначениеЗаполнено().
Ответ таков: когда у составного реквизита тип не выбран, то он имеет значение Неопределено, поэтому проверки типа ПустаяСтрока(Реквизит) Или Реквизит.Пустая() могут сгенерировать исключительную ошибку.
2) Построение запроса
Если в запросе реквизит составного типа участвует в отборах или в соединениях, то следует использовать функцию ВЫРАЗИТЬ(), что уменьшит время выполнения запроса.
Ответ таков: в таких условия система производит левое соединение реквизита с таблицами, которые указаны в его типе, а потом уже отсекает лишние записи. Добавив функцию ВЫРАЗИТЬ в запрос, мы явно указываем с какой таблицей выполнять левое соединение. Умно выражаясь, данная функция выполняет приведение значения к определенному типу.
Синтаксис функции: ВЫРАЗИТЬ ( <Выражение> КАК <Тип значения> ).
Пример.
У справочника ТочкиКартыМаршуртаБизнесПроцесса имеется реквизит ВладелецТочки, который имеет составной тип: СправочникСсылка.ШаблоныБизнесПроцессов, БизнесПроцессСылка.БизнесПроцессУниверсальный. Требуется получить выборку, содержащая информацию о всех точках маршрута, которые относятся к шаблонам бизнес-процессов, а так же наименования этих шаблонов:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ВЫРАЗИТЬ(ТочкиКартыМаршрутаБизнесПроцесса.ВладелецТочки КАК Справочник.ШаблоныБизнесПроцесса).Наименование КАК ШаблонБизнесПроцесса,
| ТочкиКартыМаршрутаБизнесПроцесса.Наименование КАК НаименованиеТочкиМаршрута,
| ТочкиКартыМаршрутаБизнесПроцесса.ВидТочки КАК ВидТочкиМаршрута
|ИЗ
| Справочник.ТочкиКартыМаршрутаБизнесПроцесса КАК ТочкиКартыМаршрутаБизнесПроцесса
|ГДЕ
| ВЫРАЗИТЬ(ТочкиКартыМаршрутаБизнесПроцесса.ВладелецТочки КАК Справочник.ШаблоныБизнесПроцесса) ЕСТЬ НЕ NULL
| И НЕ ТочкиКартыМаршрутаБизнесПроцесса.ПометкаУдаления";
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
// Вставить обработку выборки ВыборкаДетальныеЗаписи
КонецЦикла;
3) Проявление отрицательной стороны
При задании составного типа реквизиту старайтесь избегать включения в составной тип примитивных типов (число, булево, строка). Смешивая ссылочные типы с примитивными, увеличивается размер базы данных (создаются дополнительные колонки в таблице реляционной БД), может пострадать индексация реквизита (включение с составной тип неограниченной длины строку). Все это повлияет на производительность.
Вот такой вот коварный составной тип!