Как программно открыть форму внешней обработки из справочника Дополнительные отчеты и обработки?

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

При разработке в среде 1С:Предприятие 8.3 начинающие программисты часто сталкиваются с задачей: нужно добавить на форму существующего документа кнопку, которая будет открывать внешнюю обработку для заполнения табличной части. Основная сложность заключается в том, что внешняя обработка — это не объект метаданных конфигурации, а файл, хранящийся в информационной базе в виде двоичных данных. Попытка вызвать её напрямую через ОткрытьФорму с указанием пути к справочнику приводит к ошибке «Неизвестное имя формы».

В этой статье мы подробно разберем, почему стандартный подход не работает и какими способами можно реализовать это поведение в управляемом приложении, используя возможности Библиотеки стандартных подсистем (БСП) и методы платформы.

Почему возникает ошибка при вызове ОткрытьФорму?

Рассмотрим ситуацию, с которой столкнулся автор темы. Он попытался вызвать форму следующим образом:

ОткрытьФорму("Справочник.ВнешниеОбработки.ЗаполнитьПоступлениеТоваровПоПриемке.Форма");

Система выдает ошибку, так как метод ОткрытьФорму ожидает в качестве параметра полное имя объекта, прописанного в дереве конфигурации (например, Обработка.МояОбработка.Форма.ФормаОбъекта). Внешние обработки, загруженные в справочник «Дополнительные отчеты и обработки», являются элементами данных, а не метаданных. Платформа «не видит» их форм до тех пор, пока файл обработки не будет извлечен из хранилища и временно подключен к сеансу работы пользователя.

Способ 1: Использование механизмов БСП (рекомендуемый)

Если ваша конфигурация построена на базе БСП (что актуально для большинства современных решений, таких как ERP, УТ 11, БП 3.0), самым правильным решением будет использование типового механизма подключаемых команд. В этом случае вам даже не придется писать код в форме документа — БСП сама выведет кнопку в меню «Заполнить».

Для того чтобы обработка корректно работала в этом режиме, в её модуле объекта должна быть экспортная функция СведенияОВнешнейОбработке(). Проанализируем пример кода из сообщения №6:


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

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

ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьКоманду(ПараметрКоманды, ЭтаФорма);

Способ 2: Программное подключение обработки через временное хранилище

Если вам нужно открыть форму обработки «вручную» (например, если логика работы не укладывается в стандарты БСП или конфигурация сильно изменена), необходимо выполнить последовательность действий по временному подключению файла .epf.

Разберем алгоритм по шагам:

  1. На сервере: Получаем двоичные данные файла обработки из справочника.
  2. На сервере: Помещаем эти данные во временное хранилище.
  3. На сервере: Вызываем метод ВнешниеОбработки.Подключить(). Этот метод возвращает временное имя, под которым обработка доступна в текущем сеансе.
  4. На клиенте: Вызываем ОткрытьФорму, используя полученное имя.

Пример программной реализации:


&НаСервере
Функция ПодключитьОбработкуНаСервере(СсылкаНаОбработку)
    // Получаем двоичные данные из реквизита справочника (обычно это ХранилищеЗначения)
    ДвоичныеДанные = СсылкаНаОбработку.ХранилищеОбработки.Получить();
    АдресХранилища = ПоместитьВоВременноеХранилище(ДвоичныеДанные);
    
    // Подключаем внешнюю обработку
    // Метод возвращает уникальное имя, например "ВнешняяОбработка_ИмяОбработки_12345"
    ИмяОбработки = ВнешниеОбработки.Подключить(АдресХранилища, , Ложь);
    
    Возврат ИмяОбработки;
КонецФункции

&НаКлиенте
Процедура ЗаполнитьПоПриёмке(Команда)
    // Ссылка на элемент справочника "Дополнительные отчеты и обработки"
    // В реальной задаче ссылку можно получить через поиск по наименованию или идентификатору
    СсылкаНаОбработку = ПолучитьСсылкуНаОбработку(); 
    
    ИмяПодключеннойОбработки = ПодключитьОбработкуНаСервере(СсылкаНаОбработку);
    
    // Теперь мы можем обратиться к форме по временному имени
    ПутьКФорме = "ВнешняяОбработка." + ИмяПодключеннойОбработки + ".Форма.Форма";
    ОткрытьФорму(ПутьКФорме, , ЭтаФорма);
КонецПроцедуры

Как передать данные из документа в обработку?

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

1. Использование владельца формы. В модуле формы обработки можно обратиться к ВладелецФормы. Если обработка открыта из формы документа, то через ВладелецФормы.Объект можно получить доступ к данным документа и его табличным частям. Однако это считается не самым надежным методом, так как обработка становится зависимой от структуры конкретной формы.

2. Передача параметров. Рассмотрим более профессиональный метод передачи данных через структуру параметров при открытии формы:


&НаКлиенте
Процедура ОткрытьОбработкуСПараметрами()
    ПараметрыФормы = Новый Структура;
    ПараметрыФормы.Вставить("ДокументСсылка", Объект.Ссылка);
    ПараметрыФормы.Вставить("ТекущиеТовары", Объект.Товары);
    
    // Подключаем и открываем
    ИмяОбр = ПодключитьОбработкуНаСервере(НужнаяСсылка);
    ОткрытьФорму("ВнешняяОбработка." + ИмяОбр + ".Форма.Форма", ПараметрыФормы, ЭтаФорма);
КонецПроцедуры

В самой внешней обработке в процедуре ПриСозданииНаСервере вы сможете прочитать эти параметры и использовать их для настройки логики заполнения.

Важные замечания по безопасности

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

Также помните, что метод ВнешниеОбработки.Создать (упомянутый в сообщении №2) на управляемых формах использовать нельзя напрямую на клиенте, так как он создает объект на сервере, который невозможно передать на клиент. Используйте именно Подключить и ОткрытьФорму.

Таким образом, мы выяснили, что для успешного открытия формы внешней обработки необходимо либо следовать стандартам БСП, регистрируя команду открытия формы, либо программно «регистрировать» файл обработки в сеансе через временное хранилище и метод Подключить. Это обеспечит стабильную работу вашего кода и отсутствие ошибок при обращении к формам.

← На главную