Почему в запросе 1С и СКД возникает ошибка «Поле не найдено» при обращении к предопределенному элементу через функцию ЗНАЧЕНИЕ?

Программист 1С v8.3 (Управляемые формы) 1С:Управление нашей фирмой Управленческий учет IT и автоматизация бизнеса
← На главную

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

Подобная ситуация вызывает замешательство, когда в пользовательском режиме или в окне предопределенных данных конфигуратора элемент с текстом «Закрыт» и заполненным кодом визуально присутствует. Чтобы устранить проблему и предотвратить ее появление в будущем, необходимо детально разобрать принципы синтаксического анализа запросов платформой «1С:Предприятие 8.3» и особенности хранения метаданных.

Анатомия ошибки: имя метаданных против пользовательского наименования

Главная причина возникновения ошибки «Поле не найдено» кроется в смешении понятий Имя (идентификатор объекта метаданных) и Наименование (строковое представление элемента, отображаемое пользователю). Каждый объект прикладного решения в 1С обладает несколькими слоями идентификации:

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

Синтаксис и правила использования функции ЗНАЧЕНИЕ

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

Общий формат вызова выглядит следующим образом:

ЗНАЧЕНИЕ(<ТипПредопределенногоЗначения>.<ИмяОбъектаМетаданных>.<Значение>)

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

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

Пошаговый алгоритм проверки и исправления

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

  1. Открытие списка предопределенных элементов в конфигураторе: найдите в дереве метаданных требуемый справочник (например, СостоянияЗаказНарядов), разверните его состав или откройте окно редактирования объекта, перейдите на закладку «Прочее» и нажмите кнопку «Предопределенные». Либо вызовите команду контекстного меню «Открыть предопределенные данные».
  2. Сверка системного имени: в открывшемся списке найдите нужную строку и обратите внимание на колонку Имя. Именно строковое значение из колонки «Имя» (а не «Наименование» или «Код») должно указываться третьим сегментом пути в функции ЗНАЧЕНИЕ.
  3. Проверка правописания имени справочника: убедитесь, что имя самого объекта метаданных указано без опечаток и совпадает с именем в дереве объектов конфигурации (например, СостоянияЗаказНарядов, а не СостоянияЗаказовПокупателей).
  4. Программный аудит идентификаторов: если конфигурация находится на поддержке и доступ к конфигуратору ограничен, получить реальные имена предопределенных элементов можно с помощью встроенного языка в консоли кода:
    
    Имена = Справочники.СостоянияЗаказНарядов.ПолучитьИменаПредопределенных();
    Для Каждого ИмяЭлемента Из Имена Цикл
        Сообщить(ИмяЭлемента);
    КонецЦикла;
    

Варианты решения практической задачи

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

Способ 1. Исправление идентификатора в тексте запроса

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

Пример скорректированного текста запроса:


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

Условия применения: используется, когда статус логики является неизменным константным условием бизнес-процесса.

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

Способ 2. Передача предопределенного значения через параметр запроса

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


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ЗаказПокупателя.Дата КАК ДатаЗП,
    |	ЗаказПокупателя.СуммаДокумента КАК ИтогВсего
    |ИЗ
    |	Документ.ЗаказПокупателя КАК ЗаказПокупателя
    |ГДЕ
    |	ЗаказПокупателя.Дата >= &НачалоПериода
    |	И ЗаказПокупателя.СостояниеЗаказа = &СостояниеЗакрыт
    |	И ЗаказПокупателя.ВариантЗавершения = &ВариантУспешно";

Запрос.УстановитьПараметр("НачалоПериода", ПериодОтчета.ДатаНачала);
Запрос.УстановитьПараметр("СостояниеЗакрыт", Справочники.СостоянияЗаказНарядов.Завершен);
Запрос.УстановитьПараметр("ВариантУспешно", Перечисления.ВариантыЗавершенияЗаказа.Успешно);

Условия применения: подходит для типовых алгоритмов проведения, заполнения и формирования печатных форм во встроенном языке.

Преимущества: среда разработки проверяет обращение к менеджеру справочника Справочники.СостоянияЗаказНарядов.Завершен при синтаксическом контроле модуля, что исключает появление скрытых ошибок во время исполнения.

Способ 3. Вынесение отбора в настройки компоновщика СКД

При проектировании отчетов в схеме компоновки данных жесткое прописывание фильтров в блоке ГДЕ часто считается антипаттерном, поскольку лишает конечного пользователя возможности переопределить критерии отбора без модификации схемы.

Вместо жесткого условия в тексте набора данных рекомендуется:

  1. Оставить в наборе данных чистую выборку полей без принудительного сравнения с предопределенным значением в секции ГДЕ.
  2. Перейти на закладку «Настройки» схемы компоновки данных.
  3. В секции «Отбор» добавить новое условие: левое поле — СостояниеЗаказа, вид сравнения — Равно, правое значение — выбор нужного элемента справочника из доступного списка.
  4. При необходимости включить флажок доступности отбора в пользовательских настройках, чтобы аналитик мог изменить статус в режиме «1С:Предприятие».

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

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

Особенности предопределенных данных в платформе 8.3

При проектировании прикладных решений важно учитывать системные ограничения, накладываемые платформой на предопределенные данные:

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

← На главную