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