Новый взгляд на загрузку данных в 1С из Excel

Иногда меня спрашивают, почему я присвоил себе ник «Гений 1С». Наверное потому, что я вижу проблему под тем углом, о котором никто не задумывается. Вот и с загрузкой данных в 1С из Excel — казалось бы — все понятно, зачем изобретать велосипед. За свою трудовую деятельность каждый 1С-ник пишет сотни подобных загрузок. Есть и готовые загрузки, обычно платные и не совершенные. Казалось бы, что тут можно поменять и улучшить? А вот можно!

Пять лет назад, в 2017 году меня впервые посетила мысль об универсальном загрузчике из Excel и я написал первую версию. Файл настроек выглядел так:

50ab6d62661932e6021698d367fcb56b.png

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

Причем не хотелось бы на выходе получить такого монстра, как Конвертация Данных от 1С, который сложно изучать и применять. А наоборот, получить такой продукт, которым бы хотелось пользоваться, причем без особого изучения. Сел — и поехал.

И вот недавно я делал проект по загрузке данных из Excel в 1С УНФ. Пользователи готовили таблицы, я их загружал в базу 1С.

У меня была загрузка номенклатуры в 1С из Розницы, я ее адаптировал под УНФ, в целом получилось неплохо.

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

Ну и сама 1С, разумеется, по традиции не дает никаких штатных обработок по загрузке данных. Типовая обработка загрузки из табличного документа не умеет заполнять номера телефонов и адреса, например.

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

И тут меня осенило. По сути я применил ООП-подход, где есть некий базовый код, который занимается считыванием данных из таблицы, а есть некий перегружаемый код, который уже грузит эти данные в базу.

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

В итоге обработка выглядит на текущий момент так:

d0d8b17a9ef54767a262e61fb75eb410.png

Как видно, здесь используется файл настройки загрузки. Пока что для быстроты я написал его на языке 1С, об этом говорит КОД в первой строке файла:

КОД
//Загрузка юрлиц

Настройки = Параметры.Настройки;

Настройки.Вставить("СтрокаШапки", 1);

Настройки.Колонки.Добавить(Новый Структура("ИД, Имя, Обязательно", "Наименование", "Наименовние в программе", истина));
Настройки.Колонки.Добавить(Новый Структура("ИД, Имя", "НаименованиеПолное", "Наименование для печатной формы"));
Настройки.Колонки.Добавить(Новый Структура("ИД, Имя", "ЮридическаяФорма", "О контрагенте"));
Настройки.Колонки.Добавить(Новый Структура("ИД, Имя", "ИНН", "ИНН"));
Настройки.Колонки.Добавить(Новый Структура("ИД, Имя", "КПП", "КПП"));
Настройки.Колонки.Добавить(Новый Структура("ИД, Имя", "ОКПО", "ОКПО"));
Настройки.Колонки.Добавить(Новый Структура("ИД, Имя", "ОГРН", "ОГРН"));
Настройки.Колонки.Добавить(Новый Структура("ИД, Имя", "Банк", "Банк"));
Настройки.Колонки.Добавить(Новый Структура("ИД, Имя", "БИК", "БИК"));
Настройки.Колонки.Добавить(Новый Структура("ИД, Имя", "РасчетныйСчет", "Р/с"));
Настройки.Колонки.Добавить(Новый Структура("ИД, Имя", "Телефон", "Телефон"));   
Настройки.Колонки.Добавить(Новый Структура("ИД, Имя", "ТелефонПримечание", "Телефон примечание"));   
Настройки.Колонки.Добавить(Новый Структура("ИД, Имя", "Емейл", "E-mail"));
Настройки.Колонки.Добавить(Новый Структура("ИД, Имя", "ЮридическийАдрес", "Юридический адрес"));   
Настройки.Колонки.Добавить(Новый Структура("ИД, Имя", "ФактическийАдрес", "Фактический адрес"));   
Настройки.Колонки.Добавить(Новый Структура("ИД, Имя", "Тег", "Тег"));   
Настройки.Колонки.Добавить(Новый Структура("ИД, Имя", "Группа", "Группа"));   
Настройки.Колонки.Добавить(Новый Структура("ИД, Имя", "ТипКонтрагента", "Тип контрагента"));   

Настройки.Вставить("ФункцияПоиска", "УНФНайтиКонтрагентаЮрлицо");
Настройки.Вставить("ФункцияСоздания", "УНФСоздатьКонтрагента");
Настройки.Вставить("ФункцияЗаполнения", "УНФЗаполнитьКонтрагентаЮрлицо");       
Настройки.Вставить("ФункцияПослеЗаписи", "УНФПослеЗаписиКонтрагентаЮрлицо");   

В будущем планирую формировать структуру настроек из файла с отступами — формат чуть более простой чем JSON.

Файл настроек содержит не код, а лишь описание полей файла Excel и опций загрузки.

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

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

Эти методы описываются в отдельной секции формы загрузки — в области ФункцииЗагрузки:

95c48b8ace2ed3ed18a38524ebd2ac2f.png

Код по заполнению контрагента выглядит, например, так:

b26b1d4e9ccca5f0b7af5637e7b83d8a.png

Таким образом я разделил код движка и прикладной код загрузки. Движок загружает таблицу данных, на выходе формирует таблицу, у которой названия колонок уже маркированы идентификаторами, указанными в настройках, а не пользовательскими названиями колонок в Excel. С этой таблицей уже можно просто работать.

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

Я лично планирую сделать в движке доработки, которые уже применял в своих обработках загрузки:

  1. Возможность пользователю самому выбирать названия и номера колонок

  2. Возможность разных названий колонок для одной колонки (учитывать ошибки в названиях колонок)

  3. Опции для того, чтобы пропускать создание новых элементов и новых элементов в значениях полей. Например, не создавать новых контрагентов или не создавать новые банки.

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

  5. Автоматизировать работу с дополнительными пользовательскими реквизитами.

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

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

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

0b86383b8369170d1168c197100e08d9.png

© Habrahabr.ru