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