Приклад розв'язування абстрактної задачі з вивантаження документів обраного типу, за певний період.
Рекурсивний захоплення елементів довідників і документів, посилання яких присутні у всіх реквізитах всіх вивантажуються елементів.
в минулій версії при вивантаженні ієрархічних довідників, спостерігалося задвоєння кореневих папок.
(Спасибі 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.
Це моя перша публікація, сподіваюся кому небудь стане в нагоді. Приймаю будь-яку критику. Хай щастить.