Данные из Excel в 1С 8.3: от готовой загрузки до своей обработки
Содержание
Подгрузить Excel
файл в 1С 8.3 проще всего встроенной командой загрузки: в типовых конфигурациях она есть в списках справочников и в табличных частях документов. Вы выбираете файл .xlsx, сопоставляете колонки с полями 1С, смотрите предпросмотр и загружаете. Код для этого не нужен.
Если встроенной загрузки мало (нестандартный объект, тысячи строк каждый день, сложные правила поиска), пишут внешнюю обработку . Она читает таблицу одним из трёх способов: через табличный документ, через CSV-файл или через COM-объект Excel. Ниже все способы по порядку: от того, что делает бухгалтер, до того, что пишет программист.
Как подготовить таблицу Excel перед загрузкой в 1С
Половина неудачных загрузок ломается не в 1С, а в самом файле. Пять минут на подготовку экономят откат базы.
Что сделать с таблицей:
- 📌 Одна строка заголовков, данные сразу под ней. Без объединённых ячеек, без итоговых строк, без пустых строк посередине.
- 🔑 Ключевая колонка для поиска: артикул, ИНН, код. По наименованию искать ненадёжно: «Болт М8×40» и «Болт М8 x 40» для 1С разные строки.
- 🔢 Числа — числами. Если в ячейке слева зелёный уголок, значит число хранится как текст. Выделите колонку и преобразуйте в число через значок предупреждения.
- 0️⃣ Артикулы с ведущими нулями (
000123) — наоборот, текстом. Иначе Excel превратит их в123. - 📅 Даты — в формате даты Excel, а не строкой «12.03.25 г.».
- ✂️ Лишние пробелы. Функция
=СЖПРОБЕЛЫ(A2)убирает обычные пробелы, но не неразрывные. Неразрывный пробел (код 160) убирают заменой черезCtrl+H: в поле «Найти» наберитеAlt+0160на цифровой клавиатуре. - 🏷️ Справочные значения пишите так, как они названы в 1С: единица «шт», а не «штука»; ставка «20%», а не «20».
| Проблема в файле | Что увидите при загрузке |
|---|---|
| Число как текст с пробелом «1 250,00» | Ошибка преобразования или ноль в количестве |
| Объединённые ячейки в шапке | Колонки сдвинуты, данные попадают не в те поля |
| Скрытые строки и листы | Загружаются «лишние» позиции, которых вы не видели |
| Формулы со ссылками на другой файл | Пустые значения или #ССЫЛКА! вместо цифр |
Формулы перед загрузкой лучше заменить значениями: скопируйте колонку и вставьте через «Специальная вставка → Значения». Так 1С получит ровно то, что вы видите.
Перед первой загрузкой в рабочую базу сделайте резервную копию или проверьте процедуру на копии базы. Откатить сотню созданных элементов справочника вручную долго.
Встроенная загрузка из файла в типовых конфигурациях
В БП 3.0, УТ 11, КА 2 и ERP загрузка таблиц из файла входит в библиотеку стандартных подсистем. Она понимает .xlsx, .xls, .ods, .csv и .mxl.
Загрузка в справочник
- Откройте список справочника, например «Номенклатура» или «Контрагенты».
- В командной панели нажмите «Загрузить» (если кнопки нет на панели, найдите её в меню «Ещё»).
- Выберите файл или вставьте данные из буфера обмена в открывшуюся таблицу.
- Сопоставьте колонки: над каждой колонкой выберите поле 1С, в которое она попадёт.
- Укажите поле для поиска существующих элементов (артикул, ИНН, код).
- Посмотрите предпросмотр. Строки будут разделены на новые, найденные и ошибочные.
- Нажмите «Загрузить» и проверьте результат в списке.
Загрузка в табличную часть документа
В документах «Поступление (акты, накладные, УПД)», «Реализация (акты, накладные, УПД)», «Заказ покупателя» над табличной частью «Товары» есть команда загрузки. Механика та же: файл → сопоставление колонок → проверка. Номенклатура ищется по артикулу или наименованию; что не нашлось, программа предложит создать или сопоставить вручную.
При загрузке в документ проверьте ставку НДС и счета учёта у новых позиций. Созданная «на лету» номенклатура получает значения по умолчанию, а они не всегда совпадают с вашей учётной политикой.
Обработка «Загрузка данных из табличного документа»
Для конфигураций, где встроенной команды нет, или для загрузки в любой справочник и регистр используют внешнюю обработку «Загрузка данных из табличного документа» (ЗагрузкаДанныхИзТабличногоДокумента.epf). Её распространяют для подписчиков ИТС, есть версии для обычных и управляемых форм.
Открывается через Файл → Открыть (или «Дополнительные обработки», если внешние обработки подключаются через справочник). Дальше выбираете объект загрузки, вставляете данные из Excel в табличное поле, настраиваете для каждой колонки режим: искать, устанавливать значение, вычислять выражением.
Загрузка Excel через CSV и текстовый документ
Когда файл приходит из чужой системы и пишется в 1С своей обработкой, удобно сохранить его в текстовый формат. CSV не зависит от версии Excel и не требует установленного Office.
Как сохранить: в Excel Файл → Сохранить как → тип «CSV UTF-8 (разделители — запятые)» или «CSV (разделители — запятые)». В русской локали Windows Excel ставит разделителем точку с запятой, а не запятую. Откройте файл Блокнотом и проверьте разделитель и кодировку до того, как писать код.
Чтение CSV построчно через ЧтениеТекста и СтрРазделить (платформа 8.3.6 и новее):
&НаСервере
Процедура ЗагрузитьCSV(ИмяФайла)
Чтение = Новый ЧтениеТекста(ИмяФайла, КодировкаТекста.UTF8);
Строка = Чтение.ПрочитатьСтроку(); // заголовок пропускаем
Строка = Чтение.ПрочитатьСтроку();
Пока Строка <> Неопределено Цикл
Поля = СтрРазделить(Строка, ";", Истина);
Если Поля.Количество() >= 3 Тогда
Артикул = СокрЛП(Поля[0]);
Наименование = СокрЛП(Поля[1]);
ЦенаСтрокой = СтрЗаменить(СокрЛП(Поля[2]), " ", "");
ЦенаСтрокой = СтрЗаменить(ЦенаСтрокой, ",", ".");
Попытка
Цена = Число(ЦенаСтрокой);
Исключение
Сообщить("Строка с артикулом " + Артикул + ": не число в цене");
Цена = 0;
КонецПопытки;
// здесь поиск и запись объекта
КонецЕсли;
Строка = Чтение.ПрочитатьСтроку();
КонецЦикла;
Чтение.Закрыть();
КонецПроцедуры
Если файл сохранён в старом формате «CSV (разделители — запятые)», вместо КодировкаТекста.UTF8 укажите КодировкаТекста.ANSI: Excel пишет такой файл в кодировке Windows-1251.
Простое СтрРазделить ломается, если в ячейке есть сам разделитель. Excel берёт такое значение в кавычки: "ООО ""Ромашка""; склад 2". Для таких файлов нужен разбор с учётом кавычек или чтение через табличный документ.
Табличный документ: чтение xlsx без Excel
Объект ТабличныйДокумент в платформе 8.3 сам читает .xlsx, .xls и .ods методом Прочитать. Excel на компьютере не нужен, код работает и на сервере. Для своих обработок это основной способ.
&НаСервере
Процедура ЗагрузитьXLSX(АдресВХранилище)
ИмяФайла = ПолучитьИмяВременногоФайла("xlsx");
ПолучитьИзВременногоХранилища(АдресВХранилище).Записать(ИмяФайла);
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(ИмяФайла, СпособЧтенияЗначенийТабличногоДокумента.Значение);
Для НомерСтроки = 2 По ТабДок.ВысотаТаблицы Цикл
Артикул = СокрЛП(ТабДок.Область(НомерСтроки, 1, НомерСтроки, 1).Текст);
Наименование = СокрЛП(ТабДок.Область(НомерСтроки, 2, НомерСтроки, 2).Текст);
Если ПустаяСтрока(Артикул) Тогда
Продолжить;
КонецЕсли;
// поиск по артикулу и запись
КонецЦикла;
УдалитьФайлы(ИмяФайла);
КонецПроцедуры
Файл с клиента передают на сервер через временное хранилище: на клиенте НачатьПомещениеФайлаНаСервер (или ПоместитьФайл в старых обработках), на сервер уходит адрес. Режим СпособЧтенияЗначенийТабличногоДокумента.Значение возвращает значения ячеек, а не их форматированное представление.
COM-соединение с Excel: когда оно нужно и чем опасно
COM-объект Excel.Application управляет самим Excel: открывает книгу, читает ячейки, листы, даже значения формул. Способ старый, его часто встречают в обработках под обычные формы.
&НаКлиенте
Процедура ЗагрузитьЧерезCOM(ИмяФайла)
Excel = Новый COMОбъект("Excel.Application");
Excel.DisplayAlerts = Ложь;
Книга = Excel.Workbooks.Open(ИмяФайла);
Лист = Книга.Worksheets(1);
ВсегоСтрок = Лист.UsedRange.Rows.Count;
Попытка
Для НомерСтроки = 2 По ВсегоСтрок Цикл
Артикул = Лист.Cells(НомерСтроки, 1).Value;
Цена = Лист.Cells(НомерСтроки, 3).Value;
// передача строки в серверную процедуру записи
КонецЦикла;
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
Книга.Close(Ложь);
Excel.Quit();
КонецПроцедуры
Ограничения, о которых узнают слишком поздно:
- 🖥️ На компьютере, где выполняется код, должен стоять Microsoft Excel. LibreOffice не подойдёт.
- 🐢 Обращение к каждой ячейке — отдельный вызов COM. 10 000 строк по 5 колонок — это 50 000 вызовов. Быстрее прочитать весь диапазон одним вызовом
Лист.UsedRange.Valueи разбирать массив. - 👻 Если код упал до
Excel.Quit(), процессEXCEL.EXEостаётся висеть в памяти. Закрывайте книгу и Excel в любом исходе. - 🌐 В веб-клиенте COM недоступен, на сервере 1С Excel обычно не устанавливают.
- 📏
UsedRange.Rows.Countдаёт число строк используемого диапазона. Если таблица начинается не с первой строки, номер последней строки будет другим.
Как альтернативу COM иногда используют ADODB.Connection с провайдером Microsoft.ACE.OLEDB.12.0: лист читается SQL-запросом как таблица. Но провайдер тоже ставится отдельно, а разрядность должна совпадать с разрядностью клиента 1С.
| Способ | Нужен Excel | Работает на сервере | Скорость | Когда выбирать |
|---|---|---|---|---|
| Встроенная загрузка | Нет | — | Высокая | Разовые и регулярные загрузки в типовых |
| Табличный документ | Нет | Да | Высокая | Своя обработка, загрузка по расписанию |
| CSV + ЧтениеТекста | Нет | Да | Самая высокая | Большие файлы из внешних систем |
| COM Excel | Да | Обычно нет | Низкая | Нужны значения формул, несколько листов, старая обработка |
Загрузка Excel через обмен данными
«Универсальный обмен данными в формате XML» и «Конвертация данных » работают с XML, а не с таблицами. Подложить им Excel напрямую нельзя.
Обмен нужен в другом сценарии: данные из Excel уже загружены в одну базу и их надо перенести в другую. Например, номенклатуру загрузили в УТ 11, а в БП 3.0 она приходит синхронизацией. Тогда грузите Excel только в базу-источник, иначе в приёмнике появятся дубли: один элемент из файла, второй из обмена.
Если Excel — регулярная выгрузка из внешней системы (склад, маркетплейс, сайт), удобна схема в два шага:
- Внешняя обработка или регламентное задание читает файл и пишет данные в базу.
- Дальше штатный обмен разносит их по остальным базам.
Для сопоставления колонок внешнего файла с реквизитами 1С составьте карту полей заранее:
Дубли и ошибки при загрузке из Excel в 1С
Главный вопрос любой загрузки: что делать, если элемент уже есть. Решите его до запуска, а не после.
Правило поиска. Ищите по уникальному реквизиту: артикул для номенклатуры, ИНН и КПП для контрагентов, табельный номер для сотрудников. Для контрагентов одного ИНН мало: у головной организации и обособленных подразделений ИНН общий, отличается КПП.
Режим при совпадении. Встроенная загрузка спрашивает, что делать с найденными: обновлять реквизиты или пропускать. В своей обработке сделайте то же явно, флагом на форме.
Проверка дублей в самом файле. Если артикул встречается в файле дважды, вторая строка перезапишет первую. В Excel это видно за минуту: Главная → Условное форматирование → Правила выделения ячеек → Повторяющиеся значения.
Для своей обработки полезно писать журнал: номер строки Excel, что было сделано (создан, обновлён, пропущен), текст ошибки. Пользователь исправит конкретные строки, а не весь файл.
Каждый объект записывайте в отдельной попытке. Одна битая строка не должна останавливать загрузку остальных 4 999.
Как автоматизировать регулярную загрузку Excel в 1С
Если прайс поставщика приходит каждый день, загрузку можно поставить на поток.
Регламентное задание
Код обработки переносят в общий модуль конфигурации (или в расширение, чтобы не снимать типовую с поддержки) и вызывают из регламентного задания. Задание раз в час или раз в сутки смотрит папку, загружает новые файлы и переносит их в подпапку «Обработано».
Что учесть в клиент-серверном варианте:
- 📂 Путь к папке должен быть доступен серверу 1С, а не вашему компьютеру. Используйте сетевой путь
\\server\exchange\in, а неC:\Users\…. - 🔐 Права на папку нужны пользователю Windows, от которого запущена служба сервера 1С (по умолчанию
USR1CV8). - 📄 Читайте файл через
ТабличныйДокументилиЧтениеТекста. COM на сервере не используйте. - 🗂️ Ошибки пишите в журнал регистрации методом
ЗаписьЖурналаРегистрации: регламентное задание не показывает сообщений пользователю.
В файловой базе регламентные задания выполняются только при открытом сеансе 1С, поэтому для стабильного расписания нужен сервер или постоянно запущенный клиент.
Запуск из командной строки
Без доработки конфигурации можно запускать внешнюю обработку по расписанию Windows параметром /Execute:
"C:\Program Files\1cv8\8.3.24.1548\bin\1cv8.exe" ENTERPRISE /F"D:\Bases\Trade" /N"Загрузка" /P"пароль" /Execute"D:\Scripts\LoadPrice.epf"
Номер версии в пути замените на установленный у вас. Обработка выполняет загрузку в обработчике открытия формы и закрывает сеанс. Для отдельной учётной записи «Загрузка» дайте только те права, которые нужны для записи загружаемых объектов. Пароль в bat-файле храните в папке, доступной только администратору.
Частые вопросы
Можно ли открыть Excel прямо в 1С, без загрузки?
Файл → Открыть в 1С 8.3 открывает .xlsx как табличный документ. Его можно посмотреть, отредактировать и сохранить, но данные в справочники и документы так не попадут.