Данные из Excel в 1С 8.3: типовая загрузка, обработка и свой код
Содержание
Считать Excel в 1С 8.3 можно тремя способами: кнопкой Загрузить в списке справочника или в табличной части документа (есть в БП 3.0 и УТ 11), внешней обработкой «Загрузка данных из табличного документа» или своим кодом, который читает файл через объект ТабличныйДокумент. Для разовой загрузки номенклатуры или строк накладной хватает первого способа. Обработка нужна, когда типовой кнопки нет. Код — когда загрузка регулярная или файл сложный.
Во всех трёх случаях работа одна и та же: подготовить файл, сопоставить колонки с реквизитами, проверить типы данных и решить, что делать с ненайденными значениями. Именно на этих шагах и ломается импорт данных.
Типовая загрузка из Excel в конфигурациях 1С
В конфигурациях на Библиотеке стандартных подсистем есть общий механизм загрузки данных из файла. Пользователь видит его как кнопку Загрузить в командной панели списка или табличной части.
| Что загружаем | Где искать (БП 3.0, УТ 11) |
|---|---|
| 📦 Номенклатуру | Список справочника «Номенклатура», кнопка Загрузить |
| 🧾 Строки накладной, УПД | Табличная часть «Товары» документа поступления или реализации, кнопка Загрузить |
| 👥 Контрагентов | Список справочника «Контрагенты», кнопка Загрузить (если её нет в вашем релизе — через обработку, см. ниже) |
Порядок работы у механизма одинаковый:
- Нажмите
Загрузить. Откроется форма с пустой таблицей-шаблоном. - Скопируйте строки из Excel и вставьте в таблицу (
Ctrl+V) или выберите файл командой загрузки из файла. - Проверьте, что колонки шаблона совпали с колонками вашего файла по смыслу.
- Нажмите
Далее. Программа ищет каждое значение в базе и показывает результат сопоставления. - Разберите строки, которые не сопоставились: выберите элемент вручную или разрешите создать новый.
- Завершите загрузку и проверьте результат в списке или в документе.
Копирование через буфер обмена — самый быстрый путь для 50–500 строк. Файл не надо сохранять в особом формате, а лишние колонки просто не попадут в шаблон.
Если кнопки нет или нужно загрузить данные в объект, для которого типового механизма не предусмотрено (регистр сведений , нетиповой справочник), переходите к внешней обработке.
Подготовка файла Excel перед импортом в 1С
Половина проблем при загрузке решается до открытия 1С. Таблица должна выглядеть как «плоский» список: одна строка — одна запись, одна колонка — один реквизит.
Что проверить в файле:
- 📌 Одна строка заголовков. Шапка из двух-трёх строк с объединёнными ячейками сбивает нумерацию колонок.
- 📌 Нет объединённых ячеек в области данных. Значение объединённой ячейки хранится только в первой из них, остальные считаются пустыми.
- 📌 Нет промежуточных итогов и строк «Итого по группе». Иначе они загрузятся как товар с названием «Итого».
- 📌 Скрытые строки и фильтры сняты. Скрытая строка всё равно есть в файле и попадёт в загрузку.
- 📌 Артикулы, ИНН, коды — в текстовом формате. Excel превращает
00123в123, а длинный ИНН — в7,70E+09. Поставьте ячейкам формат «Текстовый» до ввода данных или загрузите исходник через импорт текста. - 📌 Числа без лишних символов. Не
1 250 руб., а1250. Разделитель дробной части — один на весь файл. - 📌 Формулы заменены значениями. Скопируйте диапазон и вставьте как значения: так 1С гарантированно увидит число, а не пустую ячейку или
#Н/Д.
Если загружаете в рабочую базу больше пары сотен строк, сначала сделайте резервную копию или прогоните файл на копии базы. Отменить массовую загрузку справочника одной кнопкой нельзя: созданные элементы придётся помечать на удаление вручную.
Формат файла — .xlsx. Старый .xls и выгрузки из других программ лучше пересохранить в .xlsx из самого Excel: так снимаются проблемы с кодировкой и нестандартной структурой файла.
Сопоставление колонок и типов данных при загрузке
Сопоставление — главный шаг импорта. 1С не знает, что колонка «Код товара» в файле — это артикул. Ей нужно явно указать, в какой реквизит класть значение и как искать ссылку.
Простые реквизиты (строка, число, дата) заполняются как есть, но с приведением типа. Ссылочные реквизиты требуют поиска: в ячейке лежит текст «шт», а в документе нужна ссылка на элемент справочника «Единицы измерения».
По каким полям искать ссылку:
| Поле поиска | Надёжность | Когда подходит |
|---|---|---|
| Артикул | Высокая | Артикулы уникальны и заполнены в базе |
| Код справочника | Высокая | Файл выгружен из той же базы |
| ИНН (для контрагентов) | Высокая | У всех контрагентов заполнен ИНН |
| Наименование | Низкая | Только если другого ключа нет |
Поиск по наименованию ломается на мелочах. «Болт М8х20» и «Болт М8x20» (кириллическая и латинская «х») для 1С — разные строки. Двойной пробел, точка в конце, кавычки «ёлочки» вместо прямых — то же самое. Результат: вместо поиска создаются дубли.
Отключите автосоздание новых элементов при первой загрузке. Пусть ненайденные строки останутся несопоставленными: так вы увидите расхождения, а не получите сотню дублей в справочнике.
Обработка «Загрузка данных из табличного документа»
Когда типовой кнопки нет, используют внешнюю обработку ЗагрузкаДанныхИзТабличногоДокумента.epf. Она распространяется фирмой 1С для пользователей с действующей поддержкой и подходит для управляемого интерфейса. Обработка умеет загружать в справочники, табличные части и регистры сведений.
Как с ней работать:
- Откройте обработку через
Файл → Открытьили подключите как дополнительную:Администрирование → Печатные формы, отчёты и обработки → Дополнительные отчёты и обработки. - Выберите режим загрузки (справочник, табличная часть или регистр сведений) и сам объект-приёмник.
- Обработка построит таблицу реквизитов объекта. Отметьте флажками те, что будете заполнять.
- Для каждого реквизита укажите номер колонки файла. Для ссылочных реквизитов выберите, по какому полю искать элемент.
- Откройте файл Excel во вкладке с табличным документом или вставьте данные через буфер.
- Запустите контроль заполнения. Обработка подсветит строки, где значение не найдено или не приводится к типу.
- Только после чистого контроля запускайте загрузку.
Для реквизитов можно задать значение по умолчанию (например, одна ставка НДС на все строки) и вычисляемое выражение. Выражение пригодится, если наименование надо собрать из двух колонок.
Сохраните настройку колонок в файл. При следующей загрузке прайса той же структуры не придётся снова расставлять номера колонок.
Для запуска внешней обработки у пользователя должно быть право на интерактивное открытие внешних обработок. В БП 3.0 при открытии также сработает защита от опасных действий: платформа предупредит, что файл может быть небезопасен. Открывайте только обработки из надёжного источника.
Как считать Excel в 1С программно: чтение файла на сервере
Свою обработку пишут, когда структура файла нестандартная или загрузку нужно повторять. Ключевой приём — читать файл объектом ТабличныйДокумент. Метод Прочитать() открывает .xlsx без установленного Excel, поэтому код работает и на сервере под Linux.
Вторая техническая тонкость — где лежит файл. В клиент-серверном режиме код &НаСервере выполняется на сервере 1С, а файл лежит на компьютере пользователя. Путь C:\Users\buh\Desktop\price.xlsx сервер не видит. Файл сначала передают во временное хранилище, а на сервере записывают во временный файл.
Пример для формы документа с табличной частью «Товары» (колонки файла: артикул, наименование, количество, цена; первая строка — заголовки):
&НаКлиенте
Процедура ЗагрузитьИзExcel(Команда)
Оповещение = Новый ОписаниеОповещения("ПослеПомещенияФайла", ЭтотОбъект);
НачатьПомещениеФайла(Оповещение, , , Истина, УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ПослеПомещенияФайла(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
Если Не Результат Тогда
Возврат;
КонецЕсли;
ЗагрузитьНаСервере(Адрес);
КонецПроцедуры
&НаСервере
Процедура ЗагрузитьНаСервере(Адрес)
ДвоичныеДанные = ПолучитьИзВременногоХранилища(Адрес);
ИмяФайла = ПолучитьИмяВременногоФайла("xlsx");
ДвоичныеДанные.Записать(ИмяФайла);
ТД = Новый ТабличныйДокумент;
ТД.Прочитать(ИмяФайла);
УдалитьФайлы(ИмяФайла);
Для НомерСтроки = 2 По ТД.ВысотаТаблицы Цикл
Артикул = СокрЛП(ТД.Область(НомерСтроки, 1, НомерСтроки, 1).Текст);
Если ПустаяСтрока(Артикул) Тогда
Продолжить;
КонецЕсли;
Номенклатура = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул", Артикул);
Если Номенклатура.Пустая() Тогда
Сообщить(СтрШаблон("Строка %1: не найден артикул %2",
Формат(НомерСтроки, "ЧГ=0"), Артикул));
Продолжить;
КонецЕсли;
Количество = ВЧисло(ТД.Область(НомерСтроки, 3, НомерСтроки, 3).Текст);
Цена = ВЧисло(ТД.Область(НомерСтроки, 4, НомерСтроки, 4).Текст);
НоваяСтрока = Объект.Товары.Добавить();
НоваяСтрока.Номенклатура = Номенклатура;
НоваяСтрока.Количество = Количество;
НоваяСтрока.Цена = Цена;
НоваяСтрока.Сумма = Количество * Цена;
КонецЦикла;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ВЧисло(Знач Текст)
Текст = СтрЗаменить(Текст, Символы.НПП, "");
Текст = СтрЗаменить(Текст, " ", "");
Текст = СтрЗаменить(Текст, ",", ".");
Если ПустаяСтрока(Текст) Тогда
Возврат 0;
КонецЕсли;
Попытка
Возврат Число(Текст);
Исключение
Возврат 0;
КонецПопытки;
КонецФункции
Что здесь важно:
- 🔹
.Текствозвращает значение так, как оно отображается в Excel:1 250,50, а не1250.5. Поэтому числа проходят через функциюВЧисло(), которая убирает пробелы (обычные и неразрывные) и приводит запятую к точке. - 🔹 Номер строки в сообщение подставляется через
Формат(..., "ЧГ=0"), иначе 1С выведет1 024с разделителем разрядов. - 🔹 Ненайденный артикул не создаёт новую номенклатуру, а попадает в сообщение. Пользователь видит, что именно не загрузилось.
- 🔹 Временный файл удаляется сразу после чтения, чтобы не копить мусор на сервере.
В реальной табличной части после заполнения строки обычно нужно пересчитать НДС и сумму с НДС. В типовых конфигурациях для этого есть свои процедуры модуля формы; вызывайте их, а не дублируйте расчёт.
Другие способы чтения и когда они нужны
| Способ | Когда | Риски |
|---|---|---|
ТабличныйДокумент.Прочитать() | Основной вариант для .xlsx | Читает отображаемый текст, нужен разбор чисел и дат |
COM-объект Excel.Application | Нужно читать формулы, листы, форматы | Требует Excel на сервере, работает только под Windows, медленно на больших файлах |
ADO через провайдер Microsoft.ACE.OLEDB.12.0 | Нужно выбирать строки SQL-запросом | Требует установленного провайдера нужной разрядности |
Сохранить файл в CSV и читать ЧтениеТекста | Очень большие файлы, выгрузки из учётных систем | Кодировка и разделитель должны быть заранее согласованы |
Автоматическая загрузка Excel по расписанию
Если поставщик каждый день присылает прайс или остатки, ручной импорт быстро надоедает. Схема автоматизации выглядит так:
- Договоритесь о фиксированной структуре файла: одинаковые колонки в одном порядке, одна строка заголовков.
- Выделите папку на сервере 1С (или сетевую папку), куда файлы кладутся автоматически: почтовым правилом, скриптом или выгрузкой из другой системы.
- Оформите загрузку как дополнительную обработку с серверной командой. В БП 3.0 и УТ 11 для такой команды в карточке дополнительной обработки задаётся расписание, и она выполняется как регламентное задание.
- Обработка читает все файлы из папки, загружает их и переносит обработанные в подпапку «Архив», а файлы с ошибками — в подпапку «Ошибки».
- Итог загрузки пишите в журнал регистрации через
ЗаписьЖурналаРегистрации(), чтобы потом найти, что и когда загрузилось.
Регламентное задание работает от имени учётной записи службы сервера 1С (по умолчанию USR1CV8), а не от имени пользователя. У этой учётной записи должны быть права на чтение и запись в папку. Сетевые диски, подключённые у пользователя (Z:\), служба не видит: указывайте полный путь вида \\server\share\import.
Для файловой базы регламентные задания выполняются, только пока кто-то работает в базе. Для настоящей автоматизации нужна клиент-серверная база или отдельный сеанс, запущенный по расписанию Windows.
Ошибки при импорте Excel в 1С и что с ними делать
Отдельно про даты. Ячейка с датой через .Текст приходит строкой вида 15.03.2026. Разберите её функциями Лев(), Сред(), Прав() и соберите Дата(Год, Месяц, День). Если же в ячейке видно число вроде 46096, это порядковый номер дня в формате Excel: у ячейки слетел формат даты. Поставьте формат даты в Excel и сохраните файл заново.