При автоматизации торгового учета и расчетов с покупателями часто возникает задача расчета точного срока отсрочки платежа. Дата фактической отгрузки товара со склада продавца может значительно отличаться от даты, когда покупатель реально принял товар и подписал электронный документ (УПД или ТОРГ-12). Рассмотрим, как в конфигурациях 1С (например, 1С:Управление торговлей 10.3 или 11) получить дату подписания документа или приемки товара из сервиса «Диадок».
Прежде чем программно извлекать реквизиты, разберем юридические и технические нюансы видов дат, доступных в документообороте ЭДО:
SignDate): формируется на ПК покупателя или фиксируется сервером оператора в момент наложения ЭП.AcceptanceDate / ДатаПрин): указывается покупателем вручную во втором титуле (титуле покупателя) при приемке товара или услуг. Для корректного расчета отсрочки платежа приоритетной является именно эта дата.ConfirmationDate): дата и время поступления документа на сервер оператора ЭДО.Если для работы с ЭДО используется официальная внешняя обработка или библиотека Диадок, мы можем получить COM-объект, соответствующий электронному документу, и вызвать его методы.
Разберем по шагам порядок действий:
GetRecipientSignature. В свойствах полученного объекта подписи будет доступна дата подписания SignDate.GetBuyerContent(). Он возвращает содержимое титула покупателя, откуда извлекается параметр AcceptanceDate (дата приемки товара).Посмотрим на пример кода получения данных через COM-объект:
// Получаем COM-объект документа Диадок
ДокументДиадок = МодульДиадок.GetDocument(ИдентификаторДокумента);
// Вариант 1. Получение даты подписи покупателя
ПодписьПокупателя = ДокументДиадок.GetRecipientSignature();
Если ЗначениеЗаполнено(ПодписьПокупателя) Тогда
ДатаПодписи = ПодписьПокупателя.SignDate;
КонецЕсли;
// Вариант 2. Получение даты приемки из Титула покупателя (для УПД / ТОРГ-12)
ТитулПокупателя = ДокументДиадок.GetBuyerContent();
Если ЗначениеЗаполнено(ТитулПокупателя) Тогда
ДатаПриемки = ТитулПокупателя.AcceptanceDate;
КонецЕсли;
В случаях, когда стандартные методы компоненты возвращают пустые значения или интеграция выполняется без использования тяжеловесных COM-объектов, мы можем прочитать исходный XML-файл второго титула (титула покупателя) с помощью объекта 1С ЧтениеXML.
В структуре XML-файлов УПД и ТОРГ-12 дата принятия товара хранится в узле или атрибуте ДатаПрин (или ДатаПолуч). Проанализируем алгоритм:
ФайлXML = Новый ЧтениеXML;
ФайлXML.ОткрытьФайл(ПутьКФайлуТитулаПокупателя);
Пока ФайлXML.Прочитать() Цикл
Если ФайлXML.Имя = "ДатаПрин" Или ФайлXML.Имя = "ДатаПринятия" Тогда
ДатаПриемкиСтр = ФайлXML.ПолучитьЗначениеАтрибута("ДатаПрин");
// Преобразуем строку формата ГГГГ-ММ-ДД в дату 1С
Если ЗначениеЗаполнено(ДатаПриемкиСтр) Тогда
ДатаПриемки = Дата(СтрЗаменить(ДатаПриемкиСтр, "-", ""));
КонецЕсли;
КонецЕсли;
КонецЦикл;
ФайлXML.Закрыть();
Так как контрагент подписывает документ асинхронно, программа 1С должна периодически проверять изменение статусов документов. Для этого мы можем настроить регламентное задание в 1С:
AcceptanceDate или SignDate.Альтернативный архитектурный вариант — использование специализированных расширений или модулей Диадок, которые записывают всю историю смены статусов ЭДО в отдельный регистр сведений 1С. В этом случае данные о датах подписи можно легко получать стандартными запросами 1С без повторных обращений к API.
Выясним важные технические моменты, которые необходимо учитывать при разработке:
Docflow API).SignDate формируется на ПК подписанта. Если у контрагента сбито системное время, эта дата может быть неточной. Для финансовых расчетов рекомендуется использовать AcceptanceDate из титула или метку времени сервера оператора (TSA).