Почему в динамическом списке 1С возникает ошибка отсутствия параметра запроса и как её исправить?

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

При разработке и сопровождении конфигураций на платформе 1С:Предприятие 8.3 разработчики нередко сталкиваются с ситуацией, когда при открытии формы выбора или динамического списка система выдает ошибку выполнения запроса с сообщением о том, что не найден или не задан определенный параметр (например, ВариантОказанияУслуг). При этом в конфигураторе или в отладчике параметр присутствует, а в демонстрационной базе ошибка может вовсе не воспроизводиться. Разберем детально, почему возникает такое поведение платформы и как правильно его устранить.

Анализ механизма возникновения ошибки

Динамический список в управляемом интерфейсе 1С работает на основе Системы компоновки данных (СКД). Важно понимать два ключевых фактора, влияющих на инициализацию схемы запроса:

  1. Влияние функциональных опций и прав доступа: Если реквизит объекта метаданных включен в состав выключенной функциональной опции (ФО) или ограничен правами RLS, платформа автоматически исключает это поле из состава доступных полей компоновки данных. Если в тексте запроса динамического списка условие с параметром прописано жестко (в стандартной секции ГДЕ, а не через расширение языка СКД в фигурных скобках), исключение реквизита приводит к сбою: компоновщик удаляет параметр из схемы, но при выполнении прямого запроса к СУБД этот параметр продолжает требоваться.
  2. Контекст открытия формы: При создании нового элемента форма выбора может открываться без предварительных отборов. Но при выборе значения из уже записанного объекта срабатывает типовой механизм СвязиПараметровВыбора или программное заполнение структуры параметров в коде формы (например, передача типа номенклатуры «Услуга»). Программная ветка пытается инициализировать параметр в Список.Параметры, но если схема СКД исключила его из-за отключенной ФО, возникает исключительная ситуация.

Проанализируем практические способы решения этой проблемы в зависимости от сценария работы с конфигурацией.

Способ 1. Включение управляющей функциональной опции в настройках

Если конфигурация типовая (например, 1С:ERP, 1С:Комплексная автоматизация или 1С:Управление торговлей) и находится на замке, самым быстрым и корректным решением является включение соответствующей функциональной опции в пользовательском режиме:

  1. Выясним, какая функциональная опция привязана к проблемному реквизиту. Для этого в конфигураторе найдем реквизит (например, ВариантОказанияУслуг справочника ВидыНоменклатуры), нажмем правой кнопкой мыши, выберем пункт Дополнительно и перейдем на вкладку Функциональные опции.
  2. Определим имя опции — например, опция, отвечающая за продажу агентских услуг.
  3. Перейдем в режим 1С:Предприятие в раздел НСИ и администрирование и включим соответствующую опцию (константу). Даже если учет по данной схеме фактически не ведется, включение опции сделает реквизит и его параметры доступными для СКД, и ошибка пропадет.

Способ 2. Использование синтаксиса расширения языка СКД в тексте запроса

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


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

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

Способ 3. Безопасная программная установка параметров в коде формы

Когда установка параметров динамического списка выполняется программно в модуле формы (например, в обработчике ПриСозданииНаСервере или ПриОткрытии), необходимо проверять доступность параметра перед его заполнением. Разберем безопасный вариант установки:


&НаСервере
Процедура УстановитьПараметрыСписка()

    // Проверяем наличие параметра в коллекции компоновщика
    ЭлементПараметра = Список.Параметры.Элементы.Найти("ВариантОказанияУслуг");
    Если ЭлементПараметра <> Неопределено Тогда
        ЭлементПараметра.Значение = ПредопределенноеЗначение("Перечисление.ВариантыОказанияУслуг.ОрганизациейПродавцом");
        ЭлементПараметра.Использование = Истина;
    КонецЕсли;

КонецПроцедуры

Также можно использовать проверку значения функциональной опции через вызов функции ПолучитьФункциональнуюОпцию(...):


&НаСервере
Процедура ИнициализироватьОтборПоОпции()

    Если ПолучитьФункциональнуюОпцию("ИспользоватьАгентскиеУслуги") Тогда
        ЭлементПараметра = Список.Параметры.Элементы.Найти("ВариантОказанияУслуг");
        Если ЭлементПараметра <> Неопределено Тогда
            ЭлементПараметра.Значение = ЗначениеПараметра;
            ЭлементПараметра.Использование = Истина;
        КонецЕсли;
    КонецЕсли;

КонецПроцедуры

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

← На главную