Выгрузка документов в XML (любая конфигурация)


Пример решения абстрактной задачи по выгрузке документов выбранного типа, за определенный период.
Рекурсивный захват элементов справочников и документов, ссылки которых присутствуют во всех реквизитах всех выгружаемых элементов.

01.04.2013 Новая версия файла 

в прошлой версии при выгрузке иерархических справочников, наблюдалось задвоение корневых папок.

(спасибо Jkey, дал пинка, что бы исправить "баг")

 

Интро:

Поставлена абстрактная задача по выгрузке документов из любой конфигурации 1С:Предприятие 8.2 с возможностью отбора по типу, дате и состоянию документа (Проведен, Удален), в xml файл.

Файл должен содержать две основные секции: «Справочники» и «Документы». Каждый выгружаемый в файл объект (элемент справочника или документ) должен иметь уникальный во всем файле идентификатор (id). Во время всех выгрузок объект должен иметь один и тот же идентификатор.

В секции «Справочники» должны располагаться вложенные секции, названия которых совпадают с названием «Вида» справочника, как он задан в конфигурации.

Если элемент справочника является группой, тогда он располагается в элементе файла, имеющем название «Группа». Если  элемент справочника не является группой, тогда он располагается в элементе с названием «Элемент».

Каждый элемент справочника необходимо развернуть по структуре, т.е поместить в файл все реквизиты справочника. Значение реквизитов справочника помещаются в элементы секции файла, имеющие названия, совпадающие с названиями реквизитов справочника, как они заданы в конфигураторе. 

Если реквизит справочника имеет тип «Справочник» или «Документ», тогда он должен быть помещен в соответствующую секцию файла выгрузки согласно правилам выгрузки элементов справочников, а использование данного значение реквизита должно быть заменено значением id данного объекта. Если реквизит справочника имеет примитивный тип (строка, число, булево) или «Перечисление», тогда значение реквизита сразу помещается в файл. 

Обязательные поля для Справочников:

  • Id – уникальный идентификатор элемента.
  • Код – код элемента справочника.
  • Наименование – наименование элемента справочника.
  • Родитель – элемент справочника, который расположен на уровень выше по отношению к данному элементу.
  • Владелец —  элемент справочника или документ, которому подчинен данный элемент справочника.
  • Состояние – состояние элемента справочника, которое может принимать значение «записан» или «удален».
Обазательные поля для Документов:
  • Id – уникальный идентификатор документа
  • Номер – номер документа
  • Дата – дата документа
  • Состояние – состояние документа (может принимать значение «проведен», «записан» или «удален»).

Такое вот задание я получил в ответ на свой отклик на вакансию, хех. До этого я ничего особого про XML не знал, (только что можно выполнять обмен с помощью этого формата и еще что его можно подредактировать в нотепаде). Я считаю это нормально (мою непросвещенность), потому как XML к 1С имеет косвенное отношение, но чтобы быть специалистом на всю голову, необходимо знать и это тоже, ничего не поделаешь, задача интересная, новая. Надо решать.

В данной статье не будут разбираться правила выгрузки в xml, приведу как пример один интересный курс  "Средства интеграции и обмена данными в системе 1С:Предприятие 8".

Можно выделить пару методов решения.

  • — самый популярный и широко рассматриваемый — это создание в конфигурации собственной схемы XDTO. Её необходимо создать (да-да, т.е внести изменения в конфигурацию, но её потом можно экспортировать и используя её загружать в куда-нибудь, например на сайт), определить в ней все интересующие нас объекты, атрибуты объектов, описать типы используемые объектами и далее, используя так называемую "Объектную модель XML", выгружать данные.
  • — самый тривиальный, ему мало уделяют времени, потому что он очень простой, его можно даже не заметить (его-то я и использовал). Мы просто последовательно рекурсивным (или просто циклом) обходом выполняем запись в файл XML. Это не очень хороший метод с точки зрения загрузки данных (если мы выгружаем данные, значит это кому-нибудь нужно (с) ).
  • чуть наврал, есть и 3й… в 1С 82 есть встроенные методы выгрузки объектов в xml, на основе собственных схем XDTO, которые уже включают все описания, но этот метод подходит только для выгрузки/загрузки в идентичные конфигурации, что встречается крайне редко… его я не стал использовать, потому как все элементы и атрибуты выгружаемого объекта будут иметь уже заложенные имена, и они не совпадают с именами реквизитов объекта(они вообще в английском представлении), а нам ведь нужно использовать "свои собственные" имена как в конфигураторе.

Приступим…

Решение задачи выполнено с использованием, так сказать, "базовых понятий" о записи XML, с выполнением последовательной записи. Объектная модель XML использоваться не будет.

Основной объект — это ЗаписьXML. Создаем новый объект и используем методы ЗаписатьНачалоЭлемента() и ЗаписатьКонецЭлемента(), так и будет. Все! 

Так как будет выгружаться 2 раздела, то необходимо их объединить одним общим корневым элементом (у меня это "Корень"). После идет описание Справочником, и потом Документов.

На форме расположены основные элементы управления:

  • Тип объекта (При открытии формы получаем список всех типов документов и загружаем в СписокЗначений)
  • НачалоПериод и КонецПериода
  • Булевские флаги "Проведен", "Удален", для возможности отбора по состоянию документа
  • и Каталог выгрузки,

В поле Каталог выбирается именно каталог, файл формируется с именем 

 ИмяФайла = Каталог+Формат(ТекущаяДата(),"ДФ=ddMMMM")+".xml";

 

Краткое описание алгоритма:

  • Запросом выбираем документы .
  • Рекурсивно получаем все типы Справочников и Документов(при выгрузке остальные типы преобразуются в строку) всех реквизитов из образовавшегося "дерева" и заполняем ими списки значений, для справочников и документов свои списки значений.
  • Рекурсивно получаем все ссылочные Значения всех реквизитов.
  • Далее проводим последовательную иерархическую запись сначала Справочников(снова рекурсия, ну а как иначе), предварительно сформировав один большой запрос, для того что бы в цикле не обращаться к базе, а использовать пакеты.
  • И после производим запись документов.

Я считаю интересным моментом, получение имен реквизитов и табличных частей и реквизитов ТЧ, с последующей обработкой.

После записи выводится сообщение.

Внешнюю обработку я создавал с Обычной неуправляемой формой, для обычного толстого клиента, на платформе 8.2.15.

Тестировал на Демо конфигурации УТ 10.3.

 

Это моя первая публикация, надеюсь кому нибудь пригодится. Принимаю любую критику. Удачи.

20 Comments

  1. GoodWinSpr

    чем отличается от ВыгрузкаЗагрузкаДанныхXML82 с диска ИТС?

    Reply
  2. DimaP

    чем отличается от ВыгрузкаЗагрузкаДанныхXML82 с диска ИТС?

    Reply
  3. absolutblohin

    чем ВыгрузкаЗагрузкаДанныхXML82 отличается от диска с ИТС?

    Reply
  4. нормальный такой

    пардоньте, в отпуске был.

    сейчас проверю, отпишу.

    Reply
  5. нормальный такой

    нуу. в целом «ВыгрузкаЗагрузкаДанныхXML82 с диска ИТС» кошерна и крута.

    это её главное отличие, и + что при выгрузке используется «встроенную» схему XDTO. получается что все реквизиты имеют свои 1совские хитрые имена.

    в моем решении имена реквизитов и выгружаемых объектов соответствуют именам метаданных в конфигурации.

    что и соответствует требованию в абстрактном задании.

    а так да, ВыгрузкаЗагрузкаДанныхXML82 она отлична, и скорее всего, предназначена для обмена между идентичными конфигурациями.

    Reply
  6. Jkey

    Интересное решение. Хотя всегда действительно пользуюсь ВыгрузкаЗагрузкаДанныхXML82.

    Reply
  7. Jkey

    Артур ты случайно не с Ёбурга? 🙂

    Reply
  8. нормальный такой

    (7) Jkey, в описании сказано что это абстрактная задача, поэтому такое вот решение)

    да, универсальная обработка хороша.

    Reply
  9. нормальный такой

    (8) Jkey, нет)

    но задание было от организации из екб )

    Reply
  10. Jkey

    догадываюсь из какой.. 🙂

    Reply
  11. YuraLu

    Между торговлей и розницей можно справочники перегнать?

    И между розницей и бухгалтерией?

    Reply
  12. нормальный такой

    (12) YuraLu, нет, нельзя.

    воспользуйтесь конвертацией данных, или если Вам нужна такая обработка, можно сделать индивидуально.

    То что внутри этой статьи — это решение поставленной(описаной) задачи, не более.

    Reply
  13. A2004333

    Вам то что сказали в организации, которую мы оба знаем, про вашу обработку?

    Reply
  14. нормальный такой

    (15) A2004333, это вполне стандартная задача на собеседовании (и не факт что я знаю в какой организации вы его получили), надеюсь вам помогло мое решение в реализации вашего «правильного».

    я не претендую на то, что обработка в моей статье — абсолютно правильное решение, конечно же нет. но я считаю его верным и буду его защищать, мы ведь взрослые люди, дайте контраргументы неправильности решения в этой статье и обработке.

    и подскажите, почему в вашем варианте выгружается меньше элементов (я сравнивал выгрузку всех проведенных реализаций в демо УТ10.3), вы уверены что не потеряли ссылки на нужные элементы и не забыли их выгрузить?

    Reply
  15. Odinsov

    Спасибо,пригодилось

    Reply
  16. kwl

    Хорошая обработка и нужная

    Reply
  17. pvlunegov

    Обработка начинает работать, что-то делает. Затем 1с выбрасывает без объяснения причин.

    Пробовал дважды.

    Жаль что не работает.

    Reply
  18. нормальный такой

    (19) pvlunegov, может у вас оперативной памяти не хватает?

    выберите период поменьше.

    Обработка очень старая, у вас все условия соблюдены?

    Внешнюю обработку я создавал с Обычной неуправляемой формой, для обычного толстого клиента, на платформе 8.2.15.

    Тестировал на Демо конфигурации УТ 10.3.

    Жаль что у Вас не работает.

    Reply
  19. Alexander.Shvets

    Хотел + поставить, промазал случайно. Возвращаю карму на место. =)

    Правда в самой обработке совершенно не обработаны общие реквизиты. Допилил уже сам + перевел упр. формы. А так — для ленивых сойдет! =)

    Reply
  20. vis_tmp

    (21)Можешь выложить свою обработку?

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *