Как вызвать обработку при изменении вида операции в документе на обычных формах 1С

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

При доработке типовых конфигураций на обычных формах (таких как 1С:Управление производственным предприятием 1.3, 1С:Комплексная автоматизация 1.1 или 1С:Управление торговлей 10.3) разработчики часто сталкиваются с необходимостью выполнить определенные действия или запустить алгоритм внешней обработки в момент смены пользователем вида операции документа (например, в документе Приходный ордер на товары). Однако при попытке найти привычное событие ПриИзменении в свойствах формы разработчик обнаруживает, что у реквизита ВидОперации нет стандартного поля ввода на форме.

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

Почему у вида операции отсутствует стандартное событие «ПриИзменении»

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

При инициализации формы (как правило, в процедуре ПриОткрытии или ПередОткрытием) вызывается служебная процедура общего модуля, которая генерирует подменю выбора операций:


РаботаСДиалогами.УстановитьПодменюВыбораВидаОперацииФильтр(
    ЭлементыФормы.ДействияФормы.Кнопки.ПодменюВидаОперации,
    ВидОперации.Метаданные().ЗначенияПеречисления,
    Новый Действие("ДействияФормыДействиеУстановитьОперацию"),
    мСписокИсключения
);

В качестве обработчика нажатия для каждого пункта подменю передается единое действие — процедура ДействияФормыДействиеУстановитьОперацию. Именно поэтому стандартного интерактивного события элемента управления в палитре свойств формы нет.

Решение: Встраивание вызова обработки в процедуру смены операции

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

  1. Откроем модуль формы документа в режиме Конфигуратор.
  2. Найдем процедуру-обработчик ДействияФормыДействиеУстановитьОперацию(Кнопка).
  3. Посмотрим на логику процедуры: сначала она определяет выбранное значение перечисления по переданной кнопке, записывает его в реквизит ЭтотОбъект.ВидОперации, а затем вызывает стандартные процедуры перенастройки интерфейса (скрытие/отображение колонок, проверка заполнения реквизитов).
  4. Встроим вызов нужной логики или внешней обработки после того, как значение реквизита ВидОперации уже обновилось и форма перенастроилась.

Рассмотрим пример кода обработчика в модуле формы:


Процедура ДействияФормыДействиеУстановитьОперацию(Кнопка)

    // Типовой алгоритм смены операции
    УстановитьОперацию(Кнопка.Значение);
    
    // Пользовательский вызов внешней обработки
    ВызватьОбработкуПриСменеОперации();

КонецПроцедуры

Способы программного вызова внешней обработки

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

Вариант 1. Загрузка обработки из файла на диске:


Процедура ВызватьОбработкуПриСменеОперации()

    ПутьКФайлу = "\\server\1c_share\ОбработкаПриходногоОрдера.epf";
    
    Попытка
        ОбработкаОбъект = ВнешниеОбработки.Создать(ПутьКФайлу);
        // Передаем контекст документа в экспортный метод обработки
        ОбработкаОбъект.Инициализировать(ЭтотОбъект);
    Исключение
        Сообщить("Ошибка при вызове внешней обработки: " + ОписаниеОшибки(), СтатусСообщения.Важное);
    КонецПопытки;

КонецПроцедуры

Вариант 2. Запуск из типового справочника «Внешние обработки»:

Если файл обработки хранится внутри информационной базы в типовом справочнике дополнительных отчетов и обработок, извлечем двоичные данные во временный файл и подключим объект:


Процедура ВызватьОбработкуПриСменеОперацииИзСправочника()

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

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

КонецПроцедуры

Альтернативные варианты и ограничения платформы

Проанализируем возможные альтернативы, если требуется минимизировать изменения в типовой конфигурации:

  1. Добавление поля ввода на форму: можно вручную разместить на форме элемент ПолеВвода, связать его с данными ВидОперации и назначить стандартное событие ПриИзменении. Однако при этом потребуется либо скрыть типовые кнопки в командной панели, либо синхронизировать их работу, чтобы избежать дублирования действий.
  2. Подключение через механизм дополнительных обработок табличных частей: если логику не обязательно выполнять мгновенно при клике по кнопке смены операции, ее можно зарегистрировать как обработку заполнения табличной части (кнопка Заполнить). Это позволит пользователю вызывать обработку штатно без изменения кода конфигурации.
  3. Ограничения подписок на события: механизм подписок на уровне метаданных (ПередЗаписью, ОбработкаПроведения) реагирует только на серверные события записи объекта базы данных и не способен перехватить интерактивный клик пользователя в интерфейсе обычной формы до момента нажатия кнопки сохранения. Поэтому для интерактивной реакции на выбор пункта меню доработка формы документа является обязательной.
← На главную