Почему внешняя обработка не открывается через Дополнительные отчеты и обработки в УТ 11

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

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

Разберем детально, почему возникает такое поведение платформы, как исправить основную причину и на какие еще нюансы разработки подсистема Библиотеки стандартных подсистем (БСП) накладывает ограничения.

Главная причина: свойство «Режим открытия окна» у управляемой формы

Проанализируем механику работы платформы. Когда обработка запускается через системное меню «Файл — Открыть», платформа создает для нее самостоятельное контекстное окружение. Однако при вызове дополнительной обработки из командного интерфейса раздела запуск происходит под управлением механизмов БСП.

Если в конфигураторе в палитре свойств формы обработки для свойства РежимОткрытияОкна выбрано значение Блокировать окно владельца, клиентское приложение ожидает обязательную передачу формы-родителя (владельца). Поскольку при клике по команде в меню раздела родительская форма отсутствует, платформа не может привязать модальность/блокировку к конкретному окну и мгновенно завершает показ созданной формы без вывода каких-либо предупреждений или ошибок.

Разберем пошаговый алгоритм исправления этой ошибки:

  1. Откроем внешнюю обработку в Конфигураторе.
  2. Перейдем к основной управляемой форме обработки и выделим в дереве элементов корень формы.
  3. В окне Свойства найдем параметр Режим открытия окна.
  4. Установим значение Независимый (или убедимся, что снят признак блокировки окна владельца).
  5. Сохраним файл обработки.
  6. В режиме «1С:Предприятие» откроем справочник Дополнительные отчеты и обработки, найдем нужный элемент, нажмем Обновить из файла и выберем сохраненный .epf-файл.
  7. Важно: обязательно перезапустим сеанс пользователя или очистим кэш, так как тонкий клиент кэширует двоичные данные подключенных обработок.

Корректное описание функции «СведенияОВнешнейОбработке»

Посмотрим на пример правильной регистрации команды с типом ОткрытиеФормы в модуле объекта внешней обработки. Для вызова формы из панели раздела БСП требует строго определенной структуры возвращаемых данных:


Функция СведенияОВнешнейОбработке() Экспорт

    РегистрационныеДанные = Новый Структура;
    РегистрационныеДанные.Вставить("Наименование", "Загрузка прайс-листов поставщиков");
    РегистрационныеДанные.Вставить("БезопасныйРежим", Ложь);
    РегистрационныеДанные.Вставить("Версия", "1.001");
    РегистрационныеДанные.Вставить("Вид", "ДополнительнаяОбработка");
    РегистрационныеДанные.Вставить("Информация", "Обработка для загрузки прайс-листов поставщиков");
    
    тзКоманд = Новый ТаблицаЗначений;
    тзКоманд.Колонки.Добавить("Идентификатор");
    тзКоманд.Колонки.Добавить("Представление");
    тзКоманд.Колонки.Добавить("Модификатор");
    тзКоманд.Колонки.Добавить("ПоказыватьОповещение");
    тзКоманд.Колонки.Добавить("Использование");
    
    строкаКоманды = тзКоманд.Добавить();
    строкаКоманды.Идентификатор = "ОткрытьФормуОбработки";
    строкаКоманды.Представление = "Открыть обработку загрузки прайс-листов";
    строкаКоманды.ПоказыватьОповещение = Ложь;
    строкаКоманды.Использование = "ОткрытиеФормы";
    
    РегистрационныеДанные.Вставить("Команды", тзКоманд);
    
    Возврат РегистрационныеДанные;

КонецФункции

При использовании варианта команды ОткрытиеФормы убедимся, что у внешней обработки в ветке конфигуратора задана Основная форма. Если основной формы нет, вызов команды не сможет определить, какое именно окно требуется отобразить.

Ошибки при обращении к параметрам в «ПриСозданииНаСервере»

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

Проанализируем фрагмент серверного кода формы:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

    // Прерываем инициализацию при служебной проверке БСП
    Если Параметры.Свойство("АвтоТест") Тогда 
        Возврат;
    КонецЕсли;

    // Безопасное чтение переданных параметров:
    Если Параметры.Свойство("Партнер", Объект.Партнер) Тогда
        // Параметр был передан и значение присвоено
    КонецЕсли;

    Если Параметры.Свойство("БлокироватьИзменениеОтбораПоПоставщику") И Параметры.БлокироватьИзменениеОтбораПоПоставщику Тогда
        Элементы.Партнер.ТолькоПросмотр = Истина;
    КонецЕсли;

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

Использование метода Свойство() объекта Структура защищает форму от аварийного завершения в тех сценариях, когда обработка запускается автономно из интерфейса подсистемы, а не программно из связанного документа.

Альтернативный вариант: вызов клиентского метода

Если требуется открыть форму с предварительной инициализацией нестандартных параметров или открыть ее модально/с блокировкой по отношению к конкретному окну, рекомендуется использовать тип команды ВызовКлиентскогоМетода.

Для этого в функции СведенияОВнешнейОбработке укажем:

строкаКоманды.Использование = "ВызовКлиентскогоМетода";

А в модуле формы или в модуле команды обработки реализуем экспортную клиентскую процедуру:


&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения = Неопределено) Экспорт

    ПараметрыОткрытия = Новый Структура;
    ПараметрыОткрытия.Вставить("РежимЗапуска", "ИзРаздела");
    
    // Программное открытие формы с явным указанием режима окна
    ОткрытьФорму("ВнешняяОбработка.ЗагрузкаЦенПоставщиков.Форма.Форма", 
                 ПараметрыОткрытия, 
                 ЭтотОбъект, 
                 , 
                 , 
                 , 
                 , 
                 РежимОткрытияОкнаФормы.Независимый);

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

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

← На главную