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