При доработке конфигураций на обычных формах (например, «Управление торговлей 10.3», «Комплексная автоматизация 1.1» или «Управление производственным предприятием 1.3») разработчики часто создают новые документы путем копирования типовых. Однако при попытке открыть стандартную форму подбора номенклатуры в новом документе система может аварийно завершить операцию со следующей ошибкой:
{ОбщийМодуль.РаботаСДиалогами.Модуль(6340)}: Ошибка при вызове метода контекста (ПодключитьОбработчикИзмененияДанных)
ФормаДокумента.ПодключитьОбработчикИзмененияДанных(ИмяРеквизита, "ОбновитьФормуПодбора", Ложь);
по причине:
Недопустимое значение параметра (параметр номер '2') (В модуле формы отсутствует процедура с указанным именем)
Разберем детально механику работы этого метода платформы 1С, выясним причину появления ошибки и рассмотрим надежные способы ее устранения.
Проанализируем сигнатуру и назначение метода платформы обычных форм. Метод ПодключитьОбработчикИзмененияДанных объекта Форма предназначен для динамической подписки формы на изменение связанных реквизитов. В типовых конфигурациях при открытии подбора номенклатуры подбор связывается с формой документа: если пользователь меняет в документе склад, тип цен или договор, открытая форма подбора должна автоматически обновить остатки и цены.
Синтаксис вызова выглядит следующим образом:
ФормаДокумента.ПодключитьОбработчикИзмененияДанных(ИмяРеквизита, ИмяПроцедуры, Отображение);
Ключевые требования платформы к параметрам этого метода:
"Склад").ФормаДокумента). Наличие процедуры в общих модулях или модуле объекта платформа не учитывает.Кроме того, процедура-обработчик обязана иметь ровно один входной параметр, принимающий имя изменившегося реквизита:
Процедура ОбновитьФормуПодбора(ИмяРеквизита)
Если процедура с данным именем отсутствует в модуле формы, содержит неподходящее количество обязательных параметров или ее имя написано с опечаткой (например, русская буква заменена латинской), платформа генерирует исключение о недопустимом значении параметра номер 2.
Выясним причину, почему при копировании документа или создании аналогичного функционала возникает данная коллизия. В общем модуле РаботаСДиалогами в процедуре ОткрытьПодборНоменклатуры обход реквизитов выполняется в цикле по структуре параметров:
Для Каждого ЭлементСтруктурыПараметров Из СтруктураПараметров Цикл
Если ОбщегоНазначения.ЕстьРеквизитДокумента(ЭлементСтруктурыПараметров.Ключ, МетаданныеДокумента) Тогда
ФормаДокумента.ПодключитьОбработчикИзмененияДанных(ЭлементСтруктурыПараметров.Ключ, "ОбновитьФормуПодбора", Ложь);
КонецЕсли;
КонецЦикла;
Разберем типичные ситуации, приводящие к сбою:
ЕстьРеквизитДокумента возвращала Ложь, и вызов обработчика не выполнялся. Если в новом документе в шапку был добавлен реквизит Склад, условие сработало как Истина, общему модулю потребовалось подключить обработчик, которого в форме не оказалось.Рассмотрим штатное и наиболее корректное решение. Чтобы форма подбора правильно реагировала на изменение реквизитов шапки нового документа, добавим в модуль формы документа требуемую процедуру.
Откроем модуль формы нового документа и поместим в него следующий программный код:
// Процедура вызывается платформой при изменении реквизитов,
// подключенных через ПодключитьОбработчикИзмененияДанных
Процедура ОбновитьФормуПодбора(ИмяРеквизита) Экспорт
// Синхронизируем параметры подбора с текущими данными документа
РаботаСДиалогами.ОбновитьПараметрыИФормуПодбора(ЭтотОбъект, ЭтаФорма, ИмяРеквизита);
КонецПроцедуры
Обратим внимание: в зависимости от используемой конфигурации процедура обновления формы подбора может располагаться в общем модуле РаботаСДиалогами либо ОбработкаТабличныхЧастей. Рекомендуется свериться с вызовами в других типовых документах со схожей механикой (например, «Заказ покупателя» или «Поступление товаров и услуг»).
Если интерактивная связь между документом и подбором не требуется (например, подбор открывается разово, а склад в документе жестко зафиксирован), проанализируем модуль формы документа в месте вызова открытия подбора.
Перед передачей структуры в РаботаСДиалогами.ОткрытьПодборНоменклатуры исключим отслеживаемый реквизит либо переименуем ключ, чтобы имя не совпадало с реквизитом шапки документа:
СтруктураПараметров = Новый Структура;
// Не передаем "Склад" в корень структуры отслеживания,
// либо передаем значение под другим ключом
СтруктураПараметров.Вставить("СкладДляОстатков", Склад);
РаботаСДиалогами.ОткрытьПодборНоменклатуры(ЭтаФорма, СтруктураПараметров);
В этом случае условие проверки наличия реквизита в метаданных вернет Ложь, и метод ПодключитьОбработчикИзмененияДанных не будет вызываться платформой.
Если конфигурация уже снята с поддержки и требуется защитить универсальный механизм открытия подбора от подобных падений во всех самописных документах, рассмотрим вариант с безопасным перехватом исключения непосредственно в общем модуле РаботаСДиалогами:
Попытка
ФормаДокумента.ПодключитьОбработчикИзмененияДанных(ЭлементСтруктурыПараметров.Ключ, "ОбновитьФормуПодбора", Ложь);
Исключение
// В модуле формы обработчик не реализован - пропускаем подключение
КонецПопытки;
Этот подход гарантирует, что форма подбора откроется даже в том случае, если разработчик забыл объявить процедуру ОбновитьФормуПодбора в модуле формы документа.