Как программно доработать модуль Контур.Диадок для автоматической рассылки уведомлений контрагентам?

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

В процессе работы с электронным документооборотом (ЭДО) часто возникает задача автоматизации контроля за подписанием документов со стороны контрагентов. Типовой сценарий: бухгалтерия отправила документ, но клиент «забыл» его подписать. Нам необходимо реализовать механизм, который будет отслеживать факт отправки, проверять статус документа и через определенный интервал (например, 5 дней) отправлять повторное уведомление. Рассмотрим, как это реализовать, используя возможности Универсального модуля Контур.Диадок.

Архитектура решения: плагины и расширение функционала

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

Вместо того чтобы изменять «потроха» внешней обработки Диадока, мы можем создать свою внешнюю обработку-плагин. В настройках Универсального модуля можно указать путь к этому плагину. Модуль в ключевые моменты своей работы (при открытии, после отправки, при получении обновлений) вызывает предопределенные процедуры из этого плагина.

Разберем основные точки входа, которые нам понадобятся для решения задачи:

  1. ПослеОтправкиПакета — позволяет зафиксировать момент ухода документа клиенту.
  2. ПослеОбновленияСтатусовДокументов — идеальное место для проверки того, изменился ли статус документа на «Подписан».
  3. ПослеОбновленияСпискаДокументов — срабатывает при обновлении ленты событий.

Шаг 1: Фиксация отправки документа

Выясним, как отловить событие подписания и отправки исходящего документа нашей стороной. Когда бухгалтер нажимает кнопку «Подписать и отправить», модуль Диадок формирует пакет и отправляет его на сервер. В этот момент нам нужно сохранить данные в свою структуру в 1С.

Проанализируем структуру хранения данных. Лучшим решением будет создание собственного Регистра сведений, например, СтатусыДокументовДляУведомлений. В нем мы будем хранить:

В коде плагина это может выглядеть следующим образом:


Процедура ПослеОтправкиПакета(Контекст, РезультатОтправки) Экспорт
    // Проанализируем результат отправки
    Для Каждого Пакет Из РезультатОтправки.Пакеты Цикл
        Для Каждого ДокументДиадок Из Пакет.Документы Цикл
            // Записываем данные в наш регистр для контроля 5-дневного срока
            МенеджерЗаписи = РегистрыСведений.СтатусыДокументовДляУведомлений.СоздатьМенеджерЗаписи();
            МенеджерЗаписи.Документ = ДокументДиадок.СсылкаНаОбъект1С;
            МенеджерЗаписи.ДатаОтправки = ТекущаяДата();
            МенеджерЗаписи.ФлагПодписано = Ложь;
            МенеджерЗаписи.Записать();
        КонецЦикла;
    КонецЦикла;
КонецПроцедуры

Шаг 2: Отслеживание подписания контрагентом

Второй важный вопрос — как понять, что клиент подписал документ? Модуль Диадока работает по принципу Event Feed (Ленты событий). Вместо того чтобы постоянно опрашивать каждый документ, система запрашивает у сервера список изменений, произошедших с момента последнего обращения.

Рассмотрим метод ЭДО_Модуль_ОбработатьНовыеСобытияДокументов. Если в вашей конфигурации внедрена подсистема Диадока, этот метод автоматически обновляет внутренние справочники (например, Диадок_Документы). Если же вы используете только внешнюю обработку, нам нужно внедриться в процесс обновления статусов.

Посмотрим на пример логики в плагине, которая будет срабатывать при обновлении списка документов:


Процедура ПослеОбновленияСтатусовДокументов(Контекст, СписокДокументов) Экспорт
    Для Каждого СтрокаДокумента Из СписокДокументов Цикл
        // Проверяем статус в структуре Диадока
        Если СтрокаДокумента.Статус = "ПодписанКонтрагентом" Тогда
            // Обновляем наш регистр контроля
            НаборЗаписей = РегистрыСведений.СтатусыДокументовДляУведомлений.СоздатьНаборЗаписей();
            НаборЗаписей.Отбор.Документ.Установить(СтрокаДокумента.СсылкаНаОбъект1С);
            НаборЗаписей.Прочитать();
            Если НаборЗаписей.Количество() > 0 Тогда
                Запись = НаборЗаписей[0];
                Запись.ФлагПодписано = Истина;
                НаборЗаписей.Записать();
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Шаг 3: Реализация регламентного задания для уведомлений

Теперь, когда у нас есть данные об отправке и мы умеем обновлять статус подписания, нам нужно реализовать «счетчик» 5 дней. Проанализируем ситуацию: проверку лучше делать на стороне сервера 1С с помощью Регламентного задания.

Рассмотрим алгоритм работы регламентного задания:

  1. Выбираем из регистра СтатусыДокументовДляУведомлений все записи, где ФлагПодписано = Ложь.
  2. Для каждой записи сравниваем ТекущаяДата с ДатаПоследнегоУведомления (или ДатаОтправки, если уведомлений еще не было).
  3. Если разница составляет 5 и более дней, инициируем отправку уведомления.

Пример кода регламентного задания:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   Статусы.Документ,
    |   Статусы.ДатаОтправки
    |ИЗ
    |   РегистрСведений.СтатусыДокументовДляУведомлений КАК Статусы
    |ГДЕ
    |   Статусы.ФлагПодписано = ЛОЖЬ
    |   И РАЗНОСТЬДАТ(Статусы.ДатаОтправки, &ТекущаяДата, ДЕНЬ) >= 5";

Запрос.УстановитьПараметр("ТекущаяДата", ТекущаяДата());
Результат = Запрос.Выполнить().Выбрать();

Пока Результат.Следующий() Цикл
    // Вызываем функцию отправки уведомления (Email, SMS или комментарий в Диадок)
    ОтправитьУведомлениеКлиенту(Результат.Документ);
    
    // Обновляем дату последнего уведомления в регистре, чтобы не спамить каждый день
    ОбновитьДатуУведомления(Результат.Документ);
КонецЦикла;

Тонкости работы с API и лентой событий

Важно помнить, что механизм Event Feed API использует указатель ExclusiveSequenceId. Если вы решите писать свой собственный полностью автономный обмен через API Диадока (используя их DLL-компоненту), вы можете случайно «сдвинуть» этот указатель. В результате основной Универсальный модуль «подумает», что он уже обработал все события, и новые документы не появятся в интерфейсе 1С.

Поэтому мы настоятельно рекомендуем использовать штатные методы Универсального модуля, такие как GetEvents или интеграцию через справочник Лента событий. Это гарантирует, что ваша доработка будет работать синхронно с основным функционалом ЭДО.

Также обратите внимание на статусы документов в API. Документ, ожидающий подписи клиента, обычно имеет внутренний статус WaitingForRecipientSignature. Программный анализ этого статуса позволяет точно определить, нужно ли отправлять напоминание, не дожидаясь визуального обновления списка пользователем.

Резюме

Подведем итог. Для реализации системы повторных уведомлений нам не нужно менять код основного модуля Диадок. Достаточно:

Такой подход является наиболее «чистым» с точки зрения архитектуры 1С, так как он сохраняет возможность беспрепятственного обновления модуля Диадок в будущем.

← На главную