Вивантаження документів в xml (будь-яка конфігурація)

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

в минулій версії при вивантаженні ієрархічних довідників, спостерігалося задвоєння кореневих папок.

(Спасибі Jkey, дав стусана, що б виправити "баг")

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

Файл повинен містити дві основні секції: «Довідники» і «Документи». Кожен вивантажуваний в файл об'єкт (елемент довідника або документ) повинен мати унікальний у всьому файлі ідентифікатор (id). Під час всіх вивантажень об'єкт повинен мати один і той же ідентифікатор.

У секції «Довідники» повинні розташовуватися вкладені секції, назви яких збігаються з назвою «Віда» довідника, як він заданий в конфігурації.

Якщо елемент довідника є групою, тоді він розташовується в елементі файлу, що має назву «Група». Якщо елемент довідника не є групою, тоді він розташовується в елементі з назвою «Елемент».

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

Якщо реквізит довідника має тип «Довідник» або «Документ», тоді він повинен бути поміщений в відповідну секцію файлу вивантаження згідно з правилами вивантаження елементів довідників, а використання даного значення реквізиту повинно бути замінено значенням id даного об'єкта. Якщо реквізит довідника має примітивний тип (рядок, число, логічне) або «Перерахування», тоді значення реквізиту відразу поміщається в файл.

Обов'язкові поля для Довідників:

  • Id - унікальний ідентифікатор елемента.
  • Код - код елемента довідника.
  • Найменування - найменування елемента довідника.
  • Батько - елемент довідника, який розташований на рівень вище по відношенню до даного елементу.
  • Власник - елемент довідника або документ, якому підпорядкований даний елемент довідника.
  • Стан - стан елемента довідника, яке може приймати значення «записаний» або «видалений».

Обазательно поля для Документів:

  • Id - унікальний ідентифікатор документа
  • Номер - номер документа
  • Дата - дата документа
  • Стан - стан документа (може приймати значення «проведено», «записаний» або «видалений»).

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

У даній статті не будуть розбиратися правила вивантаження в xml, наведу як приклад один цікавий курс "Засоби інтеграції та обміну даними в системі 1С: Підприємство 8".

Можна виділити кілька методів вирішення.

  • 1й - найпопулярніший і широко розглядається - це створення в конфігурації власної схеми XDTO. Її необхідно створити (так-так, тобто внести зміни в конфігурацію, але її потім можна експортувати і використовуючи її завантажувати в куди-небудь, наприклад на сайт), визначити в ній все цікавлять нас об'єкти, атрибути об'єктів, описати типи використовуються об'єктами і далі, використовуючи так звану "Об'єктну модель XML", вивантажувати дані.
  • 2й - самий тривіальний, йому мало приділяють часу, тому що він дуже простий, його можна навіть не помітити (його-то я і використовував). Ми просто послідовно рекурсивним (або просто циклом) обходом виконуємо запис в файл XML. Це не дуже хороший метод з точки зору завантаження даних (якщо ми вивантажуємо дані, значить це комусь потрібно (с)).
  • трохи набрехав, є і 3й. в 1С 82 є вбудовані методи вивантаження об'єктів в xml, на основі власних схем XDTO, які вже включають всі описи, але цей метод підходить тільки для вивантаження / завантаження в ідентичні конфігурації, що зустрічається вкрай рідко. його я не став використовувати, тому що всі елементи і атрибути вивантажується об'єкта матимуть вже закладені імена, і вони не збігаються з іменами реквізитів об'єкта (вони взагалі в англійському поданні), а нам адже потрібно використовувати "свої власні" імена як в конфігураторі.

Рішення завдання виконано з використанням, так би мовити, "базових понять" про записи XML, з виконанням послідовного запису. Об'єктна модель XML використовуватися не буде.

Основний об'єкт - це ЗапісьXML. Створюємо новий об'єкт і використовуємо методи ЗапісатьНачалоЕлемента () і ЗапісатьКонецЕлемента (), так і буде. Усе!

Так як вивантажуватиметься 2 розділу, то необхідно їх об'єднати одним загальною кореневою елементом (у мене це "Корінь"). Після йде опис Довідником, і потім Документів.

На формі розташовані основні елементи управління:

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

В поле Каталог вибирається саме каталог, файл формується з ім'ям

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

Короткий опис алгоритму:

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

Я вважаю цікавим моментом, отримання імен реквізитів і табличних частин і реквізитів ТЧ, з подальшою обробкою.

Після запису виводиться повідомлення.

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

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

Це моя перша публікація, сподіваюся кому небудь стане в нагоді. Приймаю будь-яку критику. Хай щастить.