Как программно вызвать внешнюю обработку из справочника через команду интерфейса в УТ 10.3

Программист 1С v8.3 (Обычные формы) Торговля и дистрибуция
← На главную

В процессе работы с конфигурацией «1С:Управление торговлей 10.3» часто возникает задача упростить доступ пользователей к специфическим инструментам, например, к модулю ЭДО «Диадок». По умолчанию такие обработки запускаются через справочник «Дополнительные внешние обработки», что требует лишних кликов. Рассмотрим, как реализовать вызов конкретной обработки напрямую через кнопку в меню интерфейса или на панели инструментов.

Постановка задачи и выбор стратегии

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

Способ 1: Прямой вызов через общий модуль (поиск по коду)

Этот способ является наиболее быстрым в реализации. Мы создадим экспортную процедуру в общем модуле конфигурации, которую затем привяжем к команде интерфейса. Рассмотрим по шагам, как выглядит программный код для решения этой задачи.

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


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

Нюансы работы с временными файлами

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

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

Способ 2: Использование константы для выбора обработки

Выясним причину, по которой поиск по коду считается «плохим тоном» в разработке. Если в справочнике произойдет перенумерация или вы перенесете код в другую базу, где у Диадока будет другой код, кнопка перестанет работать. Рассмотрим более гибкий вариант: использование константы.

  1. Создадим новую константу, например, СсылкаНаМодульДиадок с типом СправочникСсылка.ВнешниеОбработки.
  2. Выведем эту константу в настройки параметров учета, чтобы администратор мог один раз выбрать нужную обработку из списка.
  3. Изменим программный код вызова.

Процедура ДиадокЗапуститьЧерезКонстанту() Экспорт
    
    // Получаем ссылку напрямую из настроек
    ОбработкаСсылка = Константы.СсылкаНаМодульДиадок.Получить();
    
    Если ОбработкаСсылка.Пустая() Тогда
        Предупреждение("В настройках не указана внешняя обработка для запуска модуля ЭДО!");
        Возврат;
    КонецЕсли;
    
    // Далее следует логика извлечения и запуска, описанная в первом способе
    // ...
КонецПроцедуры

Интеграция в интерфейс (обычные формы)

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

Для этого выполним следующие шаги:

  1. Откроем дерево конфигурации и перейдем в ветку «Общие» -> «Интерфейсы».
  2. Выберем нужный интерфейс (например, «Полный» или «ИнтерфейсМенеджераПродаж»).
  3. В редакторе интерфейса добавим новое меню или кнопку на панель инструментов.
  4. В свойствах кнопки в поле «Действие» выберем нашу экспортную процедуру.

Особенности модуля Диадок (версии 4.60 и выше)

Проанализируем ситуацию, упомянутую в обсуждении: почему техподдержка настаивает на запуске именно из справочника внешних обработок? Современные модули ЭДО часто используют механизмы автообновления и проверки сертификатов, которые могут конфликтовать со встроенными в конфигурацию объектами.

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

Резюме и рекомендации

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

Такой подход делает работу пользователей в «1С:Управление торговлей 10.3» более комфортной, не нарушая при этом архитектуру типового решения и сохраняя возможность обновления внешних модулей без изменения кода конфигурации.

← На главную