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