Как в 1С отследить статус отправки документа через модуль Контур.Диадок версии 4.16 и выше?

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

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

Решение 1: Использование Подключаемого модуля (ПМ)

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

Рассмотрим по шагам, как использовать событие ПослеОтправкиПакета для фиксации статуса в базе 1С. Этот метод вызывается сразу после того, как пакет документов успешно ушел на сервер Диадока и получил уникальные идентификаторы.

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


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

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

Решение 2: Получение статусов через API Диадока

Для того чтобы собрать отчет "что отправлено, а что нет", нам необходимо периодически опрашивать сервер Диадока. Рассмотрим ситуацию, когда нам нужно получить статус конкретного документа, включая статус проверки маркировки в системе Честный Знак (ГИС МТ). Для проверки работы с веб-сервисом и отладки запросов пригодится консоль HTTP-запросов для управляемых форм.

Для реализации этого метода нам потребуется:

  1. Ключ разработчика (API-client-ID) — получается в техподдержке Диадока.
  2. Логин и пароль пользователя для авторизации.
  3. Идентификаторы документа (messageId и entityId), которые сохраняются в 1С при отправке.

Разберем программный пример выполнения HTTP-запроса к API:


Функция ПолучитьСтатусДокументаПоAPI(Гуид, BoxId)
    
    // 1. Авторизация и получение токена
    // Токен желательно кэшировать на 24 часа, а не запрашивать каждый раз
    АдресСайта = "diadoc-api.kontur.ru";
    ddauth_api_client = "ВАШ_API_KEY";
    
    Соединение = Новый HTTPСоединение(АдресСайта, , , , , , Новый ЗащищенноеСоединениеOpenSSL());
    
    // Запрос авторизации
    ЗапросAuth = Новый HTTPЗапрос("/Authenticate?login=" + Логин + "&password=" + Пароль);
    ЗапросAuth.Заголовки.Вставить("Authorization", "DiadocAuth ddauth_api_client_id=" + ddauth_api_client);
    
    ОтветAuth = Соединение.ОтправитьДляОбработки(ЗапросAuth);
    Токен = ОтветAuth.ПолучитьТелоКакСтроку();
    
    // 2. Получение данных документа
    // Разбиваем сохраненный Гуид на messageId и entityId
    messageId = Лев(Гуид, 36);
    entityId = СтрЗаменить(Гуид, messageId, "");
    
    // Формируем запрос к V3/GetDocument
    Ресурс = "/V3/GetDocument?boxId=" + BoxId + "&messageId=" + messageId + "&entityId=" + entityId;
    ЗапросСтатуса = Новый HTTPЗапрос(Ресурс);
    ЗапросСтатуса.Заголовки.Вставить("Accept", "application/json");
    ЗапросСтатуса.Заголовки.Вставить("Authorization", "DiadocAuth ddauth_api_client_id=" + ddauth_api_client + ",ddauth_token=" + Токен);
    
    ОтветHTTP = Соединение.Получить(ЗапросСтатуса);
    Если ОтветHTTP.КодСостояния = 200 Тогда
        ОтветJSON = ОтветHTTP.ПолучитьТелоКакСтроку();
        // Парсим JSON и анализируем структуру LastOuterDocflows для поиска статусов ГИС МТ
        // или стандартные поля для поиска статуса подписи контрагентом
    КонецЕсли;

КонецФункции

Профессиональный подход: Использование событий (BoxEvents)

Если документов много, "долбить" API запросами по каждому отдельному документу неэффективно и может привести к блокировке по лимитам. Проанализируем более правильный путь — использование метода GetEvents.

Суть метода заключается в следующем:

Это позволяет поддерживать актуальность отчета в реальном времени с минимальной нагрузкой на систему.

Где искать связи документов в 1С?

Если вы не писали свой код для сохранения ID, выясним, где сам модуль Диадок хранит связи между объектами 1С и документами в облаке:

  1. Регистр сведений "Диадок_СоответствияОбъектов": Если модуль встроен в конфигурацию, ищите данные в этом техническом регистре.
  2. Хранилище настроек или кэш-файлы: Если модуль работает как внешняя обработка без встраивания, он может хранить временные связи в локальных файлах пользователя или в системном хранилище настроек.
  3. Поле AnyCustomEntityId: При отправке через API профессионалы рекомендуют записывать GUID ссылки документа 1С в это поле на сервере Диадок. Тогда через поиск в API можно найти документ, даже если в 1С все связи были потеряны.

Важный совет: Для быстрого решения задачи без программирования, проверьте штатную функцию модуля Диадок "Выгрузить список". В последних версиях она позволяет выгрузить таблицу из текущего окна (Входящие/Исходящие) со всеми статусами и ссылками на объекты 1С прямо в Excel, что само по себе уже является готовым отчетом для бухгалтерии.

← На главную