Как извлечь дату подписания документа и приемки товара контрагентом из Диадок в 1С?

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

При автоматизации торгового учета и расчетов с покупателями часто возникает задача расчета точного срока отсрочки платежа. Дата фактической отгрузки товара со склада продавца может значительно отличаться от даты, когда покупатель реально принял товар и подписал электронный документ (УПД или ТОРГ-12). Рассмотрим, как в конфигурациях 1С (например, 1С:Управление торговлей 10.3 или 11) получить дату подписания документа или приемки товара из сервиса «Диадок».

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

Прежде чем программно извлекать реквизиты, разберем юридические и технические нюансы видов дат, доступных в документообороте ЭДО:

  1. Дата электронной подписи (SignDate): формируется на ПК покупателя или фиксируется сервером оператора в момент наложения ЭП.
  2. Дата фактической приемки (AcceptanceDate / ДатаПрин): указывается покупателем вручную во втором титуле (титуле покупателя) при приемке товара или услуг. Для корректного расчета отсрочки платежа приоритетной является именно эта дата.
  3. Дата подтверждения оператора (ConfirmationDate): дата и время поступления документа на сервер оператора ЭДО.

Способ 1. Использование методов COM-объекта интеграционного модуля Диадок

Если для работы с ЭДО используется официальная внешняя обработка или библиотека Диадок, мы можем получить COM-объект, соответствующий электронному документу, и вызвать его методы.

Разберем по шагам порядок действий:

  1. Получаем объект электронного документа из внешней компоненты Диадок.
  2. Для получения сведений о подписи покупателя вызываем метод GetRecipientSignature. В свойствах полученного объекта подписи будет доступна дата подписания SignDate.
  3. Для формализованных документов (УПД, ТОРГ-12) вызываем метод GetBuyerContent(). Он возвращает содержимое титула покупателя, откуда извлекается параметр AcceptanceDate (дата приемки товара).

Посмотрим на пример кода получения данных через COM-объект:


// Получаем COM-объект документа Диадок
ДокументДиадок = МодульДиадок.GetDocument(ИдентификаторДокумента);

// Вариант 1. Получение даты подписи покупателя
ПодписьПокупателя = ДокументДиадок.GetRecipientSignature();
Если ЗначениеЗаполнено(ПодписьПокупателя) Тогда
    ДатаПодписи = ПодписьПокупателя.SignDate;
КонецЕсли;

// Вариант 2. Получение даты приемки из Титула покупателя (для УПД / ТОРГ-12)
ТитулПокупателя = ДокументДиадок.GetBuyerContent();
Если ЗначениеЗаполнено(ТитулПокупателя) Тогда
    ДатаПриемки = ТитулПокупателя.AcceptanceDate;
КонецЕсли;

Способ 2. Извлечение даты напрямую из XML-файла титула покупателя

В случаях, когда стандартные методы компоненты возвращают пустые значения или интеграция выполняется без использования тяжеловесных COM-объектов, мы можем прочитать исходный XML-файл второго титула (титула покупателя) с помощью объекта 1С ЧтениеXML.

В структуре XML-файлов УПД и ТОРГ-12 дата принятия товара хранится в узле или атрибуте ДатаПрин (или ДатаПолуч). Проанализируем алгоритм:


ФайлXML = Новый ЧтениеXML;
ФайлXML.ОткрытьФайл(ПутьКФайлуТитулаПокупателя);

Пока ФайлXML.Прочитать() Цикл
    Если ФайлXML.Имя = "ДатаПрин" Или ФайлXML.Имя = "ДатаПринятия" Тогда
        ДатаПриемкиСтр = ФайлXML.ПолучитьЗначениеАтрибута("ДатаПрин");
        // Преобразуем строку формата ГГГГ-ММ-ДД в дату 1С
        Если ЗначениеЗаполнено(ДатаПриемкиСтр) Тогда
            ДатаПриемки = Дата(СтрЗаменить(ДатаПриемкиСтр, "-", ""));
        КонецЕсли;
    КонецЕсли;
КонецЦикл;
ФайлXML.Закрыть();

Способ 3. Организация периодического мониторинга статусов документов

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

  1. Регламентное задание с заданной периодичностью опрашивает сервер Диадок о документах, изменивших статус на «Подписан».
  2. При обнаружении подписанного документа система запрашивает AcceptanceDate или SignDate.
  3. Полученная дата записывается в соответствующий реквизит документа 1С (например, в «Реализация товаров и услуг») или в дополнительные сведения/дополнительный регистр.
  4. На основе записанной даты автоматически пересчитывается дата оплаты по договору с клиентом.

Альтернативный архитектурный вариант — использование специализированных расширений или модулей Диадок, которые записывают всю историю смены статусов ЭДО в отдельный регистр сведений 1С. В этом случае данные о датах подписи можно легко получать стандартными запросами 1С без повторных обращений к API.

Особенности и технические ограничения

Выясним важные технические моменты, которые необходимо учитывать при разработке:

← На главную