Загрузка из 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 с форматированием). Вопросы по коду — пишите в комментарии, отвечу.