Импорт таблицы Excel в 1С 8.3: от штатной кнопки до своей обработки

· 9 мин

Содержание

Для большинства задач обработку загрузки из 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

Штатный механизм есть в двух местах: в списке справочника и в табличной части документа.

Загрузка в справочник

  1. Откройте Справочники → Товары и услуги → Номенклатура.
  2. Нажмите кнопку «Загрузить» в командной панели списка. В некоторых релизах она спрятана в меню «Ещё».
  3. В открывшейся таблице-шаблоне скопируйте данные из Excel через буфер обмена или выберите файл командой загрузки из файла.
  4. На шаге сопоставления укажите, какая колонка что означает, и по какому полю искать существующие позиции.
  5. Просмотрите результат. Строки, для которых 1С нашла элемент, обновят его. Ненайденные можно создать как новые.
  6. Завершите загрузку и откройте пару карточек выборочно.

Так же работают списки контрагентов и некоторых других справочников. Если кнопки «Загрузить» в нужном списке нет, этот объект штатно из файла не грузится.

Загрузка в табличную часть документа

Документы «Поступление (акты, накладные, УПД)», «Реализация», «Требование-накладная», документы ввода остатков имеют над табличной частью «Товары» такую же команду загрузки. Порядок тот же: вставили таблицу, сопоставили колонки, проверили найденные позиции.

Главное отличие — номенклатура в документе должна уже существовать. Ненайденные строки 1С подсветит и предложит выбрать позицию вручную или создать новую.

Перед первой массовой загрузкой в рабочую базу сделайте резервную копию: Администрирование → Обслуживание → Резервное копирование и восстановление или выгрузку .dt через Конфигуратор. Отменить загрузку 800 карточек одной кнопкой нельзя.

Перенос через Универсальный обмен данными: когда Excel — лишь часть цепочки

Универсальный обмен данными в формате XML (обработка V8Exchan83.epf) работает с XML-файлами по правилам обмена, а не с таблицами Excel. Поэтому напрямую загрузить через него .xlsx не получится.

УОД полезен в связке, когда данные нужно перенести между двумя базами 1С с разными конфигурациями:

  1. Таблицу Excel загружают во вспомогательную базу, где загрузка проще: например, типовую конфигурацию со встроенной загрузкой или пустую базу с самописной обработкой.
  2. В программе «Конвертация данных» описывают правила: какой объект источника в какой объект приёмника переходит и как сопоставляются поля.
  3. В базе-источнике обработкой УОД выгружают данные в XML по этим правилам.
  4. В базе-приёмнике той же обработкой загружают XML.

Этот путь оправдан при переходе с самописной базы на типовую или при переносе тысяч связанных объектов: номенклатура, контрагенты, договоры, документы. Для одного прайса он избыточен — используйте встроенную загрузку или обработку из следующего раздела.

СпособКогда подходитРиски
Кнопка «Загрузить» в списке или документеРазовая загрузка справочника или строк документаТолько объекты, где кнопка есть
Внешняя обработкаНестандартный файл, регулярная загрузка, создание связанных объектовОшибка в коде портит данные массово
Цепочка Excel → база → УОДПеренос между разными конфигурациямиДолгая настройка правил конвертации

Как создать внешнюю обработку загрузки из Excel

Внешняя обработка — файл .epf, который открывают через Файл → Открыть без изменения конфигурации. Создают её в Конфигураторе: Файл → Новый → Внешняя обработка.

Каркас обработки

  1. Создайте внешнюю обработку, задайте имя, например ЗагрузкаПрайсаИзExcel.
  2. Добавьте управляемую форму.
  3. Добавьте команду формы Загрузить и перетащите её на форму кнопкой. Реквизит для пути к файлу не нужен: файл передаётся через временное хранилище.
  4. Вставьте код ниже в модуль формы и сохраните файл .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. Код загрузки переносят из модуля формы в модуль объекта — по расписанию форма не открывается.
  2. Файл должен лежать по пути, доступному серверу 1С: в сетевой папке с правами для пользователя, от которого работает служба. Путь вида C:\Users\Бухгалтер\Desktop с сервера не виден.
  3. Обработанный файл переносите в архивную папку, иначе следующий запуск загрузит его повторно.
  4. Ошибки пишите в журнал регистрации методом ЗаписьЖурналаРегистрации() — сообщения пользователю при фоновом запуске никто не увидит.

Запуск из командной строки

Для файловой базы без БСП подходит планировщик заданий Windows. Он запускает 1С с параметром /Execute, который открывает указанную внешнюю обработку сразу после входа:

"C:\Program Files\1cv8\common\1cestart.exe" ENTERPRISE /F "D:\Bases\Buh" /N "Загрузка" /P "пароль" /Execute "D:\Obrabotki\ZagruzkaPrajsa.epf" /DisableStartupMessages

Обработка в этом случае должна запускать загрузку из обработчика ПриОткрытии формы и завершать сеанс после работы. Для запуска заведите отдельного пользователя с минимальными правами: пароль хранится в тексте задания.

Не назначайте загрузку на рабочее время. Массовая запись сотен объектов замедляет работу пользователей файловой базы.

Частые вопросы

Нужен ли установленный Excel на компьютере для загрузки?
Нет. Метод ТабличныйДокумент.Прочитать() и встроенная загрузка читают .xlsx средствами платформы. Excel нужен только при старом способе через COM-объект Excel.Application.
Можно ли загрузить CSV вместо Excel?
Да. CSV читают как текстовый файл и делят строки по разделителю функцией СтрРазделить(). Проверьте кодировку: файл из Excel часто сохраняется в Windows-1251, а не в UTF-8.
Как загрузить сразу несколько документов из одного файла?
Добавьте в файл колонку с номером или датой документа. Обработка группирует строки по этой колонке и создаёт по документу на группу. Штатная кнопка загружает строки только в один открытый документ.
Подойдёт ли обработка, написанная для другой конфигурации?
Только после проверки. Имена справочников и реквизитов у БП, УТ и самописных баз разные, и код с чужими именами выдаст ошибку при обращении к объекту.
Как откатить неудачную загрузку?
Восстановить базу из резервной копии, сделанной перед загрузкой. Если копии нет, новые элементы находят по списку артикулов из файла, помечают на удаление и удаляют через удаление помеченных объектов. Обновлённые карточки так не вернуть, поэтому копия перед загрузкой обязательна.