Почему я перестал писать обработки для каждого 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    47106    611    71    

223

Загрузка и выгрузка в 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    234574    757    540    

502

Загрузка и выгрузка в Excel Логистика, склад и ТМЦ Ценообразование, анализ цен Файловый обмен (TXT, XML, DBF), FTP Бухгалтер Пользователь 1С:Предприятие 8 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)

Эволюция не стоит на месте - новая удобная версия функциональной обработки для Вашего бизнеса! Что же Вы получаете? Удобный и интуитивно понятный интерфейс с 3-мя этапами работы. 2 режима - автоматический и ручной. Чтение XLSX, XLSM, CSV, XML/YML форматов без офиса, на любом сервере! Визуальное связывание колонок файла и реквизитов простым перетаскиванием колонок. Создание или обновление номенклатуры с иерархией, характеристик, доп. реквизитов, упаковок, загрузка практически неограниченного количества картинок на одну номенклатуру (с возможностью загрузки в несколько потоков одновременно), с хранением в томах или в базе. Загрузка номенклатуры поставщиков или поиск по их данным номенклатуры. Загрузка доп. реквизитов в характеристики. Загрузка штрихкодов с генерацией новых. Создание элементов справочников и ПВХ "на лету" для выбранных реквизитов. (Обновление от 14.05.2026, версия 9.3.1 - 10.7.2)

20740 руб.

20.11.2015    177122    427    397    

544

Загрузка и выгрузка в 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    12835    77    0    

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

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

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

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

Шаг = 2 значит данные идут через строки. Не увидел параметр шаг.
4. G_100802897175107255412 11 24.06.26 05:37 Сейчас в теме
(3) Спасибо за идею! Вы правы — прайсы с нестандартной структурой (данные через строку, многострочные заголовки, фиксированные номера колонок) это отдельный класс задач. В текущей версии обработка ориентирована на стандартную таблицу: первая строка — заголовки, далее данные подряд.

Параметры “Первая строка данных”, “Шаг” и “Привязка к номерам колонок” — хорошие кандидаты для версии 1.2. Добавлю в план развития.
5. Dragonim 157 24.06.26 07:40 Сейчас в теме
Чем ваша разработка отличается от подсистему "Загрузка данных из файла" из БСП?
6. G_100802897175107255412 11 24.06.26 09:55 Сейчас в теме
(5) Хороший вопрос. Подсистема БСП “Загрузка данных из файла” — достойный инструмент, но она доступна только в тех конфигурациях, где разработчик её уже встроил. Моя обработка открывается как внешний .epf в любой базе без доработки конфигурации.

По функционалу: в БСП сопоставление колонок ручное — нет словаря синонимов и нечёткого сравнения. Нет шаблонов сопоставления, нет валидации данных до записи с визуальной подсветкой строк. Загрузка в документы через БСП требует дополнительной разработки в модуле менеджера объекта.

Текущая версия моей обработки ориентирована на справочники. Загрузка в табличные части документов — в плане следующих версий.
(5)
Для отправки сообщения требуется регистрация/авторизация