Почему я перестал писать обработки для каждого Excel-файла и что сделал вместо этого (и вам советую)

23.06.26

Интеграция - Загрузка и выгрузка в Excel

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

Введение

Был у меня клиент — небольшая торговая компания, закупают у десяти поставщиков. Каждый присылает прайс в своём Excel. Один — с тремя листами, цены почему-то на третьем. Другой объединяет ячейки в заголовке, отчего колонки "съезжают". Третий примерно раз в квартал добавляет новую колонку, никого не предупреждая.

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

Сначала подумал — ну ладно, бывает, ситуация специфическая. Потом посмотрел на пару других проектов у знакомых разработчиков. Та же история. Где-то семь обработок, где-то двенадцать. Похоже, это не исключение, а норма.

Я сам так делал раньше. Прислали файл — сел, написал обработку под него за пару часов, загрузил, забыл. Удобно же. Пока не накопилось одиннадцать таких "удобно".

 

Проблема, которую обычно недооценивают

Разовая обработка выглядит дешёвой, если смотреть только на момент написания. Два-три часа — и готово. Но это обманчиво простой взгляд.

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

Я попытался прикинуть цифры по тому проекту с одиннадцатью обработками. Получилось примерно так:

Этап Разовая обработка Универсальный механизм
Первая разработка 2–3 часа 20–40 часов
Изменение формата файла 1–2 часа за раз 0 часов, настройка
Поддержка 10 поставщиков в год 15–30 часов 2–4 часа
Ввод нового разработчика в курс дела 5–10 часов 1–2 часа
Переход на другую конфигурацию 15–20 часов 3–5 часов

Цифры приблизительные, у меня нет точной статистики по часам — никто их не считал в моменте, это уже постфактум прикидка. Но порядок величин, думаю, реалистичный для большинства похожих ситуаций.

 

Какие вообще есть варианты

Разовая специализированная обработка

Под конкретный файл. Знает, с какой строки данные, какой лист, как называются колонки именно у этого поставщика.

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

Минусы — не переиспользуется никак, любое изменение формата это правка кода, технический долг растёт незаметно, и в какой-то момент ты обнаруживаешь у себя одиннадцать обработок и не помнишь, что в шестой из них особенного.

Универсальный механизм

Один инструмент под любой Excel или CSV. Пользователь сам настраивает, какая колонка файла куда идёт.

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

Минусы — дольше делать с нуля, сложнее в реализации, и пользователю всё равно нужно понимать хоть немного, что такое реквизит и справочник, иначе настройка превратится в гадание.

Когда разовая обработка — нормальный выбор

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

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

Чёткой границы тут нет, я для себя определяю так: если файл будет грузиться регулярно — окупится универсальность. Если разово — не парьтесь.

 

Что происходило, пока я это делал

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

Попробовал автоматику через точное совпадение названий. Колонка "Наименование" в файле, реквизит "Наименование" в 1С — сопоставляем. Сработало процентов на тридцать-сорок, не больше. Потому что в реальности колонки называются как угодно — "Название товара", "Name", "Товар", иногда вообще "Колонка3" без всякого смысла.

Добавил словарь синонимов — список соответствий "как может называться" → "что это в 1С". Процент пополз вверх.

Потом добавил нечёткое сравнение строк, для случаев когда точного совпадения нет, но слова похожи. И тут словил неприятный сюрприз — колонка "ШтрихКод" начала автоматически сопоставляться с реквизитом "Код". Алгоритм увидел общую подстроку "код" и решил что это отличное совпадение. Пришлось городить штраф за разницу в длине строк, чтобы такого не было. Не самое элегантное решение, если честно, но рабочее.

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

 

Что я для себя вынес архитектурно

DRY применительно к загрузке данных. Чтение файла, сопоставление полей и запись в 1С — это три разные вещи, и если они слиплись в один кусок кода под конкретный файл, замена любой из них требует переписать всё. Когда разделены — можно менять отдельно.

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

Сохранение шаблонов — это форма памяти о решённой задаче. Человек один раз настроил сопоставление — и это не должно теряться. Иначе каждый понедельник он заново объясняет программе то же самое.

Dry Run — не опциональная фича, а часть архитектуры безопасности. Без режима проверки без записи в базу вы каждый раз играете в рулетку — а вдруг там пустое обязательное поле, а вдруг формат даты не такой. Лучше увидеть это на экране, чем в базе после записи.

 

Как я сейчас решаю, что выбрать

Себе задаю примерно такие вопросы. Файл будет грузиться больше одного раза? Формат может поменяться? Загружать должен не программист? Похожих файлов несколько, от разных источников? Проект на годы, не на один раз?

Если ответ "да" на большинство — универсальный механизм окупится, можно не сомневаться.

Грубая прикидка стоимости: считаете часы на одну разовую обработку, умножаете на то, сколько раз формат поменяется за год, умножаете на ставку — и сравниваете с тем, сколько стоит сделать один раз универсально. При трёх-пяти регулярно грузящихся файлах универсальный вариант обычно окупается в первый же год. У меня по крайней мере так выходило.

 

Вместо вывода

Загрузка Excel в 1С — задача, которую обычно решают на бегу, не задумываясь, что будет через год. Я сам так делал, не один раз.

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

Хорошая архитектура — это не про красивый код. Это про то, чтобы через год не пришлось всё переписывать.

 

Кстати, про практику

Реализовав этот подход на практике, я собрал его в виде обработки для Infostart. Если тема интересна — вот она: infostart.ru/1c/tools/2715613. Буду рад обратной связи от тех, кто тоже устал плодить сущности.

Вступайте в нашу телеграмм-группу Инфостарт

загрузка excel импорт данных архитектура 1с универсальная обработка технический долг автоматизация загрузки

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Загрузка и выгрузка в Excel Маркетплейсы Программист Бухгалтер Пользователь 1С:Предприятие 8 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Бухгалтерский учет Управленческий учет Платные (руб)

Реальный помощник, с помощью которого Вы преобразуете необходимые документы для Wildberries, OZON, ЯндексМаркет, ЛаМода, Мегамаркет, Aliexpress, Детский мир, Магнит Маркет (быв.МагнитЭкспресс), Лемана про, ЭНФАНТА (Акушерство), Летуаль, Твой дом, Золотое Яблоко, Каспи, Авито, Аптеки+ в документы "Отчет комиссионера (агента) о продажах" и другие. Работает в 1С:БП 3.0, 1С:БП 3.0 КОРП, 1С:УТ 11, 1С:УНФ, 1С:ERP.

5490 руб.

12.08.2021    46484    598    71    

222

Загрузка и выгрузка в Excel Розничная торговля Логистика, склад и ТМЦ Ценообразование, анализ цен Прайсы Системный администратор Программист 1С:Предприятие 8 1С:Комплексная автоматизация 1.х 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Управленческий учет Платные (руб)

Загрузка номенклатуры из файлов Excel (xls, xlsx, ods, csv, mxl) в УТ11, КА 2, ERP 2, Розница 2. Задействованы все возможности конфигурации - заполнение реквизитов номенклатуры, дополнительных реквизитов и сведений, характеристики, доп.реквизиты и сведения характеристик. Дополнительные обработки для расширения возможностей.

12444 руб.

29.10.2014    233387    755    538    

501

Загрузка и выгрузка в Excel Программист Бухгалтер Пользователь 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Розничная и сетевая торговля (FMCG) Управленческий учет Платные (руб)

Загрузка данных отчета о реализации товаров из сервиса Lamoda «Ламода» для конфигурации: 1С:Бухгалтерия предприятия, редакция 3.0; 1C:Управление торговлей, редакция 11 и 1C:Управление нашей фирмой, редакция 3.0 в документ "Отчет комиссионера (агента) о продажах".

6000 руб.

01.03.2021    12684    75    0    

33

Загрузка и выгрузка в Excel Маркетплейсы Программист Бухгалтер Пользователь 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Бухгалтерский учет Управленческий учет Платные (руб)

Загружает данные из Акта приемки товара от ООО «Вайлдберриз», полученный из личного кабинета в формате *.xlsx или API в документ "Реализация (акты, накладные, УПД)" для конфигурации: Бухгалтерия предприятия, редакция 3.0, в документ "Реализация товаров и услуг" для Управление торговлей, редакция 11; Комплексная автоматизация 2; ERP 2 Управление предприятием и в документ "Расходная накладная" для Управление нашей фирмой 3.0; Розница 3.0

6000 руб.

24.01.2021    25137    122    0    

63
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. SerVer1C 1103 23.06.26 16:15 Сейчас в теме
Мысли в слух начинающего программиста ) Зачем про это писать?
Обычно в подобных загрузчиках делают настройки, которые 1 раз заполняются и применяются при каждой загрузке. Если формат прайса меняется, корректируют настройки и продолжают счастливо жить.
MrFlanker; +1 Ответить
2. G_100802897175107255412 1 23.06.26 16:40 Сейчас в теме
(1) Спасибо за комментарий.

Да, сохранение настроек загрузки — это действительно удобный и распространённый механизм. В моей обработке он также предусмотрен.

Однако цель разработки была не просто сделать ещё один загрузчик, а упростить первичную настройку и повысить устойчивость к изменениям структуры исходных файлов. Именно на этом направлении планируется дальнейшее развитие продукта: интеллектуальное сопоставление колонок, расширенная диагностика и другие возможности, которые сокращают время подготовки загрузки.

Если у вас есть пожелания по функционалу или примеры сценариев, где существующие решения неудобны, буду рад обсудить.
3. MrFlanker 252 24.06.26 01:03 Сейчас в теме
В параметрах считывания конкретного прайса должны быть следующие:
Первая строка, Шаг, и Номера колонок для каждого поля данных.

Шаг = 2 значит данные идут через строки. Не увидел параметр шаг.
Для отправки сообщения требуется регистрация/авторизация