Значение в запросе 1С задают функцией ЗНАЧЕНИЕ(): она позволяет прямо в тексте запроса сослаться на значение перечисления, предопределённый элемент справочника, пустую ссылку, счёт или вид движения регистра. Без неё каждую такую константу пришлось бы передавать параметром. Ниже — синтаксис, список допустимых вариантов с примерами, работа в конструкторе и частые ошибки. Язык запросов в целом разобран в статье о синтаксисе запросов 1С.
У функции один аргумент — полное имя значения, записанное без кавычек:
ЗНАЧЕНИЕ(<Вид объекта>.<Имя объекта>.<Имя значения>)
Три правила, из-за которых возникает большая часть ошибок:
Справочник, Перечисление, ПланСчетов. Не Справочники и не Перечисления, как в коде модуля;Писать функцию можно везде, где допустимо выражение: в списке полей, в ГДЕ, в условиях соединения, внутри ВЫБОР, ЕСТЬNULL() и В (...), в параметрах виртуальных таблиц.
| Что нужно получить | Как записать | Пример |
|---|---|---|
| Значение перечисления | Перечисление.Имя.ИмяЗначения | ЗНАЧЕНИЕ(Перечисление.СтатусыЗаказов.Закрыт) |
| Предопределённый элемент справочника | Справочник.Имя.ИмяПредопределенного | ЗНАЧЕНИЕ(Справочник.Склады.Основной) |
| Предопределённый вид характеристики | ПланВидовХарактеристик.Имя.ИмяПредопределенного | ЗНАЧЕНИЕ(ПланВидовХарактеристик.СвойстваОбъектов.Цвет) |
| Предопределённый счёт | ПланСчетов.Имя.ИмяПредопределенного | ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетныеСчета) |
| Предопределённый вид расчёта | ПланВидовРасчета.Имя.ИмяПредопределенного | ЗНАЧЕНИЕ(ПланВидовРасчета.Начисления.Оклад) |
| Пустая ссылка | Вид.Имя.ПустаяСсылка | ЗНАЧЕНИЕ(Документ.ЗаказКлиента.ПустаяСсылка) |
| Точка маршрута бизнес-процесса | БизнесПроцесс.Имя.ТочкаМаршрута.ИмяТочки | ЗНАЧЕНИЕ(БизнесПроцесс.Задание.ТочкаМаршрута.Выполнить) |
| Вид движения регистра накопления | ВидДвиженияНакопления.Приход, ВидДвиженияНакопления.Расход | ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход) |
| Вид движения регистра бухгалтерии | ВидДвиженияБухгалтерии.Дебет, ВидДвиженияБухгалтерии.Кредит | ЗНАЧЕНИЕ(ВидДвиженияБухгалтерии.Дебет) |
| Вид счёта | ВидСчета.Активный, ВидСчета.Пассивный, ВидСчета.АктивноПассивный | ЗНАЧЕНИЕ(ВидСчета.Пассивный) |
Пустая ссылка есть у любого ссылочного типа: справочника, документа, перечисления, плана видов характеристик, плана счетов, плана видов расчёта, бизнес-процесса, задачи, плана обмена. Предопределённые элементы бывают только у справочников, планов видов характеристик, планов счетов и планов видов расчёта. У документов их нет, поэтому ЗНАЧЕНИЕ(Документ...) принимает только ПустаяСсылка.
Имена в примерах условные: у каждой конфигурации свои перечисления и свои предопределённые. Точное имя берите в конфигураторе — в свойствах значения перечисления или в окне предопределённых элементов справочника (колонка «Имя»).
Самый частый случай — отбор документов по статусу. Если подходят несколько статусов, их перечисляют через В:
ВЫБРАТЬ
Заказы.Ссылка КАК Заказ,
Заказы.Статус КАК Статус
ИЗ
Документ.ЗаказКлиента КАК Заказы
ГДЕ
Заказы.Проведен
И Заказы.Статус В (ЗНАЧЕНИЕ(Перечисление.СтатусыЗаказов.КОтгрузке),
ЗНАЧЕНИЕ(Перечисление.СтатусыЗаказов.Закрыт))
Значение можно вернуть и колонкой результата, в том числе системное перечисление вроде вида движения. Так удобно помечать, из какой части объединения пришла строка:
ВЫБРАТЬ
Поступления.Ссылка КАК Документ,
ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход) КАК Направление
ИЗ
Документ.ПоступлениеТоваров КАК Поступления
ГДЕ
Поступления.Проведен
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
Реализации.Ссылка,
ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход)
ИЗ
Документ.РеализацияТоваров КАК Реализации
ГДЕ
Реализации.Проведен
Чтобы получить значение предопределённого в запросе, пишите его имя после имени справочника. Пример — остатки только по основному складу. Условие стоит в параметрах виртуальной таблицы, поэтому отбор выполняется до расчёта остатков, а не после:
ВЫБРАТЬ
Остатки.Номенклатура КАК Номенклатура,
Остатки.КоличествоОстаток КАК Количество
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки(
&НаДату,
Склад = ЗНАЧЕНИЕ(Справочник.Склады.Основной)) КАК Остатки
Параметр &НаДату здесь остаётся параметром: дата меняется от запуска к запуску, её нет в метаданных. Для дат-констант в тексте запроса есть свой литерал, подробнее — в статье о датах в запросе.
Пустая ссылка — значение ссылочного типа, которое не указывает ни на какой объект. Так выглядит незаполненный реквизит. Пример — группы верхнего уровня справочника номенклатуры, у которых родитель не заполнен:
ВЫБРАТЬ
Номенклатура.Ссылка КАК Группа,
Номенклатура.Наименование КАК Наименование
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.ЭтоГруппа
И Номенклатура.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
После левого соединения в полях присоединённой таблицы может оказаться NULL, и сравнение с пустой ссылкой его не поймает. Замените его пустой ссылкой прямо в запросе:
ВЫБРАТЬ
Товары.Ссылка КАК Номенклатура,
ЕСТЬNULL(Назначения.Склад, ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка)) КАК Склад
ИЗ
Справочник.Номенклатура КАК Товары
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ОсновныеСклады КАК Назначения
ПО Назначения.Номенклатура = Товары.Ссылка
Теперь в колонке «Склад» всегда ссылка одного типа, а не NULL. Её можно сравнивать со ссылками в следующих условиях и соединениях (сравнение с NULL истину не даёт), а в коде безопасно читать её реквизиты: у пустой ссылки реквизит вернёт значение по умолчанию, у NULL будет ошибка. ЗначениеЗаполнено() вернёт Ложь в обоих случаях. Незаполненное поле составного типа обычно хранит Неопределено, его сравнивают с литералом НЕОПРЕДЕЛЕНО.
В бухгалтерских запросах через ЗНАЧЕНИЕ() указывают предопределённые счета. Чтобы захватить счёт вместе с субсчетами, используйте В ИЕРАРХИИ. Имена ниже — из плана счетов «Хозрасчетный» БП 3.0; в другой конфигурации сверьтесь с конфигуратором:
ВЫБРАТЬ
Проводки.Регистратор КАК Документ,
Проводки.Сумма КАК Сумма
ИЗ
РегистрБухгалтерии.Хозрасчетный КАК Проводки
ГДЕ
Проводки.Период МЕЖДУ &НачалоПериода И &КонецПериода
И Проводки.Активность
И Проводки.СчетДт = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетныеСчета)
И Проводки.СчетКт В ИЕРАРХИИ (ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыСПокупателямиИЗаказчиками))
Поле Вид у плана счетов имеет тип ВидСчета, его значения тоже получают через функцию:
ВЫБРАТЬ
Счета.Код КАК Код,
Счета.Наименование КАК Наименование
ИЗ
ПланСчетов.Хозрасчетный КАК Счета
ГДЕ
Счета.Вид = ЗНАЧЕНИЕ(ВидСчета.Пассивный)
И НЕ Счета.ПометкаУдаления
ВидДвиженияБухгалтерии.Дебет и .Кредит встречаются в двух местах. У регистров бухгалтерии без поддержки корреспонденции вместо пары СчетДт/СчетКт есть один счёт и поле ВидДвижения. У регистров с корреспонденцией то же поле есть в таблице значений субконто РегистрБухгалтерии.<Имя>.Субконто: оно показывает, к какой стороне проводки, Дт или Кт, относится субконто. Пример — контрагенты, которые встречались в дебете проводок за период (вид субконто из БП 3.0):
ВЫБРАТЬ РАЗЛИЧНЫЕ
Субконто.Значение КАК Контрагент
ИЗ
РегистрБухгалтерии.Хозрасчетный.Субконто КАК Субконто
ГДЕ
Субконто.Период МЕЖДУ &НачалоПериода И &КонецПериода
И Субконто.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияБухгалтерии.Дебет)
И Субконто.Вид = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконтоХозрасчетные.Контрагенты)
Поля Активность в этой таблице нет. Если отключённые проводки нужно исключить, соедините её с основной таблицей регистра по полям Регистратор и НомерСтроки.
Задачи хранят точку маршрута, на которой их создали. Невыполненные задачи конкретного этапа выбирают так (имена из БСП, подсистема «Бизнес-процессы и задачи»):
ВЫБРАТЬ
Задачи.Ссылка КАК Задача,
Задачи.Дата КАК Дата
ИЗ
Задача.ЗадачаИсполнителя КАК Задачи
ГДЕ
НЕ Задачи.Выполнена
И НЕ Задачи.ПометкаУдаления
И Задачи.ТочкаМаршрута = ЗНАЧЕНИЕ(БизнесПроцесс.Задание.ТочкаМаршрута.Выполнить)
Функция возвращает таблицу по складам и товарам: сколько пришло и сколько ушло за период. В одном запросе собраны четыре варианта функции: вид движения, предопределённый элемент, пустая ссылка и значение перечисления.
// Приход и расход товаров по складам за период из основной таблицы регистра.
// Размещение: общий модуль с флагом «Сервер» или модуль менеджера:
// объект Запрос на клиенте недоступен.
// Имена объектов условные: регистр остатков ТоварыНаСкладах,
// перечисление СтатусыНоменклатуры, предопределённый склад Транзитный.
Функция ПриходИРасходТоваров(НачалоПериода, КонецПериода) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Движения.Склад КАК Склад,
| Движения.Номенклатура КАК Номенклатура,
| СУММА(ВЫБОР
| КОГДА Движения.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
| ТОГДА Движения.Количество
| ИНАЧЕ 0
| КОНЕЦ) КАК Приход,
| СУММА(ВЫБОР
| КОГДА Движения.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход)
| ТОГДА Движения.Количество
| ИНАЧЕ 0
| КОНЕЦ) КАК Расход
|ИЗ
| РегистрНакопления.ТоварыНаСкладах КАК Движения
|ГДЕ
| Движения.Период МЕЖДУ &НачалоПериода И &КонецПериода
| И Движения.Активность
| И Движения.Склад <> ЗНАЧЕНИЕ(Справочник.Склады.Транзитный)
| И Движения.Номенклатура <> ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
| И Движения.Номенклатура.Статус <> ЗНАЧЕНИЕ(Перечисление.СтатусыНоменклатуры.Архивный)
|
|СГРУППИРОВАТЬ ПО
| Движения.Склад,
| Движения.Номенклатура";
Запрос.УстановитьПараметр("НачалоПериода", НачалоДня(НачалоПериода));
Запрос.УстановитьПараметр("КонецПериода", КонецДня(КонецПериода));
Возврат Запрос.Выполнить().Выгрузить();
КонецФункции
Что здесь важно:
ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход) внутри ВЫБОР раскладывает движения на две колонки. Поле ВидДвижения есть только в основной таблице регистра остатков; у оборотного регистра его нет.Движения.Активность отсекает отключённые движения. Виртуальные таблицы делают это сами, основная таблица — нет.ЗНАЧЕНИЕ(Справочник.Склады.Транзитный) исключает служебный склад. Если такого предопределённого в вашей конфигурации нет, запрос не выполнится: см. раздел об ошибках.ПустаяСсылка отбрасывает движения с незаполненной номенклатурой, которые остаются после ручных корректировок.Движения.Номенклатура.Статус — обращение к реквизиту через точку. Платформа добавит неявное соединение со справочником; подробнее о том, чем это грозит, — в статье о ссылках в запросе.Конструктор запроса понимает ЗНАЧЕНИЕ() и сохраняет её в тексте, но при отборе через перетаскивание поля по умолчанию создаёт параметр. Чтобы вписать значение вместо параметра:
Статус = &Статус.&Статус на ЗНАЧЕНИЕ(Перечисление.СтатусыЗаказов.Закрыт) и нажмите «ОК».Если значение нужно как колонка, добавьте на вкладке «Таблицы и поля» новое поле и впишите функцию в редакторе произвольного выражения. Запрос с ЗНАЧЕНИЕ() не требует параметров, поэтому его удобно проверять в консоли запросов — вставили текст и выполнили.
Функция работает только с тем, что описано в конфигурации. Не подходят:
ЗНАЧЕНИЕ(&Статус) — ошибка, пишите просто &Статус;Правило простое: если имя значения видно в дереве метаданных, используйте ЗНАЧЕНИЕ(). Если значение появляется только в данных или зависит от пользователя, передавайте его параметром:
// Общий модуль с флагом «Сервер». Имена объектов условные.
Функция ОткрытыеЗаказыВВалюте(Валюта) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Заказы.Ссылка КАК Заказ
|ИЗ
| Документ.ЗаказКлиента КАК Заказы
|ГДЕ
| Заказы.Проведен
| И Заказы.Валюта = &Валюта
| И Заказы.Статус <> ЗНАЧЕНИЕ(Перечисление.СтатусыЗаказов.Закрыт)";
Запрос.УстановитьПараметр("Валюта", Валюта);
Возврат Запрос.Выполнить().Выгрузить();
КонецФункции
В коде модуля функции ЗНАЧЕНИЕ() нет. Её аналог во встроенном языке — метод ПредопределенноеЗначение(), который принимает то же имя, но строкой в кавычках. Метод доступен и на клиенте, и на сервере. В примере видимость поля «Причина отмены» задаёт одна процедура без контекста. Её вызывают и при создании формы, и при изменении статуса, поэтому у открытого отменённого заказа поле видно сразу:
// Модуль формы документа. Имена объектов условные.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
УстановитьВидимостьПричиныОтмены(ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура СтатусПриИзменении(Элемент)
УстановитьВидимостьПричиныОтмены(ЭтотОбъект);
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьВидимостьПричиныОтмены(Форма)
ЗаказОтменен = (Форма.Объект.Статус = ПредопределенноеЗначение("Перечисление.СтатусыЗаказов.Отменен"));
Форма.Элементы.ПричинаОтмены.Видимость = ЗаказОтменен;
КонецПроцедуры
| Способ | Где работает | Что принимает |
|---|---|---|
ЗНАЧЕНИЕ(...) | только текст запроса | имя без кавычек: перечисления, предопределённые, пустые ссылки, точки маршрута, системные перечисления |
&Параметр | текст запроса | любое значение, установленное через УстановитьПараметр() |
ПредопределенноеЗначение("...") | код на клиенте и на сервере | имя строкой: перечисления, предопределённые, пустые ссылки, точки маршрута |
<<?>> стоит у аргумента функции. Типичный случай — доработанный отчёт после обновления типовой.ЗНАЧЕНИЕ(Перечисления.СтатусыЗаказов.Закрыт) — привычка из кода модуля. В запросе вид объекта всегда в единственном числе.ЗНАЧЕНИЕ("Перечисление.СтатусыЗаказов.Закрыт") — путаница с ПредопределенноеЗначение(). В запросе строка в кавычках остаётся строкой, и запрос не разберётся.Х = ЗНАЧЕНИЕ(Перечисление.СтатусыЗаказов.Закрыт); проверка синтаксиса покажет «Переменная не определена (Перечисление)» и «Процедура или функция с указанным именем не определена (ЗНАЧЕНИЕ)». В коде используйте ПредопределенноеЗначение() или менеджер: Перечисления.СтатусыЗаказов.Закрыт (на сервере).= ЗНАЧЕНИЕ(...ПустаяСсылка) не срабатывает для строк, у которых нет пары в левом соединении. Используйте ЕСТЬNULL() или проверку ЕСТЬ NULL.ИмяПредопределенныхДанных или это узел обмена, куда предопределённые ещё не загрузились. Обращение к такому элементу заканчивается ошибкой «Предопределенный элемент отсутствует в данных», а при дублях — «Предопределенный элемент не уникален». Текст запроса здесь не поможет: верните элементу значение ИмяПредопределенныхДанных или уберите лишний дубль.Нет, аргумент должен быть известен при разборе запроса. Если имя значения становится известно только во время работы, получите ссылку в коде через ПредопределенноеЗначение("Перечисление.СтатусыЗаказов." + ИмяСтатуса) и передайте её параметром.
Заметной разницы нет. С ЗНАЧЕНИЕ() текст запроса самодостаточен, и значение не забудут установить. Параметр нужен, когда значение меняется от вызова к вызову.
Да. Запрос набора данных в СКД и произвольный запрос динамического списка — обычный текст на языке запросов, функция в нём работает так же. В отборах пользовательских настроек СКД значение выбирают из списка, функция там не нужна.
У справочников, планов видов характеристик, планов счетов и планов видов расчёта есть стандартное поле Предопределенный с типом «Булево». Условие ГДЕ Таблица.Предопределенный вернёт только их.
Прямое обращение через менеджер и ПредопределенноеЗначение() вызывают исключение. В БСП для этого есть функция ОбщегоНазначенияКлиентСервер.ПредопределенныйЭлемент(): она принимает полное имя строкой и вместо ошибки возвращает Неопределено. В старых редакциях БСП её может не быть — проверьте общий модуль в своей конфигурации.
Если отчёт после обновления типовой падает с ошибкой «Неверные параметры» или запросы нужно переделать под новые статусы и предопределённые элементы, это обычная доработка отчёта, и её можно поручить исполнителю. Подробнее — на странице доработки отчётов и обработок 1С. Разместите задачу — оценка бесплатная, ответ в течение рабочего дня.
Станьте частью сообщества!
Войдите или зарегистрируйтесь, и вы сможете участвовать в обсуждениях.