+7(499)-938-42-58 Москва
+7(800)-333-37-98 Горячая линия

Значение заполнено в запросе 1с 8.3. Значение() в запросе

Содержание

Онлайн-школа программирования в 1С

Значение заполнено в запросе 1с 8.3. Значение() в запросе

Внимание! Перед вами ознакомительная версия урока, материалы которого могут быть неполными.

Войдите на сайт как ученик

Войдите как ученик, чтобы получить доступ к материалам школы

Язык запросов 1С 8.3 для начинающих программистов: функция ЗНАЧЕНИЕ

Автор уроков и преподаватель школы: Владимир Милькин

Функция ЗНАЧЕНИЕ предназначена для обращения в тексте запроса к значениям системных перечислений и предопределенным данным.

Что ещё за перечисления и предопределенные данные, спросите вы. Давайте обо всём по порядку.

Перечисления

Перечисления – это прикладной объект (вы помните, что ещё существуют Справочники и Документы). Зачем он понадобился?

Дело в том, что перечисление – это особенный объект. В отличие от справочников и документов все возможные значения перечислений задаются на этапе конфигурирования и не могут быть в дальнейшем изменены в пользовательском режиме.

Неизменность – это их главный козырь. Это своеобразные константы базы данных.

И если программист в режиме конфигурирования создал перечисление с именем Пол и значениями Мужской и Женский, то при написании программы он может быть уверен, что в дальнейшем значения этого перечисления не изменятся. Поэтому он может смело обращаться к этим значениям из кода.

Представьте, что будет, если он попытается для этих целей использовать справочник?

Во-первых, какой-нибудь пользователь возьмёт да и добавит какой-нибудь “Марсианский пол”.

Во-вторых, другой пользователь возьмёт да и удалит один из уже имеющихся полов или имя ему поменяет.

А программа от этого сломается, потому что для её работы необходимо, чтобы было ровно два пола и именно с именами “Мужской” и “Женский”.

Вот для таких случаев, как раз и существуют перечисления: чтобы один раз (ещё на этапе конфигурирования) жестко задать все возможные варианты значений и в дальнейшем использовать их в коде программ.

Давайте рассмотрим пример такого перечисления в нашей базе “Гастроном”. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь.

Вот оно наше перечисление с именем Пол. Какие значения оно может принимать?

Всего два значения. С именами “Мужской” и “Женский”. То что нам надо.

Где мы в дальнейшем можем использовать это перечисление? Ну, конечно, в справочнике Клиенты. Обратите внимание, что в его списке появился новый реквизит с именем Пол и типом Перечисление.Пол:

Таким образом, при заполнении карточки клиента уже в режиме пользователя мы сможем в качестве пола клиента выбирать всего из двух значений Мужской и Женский:

Теперь давайте составим запрос, выбирающий клиентов и их пол из базы:

ВЫБРАТЬ Наименование, ПолИЗ Справочник.Клиенты

А теперь давайте изменим запрос, чтобы остались только мужчины. Если мы попробуем написать что-то типа:

ВЫБРАТЬ Наименование, ПолИЗ Справочник.КлиентыГДЕ Пол = “Мужской”

то ничего не получим:

Потому что к значениям перечисления так обращаться нельзя. К ним нужно обращаться используя функцию ЗНАЧЕНИЕ:

ВЫБРАТЬ Наименование, ПолИЗ Справочник.КлиентыГДЕ Пол = ЗНАЧЕНИЕ(Перечисление.Пол.Мужской)

Итак, одна из задач функции ЗНАЧЕНИЕ – использование в запросах значений перечислений.

Предопределенные данные

Я лучше покажу на примере, что такое предопределенные данные для справочников. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь.

В нашей базе “Гастроном” (в режиме пользователя) откройте справочник “Единицы измерения”:

Присмотритесь к его элементам. Видите жёлтые кружочки рядом с некоторыми из элементов? Вот эти элементы (у которых кружочки) и есть предопределенные данные.

Вообще же, если какой-либо элемент справочника является предопределенным (то есть на нём стоит жёлтый кружочек), то это особенный элемент.

Во-первых, это означает, что элемент был создан ещё на этапе конфигурирования программистом (в нашем случае это элементы с кодами 1, 2 и 3).

А, во-вторых, это значит, что этот элемент очень важен для функционирования программы. Что на него (вернее на его предопределенное имя) завязан какой-то код в базе данных.

Именно поэтому просто удалить такой элемент не получится. Попробуйте пометить его на удаление:

Давайте теперь перейдём в режим конфигурирования и посмотрим где же эти самые предопределенные элементы (в данном случае для справочника Единицы измерения) создаются:

Вот они все наши предопределенные элементы для справочника Единица измерения. Обратите внимание, что все предопределенные элементы имеют специальное имя, которое не отображается в режиме пользователя.

Для элемента с кодом 1 это имя Тонна, с кодом 2 – Грамм и так далее. Это имя называется предопределенным именем элемента и именно по этому имени можно обращаться к нему из кода (или из запроса в нашем случае).

Вы спросите почему же было не сделать единицы измерения просто перечислением с элементами Тонна, Грамм и Пачка? А всё потому, что в данном случае нам важно, чтобы справочник единицы измерения всегда содержал какие-то определенные элементы (тонна, грамм и пачка), но в то же время мы не хотим запрещать пользователю добавлять какие-то свои элементы (килограмм, штука и так далее). Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь.

Поэтому здесь безусловно больше подходят предопределенные элементы, чем перечисления.

А обращаться к нашим предопределенным элементам из запроса мы сможем используя уже знакомую нам функцию ЗНАЧЕНИЕ:

ВЫБРАТЬ НаименованиеИЗ Справочник.ЕдиницыИзмеренияГДЕ Ссылка = ЗНАЧЕНИЕ(Справочник.ЕдиницыИзмерения.Тонна)

Пройдите тест

а) Напишите запрос, который выводит все значения перечисления ВременаГода:

Эталонное решение. Сначала пишем код сами, проверяем на компьютере (как и все примеры программ из уроков), только потом сверяемся

Войдите на сайт как ученик

Авторизуйтесь, чтобы получить доступ ко всем материалам школы

б) Напишите запрос, который выводит предопределенный элемент справочника Склады с предопределенным именем Временный:

Источник: https://helpme1c.ru/yazyk-zaprosov-1s-8-3-dlya-nachinayushhix-programmistov-funkciya-znachenie

Проверка на заполненное значение в запросе 1с. Значение() в запросе

Значение заполнено в запросе 1с 8.3. Значение() в запросе

Запрос.Текст =”ВЫБРАТЬ| усЕдиницыХранения.Ссылка|ИЗ| Справочник.усЕдиницыХранения КАК усЕдиницыХранения// Пример 1. сравнение с не заполненным булевым значением:|ГДЕ| усЕдиницыХранения.РазрешитьОтборИзРезервнойЗоны = Ложь// Пример 2. но если это булево определено, то лучше так: // условие на отрицательное булево:|ГДЕ| НЕ усЕдиницыХранения.

РазрешитьОтборИзРезервнойЗоны// Пример 3. выборка по условию не заполненного поля, имеющего тип “справочник конкретного типа”|ГДЕ| усЕдиницыХранения.АктивнаяОбластьОтбора = ЗНАЧЕНИЕ(Справочник.усОбластиОтбора.ПустаяСсылка)// Пример 3а. выборка по условию не заполненного поля, имеющего тип “документ конкретного типа”|ГДЕ| НашРегистрСведений.

Документ = ЗНАЧЕНИЕ(Документ.НашДокумент.ПустаяСсылка)// Пример 3б. выборка по условию не заполненного поля, имеющего тип “документы разных типов” (составное поле)|ГДЕ| (НашРегистрСведений.Документ = ЗНАЧЕНИЕ(Документ.НашДокумент1.ПустаяСсылка)| ИЛИ НашРегистрСведений.Документ = ЗНАЧЕНИЕ(Документ.НашДокумент2.ПустаяСсылка)| ИЛИ…(и т.д.

– последовательно перечисляем условия для всех возможных типов этого составного поля))// Пример 4. или наоборот, если нужно выбрать заполненное значение типа “строка”, то поможет условие:|ГДЕ| усЕдиницыХранения.Наименование > “”””// Пример 5.

если нужно выбрать документы конкретного типа, при составном типе данных, например в регистре “ВыполняемыеЗадания” ресурс “Задание” имеет составной тип, среди значений которого возможен документ “Отбор”|ГДЕ| ВЫРАЗИТЬ(РегистрСведенийВыполняемыеЗадания.Задание КАК Документ.Отбор) ССЫЛКА Документ.Отбор// Пример 5а.

Еще аналогичный пример, когда нужно выбрать документы конкретного типа| ВЫБОР| КОГДА ВЫРАЗИТЬ(агСоответствиеДокументов.ДокументБУ КАК Документ.ПоступлениеТоваровУслуг) ССЫЛКА Документ.ПоступлениеТоваровУслуг| ТОГДА “”ПоступлениеТоваровУслуг””| КОГДА ВЫРАЗИТЬ(агСоответствиеДокументов.ДокументБУ КАК Документ.РеализацияТоваровУслуг) ССЫЛКА Документ.

РеализацияТоваровУслуг| ТОГДА “”РеализацияТоваровУслуг””| ИНАЧЕ “”””| КОНЕЦ КАК ВидДокумента// Пример 6. выбор по условию не определенного значения:|ГДЕ| СохраненныеНастройки.Пользователь = НЕОПРЕДЕЛЕНО// Пример 7. выбор по виду движения “Приход” регистра накопления, “Расход” – аналогично):|ГДЕ| РегТоварыВРознице.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.

Приход)// Пример 8. Как в запросе указать, что выполнять запрос не нужно (например,нужно программно в зависимости от какого-то условия вернуть пустой результат запроса – Запрос.Текст = СтрЗаменить(Запрос.Текст, “ГДЕ Док.Ссылка = &ДокументСсылка”, “ГДЕ ЛОЖЬ”);).Для этого достаточно добавить условие “Где Ложь”.

Кстати, независимо от объема запрашиваемых в выборке данных, такой запрос будет выполнен мгновенно.|ГДЕ ЛОЖЬ// Пример 9. Проверка на то, что результат выполнения запроса содержит данные:Если НЕ Запрос.Выполнить().Пустой() Тогда// Пример 10. выбор по условию не заполненной даты:|ГДЕ| тбСтроки.ДатаОтмены = ДАТАВРЕМЯ(1, 1, 1)

В языке запросов 1С часто требуется проверить: является ли значение пустой ссылкой.
Пустая ссылка — это такое значение ссылочных объектов, когда оно имеет этот же тип, но само значение не выбрано.

На языке программирования 1С данное значение можно получить через менеджеры объекта.

Например:

  • Перечисления.Пол.ПустаяСсылка(),
  • Справочники.Организации.ПустаяСсылка(),
  • ПланыСчетов.Хозрасчетный.ПустаяСсылка(),
  • ПредопредленноеЗначение(«ПланСчетов.Хозрасчетный.ПустаяСсылка»)

Быстрый переход

Как же в запросе 1С сравнить на пустое значение

Для этого у нас есть несколько вариантов в зависимости от требований задачи:

1.Если требуется получить значение пустого типа

Воспользуемся функцией ЗНАЧЕНИЕ()

Выбрать
ЗНАЧЕНИЕ (Перечисление.Пол.ПустаяСсылка)//Без вопроса в единственном числе

Либо через переданный в запрос параметр: Выбрать

&ПустойПараметрНужногоТипа

2. Если требуется сравнить со значением не составного типа:

Выбрать
Значение(Перечисление.Пол.ПустаяСсылка)Значение(Перечисление.Пол.Мужской) как ЭтоБулевоИстина

Выбрать
Выбор когда &ПустойПараметрНужногоТипа ИЛИ Значение(Перечисление.Пол.Мужской) Тогда Истина Иначе Ложь Конец как ЭтоНеЖенскийПол

3. Если требуется проверка составного значения:

В этом случае значение

  • может быть неопределенного типа (очищено или ни разу не выбрано)
  • пустой ссылкой любого из типов (выбран тип, но не выбрано значение)
  • выбранным значением любого из типов (выбрано значение)

В этом случае обычно первые два варианта считаются пустым значением, но пустыми ссылками являются только вторые.

//Мы инициализировали массив заполненных значений и сравнили его с пустым

Выбор когда ЗНАЧЕНИЕ(Значение(Перечисление.Пол.ПустаяСсылка) в (Значение(Перечисление.Пол.Мужской),Значение(Перечисление.Пол.Женский)) ИЛИ Есть NULL Тогда Истина Иначе Ложь конец ЗначениеПустое

//Мы инициализировали массив пустых ссылок и проверили вхождение в него нашего «неизвестного» значения

Выбор когда ЗНАЧЕНИЕ(Значение(Перечисление.Пол.Мужской) в (Значение(Перечисление.Пол.ПустаяСсылка),Значение(Справочник.Контрагенты.ПустаяСсылка)) Тогда Истина Иначе Ложь конец ЗначениеПустое

Также мы можем передать массив параметром

Выбрать Выбор когда ЗНАЧЕНИЕ(Значение(Перечисление.Пол.ПустаяСсылка) в (&МассивВсехПустыхСсылок) Тогда Истина Иначе Ложь конец ЗначениеПустое

Про перечисление в запросе 1С.

Запрос.Текст = “ВЫБРАТЬ | усЕдиницыХранения.Ссылка |ИЗ | Справочник.усЕдиницыХранения КАК усЕдиницыХранения // Пример 1. сравнение с не заполненным булевым значением: |ГДЕ | усЕдиницыХранения.РазрешитьОтборИзРезервнойЗоны = Ложь // Пример 2. но если это булево определено, то лучше так: // условие на отрицательное булево: |ГДЕ | НЕ усЕдиницыХранения.

РазрешитьОтборИзРезервнойЗоны // Пример 3. выборка по условию не заполненного поля, имеющего тип “справочник конкретного типа” |ГДЕ | усЕдиницыХранения.АктивнаяОбластьОтбора = ЗНАЧЕНИЕ(Справочник.усОбластиОтбора.ПустаяСсылка) // Пример 3а. выборка по условию не заполненного поля, имеющего тип “документ конкретного типа” |ГДЕ | НашРегистрСведений.

Документ = ЗНАЧЕНИЕ(Документ.НашДокумент.ПустаяСсылка) // Пример 3б. выборка по условию не заполненного поля, имеющего тип “документы разных типов” (составное поле) |ГДЕ | (НашРегистрСведений.Документ = ЗНАЧЕНИЕ(Документ.НашДокумент1.ПустаяСсылка) | ИЛИ НашРегистрСведений.Документ = ЗНАЧЕНИЕ(Документ.НашДокумент2.ПустаяСсылка) | ИЛИ…(и т.д.

– последовательно перечисляем условия для всех возможных типов этого составного поля)) // Пример 4. или наоборот, если нужно выбрать заполненное значение типа “строка”, то поможет условие: |ГДЕ | усЕдиницыХранения.Наименование > “””” // Пример 5.

если нужно выбрать документы конкретного типа, при составном типе данных, например в регистре “ВыполняемыеЗадания” ресурс “Задание” имеет составной тип, среди значений которого возможен документ “Отбор” |ГДЕ | ВЫРАЗИТЬ(РегистрСведенийВыполняемыеЗадания.Задание КАК Документ.Отбор) ССЫЛКА Документ.Отбор // Пример 5а.

Еще аналогичный пример, когда нужно выбрать документы конкретного типа | ВЫБОР | КОГДА ВЫРАЗИТЬ(агСоответствиеДокументов.ДокументБУ КАК Документ.ПоступлениеТоваровУслуг) ССЫЛКА Документ.ПоступлениеТоваровУслуг | ТОГДА “”ПоступлениеТоваровУслуг”” | КОГДА ВЫРАЗИТЬ(агСоответствиеДокументов.ДокументБУ КАК Документ.РеализацияТоваровУслуг) ССЫЛКА Документ.

РеализацияТоваровУслуг | ТОГДА “”РеализацияТоваровУслуг”” | ИНАЧЕ “””” | КОНЕЦ КАК ВидДокумента // Пример 6. выбор по условию не определенного значения: |ГДЕ | СохраненныеНастройки.Пользователь = НЕОПРЕДЕЛЕНО // Пример 7. выбор по виду движения “Приход” регистра накопления, “Расход” – аналогично): |ГДЕ | РегТоварыВРознице.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.

Приход) // Пример 8. Как в запросе указать, что выполнять запрос не нужно (например,нужно программно в зависимости от какого-то условия вернуть пустой результат запроса – Запрос.Текст = СтрЗаменить(Запрос.Текст, “ГДЕ Док.Ссылка = &ДокументСсылка”, “ГДЕ ЛОЖЬ”);).Для этого достаточно добавить условие “Где Ложь”.

Кстати, независимо от объема запрашиваемых в выборке данных, такой запрос будет выполнен мгновенно. |ГДЕ ЛОЖЬ // Пример 9. Проверка на то, что результат выполнения запроса содержит данные: Если НЕ Запрос.Выполнить().Пустой() Тогда // Пример 10. выбор по условию не заполненной даты: |ГДЕ | тбСтроки.ДатаОтмены = ДАТАВРЕМЯ(1, 1, 1)

Предопределенные значения объектов конфигурации отличный способ заполнить 1с распространенными значениями, а в бухгалтерских конфигурациях в плане счетов без этого не обойтись, ведь набор счетов жестко регламентирован.

Быстрый переход

Как же работать с предопределенными значениями?

В коде модулей обращение к таким элементам производится через менеджер объекта, например:

В языке запросов это производится аналогично, но с использованием функции запросов ЗНАЧЕНИЕ().
Функция значение предназначена для получения ссылки на предопределенные значения справочников, перечислений, планов видов характеристик, планов счетов, планов видов расчетов, точек маршрутов бизнес процессов, к системным перечислениям.

При этом имя вида объекта указывается в запросе в единственном числе.

Примеры использования ЗНАЧЕНИЕ():

ВЫБРАТЬ ЗНАЧЕНИЕ(Справочник.ВидыНоменклатуры.Услуга)

Для проверки на пустое значение справочника:

Справочник.Контрагенты КАК Контрагенты

Контрагенты.ОсновнойДоговорКонтрагента = ЗНАЧЕНИЕ(Справочник.ДоговорыКонтрагентов.ПустаяСсылка)

Для получения перечислений:

Справочник.ДоговорыКонтрагентов КАК Договор

Договор.ВидДоговора = ЗНАЧЕНИЕ(Перечисление.ВидыДоговоровКонтрагентов.СПокупателем)

ИЛИ Договор.ВидДоговора = ЗНАЧЕНИЕ (Перечисление.ВидыДоговоровКонтрагентов.ПустаяСсылка)

План видов характеристик:

ВЫБРАТЬ ЗНАЧЕНИЕ(ПланВидовХарактеристик.НастройкиПользователей.ПустаяСсылка)

Счет в плане счетов:

ВЫБРАТЬ ЗНАЧЕНИЕ (ПланСчетов.Хозрасчетный.Товары) КАК СчетТоваров

Системные перечисления:

ВЫБРАТЬ ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход) КАК Расход, ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход) КАК Приход, ЗНАЧЕНИЕ(ВидДвиженияБухгалтерии.Дебет) КАК Дебет, ЗНАЧЕНИЕ(ВидДвиженияБухгалтерии.Кредит) КАК Кредит, ЗНАЧЕНИЕ(ВидСчета.Активный) КАК Активный, ЗНАЧЕНИЕ(ВидСчета.Пассивный) КАК Пассивный,

ЗНАЧЕНИЕ(ВидСчета.АктивноПассивный) КАК АктивноПассивный

Аналог функции ЗначениеЗаполнено() в запросе

  • В явном виде функции на заполнение нет, но возможна проверка на несовпадение, например:

ГДЕ НЕ ОсновнойДоговорКонтрагента = ЗНАЧЕНИЕ(Справочник.ДоговорыКонтрагента.ПустаяСсылка)

  • проверка на невхождение в список:

ГДЕ НЕ ОсновнойДоговорКонтрагента В (ЗНАЧЕНИЕ(Справочник.ДоговорыКонтрагента.ПустаяСсылка), НЕОПРЕДЕЛЕНО, NULL,””)

То есть, если значение не пустое или не входит в список пустых, его можно считать заполненным.

Ошибки при использовании ЗНАЧЕНИЕ()

При неверном синтаксисе параметра функции возникает ошибка «Неверные параметры».

  • указание во множественном числе (например «Справочники» вместо «Справочник»)
  • не верное имя предопределенного или его отсутствие

Недопустима передача в ЗНАЧЕНИЕ параметра вот так:

ЗНАЧЕНИЕ(&Параметр)

Выйдет ошибка «Ожидается параметр»:

Функция как раз предназначена для ухода от параметров для предопределенных в метаданных ссылках.

Не требуется указание параметра функции в кавычках: это вызовет ошибку «Ожидается имя»

Источник: https://musings.ru/gift/proverka-na-zapolnennoe-znachenie-v-zaprose-1s-znachenie-v/

4 приема отладки запросов в типовых конфигурациях – на примере УТ 11.3 и УПП 1.3

Значение заполнено в запросе 1с 8.3. Значение() в запросе

В типовых конфигурациях используются массивные запросы до нескольких тысяч строк. Разобраться «с наскока» в таких запросах не получится.

Тексты этих запросов представляют собой пакеты с десятками временных таблиц.

Умение быстро просмотреть содержимое каждой временной таблицы (по сути – каждого отдельного этапа получения данных) существенно упрощает жизнь внедренцам, позволяет понять логику работы запроса, найти допущенную ошибку.

В текущей статье мы рассмотрим несколько приемов, которые помогут Вам анализировать и дорабатывать типовые конфигурации.

Начнем с ответа на популярный вопрос:

Для примера рассмотрим конфигурацию «Управление торговлей», редакция 11.3.

При закрытии кассовой смены пробитые чеки ККМ архивируются, все данные о продажах переносятся в документ Отчет о розничных продажах.

Проанализируем, какой запрос используется при закрытии кассовой смены.

В общем модуле РозничныеПродажи есть функция ЗаполнитьОтчетОРозничныхПродажах. Именно в ней и содержится текст запроса, который получает данные о чеках ККМ, пробитых за текущую кассовую смену. Приведем фрагмент этой процедуры.

Функция ЗаполнитьОтчетОРозничныхПродажах(ОтчетОРозничныхПродажахОбъект, КассоваяСмена, ОписаниеОшибки = “”) Экспорт УстановитьПривилегированныйРежим(Истина); // Заполнение отчета о розничных продажах Попытка МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; // Подготовка данных. ТекстЗапроса = “ВЫБРАТЬ | ЧекККМТовары.Ссылка КАК Ссылка, | ЧекККМТовары.

КлючСвязи КАК КлючСвязи, | ЧекККМТовары.Номенклатура КАК Номенклатура, | ЧекККМТовары.Характеристика КАК Характеристика, | ЧекККМТовары.Серия КАК Серия, | ЧекККМТовары.Упаковка КАК Упаковка, | ВЫРАЗИТЬ(ВЫБОР | КОГДА | ЧекККМТовары.СуммаРучнойСкидки + ЧекККМТовары.СуммаАвтоматическойСкидки = 0 | ИЛИ ЧекККМТовары.КоличествоУпаковок = 0 | ТОГДА | ЧекККМТовары.Цена | ИНАЧЕ | ЧекККМТовары.

Сумма / ЧекККМТовары.КоличествоУпаковок | КОНЕЦ КАК Число(15,2)) КАК Цена, | ЧекККМТовары.СтавкаНДС КАК СтавкаНДС, | ЧекККМТовары.КоличествоУпаковок КАК КоличествоУпаковок, | ЧекККМТовары.Количество КАК Количество, | ЧекККМТовары.Сумма КАК Сумма, | ЧекККМТовары.СуммаНДС КАК СуммаНДС, | ЧекККМТовары.Ссылка.Склад КАК Склад, | ЧекККМТовары.Ссылка.Партнер КАК Партнер, | ЧекККМТовары.

Помещение КАК Помещение, | ЧекККМТовары.Продавец КАК Продавец, | ЧекККМТовары.Ссылка.Валюта КАК Валюта, | ЧекККМТовары.Ссылка.ВидЦены КАК ВидЦены, | ЧекККМТовары.Ссылка.КассаККМ КАК КассаККМ, | ЧекККМТовары.Ссылка.Организация КАК Организация, | ЧекККМТовары.Ссылка.НалогообложениеНДС КАК НалогообложениеНДС | |ПОМЕСТИТЬ Товары | |ИЗ | Документ.ЧекККМ.Товары КАК ЧекККМТовары |ГДЕ | ЧекККМТовары.

Ссылка.КассоваяСмена = &КассоваяСмена | И ЧекККМТовары.Ссылка.Проведен | И ЧекККМТовары.Ссылка.НомерЧекаККМ > 0 | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ | ЧекККМТовары.Ссылка, | 0, | ЧекККМТовары.Номенклатура, | ЧекККМТовары.Характеристика, | ЧекККМТовары.Серия, | ЧекККМТовары.Упаковка, | ЧекККМТовары.Цена, | ЧекККМТовары.СтавкаНДС, | -ЧекККМТовары.КоличествоУпаковок, | -ЧекККМТовары.

Количество, | -ЧекККМТовары.Сумма, | -ЧекККМТовары.СуммаНДС, | ЧекККМТовары.Ссылка.Склад, | ЧекККМТовары.Ссылка.Партнер, | ЧекККМТовары.Помещение, | ЧекККМТовары.Продавец, | ЧекККМТовары.Ссылка.Валюта, | ЧекККМТовары.Ссылка.ВидЦены, | ЧекККМТовары.Ссылка.КассаККМ, | ЧекККМТовары.Ссылка.Организация, | ЧекККМТовары.Ссылка.НалогообложениеНДС |ИЗ | Документ.ЧекККМВозврат.

Товары КАК ЧекККМТовары |ГДЕ | ЧекККМТовары.Ссылка.КассоваяСмена = &КассоваяСмена | И ЧекККМТовары.Ссылка.Проведен | И ЧекККМТовары.Ссылка.НомерЧекаККМ > 0 |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ЧекККМТовары.Ссылка КАК Ссылка, | ЧекККМТовары.Номенклатура КАК Номенклатура, | ЧекККМТовары.

Характеристика КАК Характеристика, | ЧекККМТовары.Серия КАК Серия, | ЧекККМТовары.Упаковка КАК Упаковка, | ЧекККМТовары.Цена КАК Цена, | ЧекККМТовары.СтавкаНДС КАК СтавкаНДС, | ЧекККМТовары.КоличествоУпаковок КАК КоличествоУпаковок, | ЧекККМТовары.Количество КАК Количество, | ЧекККМТовары.Сумма КАК Сумма, | ЧекККМТовары.СуммаНДС КАК СуммаНДС, | ЧекККМТовары.Склад КАК Склад, | ЧекККМТовары.

Партнер КАК Партнер, | ЧекККМТовары.Помещение КАК Помещение, | ЧекККМТовары.Продавец КАК Продавец, | ЧекККМТовары.Валюта КАК Валюта, | ЧекККМТовары.ВидЦены КАК ВидЦены, | ЧекККМТовары.КассаККМ КАК КассаККМ, | ЧекККМТовары.Организация КАК Организация, | ЧекККМТовары.

НалогообложениеНДС КАК НалогообложениеНДС | |ПОМЕСТИТЬ СписокТоваров |ИЗ | Товары КАК ЧекККМТовары |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ РАЗЛИЧНЫЕ | СписокТоваров.

Ссылка КАК Ссылка |ПОМЕСТИТЬ ЧекиККМ |ИЗ | СписокТоваров КАК СписокТоваров |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ЧекиККМ.Ссылка КАК Ссылка |ИЗ | ЧекиККМ КАК ЧекиККМ |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ РАЗЛИЧНЫЕ | СписокТоваров.Валюта КАК Валюта, | СписокТоваров.

ВидЦены КАК ВидЦены, | СписокТоваров.КассаККМ КАК КассаККМ, | СписокТоваров.Организация КАК Организация, | СписокТоваров.НалогообложениеНДС КАК НалогообложениеНДС, | СписокТоваров.Склад КАК Склад |ИЗ | СписокТоваров КАК СписокТоваров |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ РАЗЛИЧНЫЕ | СписокТоваров.

Номенклатура КАК Номенклатура, | СписокТоваров.Характеристика КАК Характеристика, | СписокТоваров.Серия КАК Серия, | СписокТоваров.Упаковка КАК Упаковка, | СписокТоваров.Цена КАК Цена, | СписокТоваров.СтавкаНДС КАК СтавкаНДС |ИЗ | СписокТоваров КАК СписокТоваров |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | КассоваяСмена.

ОкончаниеКассовойСмены КАК ОкончаниеКассовойСмены |Из | Документ.КассоваяСмена КАК КассоваяСмена |ГДЕ КассоваяСмена.Ссылка = &КассоваяСмена |”; Запрос = Новый Запрос; Запрос.Текст = ТекстЗапроса; Запрос.УстановитьПараметр(“КассоваяСмена”, КассоваяСмена); Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц; МассивРезультатов = Запрос.ВыполнитьПакет(); … КонецФункции

В приведенном программном коде первым делом создается экземпляр менеджера временных таблиц. Именно в нем будут храниться создаваемые временные таблицы.

Далее создается запрос, осуществляется связь запроса с ранее созданным менеджером временных таблиц. Видно, что в тексте запроса несколько раз встречается ключевое слово ПОМЕСТИТЬ. Значит, при выполнении такого запроса происходит создание нескольких временных таблиц.

При отладке этого фрагмента программного кода может возникнуть потребность просмотреть содержимое временных таблиц. Рассмотрим, как это можно сделать.

В последней строке программного кода происходит выполнение пакета запросов. В результате система возвращает массив, куда последовательно помещаются результаты выполнения отдельных запросов пакета:

В пакете первый запрос создает временную таблицу Товары. Результат такого запроса содержит одну колонку Количество и одну строку, куда помещается количество записей в созданной временной таблице:

Выгрузим результат этого запроса в таблицу значений:

Можно увидеть, что в созданной временной таблице находятся три записи, но сами значения, помещенные во временную таблицу, отсутствуют, поскольку в результате запроса с ключевым словом ПОМЕСТИТЬ содержится только количество записей в созданной временной таблице, а не сами записи.

Чтобы просмотреть содержимое временной таблицы, в типовой конфигурации «Управление торговлей», редакция 11.3 была реализована вспомогательная экспортная функция ПоказатьВременнуюТаблицу общего модуля ОбщегоНазначенияУТ.

В качестве параметров нужно передать менеджер временных таблиц (или сам запрос) и имя самой временной таблицы, которую требуется просмотреть. Функция возвращает таблицу значений. Следовательно, в конфигураторе в окне Вычислить выражение можно получить саму временную таблицу:

Функция выглядит следующим образом:

Функция ПоказатьВременнуюТаблицу(МенеджерВременныхТаблицИлиЗапрос, ИмяВременнойТаблицы) Экспорт ЗакрытьМенеджерВременныхТаблиц = Ложь; Если ТипЗнч(МенеджерВременныхТаблицИлиЗапрос) = Тип(“Запрос”) Тогда Если МенеджерВременныхТаблицИлиЗапрос.

МенеджерВременныхТаблиц = Неопределено Тогда МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; ЗакрытьМенеджерВременныхТаблиц = Истина; МенеджерВременныхТаблицИлиЗапрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц; Иначе МенеджерВременныхТаблиц = МенеджерВременныхТаблицИлиЗапрос.

МенеджерВременныхТаблиц; КонецЕсли; МенеджерВременныхТаблицИлиЗапрос.

Выполнить(); Иначе МенеджерВременныхТаблиц = МенеджерВременныхТаблицИлиЗапрос; КонецЕсли; ДанныеТаблицы = ЗапросВыполнитьВыгрузить(“ВЫБРАТЬ * ИЗ ” + ИмяВременнойТаблицы,, МенеджерВременныхТаблиц); Если ЗакрытьМенеджерВременныхТаблиц Тогда МенеджерВременныхТаблиц.Закрыть(); МенеджерВременныхТаблицИлиЗапрос.

МенеджерВременныхТаблиц = Неопределено; КонецЕсли; Возврат ДанныеТаблицы; КонецФункции Функция ЗапросВыполнитьВыгрузить(ТекстЗапроса, ПараметрыЗапроса = Неопределено, МенеджерВременныхТаблиц = Неопределено) Экспорт Запрос = Новый Запрос(ТекстЗапроса); Если МенеджерВременныхТаблиц Неопределено Тогда Запрос.

МенеджерВременныхТаблиц = МенеджерВременныхТаблиц; КонецЕсли; Если ЗначениеЗаполнено(ПараметрыЗапроса) Тогда Для Каждого Параметр Из ПараметрыЗапроса Цикл Запрос.УстановитьПараметр(Параметр.Ключ, Параметр.Значение); КонецЦикла; КонецЕсли; Возврат Запрос.Выполнить().Выгрузить(); КонецФункции

Итак, при помощи подобной функции можно при отладке просмотреть содержимое временной таблицы.

Функция ПоказатьВременнуюТаблицу из общего модуля ОбщегоНазначенияУТ присутствует в конфигурациях «Управление торговлей», редакция 11.3, «Комплексная автоматизация», редакция 2, «ERP Управление предприятием 2».

Если в конфигурации нет аналогичной функции (например, в «1С:Бухгалтерии» или «Управление небольшой фирмой» нет такого общего модуля и такой функции), то ее можно реализовать самостоятельно, например, в общем модуле, а затем использовать при отладке. Самый простой вариант функции будет выглядеть следующим образом:

Функция ПоказатьВременнуюТаблицу(МенеджерВременныхТаблиц, ИмяВременнойТаблицы) Экспорт Запрос = Новый Запрос; Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц; Запрос.Текст = “ВЫБРАТЬ * ИЗ ” + ИмяВременнойТаблицы; Возврат Запрос.Выполнить().Выгрузить(); КонецФункции

Свойства менеджера временных таблиц, появившиеся в платформе 8.3.8

В предыдущем разделе для получения содержимого временной таблицы нужно было воспользоваться функцией из конфигурации. Было бы намного удобнее, если бы возможности просмотра временных таблиц были реализованы прямо в платформе. И в платформе 8.3.8 такие возможности были добавлены.

У менеджера временных таблиц есть свойство Таблицы. Это коллекция, которая содержит временные таблицы, хранящиеся в менеджере временных таблиц:

Для каждой временной таблицы можно получить имя (свойство ПолноеИмя) и список колонок (свойство Колонки). Метод ПолучитьДанные() временной таблицы запроса возвращает значение типа РезультатЗапроса. Соответственно, можно вывести содержимое самой временной таблицы:

Также у объекта встроенного языка Запрос появился новый метод ВыполнитьПакетСПромежуточнымиДанными():

Результат работы этого метода аналогичен методу ВыполнитьПакет(), но есть важное отличие.

Когда используется метод ВыполнитьПакет(), то для временной таблицы в результате мы получаем количество записей, которое было помещено во временную таблицу. При использовании метода ВыполнитьПакетСПромежуточнымиДанными() вместо количества записей будет возвращено содержимое этой временной таблицы:

Значит, теперь нет необходимости реализовывать специальные функции в конфигурациях, а можно использовать новые возможности платформы.

Просмотр временных таблиц при проведении документа Расчет себестоимости в УПП 1.3

В конфигурации «Управление производственным предприятием», редакция 1.3 документ Расчет себестоимости – один из самых сложных с точки зрения используемых алгоритмов. И в запросах, которые выполняются при проведении этого документа, используется достаточно большое количество временных таблиц. И зачастую при отладке нужно знать, какие именно данные в этих таблицах размещаются.

Рассмотрим, какие возможности есть в конфигурации УПП.

Рассмотрим для примера, как просмотреть содержимое временной таблицы, которая формируется при проведении документа на шаге Расчет базы распределения косвенных расходов (используется партионный учет):

В конфигураторе устанавливаем точку останова в процедуре ОбработкаПроведения. В пользовательском режиме запускаем проведение документа. Происходит остановка на точке.

Теперь по шагам можно пройти все выполняемые строки программного кода, определить, где именно происходит расчет базы распределения.

Это процедура ВыполнениеДействийДокумента в модуле объекта, где последовательно выполняются действия, указанные пользователем в форме документа.

Для расчета базы происходит переход к процедуре РассчитатьБазуРаспределения общего модуля ПроцедурыРасчетаБазыРаспределенияЗатрат, в которой встречается следующий фрагмент программного кода:

// Вызывается процедура формирования запроса по временной таблице. Используется при отладке алгоритмов. // Для просмотра временной таблицы в структуре шапки документа поле “ОтладочныйРежим” должно иметь значение “Истина”. ИмяВременнойТаблицы = “БазаРаспределения” + СуффиксИмениРегистра; РасширеннаяАналитикаУчета.ПоказатьВременнуюТаблицу( СтруктураПараметров, МенеджерВременныхТаблиц, ИмяВременнойТаблицы );

Сама процедура ПоказатьВременнуюТаблицу() выглядит следующим образом:

Процедура ПоказатьВременнуюТаблицу( СтруктураШапкиДокумента, МенеджерВременныхТаблиц, ИмяВременнойТаблицы ) Экспорт Если Не СтруктураШапкиДокумента.Свойство(“ОтладочныйРежим”) ИЛИ Не СтруктураШапкиДокумента.ОтладочныйРежим Тогда Возврат; КонецЕсли; ТекстЗапроса = ” |ВЫБРАТЬ | * |ИЗ | ИмяВременнойТаблицы |”; Запрос = Новый Запрос; Запрос.

Текст = СтрЗаменить(ТекстЗапроса, “ИмяВременнойТаблицы”, ИмяВременнойТаблицы); Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц; РезультатЗапроса = Запрос.Выполнить(); КонецПроцедуры // ПоказатьВременнуюТаблицу()

Первым делом необходимо включить отладочный режим в структуре шапки документа.

Для этого в окне Вычислить выражение (Shift + F9) указать:

Источник: https://xn----1-bedvffifm4g.xn--p1ai/articles/2017-09-07-4-methods-of-query-debugging/

1с значение заполнено в запросе

Значение заполнено в запросе 1с 8.3. Значение() в запросе

-Качество услуг-1с значение заполнено в запросе.

Запрос.Текст =”ВЫБРАТЬ| усЕдиницыХранения.Ссылка|ИЗ| Справочник.усЕдиницыХранения КАК усЕдиницыХранения// Пример 1. сравнение с не заполненным булевым значением:|ГДЕ| усЕдиницыХранения.РазрешитьОтборИзРезервнойЗоны = Ложь// Пример 2. но если это булево определено, то лучше так: // условие на отрицательное булево:|ГДЕ| НЕ усЕдиницыХранения.

РазрешитьОтборИзРезервнойЗоны// Пример 3. выборка по условию не заполненного поля, имеющего тип “справочник конкретного типа”|ГДЕ| усЕдиницыХранения.АктивнаяОбластьОтбора = ЗНАЧЕНИЕ(Справочник.усОбластиОтбора.ПустаяСсылка)// Пример 3а. выборка по условию не заполненного поля, имеющего тип “документ конкретного типа”|ГДЕ| НашРегистрСведений.

Документ = ЗНАЧЕНИЕ(Документ.НашДокумент.ПустаяСсылка)// Пример 3б. выборка по условию не заполненного поля, имеющего тип “документы разных типов” (составное поле)|ГДЕ| (НашРегистрСведений.Документ = ЗНАЧЕНИЕ(Документ.НашДокумент1.ПустаяСсылка)| ИЛИ НашРегистрСведений.Документ = ЗНАЧЕНИЕ(Документ.НашДокумент2.ПустаяСсылка)| ИЛИ…(и т.д.

– последовательно перечисляем условия для всех возможных типов этого составного поля))// Пример 4. или наоборот, если нужно выбрать заполненное значение типа “строка”, то поможет условие:|ГДЕ| усЕдиницыХранения.Наименование > “”””// Пример 5.

если нужно выбрать документы конкретного типа, при составном типе данных, например в регистре “ВыполняемыеЗадания” ресурс “Задание” имеет составной тип, среди значений которого возможен документ “Отбор”|ГДЕ| ВЫРАЗИТЬ(РегистрСведенийВыполняемыеЗадания.Задание КАК Документ.Отбор) ССЫЛКА Документ.Отбор// Пример 5а.

Еще аналогичный пример, когда нужно выбрать документы конкретного типа| ВЫБОР| КОГДА ВЫРАЗИТЬ(агСоответствиеДокументов.ДокументБУ КАК Документ.ПоступлениеТоваровУслуг) ССЫЛКА Документ.ПоступлениеТоваровУслуг| ТОГДА “”ПоступлениеТоваровУслуг””| КОГДА ВЫРАЗИТЬ(агСоответствиеДокументов.ДокументБУ КАК Документ.РеализацияТоваровУслуг) ССЫЛКА Документ.

РеализацияТоваровУслуг| ТОГДА “”РеализацияТоваровУслуг””| ИНАЧЕ “”””| КОНЕЦ КАК ВидДокумента// Пример 6. выбор по условию не определенного значения:|ГДЕ| СохраненныеНастройки.Пользователь = НЕОПРЕДЕЛЕНО// Пример 7. выбор по виду движения “Приход” регистра накопления, “Расход” – аналогично):|ГДЕ| РегТоварыВРознице.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.

Приход)// Пример 8. Как в запросе указать, что выполнять запрос не нужно (например,нужно программно в зависимости от какого-то условия вернуть пустой результат запроса – Запрос.Текст = СтрЗаменить(Запрос.Текст, “ГДЕ Док.Ссылка = &ДокументСсылка”, “ГДЕ ЛОЖЬ”);).Для этого достаточно добавить условие “Где Ложь”.

Кстати, независимо от объема запрашиваемых в выборке данных, такой запрос будет выполнен мгновенно.|ГДЕ ЛОЖЬ// Пример 9. Проверка на то, что результат выполнения запроса содержит данные:Если НЕ Запрос.Выполнить().Пустой() Тогда// Пример 10. выбор по условию не заполненной даты:|ГДЕ| тбСтроки.ДатаОтмены = ДАТАВРЕМЯ(1, 1, 1)

В языке запросов 1С часто требуется проверить: является ли значение пустой ссылкой.
Пустая ссылка — это такое значение ссылочных объектов, когда оно имеет этот же тип, но само значение не выбрано.

На языке программирования 1С данное значение можно получить через менеджеры объекта.

Например:

  • Перечисления.Пол.ПустаяСсылка(),
  • Справочники.Организации.ПустаяСсылка(),
  • ПланыСчетов.Хозрасчетный.ПустаяСсылка(),
  • ПредопредленноеЗначение(«ПланСчетов.Хозрасчетный.ПустаяСсылка»)

Быстрый переход

Пустая дата

Проверка значения на пустую дату производится путем сравнения с конструкцией ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0). Пример использования приведен ниже:

Пустая ссылка в запросе 1С

В случае, когда возвращаемый реквизит имеет ссылочный тип, например, это элемент какого-либо справочника, документа и т. п., используется следующая конструкция: ЗНАЧЕНИЕ(Справочник.ИмяСправочника.ПустаяСсылка).

В приведенном ниже примере запрос выбирает всех партнеров, у которых не указан бизнес-регион.

Чтобы проверить на «ЗначениеЗаполнено» нужно сделать обратное условие:

Партнеры.БизнесРегион ЗНАЧЕНИЕ(Справочник.БизнесРегионы.ПустаяСсылка)

Пустая строка

Для проверки строковых типов производится сравнение с другим образцом. В данном случае – «».

Приведенный ниже запрос отберет всех партнеров с незаполненным наименованием.

В ходе работы с запросами любому программисту приходится так или иначе взаимодействовать с пустыми значениями. Что мы понимаем под пустым значением?

Пустое значение – это или отсутствие значения, или значение по умолчанию для типа данных. С примитивными типами все довольно просто: значением по умолчанию является некое начальное значение, служащее точкой отсчета.

Виды пустых значений

Рассмотрим типы пустых значений, которые могут встретиться или потребоваться в запросе.

  • Для типа Число – пустым значением является ноль – 0.
  • Для типа Строка – пустая строка – «».
  • Для типа Дата – первое января первого года – 01.01.0001 00:00:00. Именно с этой даты ведется отсчет времени в 1С.*
  • Для типа Булево – значением по умолчанию, технически, является Ложь, но логически оба значения типа являются заполненными. Поэтому принятие решения о том пустое значение Ложь или нет, основывается на логике конкретного алгоритма.

*Будьте внимательны, вне 1С существуют различные системы счисления дат с разными точками отсчета.

Отсутствующее значение в полном смысле соответствует только типу Null. Этот тип содержит лишь одно значение, которое обозначает отсутствие значения.

Похожий на него тип Неопределено тоже содержит лишь одно значение, но Неопределено означает не отсутствие данных, а лишь невозможность определить значение по умолчанию для типа. Неопределено является значением по умолчанию для составных, в том числе не определенных явно, типов. Например, значение в новой строке таблицы значений в колонке, для которой тип не определен явно.

Со ссылочными типами намного меньше неопределенности. Все ссылочные типы предусматривают пустое значение.

Пустое значение – это та же самая ссылка с указанием типа данных, но без уникального идентификатора конкретного значения.

Благодаря этому мы можем обращаться с пустой ссылкой как с обычной и применять к ней все предусмотренные платформой методы, работая с ней как с полноценным значением.

Работа с пустыми значениями в запросе

Независимо от того, необходимо ли вам явно ввести в результат запроса пустое значение или сравнить с ним существующие значения, необходимо знать, каким образом описывать пустые значения в запросе.

Типы Число, Строка, Булево описываются в запросе как во встроенном языке:

ВЫБРАТЬ 0 КАК ПримерТипаЧисло, “Привет мир” КАК ПримерТипаСтрока, ИстинаКАК ПримерТипаБулево

Неопределено, являясь по существу примитивным типом, описывается аналогично:

Выбрать Партии.Период Из РегистрНакопления.Партии Как Партии Где Остатки.ДокументПартии = Неопределено

Пустые ссылочные значения определяются немного сложнее. У всех ссылочных объектов предусмотрено предопределенное служебное значение ПустаяСсылка. Благодаря этому есть возможность единым способом выбрать пустую ссылку – через функцию Значение:

Выбрать Значение(Справочник.Номенклатура.ПустаяСсылка) Как Пустая Номенклатура

Возможности работы со значениями типа Null несколько богаче. Как и другие примитивные типы, Null описывается так же, как во встроенном языке. Помимо этого, предусмотрены специальный оператор Есть Null и функция ЕстьNull.

  • Оператор Есть Null позволяет создать логическое выражение сравнивающее выбранное значение со значением Null.
  • Функция ЕстьNull возвращает первый аргумент, если он не равен Null, и второй аргумент в обратном случае.

Выражения, определяющие пустые значения, можно использовать в любых разделах запроса поддерживающих выражения. Например, вы можете добавить пустую ссылку в секцию Выбрать или проверку на Null в Условие.

Практические примеры

С использованием функции Значение

Выбрать Товары.Ссылка Как Номенклатура, Товары.Ссылка = Значение(Справочник.Номенклатура.ПустаяСсылка) Как ЭтаСсылкаПустая Из втТовары Как втТовары

С использованием оператора Есть Null

Выбрать Товары.Ссылка Как Номенклатура, Товары.Ссылка Есть Null Как ЭтаСсылкаПустая Из втТовары Как втТовары

Null при левом или полном соединении

Проверка на Null

Пример демонстрирует частую практическую ситуацию, когда при левом соединении, для первой таблицы не находится соответствия во второй. В этом случае все поля второй таблицы будут равны Null.

Выбрать втТовары.Ссылка Как Номенклатура, Остатки.КоличествоОстаток КакКоличество, Остатки.КоличествоОстаток Есть NullКак НетОстатка Из втТовары как втТовары Левое Соединение РегистрНакопления.ТоварыНаСкладах.Остатки Как Остатки По втТовары.Ссылка =Остатки.Номенклатура

Обработка Null-значений

Модификация предыдущего запроса для демонстрации часто встречающейся методики по получению каких-либо значений по умолчанию, взамен отсутствующих. В данном примере с использованием функции ЕстьNull, производится замена отсутствующего значения остатка, на логически правильное 0.

Выбрать втТовары.Ссылка Как Номенклатура, ЕстьNull(Остатки.КоличествоОстаток, 0) Как Количество Из втТовары как втТовары Левое Соединение РегистрНакопления.ТоварыНаСкладах.Остатки Как Остатки По втТовары.Ссылка = Остатки.Номенклатура

В рамках этой статьи мы рассмотрели различные типы пустых значений и их свойства, изучили способы определения различных типов пустых значений в запросах, а в практической части убедились в простоте применения рассмотренного материала.



Источник: https://lenkom35.ru/the-quality-of-services/1s-znachenie-zapolneno-v-zaprose.html

Примеры запросов в 1С 8

Значение заполнено в запросе 1с 8.3. Значение() в запросе

В запросе воспользуемся функцией КОНЕЦПЕРИОДА(&ДатаКонец, ДЕНЬ), она приведет дату к виду «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(ГТД.

    Количество, 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 ТОГДА «Суббота» ИНАЧЕ «Воскресенье» КОНЕЦ КАК ДеньНедели

В этом примере показано, как с помощью опрератора ВЫБОР выводить текстовое представление дня недели.

Как составить запрос к табличной части документа?

Пример запроса:

Построитель.Текст = «ВЫБРАТЬ
| Товары.Ответственный,
| Товары.Ссылка КАК Документ,
| Товары.Номенклатура,
| СУММА(Товары.Сумма) КАК Сумма
|ИЗ
| Документ.ЧекККМ.Товары КАК Товары
|ГДЕ
| Товары.Ссылка.Дата Между &ДатаНач и &ДатаКон
|СГРУППИРОВАТЬ ПО
| Товары.Ссылка,
| Товары.Ответственный,
| Товары.Номенклатура»;

Особенность этого запроса в том, что мы обращаемся к табличной части «Товары».Поэтому к реквизитам документа «ЧекККМ» мы обращаемся через свойство «Ссылка».Только в этом случае мы сможем получить строки табличной части документа.

Если не указать свойство «Ссылка», то появится ошибка, примерно такого вида:

Источник: https://www.softmaker.kz/zaprosy/primery-zaprosov-v-1s-8.html

Поделиться:
Нет комментариев

    Добавить комментарий

    Ваш e-mail не будет опубликован. Все поля обязательны для заполнения.