Добавить в корзинуПозвонить
Найти в Дзене

Заполнение табличной части в 1С: Загрузка из файла Excel (КА, ERP)

Менеджер приносит Excel с 800 строками номенклатуры и говорит: «Забей в заказ поставщику к обеду». Знакомо? Руками — это 3 часа и гарантированные ошибки. Или 20 минут с правильным кодом. Покажу, как сделать загрузку из Excel в табличную часть документа в 1С:Комплексная автоматизация и 1С:ERP — с реальным кодом, подводными камнями и примерами из практики. Без воды. В ERP и КА есть встроенная обработка загрузки данных. Но на практике она решает задачу только в 30% случаев. Типичные проблемы со стандартными инструментами: Поэтому большинство проектов на ERP (от 432 000₽ за лицензию) в итоге обрастают кастомными обработками загрузки. Это нормально — давайте сделаем это правильно. Прежде чем открывать конфигуратор, ответьте на три вопроса: Я лично столкнулся с этим на одном из проектов — производственное предприятие, 120 пользователей. Третий пункт мы не продумали заранее. Загрузчик молча создавал дубли номенклатуры, и за месяц в справочнике накопилось 400 лишних позиций. Чистили потом два
Оглавление
Заполнение табличной части в 1С
Заполнение табличной части в 1С

Загрузка из Excel в табличную часть 1С КА и ERP — как сделать правильно и не наступить на грабли

Менеджер приносит Excel с 800 строками номенклатуры и говорит: «Забей в заказ поставщику к обеду». Знакомо? Руками — это 3 часа и гарантированные ошибки. Или 20 минут с правильным кодом.

Покажу, как сделать загрузку из Excel в табличную часть документа в 1С:Комплексная автоматизация и 1С:ERP — с реальным кодом, подводными камнями и примерами из практики. Без воды.

Почему стандартные инструменты 1С КА/ERP не спасают

В ERP и КА есть встроенная обработка загрузки данных. Но на практике она решает задачу только в 30% случаев.

Типичные проблемы со стандартными инструментами:

  • Формат Excel у клиента не совпадает со шаблоном 1С — и менеджер тратит час на переформатирование
  • Нет автоматического поиска номенклатуры по артикулу или коду поставщика
  • Не заполняются характеристики, серии, склады
  • При дублях строк — молча пропускает или падает с ошибкой

Поэтому большинство проектов на ERP (от 432 000₽ за лицензию) в итоге обрастают кастомными обработками загрузки. Это нормально — давайте сделаем это правильно.

Архитектура решения: что нужно продумать до написания кода

Прежде чем открывать конфигуратор, ответьте на три вопроса:

  • Откуда берётся файл? Пользователь выбирает вручную, или файл лежит в сетевой папке по расписанию?
  • Как искать номенклатуру? По наименованию (ненадёжно), по артикулу, по коду поставщика, по штрихкоду?
  • Что делать с незнакомыми позициями? Пропускать, создавать новые, показывать предупреждение?

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

Золотое правило: всегда показывай пользователю список нераспознанных строк перед записью документа.

Код загрузки из Excel в 1С — реальный рабочий пример

Шаг 1. Читаем файл Excel через табличный документ

Самый простой и надёжный способ в 1С — через ТабличныйДокумент. Не нужен COM-объект Excel, работает даже если Office не установлен.

&НаКлиенте
Процедура ЗагрузитьИзФайла(Команда)
    ОчиститьСообщения();

    // Диалог выбора файла
    ДиалогФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    ДиалогФайла.Фильтр = "Excel файлы (*.xlsx, *.xls)|*.xlsx;*.xls";
    ДиалогФайла.МножественныйВыбор = Ложь;

    Если ДиалогФайла.Выбрать() Тогда
        ЗагрузитьДанныеНаСервере(ДиалогФайла.ПолноеИмяФайла);
    КонецЕсли;
КонецПроцедуры

Шаг 2. Серверная процедура — читаем строки и ищем номенклатуру

На сервере читаем табличный документ и построчно обрабатываем данные. Поиск номенклатуры делаем по артикулу — это надёжнее, чем по наименованию. Ну вы поняли, к чему я веду: наименования у всех разные, артикул — это хотя бы какой-то стандарт.

&НаСервере
Процедура ЗагрузитьДанныеНаСервере(ПутьКФайлу)
    ТабДок = Новый ТабличныйДокумент;
    ТабДок.Прочитать(ПутьКФайлу, СпособЧтенияЗначенийТабличногоДокумента.Значение);

    // Начинаем со второй строки — первая строка заголовки
    Для НомерСтроки = 2 По ТабДок.ВысотаТаблицы Цикл
        Артикул = СокрЛП(ТабДок.Область(НомерСтроки, 1).Текст);
        Количество = ТабДок.Область(НомерСтроки, 2).Значение;
        Цена = ТабДок.Область(НомерСтроки, 3).Значение;

        Если ПустаяСтрока(Артикул) Тогда
            Продолжить; // Пропускаем пустые строки
        КонецЕсли;

        НайденнаяНоменклатура = НайтиНоменклатуруПоАртикулу(Артикул);

        Если НайденнаяНоменклатура = Неопределено Тогда
            // Фиксируем нераспознанные — не молчим!
            СообщениеПользователю = Новый СообщениеПользователю;
            СообщениеПользователю.Текст = "Не найден артикул: " + Артикул;
            СообщениеПользователю.Сообщить();
            Продолжить;
        КонецЕсли;

        НоваяСтрока = Объект.Товары.Добавить();
        НоваяСтрока.Номенклатура = НайденнаяНоменклатура;
        НоваяСтрока.Количество = Количество;
        НоваяСтрока.Цена = Цена;
        НоваяСтрока.Сумма = Количество * Цена;
    КонецЦикла;
КонецПроцедуры

Шаг 3. Поиск номенклатуры по артикулу — запрос

Ищем через запрос — это быстрее, чем метод НайтиПоРеквизиту, особенно если строк в файле больше 100.

Функция НайтиНоменклатуруПоАртикулу(Артикул)
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ ПЕРВЫЕ 1
    |    Номенклатура.Ссылка КАК Ссылка
    |ИЗ
    |    Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    |    Номенклатура.Артикул = &Артикул
    |    И НЕ Номенклатура.ПометкаУдаления";

    Запрос.УстановитьПараметр("Артикул", Артикул);
    РезультатЗапроса = Запрос.Выполнить();

    Если РезультатЗапроса.Пустой() Тогда
        Возврат Неопределено;
    КонецЕсли;

    Возврат РезультатЗапроса.Выгрузить()[0].Ссылка;
КонецФункции

Сейчас будет важное — не пропустите: если файл содержит 500+ строк — вынеси все запросы за пределы цикла. Загрузи номенклатуру одним запросом в соответствие, и ищи по нему. Иначе получишь 500 запросов к базе вместо одного. Это не просто замедление — это реальный риск положить сессию на нагруженной базе.

Подводные камни, которые съедают время на проектах

За 8 лет практики собрал список граблей, на которые наступают почти все:

  • Кодировка и формат чисел. Excel с немецкой локалью пишет «1.234,56» вместо «1234.56». Парсер 1С это не поймёт — проверяй тип ячейки, используй .Значение, а не .Текст
  • Объединённые ячейки. Если в шапке таблицы есть объединённые ячейки — ТабличныйДокумент читает их некорректно. Предупреди пользователей: шаблон без объединений
  • Скрытые строки и столбцы. Они тоже читаются. Добавь проверку на пустую строку перед обработкой
  • Характеристики номенклатуры в ERP. Если у номенклатуры есть характеристики — нужно искать не только по артикулу, но и по характеристике. Иначе строка добавится без характеристики и документ не проведётся
  • Единицы измерения. В Excel — «шт», в 1С — «Штука». Заведи таблицу соответствий или ищи по сокращению

Помню случай — торговая компания из Екатеринбурга, 1С:КА, около 50 сотрудников. Загрузчик работал три месяца без единой жалобы. Потом поставщик прислал файл с характеристиками — и всё сломалось в один день. Менеджеры не могли провести ни одного заказа. Закладывай обработку характеристик сразу, даже если сейчас они не нужны. Это час работы сейчас против дня разбора полётов потом.

Best Practice: как сделать загрузчик, который не придётся переписывать

  • Предпросмотр перед загрузкой. Покажи пользователю таблицу значений с результатами разбора файла — что нашлось, что не нашлось. Пусть сам решит, продолжать или нет
  • Настраиваемый маппинг колонок. Храни в константе или регистре сведений: «колонка 1 = Артикул, колонка 2 = Количество». Тогда при смене формата файла не нужен программист
  • Лог загрузки. Записывай в регистр сведений: дата, пользователь, файл, количество строк загружено/пропущено. Через месяц скажешь себе спасибо
  • Транзакция. Оборачивай запись в транзакцию — если на 400-й строке ошибка, пользователь не получит полузаполненный документ
  • Ограничение на размер файла. Больше 5000 строк — предупреждай. Больше 20 000 строк — запускай фоновым заданием, иначе сессия упадёт по таймауту

Я считаю, что настраиваемый маппинг колонок — это самая недооценённая фича в таких обработках. Не соглашусь с теми, кто говорит «зашей колонки в код, потом поправим». В 4 из 5 проектов за последний год формат файла менялся минимум раз через два-три месяца после внедрения. И каждый раз это звонок программисту, задача, деньги.

Итог: сколько времени это экономит

Хорошо написанный загрузчик из Excel — это окупаемость за первую же неделю.

Считай сам: менеджер вбивает 200 строк вручную — 2 часа работы плюс ошибки. С загрузчиком — 3 минуты. При ставке 80 000₽/мес это ~800₽ за одну операцию. Если таких операций 10 в неделю — 32 000₽/мес экономии только на одном сотруднике.

Разработка нормального загрузчика с предпросмотром и логом — 8-12 часов работы программиста. При ставке 3 500₽/час — 28 000–42 000₽. Окупается за месяц-полтора. Ладно, погнали дальше — цифры говорят сами за себя.

Если нужен готовый специалист для такой задачи — найти проверенного 1С-разработчика можно на koderion.ru. Биржа специалистов 1С: фиксированные ставки, портфолио, отзывы реальных заказчиков.

👍 Поставьте лайк, если разбор был полезен — так я пойму, что писать следующую статью про работу с Excel в 1С (например, выгрузку обратно в Excel с форматированием). Вопросы по коду — пишите в комментарии, отвечу.