Конфигурация "Обмен данными Excel"






Что будет, если скрестить Конвертацию 2.0, Модуль загрузки преобразования в значения БД от конвертации 3.0 и Excel шаблоны? Правильно, получится отличная подсистема «Обмен данными Excel», которую можно встраивать в существующие конфигурации и получить универсальный механизм по загрузке данных из Excel и вводу начальных данных. Данная подсистема позволит заменить множество различных обработок по загрузкам из Excel. Хочу отметить, что все интеграции через веб сервисы 1С по загрузкам soap пакетов (документов xml) можно адаптировать и универсально загружать через данную подсистему, правда, это потребует двух доработок конфигурации, но это возможно, архитектурное решение и идея включены в подсистему «Обмен данными Excel».

Здравствуйте, Друзья!

Мне было интересно, в свое время, разобраться с функциональностью загрузки от конвертации 3.0. Я отметил, что данные объекта XDTO конвертируются в структуру и далее, уже полученная структура конвертируется в объекты БД. Ок, подумал я, а что если мы будем формировать собственные структуры и передавать их в процедуру конвертации структур в объекты БД? В процессе реализации начался новый процесс понимания как конвертация 3.0 генерирует модуль менеджера обмена, т.к. для метода СтруктураОбъектаXDTOВДанныеИБ требуется не просто структура, составленная, опять-таки, по строгим правилам, но и целая сложная сущность, называемая КомпонентыОбмена, в которую входят все те сущности создаваемые в модуле менеджера обмена 🙂 — ПравилаОбработкиДанных, ПравилаКонвертацииОбъектов, ПравилаКонвертацииПредопределенныхДанных …, вообщем много чего. 

Почему Excel? Просто, в свое время, была задача произвести множественные загрузки из ёкселя — т.е. преобразовать данные ёкселя в объекты БД. Для такого преобразования требуется создать некие правила преобразований. Откуда их взять или что взять за основу, когда на входе структура из ёкселя, которая по определенным правилам должна преобразовываться в объекты БД? Конвертация 2.0 — это идеальный вариант для основы в части архитектуры такого решения. Что и было сделано. В итоге: ёксель данные преобразуем в структуру и конвертируем полученную структуру в объект БД.

В принципе, можно доработать и для входящих данных в виде xml документа, но это в будущем. Да, Вы и сами это сможете сделать :), если захотите. 

Проверял на всех ссылочных типах: справочник, документ, ПВХ и ПВР. Также, должно работать и для бизнес-процесса и задачи. Независимый Регистр сведений (периодический и непериодический) — руки пока не дошли :).

И, как бы это смешно не звучало, но есть правилам обмена данными, написанные на конвертации 2.0 для выгрузки и загрузки обработкой "Универсальный обмен данными в формате xml" правил обмена, созданных в подсистеме "Обмен данными Excel".

Как работает подсистема в режиме предприятия.

Шаблон данных предназначен для хранения структуры Excel файла — поля (колонки). По команде "Сохранить бланк для заполнения…" будет создан Excel шаблон с шапкой колонок. Excel шаблон заполняется данными и готов к загрузке.

На основании Шаблона данных создаются "Правила загрузки Excel" (Правила загрузки). Правила загрузки содержат параметры загрузки. На основании Правил загрузки создаются "Правила конвертации объектов Excel" (ПКО). 

Для создания ПКО применяется обработка "Настройка правил обмена Excel". 
ПКО содержат объект метаданных — Приемник (Справочник, Документ, ПВХ, ПВР), в который будут конвертированы данные шаблона. У ПКО есть Реквизиты — "Правила конвертации свойств".

Для загрузки данных по шаблонам применяются обработки: "Обмен данными загрузка Excel" и "Обмен данными по шаблонам загрузки Excel". 
Обработка  "Обмен данными по шаблонам загрузки Excel" предназначена для загрузки по нескольким шаблонам данных.
Обработка "Обмен данными загрузка Excel" предназначена для загрузки по одному шаблону данных и множествам правил загрузки.

Для загрузки по нескольким шаблонам данных требуется создать "Шаблон загрузки данных", в котором указать шаблоны данных, правила загрузки и значения параметров загрузки по правилам загрузки.

Для ПКО и ПКС встроена справка.

Табличные части объектов в файле Excel вместе с реквизитами объекта — пока это особенность, т.к. вижу, что можно сделать и более красиво, но по скорости реализован такой вариант, т.к. явился более простым:

Реквизит1 Объекта Реквизит2 Объекта Реквизит1 ТЧ1 Реквизит2 ТЧ1 Реквизит1 ТЧ2 Реквизит2 ТЧ2
значения…          
           

 

Требования: адаптирована под БСП 2.4.5.7 100%. Под БСП более старшие может и потребуется адаптация, а может и нет, не пробовал, но думаю тоже взлетят :).

Платформа не ниже 8.3.10.

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

Внимание! Данная публикация является опытом автора и признана им поделиться. Если Вы планируете вводить результаты данной публикации в ОПЭ ваших продуктивных баз, то, пожалуйста, убедитесь, что все кейсы успешно отрабатывают на Ваших тестовых базах. По мере своего свободного времени буду исправлять баги, если таковые появятся, но без гарантии, т.к. ещё раз повторюсь — это некий интересный, на мой взгляд, опыт, которым я бы хотел с Вами поделиться, Друзья!

Спасибо и Продуктивного Всем кодинга!

P.S. На просторах интернета столько обработок загрузки из Excel и под каждую задачу приходиться создавать новую обработку или модифицировать существующую … Данная конфигурация полностью заменяет все обработки. Вам больше не требуется создавать новые обработки по загрузке … Включите данную подсистему и просто в режиме предприятия создавайте новые правила :).

10 Comments

  1. leosoft

    Как-то не очень понятно — насколько сложные настройки надо делать.

    Допустим, что у меня есть excel файл такой структуры:

    Контрагент1, ИНН1, код1, адрес1

    Договор1, ДатаДоговора1, НомерДоговора1

    Договор2, ДатаДоговора2, НомерДоговора2

    …..

    ,,,,..

    Контрагент2, ИНН2, код2, адрес2

    Договор21, ДатаДоговора21, НомерДоговора21

    Договор22, ДатаДоговора22, НомерДоговора22

    …..

    ,,,,..

    Как по Вашей методике это загрузить в 1С Бухгалтерию 30?

    Reply
  2. Алексей777

    ( leosoft) Можно и так. 05.03.2019 вечером отвечу.

    Reply
  3. Алексей777

    ( leosoft) Каноническая модель структуры шаблона ёкселя — это поля(колонки) первой строки:

    Контрагент, ИНН, Код контрагента, Адрес контрагента, Договор, Дата договора, Номер договора

    Так работает ЗагрузкаДанныхИзФайла.

    Если структура файла ёкселя это первая строка — данные контрагента, вторая, третья … договора и далее все в цикле, то требуется привести данные ёксель файла к каноническому виду. Потребуется создать два шаблона данных. Первый шаблон — каноническая модель — на основании данной модели мы будем создавать ПКО; второй шаблон — структура текущего ёксель файла, которая при загрузке будет преобразована в ТЗ и полученные данные ТЗ мы трансформируем в ТЗ канонической модели.

    Создаем Шаблон данных, в основе структуры шаблона (имена колонок) каноническая модель. На закладке шаблона данных «Настройки преобразований» выбираем способ преобразования данных файла ёкселя = Внешняя обработка. Появится возможность загрузить внешнюю обработку. На этой же закладке добавляем строку в таблице: Имя листа = имя листа в ёкселе без тех. знаков и пробелов — нам требуется текущий ёксель файл немного подготовить; шаблон данных — структура текущего ёксель файла — для данного шаблона мы не создаем ПКО.

    Создаем внешнюю обработку. Внешняя обработка должна иметь экспортную процедуру «ПреобразоватьДанныеФайлаПоСтруктуреШаблона (ПараметрыПреобразования)». ПараметрыПреобразования — это Структура с ключами: АдресФайла, АдресДанных, ИнформацияПоКолонкам, Расширение, ШаблоныПоЛистам.

    Параметр АдресФайла — адрес Excel файла во временном хранилище; параметр АдресДанных — адрес во временном хранилище, в котором хранится нормализованная таблица значений под структуру шаблона; Расширение — «xls» или «xlsx»; ИнформацияПоКолонкам — структура шаблона; ШаблоныПоЛистам — соответствие, ключ — имя листа Excel, значение — информация по колонкам. Параметры структуры «ПараметрыПреобразования» доступны в процедуре по именам.

    Процедура возвращает адрес во временном хранилище, в котором хранится нормализованная таблица значений под структуру шаблона.

    Справка для шаблона данных есть.

    Reply
  4. leosoft

    Алексей, спасибо большое за информацию! Для меня это показалось сложным процессом, хотя Ваш подход интересный!

    Reply
  5. Алексей777

    (leosoft) Все сложные преобразования Вы будете производить во внешней обработке, а затем её прикреплять к шаблону данных. Т.е. конфигурация останется неизменной. Как пример кода процедуры в которой трансформированы таблицы на листах в одну каноническую таблицу.

    Процедура ПреобразоватьДанныеФайлаПоСтруктуреШаблона(ПараметрыПреобразования) Экспорт
    
    АдресФайла           = ПараметрыПреобразования.АдресФайла;
    АдресДанных          = ПараметрыПреобразования.АдресДанных;
    ИнформацияПоКолонкам = ПараметрыПреобразования.ИнформацияПоКолонкам;
    Расширение           = ПараметрыПреобразования.Расширение;
    ШаблоныПоЛистам      = ПараметрыПреобразования.ШаблоныПоЛистам;
    
    Если НЕ ШаблоныПоЛистам.Количество() Тогда
    Возврат;
    КонецЕсли;
    
    ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресФайла);
    ИмяВременногоФайла = ПолучитьИмяВременногоФайла(Расширение);
    
    ДвоичныеДанные.Записать(ИмяВременногоФайла);
    
    ЗагруженныйШаблонСДанными = Новый ТабличныйДокумент;
    ЗагруженныйШаблонСДанными.Прочитать(ИмяВременногоФайла);
    
    ДанныеПоЛистам = Новый Соответствие;
    
    Для Каждого КлючЗначение Из ШаблоныПоЛистам Цикл
    
    ДанныеЛиста = Истина;
    Справочники.ЭАОДБШаблоныДанныхExcel.ТабличныйДокументВТаблицуЗначений(ЗагруженныйШаблонСДанными.ПолучитьОбласть(КлючЗначение.Ключ), ШаблоныПоЛистам.Получить(КлючЗначение.Ключ), «», ДанныеЛиста);
    
    ДанныеПоЛистам.Вставить(КлючЗначение.Ключ, ДанныеЛиста);
    КонецЦикла;
    
    Лист1     = ДанныеПоЛистам.Получить(«Лист1»);
    
    Лист2           = ДанныеПоЛистам.Получить(«Лист2»);
    
    Лист3         = ДанныеПоЛистам.Получить(«Лист3»);
    
    Лист4            = ДанныеПоЛистам.Получить(«Лист4»);
    
    // ТаблицаРезультат.
    ТаблицаРезультат = Новый ТаблицаЗначений;
    
    ТаблицаРезультат.Колонки.Добавить(«Контрагент»);
    
    ТаблицаРезультат.Колонки.Добавить(«Договор»);
    
    ТаблицаРезультат.Колонки.Добавить(«ИНН»);
    
    ТаблицаРезультат.Колонки.Добавить(«КодДоговора»);
    
    ТаблицаРезультат.Колонки.Добавить(«ДатаДоговора»);
    
    ТаблицаРезультат.Колонки.Добавить(«КодКонтрагента»);
    
    // Производим преобразования данных со всех листов в основную таблицу — каноническую модель, например:
    Для Каждого СтрокаЛист1 Из Лист1 Цикл
    ЗаполнитьЗначенияСвойств(ТаблицаРезультат.Добавить(), СтрокаЛист1);
    КонецЦикла;
    
    // …. Суть думаю понятна.
    
    АдресДанных = ПоместитьВоВременноеХранилище(ТаблицаРезультат, АдресДанных);
    ПараметрыПреобразования.АдресДанных = АдресДанных;
    
    КонецПроцедуры

    Показать

    Reply
  6. Алексей777

    (4) Спасибо, Леонид, за Вопрос! Я постарался сделать конфигурацию универсальной, чтобы покрыть много «подводных камней» :).

    Reply
  7. user664038_av.lebedev

    Как нужно заполнять реквизиты в Excel для типов данных в 1С Хранилище значений, ДвочныеДанные (РегламентныеРасписания) например?Как в шаблон попадает загрузка табличной части Справочников и документов? Во многих Конфигурациях вывод на форму Элемента табличная часть является перевернутой т.е. Каждое значение Строка/Колонка хранится в отдельной строке табличной части с разными типами. Можно ли управлять Шаблонами Excel?

    Reply
  8. Алексей777

    Приветствую, Андрей!

    1. Хранилище значений, ДвоичныеДанные.

    Да, может.

    Для эксперимента выгрузил таблицу значений в строку в формате base64:

    тз = данные.Выгрузить();
    тзхран = Новый ХранилищеЗначения(тз);
    строкаикс = XMLСтрока(тзхран);
    

    В ёксель ячейку «Двоич» вставил полученное значение. В обработчике реквизита «При загрузке» произвел чтение:

    ЗначениеСвойств = ЗначенияСтроки[«Двоич»];
    ЗначениеСвойств = XMLЗначение(тип(«ХранилищеЗначения»), ЗначениеСвойств);
    ЗначениеСвойств = ЗначениеСвойств.Получить();
    Для Каждого Строка из ЗначениеСвойств Цикл
    сообщить(Строка.Реквизит1);
    КонецЦикла;

    Все ок.

    2. Загрузка с табличными частями. Пример в прикрепленном файла. Реквизиты документа идут вместе со значениями реквизитов табличных частей. Идентификатором документа в данном примере являются поля Номер документа и Дата документа, в правилах конвертации свойств данным полям устанавливаем Истина для реквизита Поиск.

    3. Андрей, поясните, пожалуйста, что значит управлять шаблонами?

    Reply
  9. Светлый ум

    Интересный обмен +1

    Взял на вооружение

    Reply
  10. Алексей777

    Спасибо! На базе данной конфигурации я сейчас готовлю аналог для входящих документов xml как в конвертации 3.0.

    Reply

Leave a Comment

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