Как программно открыть внешнюю обработку из справочника Дополнительные отчеты и обработки в 1С:УТ 11

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

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

Анализ типичной ошибки: почему открывается форма справочника?

Рассмотрим ситуацию, когда при попытке программного вызова вместо окна обработки открывается карточка справочника. Это происходит из-за того, что разработчик пытается вызвать метод ПолучитьФорму() непосредственно у ссылки на элемент справочника ДополнительныеОтчетыИОбработки. В системе 1С это интерпретируется как команда на открытие формы самого элемента справочника, а не того внешнего файла, который в нем хранится.

Для запуска внешней обработки система должна сначала извлечь двоичные данные файла из хранилища, поместить их во временное хранилище на сервере и «подключить» их к текущему сеансу, присвоив временное имя. Только после этого форму можно будет открыть по строковому пути ВнешняяОбработка.[Имя].Форма.

Решение 1: Программное подключение через серверный вызов

Проанализируем наиболее популярный и гибкий способ решения задачи. Нам потребуется разделить логику на клиентскую часть (взаимодействие с интерфейсом) и серверную (работа с базой данных и подключение файла).

Шаг 1. Создание серверной функции для получения ссылки и подключения.

Поскольку обращение к справочникам напрямую с клиента невозможно (или крайне ограничено), нам нужно найти ссылку на обработку и вызвать метод подключения на стороне сервера. Для этого воспользуемся общим модулем ДополнительныеОтчетыИОбработкиВызовСервера.


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

    // Подключаем обработку и получаем её временное внутреннее имя
    ИмяОбработки = ДополнительныеОтчетыИОбработкиВызовСервера.ПодключитьВнешнююОбработку(СсылкаНаОбр);
    
    Возврат ИмяОбработки;
    
КонецФункции

Шаг 2. Клиентская процедура открытия формы.

Теперь на стороне клиента мы вызываем нашу серверную функцию, получаем имя и используем стандартный метод ОткрытьФорму(). Обратите внимание, что к имени обработки нужно добавить префикс ВнешняяОбработка. (или ВнешнийОтчет., если это отчет).


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

Решение 2: Использование стандартных методов БСП

Выясним, как сделать это еще более правильно с точки зрения Библиотеки Стандартных Подсистем (БСП). В современных версиях УТ 11 предусмотрены специальные клиентские методы, которые инкапсулируют всю логику поиска и открытия — для этих задач есть автоматизация вызова объектов и заполнения форм.

Рассмотрим метод ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьОткрытиеФормыОбработки. Его преимущество в том, что он учитывает настройки безопасности и правильно обрабатывает параметры открытия.


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

Передача контекста: как передать данные документа в обработку

Проанализируем ситуацию, когда обработка должна не просто открыться, а сразу «увидеть» документ, из которого её вызвали. Для этого используется структура параметров. Рассмотрим пример передачи ссылки на текущий заказ клиента в параметр ОбъектНазначения.


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

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

Важные нюансы и рекомендации

Разберем несколько критически важных моментов, которые помогут избежать ошибок в будущем:

  1. Поиск по наименованию: В примере выше мы использовали НайтиПоНаименованию. Это крайне ненадежный способ, так как любой пользователь с правами администратора может переименовать запись в справочнике, и ваша кнопка перестанет работать. Рекомендуется использовать поиск по уникальному идентификатору или (лучше всего) хранить ссылку в настройках конфигурации/расширения.
  2. Безопасный режим: При подключении внешней обработки через справочник система часто запускает её в безопасном режиме. Если ваша обработка должна работать с файловой системой сервера или внешними API, убедитесь, что в карточке дополнительной обработки в интерфейсе снята галочка «Безопасный режим».
  3. Имя обработки: Метод ПодключитьВнешнююОбработку каждый раз генерирует уникальное имя (GUID). Не пытайтесь «зашить» имя обработки в код жестко. Всегда используйте результат, возвращаемый функцией подключения.
  4. Удаление из памяти: После закрытия формы обработка может оставаться подключенной в рамках текущего сеанса. При массовом программном открытии множества разных обработок это может привести к потреблению памяти, однако для разовых вызовов это не критично.

Таким образом, мы рассмотрели основные способы интеграции внешнего функционала в типовые формы УТ 11 — для подобных задач есть универсальный набор инструментов разработчика 1С. Использование методов БСП является наиболее предпочтительным, так как гарантирует совместимость при обновлениях конфигурации.

← На главную