Иногда меня спрашивают, почему я присвоил себе ник "Гений 1С". Наверное потому, что я вижу проблему под тем углом, о котором никто не задумывается. Вот и с загрузкой данных в 1С из Excel - казалось бы - все понятно, зачем изобретать велосипед. За свою трудовую деятельность каждый 1С-ник пишет сотни подобных загрузок. Есть и готовые загрузки, обычно платные и не совершенные. Казалось бы, что тут можно поменять и улучшить? А вот можно!
Пять лет назад, в 2017 году меня впервые посетила мысль об универсальном загрузчике из Excel и я написал первую версию. Файл настроек выглядел так:
Конечно, решение было неудобным и непрактичным, но тогда зародились первые зерна мысли, которая звучала так - зачем каждый раз писать обработчик загрузки, если можно использовать некий движок загрузки? По сути, возникла мысль выделить некие общие особенности загрузки в движок, а управлять загрузкой уже настройками.
Причем не хотелось бы на выходе получить такого монстра, как Конвертация Данных от 1С, который сложно изучать и применять. А наоборот, получить такой продукт, которым бы хотелось пользоваться, причем без особого изучения. Сел - и поехал.
И вот недавно я делал проект по загрузке данных из Excel в 1С УНФ. Пользователи готовили таблицы, я их загружал в базу 1С.
У меня была загрузка номенклатуры в 1С из Розницы, я ее адаптировал под УНФ, в целом получилось неплохо.
Но надо было загружать еще и контрагентов. Готовой обработки на Infostart я не нашел - там были обработки разной степени полезности и полноты, все равно их пришлось бы доделывать. Писать с нуля одноразовую обработку не хотелось.
Ну и сама 1С, разумеется, по традиции не дает никаких штатных обработок по загрузке данных. Типовая обработка загрузки из табличного документа не умеет заполнять номера телефонов и адреса, например.
Тут мне на глаза случайно и попалась моя разработка пятилетней давности и я опять задумался о том, почему приходится так сложно писать обработки загрузки.
И тут меня осенило. По сути я применил ООП-подход, где есть некий базовый код, который занимается считыванием данных из таблицы, а есть некий перегружаемый код, который уже грузит эти данные в базу.
Или другими словами - есть некий базовый код движка и есть дополнительный, частный код, который применяется уже в каждом отдельном случае.
В итоге обработка выглядит на текущий момент так:
Как видно, здесь используется файл настройки загрузки. Пока что для быстроты я написал его на языке 1С, об этом говорит КОД в первой строке файла:
КОД
//Загрузка юрлиц
Настройки = Параметры.Настройки;
Настройки.Вставить("СтрокаШапки", 1);
Настройки.Колонки.Добавить(Новый Структура("ИД, Имя, Обязательно", "Наименование", "Наименовние в программе", истина));
Настройки.Колонки.Добавить(Новый Структура("ИД, Имя", "НаименованиеПолное", "Наименование для печатной формы"));
Настройки.Колонки.Добавить(Новый Структура("ИД, Имя", "ЮридическаяФорма", "О контрагенте"));
Настройки.Колонки.Добавить(Новый Структура("ИД, Имя", "ИНН", "ИНН"));
Настройки.Колонки.Добавить(Новый Структура("ИД, Имя", "КПП", "КПП"));
Настройки.Колонки.Добавить(Новый Структура("ИД, Имя", "ОКПО", "ОКПО"));
Настройки.Колонки.Добавить(Новый Структура("ИД, Имя", "ОГРН", "ОГРН"));
Настройки.Колонки.Добавить(Новый Структура("ИД, Имя", "Банк", "Банк"));
Настройки.Колонки.Добавить(Новый Структура("ИД, Имя", "БИК", "БИК"));
Настройки.Колонки.Добавить(Новый Структура("ИД, Имя", "РасчетныйСчет", "Р/с"));
Настройки.Колонки.Добавить(Новый Структура("ИД, Имя", "Телефон", "Телефон"));
Настройки.Колонки.Добавить(Новый Структура("ИД, Имя", "ТелефонПримечание", "Телефон примечание"));
Настройки.Колонки.Добавить(Новый Структура("ИД, Имя", "Емейл", "E-mail"));
Настройки.Колонки.Добавить(Новый Структура("ИД, Имя", "ЮридическийАдрес", "Юридический адрес"));
Настройки.Колонки.Добавить(Новый Структура("ИД, Имя", "ФактическийАдрес", "Фактический адрес"));
Настройки.Колонки.Добавить(Новый Структура("ИД, Имя", "Тег", "Тег"));
Настройки.Колонки.Добавить(Новый Структура("ИД, Имя", "Группа", "Группа"));
Настройки.Колонки.Добавить(Новый Структура("ИД, Имя", "ТипКонтрагента", "Тип контрагента"));
Настройки.Вставить("ФункцияПоиска", "УНФНайтиКонтрагентаЮрлицо");
Настройки.Вставить("ФункцияСоздания", "УНФСоздатьКонтрагента");
Настройки.Вставить("ФункцияЗаполнения", "УНФЗаполнитьКонтрагентаЮрлицо");
Настройки.Вставить("ФункцияПослеЗаписи", "УНФПослеЗаписиКонтрагентаЮрлицо");
В будущем планирую формировать структуру настроек из файла с отступами - формат чуть более простой чем JSON.
Файл настроек содержит не код, а лишь описание полей файла Excel и опций загрузки.
В будущем планирую выводить на форму эту структуру, чтобы пользователь мог поправить названия колонок, если они у него отличаются, указать какие-нибудь галочки, например, не создавать новых элементов или не загружать какие-либо поля.
В файле настроек содержатся также названия методов для поиска, создания, заполнения данных.
Эти методы описываются в отдельной секции формы загрузки - в области ФункцииЗагрузки:
Код по заполнению контрагента выглядит, например, так:
Таким образом я разделил код движка и прикладной код загрузки. Движок загружает таблицу данных, на выходе формирует таблицу, у которой названия колонок уже маркированы идентификаторами, указанными в настройках, а не пользовательскими названиями колонок в Excel. С этой таблицей уже можно просто работать.
Движок (обработку универсальной загрузки) теперь можно дорабатывать. После этого брать свежую версию движка, копировать туда свои функции и получать все тот же код, но еще более удобный за счет доработок движка. По сути теперь можно вкладывать силы не в усовершенствование каждой отдельной обработки загрузки, а вкладываться в разработку движка и это даст пользу для каждой обработки загрузки.
Я лично планирую сделать в движке доработки, которые уже применял в своих обработках загрузки:
Возможность пользователю самому выбирать названия и номера колонок
Возможность разных названий колонок для одной колонки (учитывать ошибки в названиях колонок)
Опции для того, чтобы пропускать создание новых элементов и новых элементов в значениях полей. Например, не создавать новых контрагентов или не создавать новые банки.
Предварительный просмотр - вывод таблицы, где будет показано, какие элементы будут созданы, какие значения полей будут у новых элементов. Причем ненужные для загрузки данные можно убрать в пользовательском режиме.
Автоматизировать работу с дополнительными пользовательскими реквизитами.
Теперь я выделил черновую работу в движок и на каждой загрузке могу сосредоточиться уже на конкретных особенностях этой загрузки.
А пользователи инструмента программисты получают движок, понятный и прозрачный, к которому можно привыкнуть, который не требует долгого изучения. В который можно просто вставить свой код и быстро загрузить нужные данные.
Пользователи за счет гибких возможностей движка без программистов могут использовать гибко уже готовые загрузки, что снизит нагрузку на разработчиков.