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