Перевод документооборота в электронный вид на платформе 1С 7.7 нередко вызывает массу вопросов у разработчиков. Устаревшая платформа не имеет встроенных механизмов для работы с современными веб-сервисами и криптографией, поэтому типовая интеграция с сервисом Диадок требует четкого понимания доступных подходов. Рассмотрим детально, как можно реализовать обмен электронными документами, разберем архитектурные варианты, частые скрытые ошибки и приведем практический пример выгрузки данных.
При организации взаимодействия между 1С 7.7 и оператором электронного документооборота выделяют три основных варианта реализации:
СоздатьОбъект(). Этот подход избавляет от необходимости вручную формировать файлы XML и отправлять HTTP-пакеты. Компонента самостоятельно отвечает за авторизацию, криптографические операции и упаковку данных в протокол передачи.Проанализируем ключевые сложности, с которыми разработчики сталкиваются при работе через объектную модель Диадока из встроенного языка 1С 7.7:
Мн_часть.price = "10.0";
ValidationError в поле FieldId может возвращать системные идентификаторы вида Consignee.FnsParticipantIdOrInn. Это означает необходимость заполнить либо идентификатор участника документооборота ФНС (FnsParticipantId), либо ИНН грузополучателя (Inn), а не поле с объединенным наименованием.Функция="СЧФ" Диадок может отобразить созданный документ в веб-интерфейсе как отдельный счет-фактуру, изменяя визуальную форму представления. Чтобы создавать документ как полноценный универсальный передаточный документ (включающий первичный учетный документ), рекомендуется использовать значение Функция="СЧФДОП".Рассмотрим практический пример построения выгрузки данных документа в структурированный файл 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.
При переходе на ЭДО у бухгалтерии нередко возникает вопрос юридической силы и порядка хранения документов. Разберем ключевые правила работы с архивом:
.sig или .p7s), а также квитанции оператора о доставке и подписании.