Как внедрить Диадок в 1С 7.7: способы интеграции, примеры формирования XML и типичные ошибки

Программист 1С v7.7 Бухгалтерский учет IT и автоматизация бизнеса
← На главную

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

Архитектурные подходы к интеграции с сервисом Диадок

При организации взаимодействия между 1С 7.7 и оператором электронного документооборота выделяют три основных варианта реализации:

  1. Использование внешней COM-компоненты Диадока (объектная модель). Оператор предоставляет официальную библиотеку, которую можно зарегистрировать в операционной системе и вызывать из кода 1С через СоздатьОбъект(). Этот подход избавляет от необходимости вручную формировать файлы XML и отправлять HTTP-пакеты. Компонента самостоятельно отвечает за авторизацию, криптографические операции и упаковку данных в протокол передачи.
  2. Формирование формализованных XML-файлов и ручная загрузка через веб-интерфейс. Если объем передаваемых документов невелик, задача разработчика сводится к выгрузке структурированного XML-файла строго по формату ФНС (например, УПД по актуальному приказу налоговой службы). Бухгалтер или оператор вручную загружает сформированный файл через браузер, проверяет и подписывает его непосредственно в личном кабинете.
  3. Использование внешнего шлюза или папки обмена (Hot Folder). 1С 7.7 выгружает данные во внутреннем формате (текст, простой XML или DBF) в специальный каталог. Отдельная фоновая служба-коннектор считывает эти файлы, формирует пакеты нужного формата, подписывает их установленным на машине сертификатом ЭЦП и отправляет через API оператора. Обратно в 1С возвращаются квитанции и статусы документов.

Подводные камни и специфика работы с COM-компонентой Диадока

Проанализируем ключевые сложности, с которыми разработчики сталкиваются при работе через объектную модель Диадока из встроенного языка 1С 7.7:

  1. Строковый формат числовых показателей в УПД. В ряде версий компоненты при заполнении табличной части универсального передаточного документа поля цен, количества и сумм требуют передачи строго в виде строкового типа данных с фиксированной точкой. Передача стандартного вещественного числа платформы 1С может вызывать ошибку валидации. Например, значение цены необходимо устанавливать так: Мн_часть.price = "10.0";
  2. Неочевидные сообщения валидатора структуры данных. При возникновении ошибки заполнения объект компоненты ValidationError в поле FieldId может возвращать системные идентификаторы вида Consignee.FnsParticipantIdOrInn. Это означает необходимость заполнить либо идентификатор участника документооборота ФНС (FnsParticipantId), либо ИНН грузополучателя (Inn), а не поле с объединенным наименованием.
  3. Тип контрагента по умолчанию. В объектной модели по умолчанию для контрагентов может выставляться тип физического лица или индивидуального предпринимателя. При создании документов для юридических лиц требуется явно передавать признак организации.
  4. Разделение визуальных форм УПД и счета-фактуры. При передаче УПД со значением признака Функция="СЧФ" Диадок может отобразить созданный документ в веб-интерфейсе как отдельный счет-фактуру, изменяя визуальную форму представления. Чтобы создавать документ как полноценный универсальный передаточный документ (включающий первичный учетный документ), рекомендуется использовать значение Функция="СЧФДОП".
  5. Разрядность окружения Windows. Платформа 1С 7.7 является 32-разрядным процессом. При работе в 64-битных операционных системах все COM-компоненты Диадока и криптопровайдеры (например, КриптоПро CSP) должны быть обязательно зарегистрированы в 32-разрядном окружении, иначе вызов функции инициализации завершится ошибкой создания объекта.

Формирование XML-сообщения на встроенном языке 1С 7.7

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


ТекПодтв = СоздатьОбъект("Текст");    
ТекПодтв.ДобавитьСтроку("<?xml version=""1.0"" encoding=""windows-1251""?>");
ТекПодтв.ДобавитьСтроку("<eDIMessage id=""" + ИДСообщ + """ creationDateTime=""" + ДатаВремяСообщ + """>");

ТекПодтв.ДобавитьСтроку("<interchangeHeader>");
ТекПодтв.ДобавитьСтроку("<sender>" + СокрЛП(ГЛНФирм) + "</sender>");
ТекПодтв.ДобавитьСтроку("<recipient>" + СокрЛП(ГЛНОфис) + "</recipient>");
Если флКорр = 0 Тогда
    ТекПодтв.ДобавитьСтроку("<documentType>INVOIC</documentType>");
Иначе
    ТекПодтв.ДобавитьСтроку("<documentType>COINVOIC</documentType>");
КонецЕсли;
ТекПодтв.ДобавитьСтроку("<creationDateTime>" + СокрЛП(ДатаВремяСообщ) + "</creationDateTime>");
ТекПодтв.ДобавитьСтроку("</interchangeHeader>");

Если ТзДок.Выгружен <> 1 Тогда
    ТекПодтв.ДобавитьСтроку("<invoice number=""" + СокрЛП(Док.НомерДок) + """ date=""" + ДатаВФормате(Док.ДатаДок) + """ type=""Original"">");
Иначе
    НомерИсправленияА = ?(НомерИсправления = 0, 1, НомерИсправления);
    ТекПодтв.ДобавитьСтроку("<invoice number=""" + СокрЛП(Док.НомерДок) + """ date=""" + ДатаВФормате(Док.ДатаДок) + """ revisionNumber=""" + СокрЛП(НомерИсправленияА) + """ revisionDate=""" + ДатаВФормате(ТекущаяДата()) + """ type=""Replace"">");
КонецЕсли;

ТекПодтв.ДобавитьСтроку("<seller>");
ТекПодтв.ДобавитьСтроку("<gln>" + СокрЛП(ГЛНФирм) + "</gln>");
ТекПодтв.ДобавитьСтроку("</seller>");

ТекПодтв.ДобавитьСтроку("<buyer>");
ТекПодтв.ДобавитьСтроку("<gln>" + СокрЛП(ГЛНМаг) + "</gln>");
ТекПодтв.ДобавитьСтроку("</buyer>");

ТекПодтв.ДобавитьСтроку("<lineItems>");
ТекПодтв.ДобавитьСтроку("<currencyISOCode>RUB</currencyISOCode>");

ТЗ.ВыбратьСтроки();
Пока ТЗ.ПолучитьСтроку() = 1 Цикл
    ТекПодтв.ДобавитьСтроку("<lineItem>");
    ТекПодтв.ДобавитьСтроку("<gtin>" + СокрЛП(ТЗ.ШтрихКод) + "</gtin>");
    ТекПодтв.ДобавитьСтроку("<orderLineNumber>" + СокрЛП(ТЗ.НомерСтроки) + "</orderLineNumber>");
    ТекПодтв.ДобавитьСтроку("<description>""" + СокрЛП(ТЗ.Товар.Наименование) + """</description>");
    ТекПодтв.ДобавитьСтроку("<quantity unitOfMeasure=""PCE"">" + ТЗ.Количество + "</quantity>");
    ТекПодтв.ДобавитьСтроку("<netPrice>" + ТЗ.ЦенаБНДС + "</netPrice>");
    ТекПодтв.ДобавитьСтроку("<netPriceWithVAT>" + ТЗ.Цена + "</netPriceWithVAT>");
    ТекПодтв.ДобавитьСтроку("<vATRate>" + СтрЗаменить(ТЗ.СтавкаНДС, "%", "") + "</vATRate>");
    ТекПодтв.ДобавитьСтроку("<vATAmount>" + ТЗ.СуммаНДС + "</vATAmount>");
    ТекПодтв.ДобавитьСтроку("<amount>" + ТЗ.Сумма + "</amount>");
    ТекПодтв.ДобавитьСтроку("</lineItem>");
КонецЦикла;

ТекПодтв.ДобавитьСтроку("<totalAmount>" + ТЗ.Итог("Сумма") + "</totalAmount>");
ТекПодтв.ДобавитьСтроку("</lineItems>");
ТекПодтв.ДобавитьСтроку("</invoice>");
ТекПодтв.ДобавитьСтроку("</eDIMessage>");

ИмяФайла = "INVOIC_" + СокрЛП(Док.НомерДок) + ".xml";
ТекПодтв.КодоваяСтраница(0);
ТекПодтв.Записать(КаталогИсходящихФайлов + ИмяФайла);

Важное замечание: при ручной конкатенации строк XML необходимо учитывать экранирование служебных спецсимволов (&, <, >, кавычки) в наименованиях контрагентов и номенклатуры. Если этого не сделать, файл окажется невалидным при открытии XML-парсером на стороне оператора. Для критичных обменов надежнее формировать документ через объектную модель MSXML2.DOMDocument либо использовать потоки ADODB.Stream для сохранения файлов в кодировке UTF-8.

Организация локального архива электронных документов

При переходе на ЭДО у бухгалтерии нередко возникает вопрос юридической силы и порядка хранения документов. Разберем ключевые правила работы с архивом:

  1. Обязанность хранения лежит на налогоплательщике. Законодательство обязывает организацию хранить первичные документы и счета-фактуры не менее пяти лет. Полагаться исключительно на сервера оператора ЭДО рискованно: при смене оператора или расторжении договора доступ к веб-архиву может быть ограничен.
  2. Юридическая значимость комплекта. Печатная форма со штампом ЭЦП в формате PDF юридической силы сама по себе не имеет — это лишь визуальное представление. Полноценным электронным документом является исходный структурированный XML-файл плюс отдельный файл открепленной квалифицированной электронной подписи (обычно с расширением .sig или .p7s), а также квитанции оператора о доставке и подписании.
  3. Ответы на требования ФНС. При встречных и выездных налоговых проверках нет необходимости распечатывать электронные документы на бумаге. Программно формируется выгрузка исходных XML-файлов и подписей за запрашиваемый период с упаковкой в архив для отправки через каналы телекоммуникационной связи (ТКС), что существенно экономит ресурсы компании.
← На главную