При доработке типовых конфигураций на обычных формах (таких как 1С:Управление производственным предприятием 1.3, 1С:Комплексная автоматизация 1.1 или 1С:Управление торговлей 10.3) разработчики часто сталкиваются с необходимостью выполнить определенные действия или запустить алгоритм внешней обработки в момент смены пользователем вида операции документа (например, в документе Приходный ордер на товары). Однако при попытке найти привычное событие ПриИзменении в свойствах формы разработчик обнаруживает, что у реквизита ВидОперации нет стандартного поля ввода на форме.
Разберем подробно, почему так происходит, как устроен механизм переключения вида операции в обычных формах и где именно следует размещать вызов собственного кода или внешней обработки.
Проанализируем структуру формы типового документа. В конфигурациях на обычных формах выбор вида операции реализован не через стандартный элемент управления (ПолеВвода или ПолеВыбора), а через динамически формируемые кнопки командной панели формы.
При инициализации формы (как правило, в процедуре ПриОткрытии или ПередОткрытием) вызывается служебная процедура общего модуля, которая генерирует подменю выбора операций:
РаботаСДиалогами.УстановитьПодменюВыбораВидаОперацииФильтр(
ЭлементыФормы.ДействияФормы.Кнопки.ПодменюВидаОперации,
ВидОперации.Метаданные().ЗначенияПеречисления,
Новый Действие("ДействияФормыДействиеУстановитьОперацию"),
мСписокИсключения
);
В качестве обработчика нажатия для каждого пункта подменю передается единое действие — процедура ДействияФормыДействиеУстановитьОперацию. Именно поэтому стандартного интерактивного события элемента управления в палитре свойств формы нет.
Разберем по шагам, как перехватить выбор нового вида операции и запустить нужный алгоритм.
ДействияФормыДействиеУстановитьОперацию(Кнопка).ЭтотОбъект.ВидОперации, а затем вызывает стандартные процедуры перенастройки интерфейса (скрытие/отображение колонок, проверка заполнения реквизитов).ВидОперации уже обновилось и форма перенастроилась.Рассмотрим пример кода обработчика в модуле формы:
Процедура ДействияФормыДействиеУстановитьОперацию(Кнопка)
// Типовой алгоритм смены операции
УстановитьОперацию(Кнопка.Значение);
// Пользовательский вызов внешней обработки
ВызватьОбработкуПриСменеОперации();
КонецПроцедуры
Выясним, как правильно подключить и запустить внешнюю обработку из модуля формы документа. В зависимости от архитектуры решения можно использовать один из двух вариантов.
Вариант 1. Загрузка обработки из файла на диске:
Процедура ВызватьОбработкуПриСменеОперации()
ПутьКФайлу = "\\server\1c_share\ОбработкаПриходногоОрдера.epf";
Попытка
ОбработкаОбъект = ВнешниеОбработки.Создать(ПутьКФайлу);
// Передаем контекст документа в экспортный метод обработки
ОбработкаОбъект.Инициализировать(ЭтотОбъект);
Исключение
Сообщить("Ошибка при вызове внешней обработки: " + ОписаниеОшибки(), СтатусСообщения.Важное);
КонецПопытки;
КонецПроцедуры
Вариант 2. Запуск из типового справочника «Внешние обработки»:
Если файл обработки хранится внутри информационной базы в типовом справочнике дополнительных отчетов и обработок, извлечем двоичные данные во временный файл и подключим объект:
Процедура ВызватьОбработкуПриСменеОперацииИзСправочника()
СсылкаНаОбработку = Справочники.ВнешниеОбработки.НайтиПоНаименованию("Обработка заполнения ордера");
Если Не ЗначениеЗаполнено(СсылкаНаОбработку) Тогда
Возврат;
КонецЕсли;
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("epf");
ДвоичныеДанные = СсылкаНаОбработку.ХранилищеВнешнейОбработки.Получить();
ДвоичныеДанные.Записать(ИмяВременногоФайла);
Попытка
ОбработкаОбъект = ВнешниеОбработки.Создать(ИмяВременногоФайла);
ОбработкаОбъект.ВыполнитьДействие(ЭтотОбъект);
Исключение
Сообщить("Не удалось выполнить внешнюю обработку: " + ОписаниеОшибки(), СтатусСообщения.Внимание);
КонецПопытки;
УдалитьФайлы(ИмяВременногоФайла);
КонецПроцедуры
Проанализируем возможные альтернативы, если требуется минимизировать изменения в типовой конфигурации:
ПолеВвода, связать его с данными ВидОперации и назначить стандартное событие ПриИзменении. Однако при этом потребуется либо скрыть типовые кнопки в командной панели, либо синхронизировать их работу, чтобы избежать дублирования действий.ПередЗаписью, ОбработкаПроведения) реагирует только на серверные события записи объекта базы данных и не способен перехватить интерактивный клик пользователя в интерфейсе обычной формы до момента нажатия кнопки сохранения. Поэтому для интерактивной реакции на выбор пункта меню доработка формы документа является обязательной.