Работа с Контур.Диадок (diadoc)
Год назад руководство поставило цель – отправлять документы
клиентам с помощью системы электронного документооборота (главная страница https://www.diadoc.ru/).
Данная система очень распространена и решающим моментом в
этом деле стало заявление такого крупного игрока, как Эмекс, что все документы должны
быть загружены в электронном виде. А если не в электронном, тогда вам будет
выставлен доп.счёт за обработку документов. А далее выяснилось, что таких
клиентов очень много.
После получения задачи и не сильно разбираясь в сути
проблемы и не разбирая инструментарий, который предоставляет Дидаок, решил
сделать просто: формировать XML вручную. Сделав первый
прототип и замучившись в отладкой решил что-то менять.
Для различных стандартных платформ (типа 1с) есть
стандартные плагины, которые всё сделают за вас. Но в моём случае это не так и
решение «самописное».
Работа с диадок-ом выглядит следующим образом:
1. Формируем
файл XML
2. Загружаем
файл в Контур.Диадок
В идеальном варианте у контура есть возможность использовать
API-методы и сделать всё в 1 шаг, но сейчас реализовано
половинчатое решение.
Документы, которые стоит изучить для понимания того, как
заполнять XML файл (для примера
УПД):
1. https://normativ.kontur.ru/document?moduleId=1&documentId=271958
– Последний на сегодня (25.09.2017) документ, который утверждает электронный
формат счёт-фактуры (Приказ ФНС РФ от 24.03.2016 N ММВ-7-15/155@)
2. https://www.diadoc.ru/docs/forms/upd/structure/1
- Форма проверки документа в контуре
3. https://www.diadoc.ru/docs/forms/upd/structure/xsd/1
- XSD-схема для УПД
Вооружившись этим документами можно формировать XML файл с помощью XSD схемы.
Для создания нормального объекта в C#
я воспользовался утилитой XSD.exe и натравил на неё файл SCHFDOPPOK.xsd, который находится в
архиве в третьей ссылке. У меня полная строка генерации файла класса выглядит
так
C:\Program Files (x86)\Microsoft
SDKs\Windows\v7.0A\Bin\xsd.exe SCHFDOPPOK.xsd /classes
Файл получился следующий: http://www.adoe.ru/_files/SCHFDOPPOK.cs.txt. В проекте
для работы я его переименовал в UpdDiadoc.cs
Ну а далее добавляем файл к решению и заполняем наш документ.
Конечно, русские поля и названия классов выглядят странно, зато всё понятно и
все поля соответствуют спецификации, которая указана в первой ссылке(Приказ ФНС…)
Я позволил себе набросать нерабочий проект,
который содержит статичный метод CreateXML_UPD. Суть метода –
наполнение объекта и генерация из него файла в XML через стандартный метод XmlSerializer.Serialize
Ясное дело, что объекты Outlay и outlayPosition
у каждого свои. Главная цель – показать как работать с этим необычным объектом
и как его заполнять. Некоторые решения по заполнению нетривиальны.
Большая часть этого текста сделана для себя с целью «Не
забыть».
Ссылка на пример проекта http://www.adoe.ru/_files/diadoc.zip