Импорт таблицы Excel в 1С 8.3: от штатной кнопки до своей обработки
Содержание
Для большинства задач обработку загрузки из Excel в 1С писать не нужно. В 1С:Бухгалтерии 3.0 и других конфигурациях на БСП списки справочников и табличные части документов умеют принимать данные из файла: кнопка «Загрузить» открывает окно, куда вставляют таблицу и сопоставляют колонки. Свою внешнюю обработку пишут, когда загрузка повторяется, когда нужно создавать связанные объекты или когда файл приходит в нестандартном виде.
Типичная ситуация: поставщик прислал прайс на 800 позиций, и его нужно превратить в карточки номенклатуры с ценами. Руками это два дня работы. Импорт данных из Excel занимает 10 минут, если файл подготовлен и поля сопоставлены правильно.
Подготовка таблицы Excel перед загрузкой в 1С
Половина проблем при импорте возникает до того, как файл попал в 1С. Программа читает ячейки буквально: лишний пробел в артикуле — это уже другой артикул, а объединённая ячейка — пустая строка.
Приведите файл к такому виду:
- 📄 Одна строка заголовков, сразу над данными. Шапку прайса с логотипом и реквизитами поставщика удалите.
- 🧱 Без объединённых ячеек. Снимите объединение по всему листу и заполните пустоты значениями.
- 🔢 Числа — числами. Цена «1 250,00 руб.» должна стать
1250. Пробелы-разделители тысяч и слово «руб.» мешают распознаванию. - 🧮 Формулы — в значения. Скопируйте лист и вставьте через «Специальная вставка → Значения».
- 🔑 Уникальный ключ. Колонка, по которой 1С будет искать существующий объект: артикул, ИНН, табельный номер. Дубли ключа уберите заранее.
- 📑 Один лист. Оставьте данные на первом листе, остальные удалите.
- 💾 Формат
.xlsx. Старый.xlsтоже читается, но с.xlsxсюрпризов меньше.
Отдельно проверьте справочники-значения: единицы измерения, ставки НДС, группы. В файле они должны совпадать с тем, как записаны в 1С. «шт», «шт.» и «штука» для программы три разных значения.
Удобно сразу составить карту полей — какая колонка файла в какой реквизит 1С попадёт:
Перед загрузкой отсортируйте файл по ключевой колонке и включите фильтр. Пустые ключи и дубли видно сразу.
Встроенная загрузка данных из Excel в 1С:Бухгалтерию 3.0
Штатный механизм есть в двух местах: в списке справочника и в табличной части документа.
Загрузка в справочник
- Откройте
Справочники → Товары и услуги → Номенклатура. - Нажмите кнопку «Загрузить» в командной панели списка. В некоторых релизах она спрятана в меню «Ещё».
- В открывшейся таблице-шаблоне скопируйте данные из Excel через буфер обмена или выберите файл командой загрузки из файла.
- На шаге сопоставления укажите, какая колонка что означает, и по какому полю искать существующие позиции.
- Просмотрите результат. Строки, для которых 1С нашла элемент, обновят его. Ненайденные можно создать как новые.
- Завершите загрузку и откройте пару карточек выборочно.
Так же работают списки контрагентов и некоторых других справочников. Если кнопки «Загрузить» в нужном списке нет, этот объект штатно из файла не грузится.
Загрузка в табличную часть документа
Документы «Поступление (акты, накладные, УПД)», «Реализация», «Требование-накладная», документы ввода остатков имеют над табличной частью «Товары» такую же команду загрузки. Порядок тот же: вставили таблицу, сопоставили колонки, проверили найденные позиции.
Главное отличие — номенклатура в документе должна уже существовать. Ненайденные строки 1С подсветит и предложит выбрать позицию вручную или создать новую.
Перед первой массовой загрузкой в рабочую базу сделайте резервную копию: Администрирование → Обслуживание → Резервное копирование и восстановление или выгрузку .dt через Конфигуратор. Отменить загрузку 800 карточек одной кнопкой нельзя.
Перенос через Универсальный обмен данными: когда Excel — лишь часть цепочки
Универсальный обмен данными в формате XML (обработка V8Exchan83.epf) работает с XML-файлами по правилам обмена, а не с таблицами Excel. Поэтому напрямую загрузить через него .xlsx не получится.
УОД полезен в связке, когда данные нужно перенести между двумя базами 1С с разными конфигурациями:
- Таблицу Excel загружают во вспомогательную базу, где загрузка проще: например, типовую конфигурацию со встроенной загрузкой или пустую базу с самописной обработкой.
- В программе «Конвертация данных» описывают правила: какой объект источника в какой объект приёмника переходит и как сопоставляются поля.
- В базе-источнике обработкой УОД выгружают данные в XML по этим правилам.
- В базе-приёмнике той же обработкой загружают XML.
Этот путь оправдан при переходе с самописной базы на типовую или при переносе тысяч связанных объектов: номенклатура, контрагенты, договоры, документы. Для одного прайса он избыточен — используйте встроенную загрузку или обработку из следующего раздела.
| Способ | Когда подходит | Риски |
|---|---|---|
| Кнопка «Загрузить» в списке или документе | Разовая загрузка справочника или строк документа | Только объекты, где кнопка есть |
| Внешняя обработка | Нестандартный файл, регулярная загрузка, создание связанных объектов | Ошибка в коде портит данные массово |
| Цепочка Excel → база → УОД | Перенос между разными конфигурациями | Долгая настройка правил конвертации |
Как создать внешнюю обработку загрузки из Excel
Внешняя обработка — файл .epf, который открывают через Файл → Открыть без изменения конфигурации. Создают её в Конфигураторе: Файл → Новый → Внешняя обработка.
Каркас обработки
- Создайте внешнюю обработку, задайте имя, например
ЗагрузкаПрайсаИзExcel. - Добавьте управляемую форму.
- Добавьте команду формы
Загрузитьи перетащите её на форму кнопкой. Реквизит для пути к файлу не нужен: файл передаётся через временное хранилище. - Вставьте код ниже в модуль формы и сохраните файл
.epf.
Файл читается методом ТабличныйДокумент.Прочитать(). Он понимает .xlsx без установленного Excel, поэтому работает и на сервере, и в веб-клиенте. Сам файл пользователь передаёт с компьютера во временное хранилище, а читается он на сервере.
&НаКлиенте
Процедура Загрузить(Команда)
Оповещение = Новый ОписаниеОповещения("ПослеПомещенияФайла", ЭтотОбъект);
НачатьПомещениеФайла(Оповещение, , , Истина, УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ПослеПомещенияФайла(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
Если Не Результат Тогда
Возврат;
КонецЕсли;
ЗагрузитьНаСервере(Адрес);
КонецПроцедуры
&НаСервере
Процедура ЗагрузитьНаСервере(Адрес)
ВременныйФайл = ПолучитьИмяВременногоФайла("xlsx");
ПолучитьИзВременногоХранилища(Адрес).Записать(ВременныйФайл);
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(ВременныйФайл, СпособЧтенияЗначенийТабличногоДокумента.Значение);
УдалитьФайлы(ВременныйФайл);
Создано = 0;
Обновлено = 0;
// Строка 1 — заголовки. Колонки: 1 Артикул, 2 Наименование, 3 Цена
Для НомерСтроки = 2 По ТабДок.ВысотаТаблицы Цикл
Артикул = СокрЛП(ТабДок.Область(НомерСтроки, 1, НомерСтроки, 1).Текст);
Наименование = СокрЛП(ТабДок.Область(НомерСтроки, 2, НомерСтроки, 2).Текст);
Цена = ВЧисло(ТабДок.Область(НомерСтроки, 3, НомерСтроки, 3).Текст);
Если ПустаяСтрока(Артикул) Тогда
Продолжить;
КонецЕсли;
Ссылка = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул", Артикул);
Если Ссылка.Пустая() Тогда
Элемент = Справочники.Номенклатура.СоздатьЭлемент();
Элемент.Заполнить(Неопределено);
Элемент.Артикул = Артикул;
Новый_ = Истина;
Иначе
Элемент = Ссылка.ПолучитьОбъект();
Новый_ = Ложь;
КонецЕсли;
Элемент.Наименование = Наименование;
Если Не Элемент.ПроверитьЗаполнение() Тогда
Сообщить(СтрШаблон("Строка %1: не заполнены обязательные поля", Формат(НомерСтроки, "ЧГ=0")));
Продолжить;
КонецЕсли;
Элемент.Записать();
Если Новый_ Тогда
Создано = Создано + 1;
Иначе
Обновлено = Обновлено + 1;
КонецЕсли;
// Цену из переменной Цена записывают документом установки цен — см. ниже
КонецЦикла;
Сообщить(СтрШаблон("Создано: %1, обновлено: %2", Формат(Создано, "ЧГ=0"), Формат(Обновлено, "ЧГ=0")));
КонецПроцедуры
&НаСервере
Функция ВЧисло(Знач Текст)
Текст = СтрЗаменить(СокрЛП(Текст), " ", "");
Текст = СтрЗаменить(Текст, Символы.НПП, "");
Текст = СтрЗаменить(Текст, ",", ".");
Попытка
Возврат Число(Текст);
Исключение
Возврат 0;
КонецПопытки;
КонецФункции
Что важно в этом коде
- 🔎 Поиск по ключу.
НайтиПоРеквизитувозвращает первый найденный элемент. Если в базе есть дубли артикула, обновится только один — чистите дубли до загрузки. - 🧩 Заполнение по умолчанию.
Заполнить(Неопределено)подставляет значения, которые конфигурация ставит в новый элемент сама. Обязательные реквизиты, которых нет в файле (вид номенклатуры, единица), лучше задать на форме обработки и присваивать каждой новой позиции. - ✅ Проверка перед записью.
ПроверитьЗаполнение()не даёт записать неполную карточку и выводит сообщение по строке. - 💰 Цены отдельно. Цена в БП хранится не в карточке, а в регистре цен номенклатуры, который заполняет документ установки цен. Обработка может создать такой документ и добавить строки, но для начала проще загрузить цены в табличную часть этого документа штатной кнопкой.
Сначала прогоните обработку на копии базы. Ошибка в номере колонки перезапишет наименования у всех позиций сразу.
Для выбора конкретного листа и проверки файла до записи добавьте на форму табличное поле типа «Табличный документ» и выводите в него прочитанный ТабДок. Пользователь увидит, что именно загрузится.
Ошибки при импорте данных из Excel и что с ними делать
Автоматическая загрузка из Excel по расписанию
Если файл приходит каждый день, ручной запуск обработки быстро надоедает. Есть два рабочих варианта.
Дополнительная обработка с расписанием
В конфигурациях на БСП внешнюю обработку можно зарегистрировать как дополнительную: Администрирование → Печатные формы, отчеты и обработки → Дополнительные отчеты и обработки. Для этого в модуле объекта обработки нужна экспортная функция СведенияОВнешнейОбработке() с описанием вида и команд. Команде с типом вызова серверного метода затем назначают расписание прямо в карточке дополнительной обработки.
Что учесть:
- Код загрузки переносят из модуля формы в модуль объекта — по расписанию форма не открывается.
- Файл должен лежать по пути, доступному серверу 1С: в сетевой папке с правами для пользователя, от которого работает служба. Путь вида
C:\Users\Бухгалтер\Desktopс сервера не виден. - Обработанный файл переносите в архивную папку, иначе следующий запуск загрузит его повторно.
- Ошибки пишите в журнал регистрации методом
ЗаписьЖурналаРегистрации()— сообщения пользователю при фоновом запуске никто не увидит.
Запуск из командной строки
Для файловой базы без БСП подходит планировщик заданий Windows. Он запускает 1С с параметром /Execute, который открывает указанную внешнюю обработку сразу после входа:
"C:\Program Files\1cv8\common\1cestart.exe" ENTERPRISE /F "D:\Bases\Buh" /N "Загрузка" /P "пароль" /Execute "D:\Obrabotki\ZagruzkaPrajsa.epf" /DisableStartupMessages
Обработка в этом случае должна запускать загрузку из обработчика ПриОткрытии формы и завершать сеанс после работы. Для запуска заведите отдельного пользователя с минимальными правами: пароль хранится в тексте задания.
Не назначайте загрузку на рабочее время. Массовая запись сотен объектов замедляет работу пользователей файловой базы.