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