В процессе работы с конфигурацией «1С:Управление торговлей 10.3» часто возникает задача упростить доступ пользователей к специфическим инструментам, например, к модулю ЭДО «Диадок». По умолчанию такие обработки запускаются через справочник «Дополнительные внешние обработки», что требует лишних кликов. Рассмотрим, как реализовать вызов конкретной обработки напрямую через кнопку в меню интерфейса или на панели инструментов.
Проанализируем ситуацию: у нас есть элемент справочника ВнешниеОбработки, в котором хранится файл модуля (например, Диадок). Наша цель — создать процедуру, которая при нажатии на кнопку интерфейса автоматически найдет этот элемент, извлечет файл во временное хранилище и откроет его форму пользователю. Разберем наиболее эффективные способы реализации этой задачи, учитывая нюансы работы обычных форм.
Этот способ является наиболее быстрым в реализации. Мы создадим экспортную процедуру в общем модуле конфигурации, которую затем привяжем к команде интерфейса. Рассмотрим по шагам, как выглядит программный код для решения этой задачи.
Для начала нам необходимо определить уникальный идентификатор обработки в справочнике. В примере ниже используется поиск по коду, однако помните, что это требует жесткого соответствия кодов в базе данных.
Процедура ДиадокЗапуститьВнешнююОбработку() Экспорт
// 1. Находим ссылку на элемент справочника по его коду
ОбработкаСсылка = Справочники.ВнешниеОбработки.НайтиПоКоду("Т00000003");
Если ОбработкаСсылка = Справочники.ВнешниеОбработки.ПустаяСсылка() Тогда
Сообщить("Элемент справочника внешних обработок с кодом Т00000003 не найден!", СтатусСообщения.ОченьВажное);
Возврат;
КонецЕсли;
// 2. Проверяем, что это именно обработка, а не печатная форма
Если ОбработкаСсылка.ВидОбработки <> Перечисления.ВидыДополнительныхВнешнихОбработок.Обработка Тогда
Предупреждение("Данный элемент не является внешней обработкой!");
Возврат;
КонецЕсли;
Попытка
// 3. Извлекаем двоичные данные файла из хранилища
ИмяФайла = ПолучитьИмяВременногоФайла("epf"); // Явно указываем расширение
ДвоичныеДанные = ОбработкаСсылка.ХранилищеВнешнейОбработки.Получить();
ДвоичныеДанные.Записать(ИмяФайла);
// 4. Получаем форму и открываем ее
Форма = ВнешниеОбработки.ПолучитьФорму(ИмяФайла);
Если Не Форма = Неопределено Тогда
Форма.Открыть();
Иначе
// Если форма по умолчанию не определена, создаем объект
ВнешняяОбработкаОбъект = ВнешниеОбработки.Создать(ИмяФайла);
ВнешняяОбработкаОбъект.ПолучитьФорму().Открыть();
КонецЕсли;
// ВНИМАНИЕ: Файл нельзя удалять сразу, если обработка обращается к нему в процессе работы
// УдалитьФайлы(ИмяФайла); // Рекомендуется удалять при закрытии формы или сеанса
Исключение
Предупреждение("Ошибка при запуске внешней обработки: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Разберем важный технический момент. В коде выше мы использовали функцию ПолучитьИмяВременногоФайла("epf"). Проанализируем, почему это критично. В обычных формах при вызове метода ВнешниеОбработки.ПолучитьФорму() платформа 1С ориентируется на расширение файла. Если файл не будет иметь расширения .epf, система может выдать ошибку «Неверный формат файла».
Также обратите внимание на строку УдалитьФайлы(ИмяФайла). Если мы удалим файл сразу после выполнения команды Форма.Открыть(), внешняя обработка может потерять доступ к собственным макетам или ресурсам, которые подгружаются динамически. Правильнее будет оставлять файл во временной директории — платформа очистит её автоматически при завершении работы пользователя.
Выясним причину, по которой поиск по коду считается «плохим тоном» в разработке. Если в справочнике произойдет перенумерация или вы перенесете код в другую базу, где у Диадока будет другой код, кнопка перестанет работать. Рассмотрим более гибкий вариант: использование константы.
СсылкаНаМодульДиадок с типом СправочникСсылка.ВнешниеОбработки.
Процедура ДиадокЗапуститьЧерезКонстанту() Экспорт
// Получаем ссылку напрямую из настроек
ОбработкаСсылка = Константы.СсылкаНаМодульДиадок.Получить();
Если ОбработкаСсылка.Пустая() Тогда
Предупреждение("В настройках не указана внешняя обработка для запуска модуля ЭДО!");
Возврат;
КонецЕсли;
// Далее следует логика извлечения и запуска, описанная в первом способе
// ...
КонецПроцедуры
После того как процедура в общем модуле создана (не забудьте установить флаг «Глобальный» или просто вызывайте через имя модуля, например МойМодуль.ДиадокЗапуститьВнешнююОбработку()), нам нужно добавить её в интерфейс.
Для этого выполним следующие шаги:
Проанализируем ситуацию, упомянутую в обсуждении: почему техподдержка настаивает на запуске именно из справочника внешних обработок? Современные модули ЭДО часто используют механизмы автообновления и проверки сертификатов, которые могут конфликтовать со встроенными в конфигурацию объектами.
При использовании программного метода, описанного выше, мы фактически имитируем стандартное поведение справочника, что позволяет сохранить полную работоспособность модуля и поддержку от вендора (Контура). При этом пользователь получает удобство «одной кнопки», а система работает стабильно.
Мы рассмотрели, как программно реализовать мост между интерфейсом 1С и хранилищем внешних обработок. Подведем итоги:
.epf при создании временного файла.НайтиПоКоду), отдавая предпочтение константам или дополнительным свойствам.Такой подход делает работу пользователей в «1С:Управление торговлей 10.3» более комфортной, не нарушая при этом архитектуру типового решения и сохраняя возможность обновления внешних модулей без изменения кода конфигурации.