При разработке сложных запросов в среде 1С:Предприятие разработчики часто сталкиваются с двумя типами проблем: техническими ошибками передачи параметров и логическими ошибками формирования текста запроса. Рассмотрим детально, как выявить причину сбоя и как избежать некорректного использования конструкций языка запросов.
Если система выдает сообщение об ошибке Не задано значение параметра, в 99% случаев это означает несоответствие имен параметров в коде 1С и в тексте самого запроса. В 1С регистр символов в именах параметров не всегда играет роль, но вот раскладка клавиатуры — критична.
Как предотвратить такую ошибку:
Запрос.УстановитьПараметр и вставьте её прямо в текст запроса.C и русская С выглядят идентично, но для системы это два разных символа.Запрос.Параметры. Это позволит наглядно увидеть, какой список ключей сформирован и совпадает ли он с тем, что вы ожидаете увидеть в тексте запроса.Многие разработчики пытаются реализовать условную логику фильтрации прямо в секции ГДЕ, используя конструкцию ВЫБОР КОГДА ... ТОГДА ... КОНЕЦ. Однако это часто приводит к ошибкам или непредсказуемым результатам, так как ГДЕ ожидает строго булево значение (Истина или Ложь).
Почему ваш вариант не работает:
Если вы пишете условие без ветки ИНАЧЕ, то при невыполнении условия ВЫБОР вернет значение NULL. Система 1С интерпретирует NULL в условиях фильтрации не как Ложь, а как неопределенное состояние, что приводит к некорректной работе отбора.
Вместо использования ВЫБОР в секции ГДЕ, лучше использовать классическую логику с операторами И, ИЛИ и НЕ. Это делает код читаемым и гарантирует правильную работу транслятора запросов 1С.
Рассмотрим правильный подход на примере:
Предположим, вам нужно оставить записи, которые входят в список складов и удовлетворяют условию сертификации, а записи, не входящие в список — оставить все (или отфильтровать по иному принципу). Сделаем это через логическое объединение:
// Вместо сложного ВЫБОР внутри ГДЕ используем логические связки
ГДЕ
(ТоварыНаСкладахОстатки.Склад В (&СписокОтбораСклады)
И СертификацияНоменклатурыСрезПоследних.СостояниеСертификации = ЗНАЧЕНИЕ(Перечисление.СостоянияСертификацииНоменклатуры.ЕстьБезРазрешения))
ИЛИ
(НЕ ТоварыНаСкладахОстатки.Склад В (&СписокОтбораСклады))
Почему этот подход лучше:
NULL в результате выполнения условий, что гарантирует получение ожидаемого набора данных.ГДЕ.Если ваш СписокЗначений или массив содержит тысячи элементов, передача его через параметр &Список может замедлить запрос. В таких случаях рекомендуем использовать метод временных таблиц:
Запрос.МенеджерВременныхТаблиц.ВНУТРЕННЕЕ СОЕДИНЕНИЕ с вашей временной таблицей.Это позволит серверу базы данных использовать индексы более эффективно, что значительно ускорит формирование тяжелых отчетов.
Соблюдая эти простые рекомендации, вы сможете избавиться от большинства ошибок при работе с запросами 1С и сделаете свой код надежным и понятным для других специалистов.