К статье
Практический материал

Разработка и Конфигурация · 10 мин

Знач в 1С: что это такое и как работает функция Значение

ЗНАЧ в 1С — что означает функция Значение в запросах и коде, как применять ЗНАЧЕНИЕ() для перечислений, справочников и предопределённых данных.

Запрос «знач 1с» чаще всего означает поиск информации о функции ЗНАЧЕНИЕ() — одной из самых часто используемых конструкций языка запросов 1С. Иногда под этим подразумевают и оператор ЗНАЧ в тексте запроса, и общее понятие «значение» в платформе 1С:Предприятие. Разобраться в этом нужно любому разработчику и внедренцу, потому что без ЗНАЧЕНИЕ() невозможно корректно отфильтровать данные по конкретному виду документа, перечислению или предопределённому элементу справочника.

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

Ниже разберём, что именно делает ЗНАЧЕНИЕ(), в каких случаях её применять, чем она отличается от передачи параметра, какие типы данных поддерживаются и какие ошибки встречаются чаще всего. Материал ориентирован на тех, кто пишет запросы в консоли запросов, отчётах на СКД или в модуле объекта.

Что означает ЗНАЧЕНИЕ в языке запросов 1С

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

Типичный пример — отбор по значению перечисления. Если в конфигурации есть перечисление «СтатусыЗаказа» со значением «ВРаботе», то условие в запросе выглядит так: ГДЕ Заказ.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыЗаказа.ВРаботе). Платформа при выполнении запроса подставит ссылку на это значение перечисления.

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

Какие типы данных можно получить через ЗНАЧЕНИЕ

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

  • значения перечислений — ЗНАЧЕНИЕ(Перечисление.ИмяПеречисления.ИмяЗначения);
  • предопределённые элементы справочников — ЗНАЧЕНИЕ(Справочник.ИмяСправочника.ИмяЭлемента);
  • предопределённые элементы планов видов характеристик, планов счетов и планов видов расчёта;
  • пустые ссылки любого ссылочного типа — например, ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка);
  • точки маршрута бизнес-процессов.

Обращение к документам, регистрам или обычным (не предопределённым) элементам через ЗНАЧЕНИЕ() невозможно — попытка вызовет ошибку построения запроса. Для таких данных всегда используется параметр.

Когда использовать ЗНАЧЕНИЕ, а когда параметр запроса

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

Если же элемент выбирает пользователь или он может отличаться между базами, нужен параметр. Параметр гибче: один и тот же запрос работает с любым значением, а не только с жёстко прописанным. Кроме того, параметры позволяют оптимизатору СУБД строить более предсказуемые планы запросов при варьирующихся условиях.

Сравнение вариантов

ЗНАЧЕНИЕ()

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

Параметр запроса

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

Временная таблица с отбором

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

Как написать запрос с ЗНАЧЕНИЕ: практические примеры

Рассмотрим типовой запрос, выбирающий документы с конкретным видом операции. Текст запроса в модуле задаётся строкой, а функция ЗНАЧЕНИЕ() вставляется прямо в условие:

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Реализация.Ссылка,

| Реализация.СуммаДокумента

|ИЗ

| Документ.РеализацияТоваровУслуг КАК Реализация

|ГДЕ

| Реализация.ВидОперации = ЗНАЧЕНИЕ(Перечисление.ВидыОперацийРеализация.Товары)";

Второй частый сценарий — проверка на пустую ссылку. Например, найти строки, где не заполнен контрагент: ГДЕ Таблица.Контрагент = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка). Это корректная замена сравнению с NULL — для ссылочных полей пустое значение хранится именно как пустая ссылка, а не NULL.

Третий сценарий — отбор по предопределённому элементу справочника. Если в конфигурации есть предопределённая группа «Услуги» в справочнике номенклатуры, запрос ГДЕ Номенклатура.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.Услуги) вернёт все позиции внутри этой группы первого уровня.

Порядок действий
  1. 1
    Откройте конфигуратор и найдите нужный предопределённый элемент или значение перечисления, запомните его точное имя.
  2. 2
    В тексте запроса напишите условие вида Поле = ЗНАЧЕНИЕ(Тип.Объект.ИмяЭлемента).
  3. 3
    Выполните запрос в консоли запросов и проверьте, что возвращаются ожидаемые строки.
  4. 4
    Если запрос выдаёт ошибку — проверьте, что элемент действительно предопределённый и имя написано без опечаток.

Типичные ошибки при работе со ЗНАЧЕНИЕ

Самая распространённая ошибка — попытка передать в ЗНАЧЕНИЕ() обычный, не предопределённый элемент справочника. Платформа выдаёт ошибку вида «Неверные параметры в операции сравнения» или сообщение о том, что поле не найдено. Лечится заменой на параметр запроса.

Вторая ошибка — использование пользовательского наименования вместо имени предопределённого элемента. Администратор мог переименовать элемент в режиме предприятия, но в запросе всегда указывается имя из конфигуратора. Третья ошибка — сравнение с NULL вместо пустой ссылки: условие = NULL для ссылочного поля почти никогда не даёт ожидаемого результата.

Типичные ошибки
01
Передача в ЗНАЧЕНИЕ() обычного элемента справочника — запрос падает с ошибкой, нужен параметр.
02
Использование наименования вместо имени предопределённого элемента — элемент не находится, запрос не выполняется.
03
Сравнение ссылочного поля с NULL вместо ЗНАЧЕНИЕ(...ПустаяСсылка) — условие не срабатывает, данные теряются из выборки.
04
Жёсткое зашивание ЗНАЧЕНИЕ() там, где значение должно меняться, — при смене требований приходится переписывать код вместо настройки.

Ограничения и риски при изменении конфигурации

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

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

Как проверить, что запрос со ЗНАЧЕНИЕ работает правильно

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

Контрольные точки

Как проверить результат

Выполнение запроса
Норма

Запрос выполняется без ошибок и возвращает строки

Тревожный признак

Ошибка «Поле не найдено» или «Неверные параметры» — проверьте имя элемента и его предопределённость

Содержимое выборки
Норма

В результате только записи с нужным значением отбора

Тревожный признак

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

Работа после обновления конфигурации
Норма

Отчёты и обработки выполняются как раньше

Тревожный признак

Ошибки после обновления — проверьте, не переименован ли предопределённый элемент в новом релизе

Дополнительный приём — временно заменить ЗНАЧЕНИЕ() на параметр и подставить ссылку вручную. Если с параметром запрос работает, а со ЗНАЧЕНИЕ() нет, проблема точно в имени или статусе предопределённого элемента.

Частые вопросы о ЗНАЧ в 1С

Можно ли через ЗНАЧЕНИЕ() получить обычный элемент справочника?

Нет. Функция работает только с предопределёнными элементами, заданными в конфигураторе. Для обычных элементов используйте параметр запроса или получайте ссылку через метод НайтиПоНаименованию / НайтиПоКоду в коде.

Чем ЗНАЧЕНИЕ(Справочник.Х.ПустаяСсылка) отличается от NULL?

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

Работает ли ЗНАЧЕНИЕ() в запросах СКД?

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

Что делать, если запрос пишет «Поле не найдено» при использовании ЗНАЧЕНИЕ?

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

Можно ли передать в ЗНАЧЕНИЕ() имя элемента строкой из переменной?

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

Итог

Что важно запомнить

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