Как модифицировать формы обработки Контур.Диадок через подключаемый модуль

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

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

Поиск точек входа: Активация трассировщика событий

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

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


Функция ОбработатьСобытие(ИмяСобытия, Параметры) Экспорт
    // Реализуем вывод отладочной информации
    Сообщить("ПМ Диадок — Обработка события: " + ИмяСобытия);
    
    Если ИмяСобытия = "ПередОткрытиемФормы" Тогда
        // Здесь будет наша логика модификации
    КонецЕсли;
    
    Возврат Неопределено;
КонецФункции

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

Программная модификация форм и создание элементов

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

Рассмотрим пошагово процесс добавления кнопки в подключаемом модуле:

  1. Получаем объект формы: Через входящие параметры функции определяем, с какой формой мы работаем.
  2. Создаем элемент: Используем метод ЭлементыФормы.Добавить().
  3. Назначаем действие: Это самый критичный момент для обычных форм.

Проанализируем пример кода для программного создания кнопки:


Процедура МодифицироватьФормуСписка(Форма)
    // Добавляем кнопку на командную панель "Действия"
    КоманднаяПанель = Форма.ЭлементыФормы.КоманднаяПанельФормы;
    НоваяКнопка = КоманднаяПанель.Кнопки.Добавить("КнМояДоработка", ТипКнопкиКоманднойПанели.Действие, "Мое Действие", Новый Действие("ПодключаемыйМодуль_ВыполнитьКоманду"));
    
    // Если нужно добавить колонку в табличную часть
    ТЧ = Форма.ЭлементыФормы.СписокДокументов;
    НоваяКолонка = ТЧ.Колонки.Вставить(0, "ДопИнфо");
    НоваяКолонка.ТекстШапки = "Инфо";
    НоваяКолонка.Видимость = Истина;
КонецПроцедуры

Важное ограничение: В обычных формах (ОФ) объект Действие требует наличия процедуры-обработчика именно в модуле самой формы. Поскольку мы работаем через ПМ, нам необходимо использовать стандартные обработчики Диадока, которые умеют перенаправлять вызов обратно в подключаемый модуль. Обычно это процедура ПодключаемыйМодуль_ВыполнитьКоманду. Если её нет в вашей версии основной обработки, прямое назначение действия из ПМ на кнопку в ОФ может быть затруднено без минимальной правки основной формы-шаблона.

Обработка нажатия кнопок в ПМ

Чтобы выполнить полезный код при нажатии нашей программно созданной кнопки, мы должны поймать событие нажатия в той же функции ОбработатьСобытие. Выясним, как это работает на практике. Когда пользователь нажимает кнопку, основная обработка транслирует событие в ПМ с определенным именем, например, ВыполнитьКоманду или НажатиеКнопки.


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

Добавление колонок и заполнение данных

Добавление колонки — это только половина задачи. Нам также необходимо заполнить её данными. В Диадоке для этого используются события ПриВыводеСтроки или ПриПолученииДанных. Разберем, как подключиться к этим событиям через ПМ.

Проанализируем ситуацию: в момент вывода строки основная обработка вызывает ПМ. Мы можем использовать этот момент для установки текста или значения в нашу новую колонку:


Если ИмяСобытия = "ПриВыводеСтроки" Тогда
    // Параметры содержат ОформлениеСтроки и ДанныеСтроки
    Оформление = Параметры.ОформлениеСтроки;
    Данные = Параметры.ДанныеСтроки;
    
    // Устанавливаем значение в нашу колонку
    Оформление.Ячейки.ДопИнфо.УстановитьТекст("Статус: " + ПолучитьМойСтатус(Данные.Ссылка));
КонецЕсли;

Ограничения и рекомендации по использованию ПМ

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

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

Подводя итог, можно сказать: использование ПМ — это отличный способ сохранить обработку Диадок обновляемой, но он требует тщательного исследования доступных событий через трассировку и понимания механизмов взаимодействия объектов в 1С.

← На главную