1с запрос проверить на пустое значение. Значение() в запросе. Для получения перечислений

Содержание

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

1с запрос проверить на пустое значение. Значение() в запросе. Для получения перечислений

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

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

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

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

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

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

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

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

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

Средства определения пустых ссылок, дат или строк. Рассмотрим, как проверить на пустую ссылку, дату или строку в запросе 1С.

Определить нулевые данные можно путем использования специальных операторов.

Информацию из базы данных 1С запрашивают (а потом получают) с помощью такого инструмента, как язык запросов (Query, англ.). Они составляются на латинице и кириллице.

А одним из ключевых слов-команд (операторов) при получении информации является слово-команда ВЫБРАТЬ (SELECT, англ.) в сочетании с некоторыми конструкциями.

Приведём примеры построения интересующих нас по теме запрашиваемых заданий:

Проверка на содержание NULL

Такое задание выполняется оператором ВЫБРАТЬ в сочетании с конструкцией «ЕСТЬ NULL»:

SELECTЗаказыОстатки.Заказчик,ЗаказыОстатки.КоличествоОстатокИЗРегистрНакопления.Заказы.Остатки КАК ЗаказыОстаткиГДЕ

ЗаказыОстатки.КоличествоОстаток ЕСТЬ NULL

Контроль даты

Пустая дата в запросе 1С вносится построением «ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)»:

SELECTСчетВходящийПоставщика.Link,СчетВходящийПоставщика.ДатаПриходаИЗДокумент. СчетВходящийПоставщика КАК СчетВходящийПоставщикаГДЕ

СчетВходящийПоставщика.ДатаПрихода = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)

Ссылочная проверка

Проверка несуществующих внутриссылочных значений (на планы счетов, справочники и пр.) производится с использованием конструкции «VALUE(Справочник.Имя…ПустаяСсылка)»:

Проверка строки

Пустота в строках обнаруживается с применением пробела в кавычках «»:

SELECTПокупатели.LinkИЗСправочник.Покупатели КАК ПокупателиГДЕ

Покупатели.Код = «»

Ещё о битых и обычных линках

«Битой» считается ссылка (Link, англ.), ведущая (указывающая) на несуществующий элемент. Под несуществующим понимают такой, которого нет в базе данных. Полезно о таких линках знать хотя бы для того, чтобы получать от системы уведомления в более понятной форме. Да и запись, удаление и открытие нереальных объектов не имеет смысла.

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

В системе 1С-7.7

Для «битой» – методом Link.Selected() и функцией ПустоеЗначение() возвращается ноль. Для «пустой» – в первом случае ноль, а во втором – единица. Для «нормальной» – единица и ноль. Получается, в 1С-7.7 «битая» – не является несуществующим значением, которое не считается выбранным.

В системе 1С-8.x

Всё по-другому – в обоих случаях (для «битых» и «обычных») метод возвращает Ложь, а функция – Истину. Решение такое: Для «битой» методом Ссылка.ПолучитьОбъект() возвращается функция «Неопределено».

Для «пустой» – выбрасывается «Ошибка метода контекста». Для «нормальной» – возвращается значение согласно документации; Выходит, в 1С-8.

х «битая» – не будет несуществующей функцией ссылочного типа, которая возвращает Неопределённое значение объекта.

Откуда они берутся

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

Во время работы с конфигурацией она постоянно дорабатывается, обновляется. Какие-то объекты подлежат удалению, изменяется структура. А ссылка на удалённый элемент остаётся в конструкциях и алгоритмах.

Таким образом, несуществующие адреса остаются в системе после удаления самого элемента (вместе с адресом).

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Значение NULL возвращается в том случае, когда реквизита попросту нет. Тип в этом случае будет тоже NULL. Например, вы объединяете две таблицы через левое соединение. В том случае, когда для левой таблицы не будет найдено ни одного значения в правой, вернется NULL.

Проверку на данное значение можно осуществить при помощи конструкции «ЕСТЬ NULL» и « ». В первом случае возвращается Истина или Ложь. Во втором случае можно сразу задать другое значение в том случае, когда возвращается NULL.
В приведенном ниже запросе 1С 8.3 будут возвращен список контактных лиц тех партнеров, у кого не задан сегмент.

ВЫБРАТЬКонтактныеЛицаПартнеров.СсылкаИЗСправочник.КонтактныеЛицаПартнеров КАК КонтактныеЛицаПартнеровВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.СегментыПартнеров КАК СегментыПартнеровПО КонтактныеЛицаПартнеров.Владелец = СегментыПартнеров.РодительГДЕ

СегментыПартнеров.Ссылка ЕСТЬ NULL

Пустая дата

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

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

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

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

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

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

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

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

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

Источник: https://dpoirk.ru/1s-pustoe-znachenie-perechisleniya-v-zaprose-znachenie-v-zaprose/

Программная работа с перечислениями в 1С 8.3

1с запрос проверить на пустое значение. Значение() в запросе. Для получения перечислений

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

Перечисления в 1С.

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

Перечисление в серверном контексте

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

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

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

На этой форме я создал команду, серверный и клиентский обработчик команды.

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

&НаСервереПроцедура СоздатьСправочникНаСервере() НовыйКонтр = Справочники.Контрагенты.СоздатьЭлемент(); НовыйКонтр.Наименование = “Иванов и Партнеры”; НовыйКонтр.Статус = Перечисления.ЮридическийСтатусКонтрегента.ЮрЛицо; НовыйКонтр.Записать();КонецПроцедуры &НаКлиентеПроцедура СоздатьСправочник(Команда) СоздатьСправочникНаСервере();КонецПроцедуры

В этом коде мы создаем объект справочника, заполняем егореквизиты какими-то значениями, а потом сохраняем. Реквизиту Статус мы присваиваем конкретноезначение перечисления ЮридическийСтатусКонтреганта.Вы заметили, что к нужному перечислению мы обращаемся посредством объекта Перечисления, который имеет типа ПеречисленияМенеджер.

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

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

Если по какой-то причине нам не нужно записывать определенное значение перечисления, то мы можем записать пустую ссылку на это перечисление, обратившись к методу менеджера перечисления ПустаяСсылка(). Тогда будет иметь место следующий код.

НовыйКонтр = Справочники.Контрагенты.СоздатьЭлемент();НовыйКонтр.Наименование = “Иванов и Партнеры”;НовыйКонтр.Статус = Перечисления.ЮридическийСтатусКонтрегента.ПустаяСсылка();НовыйКонтр.Записать();

Перечисление в клиентском контексте (на тонком клиенте)

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

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

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

Поскольку в предыдущей статье мы создали перечисление ЮридическийСтатусКонтрегента, то назовем реквизит формы СтатусИП, и будем при выполнении команды в него записывать соответствующее значение перечисления.

Создадим реквизит, поместим его на форму, и также я создам команду, которую помещу на форму.

Для этой команды создадим клиентский обработчик.

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

&НаКлиентеПроцедура Установить(Команда) СтатусИП = Перечисления.ЮридическийСтатусКонтрегента.ИП; КонецПроцедуры

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

Проверим это. Зайдем в параметры конфигурации по пути Главное меню – Сервис – Параметры

В этой форме на закладке Модулив подзакладке Проверка нас интересуетфлаг Тонкий клиент.

Если этот флаг установлен, то при синтаксической проверке модуля, на код, который мы написали ранее, выйдет ошибка.

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

Чтобы получить в режиме тонкого клиента значениеперечисления, нужно использовать метод глобального контекста ПредопределенноеЗначение.В этом случае код будет следующим.
&НаКлиентеПроцедура Установить(Команда) СтатусИП = ПредопределенноеЗначение(“Перечисление.ЮридическийСтатусКонтрегента.ИП”); КонецПроцедуры

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

Если мы сейчас запустим «1С: Предприятие» под тонкимклиентом, то значением в реквизит прекрасно запишется.

Заметили, что обращались мы к имени значения перечисления, ана форме отображается синоним значения.

Перечисление в языке запросов 1С

Рассмотрим, как работать с перечислениями в языке запросов1С.

Более подробно, изучить языка запросов 1С Вы можете в моем курсе «Запросы в 1С для начинающих», промо-код на скидку для читателей блога — hrW0rl9Nnx

Ознакомится с видео-курсом «Запросы в 1С для начинающих».

Для того, чтобы понять как работать с перечислениями в запросе разберем простой и понятный пример. Из справочника Контрагенты отберем только тех, контрагентов, у которых статус ИП. Делать мы это будем сразу в «1С: Предприятии», в консоли запросов.

Скачать консоль запросов для платформы 1С 8.3 можно по этой ссылке.

В консоли запросов откроем конструктор запроса, выберем таблицу Контрагенты и поля этой таблицы Наименование и Статус.

На закладке Условия установим, чтобы отбирались контрагентысо статусом ИП.

В этом случае мы используем функцию Значение языка запросов 1С, где в качестве параметра указываем путьк нужному нам значению перечисления.

У нас должен получиться вот такой запрос:

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

Который будет возвращать контрагентов только с нужнымстатусом.

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

ВЫБРАТЬ ЗНАЧЕНИЕ(Перечисление.ЮридическийСтатусКонтрегента.ИП) КАК Статус ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ЗНАЧЕНИЕ(Перечисление.ЮридическийСтатусКонтрегента.ЮрЛицо)

Который будет возвращать два значения перечисления.

А что делать, если нужен отбор по нескольким значениямиперечислений? Для этого мы объединим два этих запроса: поместим во временнуютаблицу значения двух перечислений, а потом при получении контрагентов,  в условии при помощи оператора множественноговыбора  отберем контрагентов только сдвумя значениями перечислений.

Код запроса будет в этом случае следующим:

ВЫБРАТЬ ЗНАЧЕНИЕ(Перечисление.ЮридическийСтатусКонтрегента.ИП) КАК СтатусПОМЕСТИТЬ втПеречисления ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ЗНАЧЕНИЕ(Перечисление.ЮридическийСтатусКонтрегента.ЮрЛицо); ////////////////////////////////////////////////////////////////////////////////ВЫБРАТЬ Контрагенты.Наименование КАК Наименование, Контрагенты.Статус КАК СтатусИЗ Справочник.Контрагенты КАК КонтрагентыГДЕ Контрагенты.Статус В (ВЫБРАТЬ вт.Статус ИЗ втПеречисления КАК вт)

И этот запрос будет выдавать нужный результат.

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

ВЫБРАТЬ Контрагенты.Наименование КАК Наименование, Контрагенты.Статус КАК СтатусИЗ Справочник.Контрагенты КАК КонтрагентыГДЕ Контрагенты.Статус = &Статус

Который будет выполняться следующим образом.

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

ВЫБРАТЬ Контрагенты.Наименование КАК Наименование, Контрагенты.Статус КАК СтатусИЗ Справочник.Контрагенты КАК КонтрагентыГДЕ Контрагенты.Статус в (&Статусы)

С таким результатом.

Более подробно и основательно конфигурирование в 1С дается в моей книге:

Если Вы всё еще «плаваете» в конструкциях языка запросов, и у Вас вызывают трудности даже самые простые запросы, то рекомендую вам мой курс «Язык запросов в 1С для начинающих». Где эти и многие другие вопросы рассматриваются более подробно.

В чем особенность этого курса:• Курс рассчитан на тех, кто не знаком с языком запросов в 1С;• Учебный материал грамотно скомпонован и прост в освоении;• Несколько десятков уроков;• Полезные практические примеры;

• Все уроки изложены понятным и простым языком

Источник: https://www.1s-up.ru/programmnaja-rabota-s-perechislenijami-v-1s-8-3/

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

1с запрос проверить на пустое значение. Значение() в запросе. Для получения перечислений

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Значение заполнено в запросе 1с 8.2. Значение() в запросе. Для получения перечислений

1с запрос проверить на пустое значение. Значение() в запросе. Для получения перечислений

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

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

Например:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Средства определения пустых ссылок, дат или строк. Рассмотрим, как проверить на пустую ссылку, дату или строку в запросе 1С.

Определить нулевые данные можно путем использования специальных операторов.

Информацию из базы данных 1С запрашивают (а потом получают) с помощью такого инструмента, как язык запросов (Query, англ.). Они составляются на латинице и кириллице.

А одним из ключевых слов-команд (операторов) при получении информации является слово-команда ВЫБРАТЬ (SELECT, англ.) в сочетании с некоторыми конструкциями.

Приведём примеры построения интересующих нас по теме запрашиваемых заданий:

Проверка на содержание NULL

Такое задание выполняется оператором ВЫБРАТЬ в сочетании с конструкцией «ЕСТЬ NULL»:

SELECTЗаказыОстатки.Заказчик,ЗаказыОстатки.КоличествоОстатокИЗРегистрНакопления.Заказы.Остатки КАК ЗаказыОстаткиГДЕ

ЗаказыОстатки.КоличествоОстаток ЕСТЬ NULL

Ссылочная проверка

Проверка несуществующих внутриссылочных значений (на планы счетов, справочники и пр.) производится с использованием конструкции «VALUE(Справочник.Имя…ПустаяСсылка)»:

Ещё о битых и обычных линках

«Битой» считается ссылка (Link, англ.), ведущая (указывающая) на несуществующий элемент. Под несуществующим понимают такой, которого нет в базе данных. Полезно о таких линках знать хотя бы для того, чтобы получать от системы уведомления в более понятной форме. Да и запись, удаление и открытие нереальных объектов не имеет смысла.

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

Откуда они берутся

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

Во время работы с конфигурацией она постоянно дорабатывается, обновляется. Какие-то объекты подлежат удалению, изменяется структура. А ссылка на удалённый элемент остаётся в конструкциях и алгоритмах.

Таким образом, несуществующие адреса остаются в системе после удаления самого элемента (вместе с адресом).

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

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

Значение NULL возвращается в том случае, когда реквизита попросту нет. Тип в этом случае будет тоже NULL. Например, вы объединяете две таблицы через левое соединение. В том случае, когда для левой таблицы не будет найдено ни одного значения в правой, вернется NULL.

Проверку на данное значение можно осуществить при помощи конструкции «ЕСТЬ NULL» и « ». В первом случае возвращается Истина или Ложь. Во втором случае можно сразу задать другое значение в том случае, когда возвращается NULL.
В приведенном ниже запросе 1С 8.3 будут возвращен список контактных лиц тех партнеров, у кого не задан сегмент.

ВЫБРАТЬКонтактныеЛицаПартнеров.СсылкаИЗСправочник.КонтактныеЛицаПартнеров КАК КонтактныеЛицаПартнеровВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.СегментыПартнеров КАК СегментыПартнеровПО КонтактныеЛицаПартнеров.Владелец = СегментыПартнеров.РодительГДЕ

СегментыПартнеров.Ссылка ЕСТЬ NULL

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Источник: https://www.car-ville.ru/znachenie-zapolneno-v-zaprose-1s-8-2-znachenie-v-zaprose-dlya/

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

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

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