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