Как разово загрузить сложные данные из Excel в справочник 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Разовая загрузка данных из внешних файлов Excel в информационные базы 1С — одна из самых частых задач, с которой сталкиваются как начинающие разработчики, так и опытные специалисты. Ситуация усложняется, когда целевой справочник имеет нетривиальную структуру: содержит подчиненные справочники, табличные части, обязательные связи по владельцам или требует сложной логики сопоставления дублей. В таких случаях стандартные решения могут показаться бесполезными, а написание собственного кода с нуля — слишком трудоемким процессом.

В этой статье мы подробно разберем несколько эффективных подходов к решению этой задачи. Мы пройдем путь от раскрытия скрытого потенциала стандартных инструментов до написания оптимизированных алгоритмов на встроенном языке 1С. Рассмотрим преимущества и недостатки каждого метода, чтобы вы смогли выбрать наиболее быстрое и качественное решение.

Вариант 1. Использование скрытых возможностей стандартной обработки «Загрузка данных из табличного документа»

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

Выясним, как использовать этот механизм для загрузки в сложные структуры данных:

  1. Режим вычисления выражений. В настройках сопоставления полей для любого реквизита справочника мы можем переключить режим получения данных в положение «Вычислять». Это позволяет написать произвольный код на встроенном языке 1С для заполнения конкретной колонки. В контексте выполнения этого кода нам доступны предопределенные переменные:
    • ТекстЯчейки — строковое представление текущей обрабатываемой ячейки файла Excel.
    • ТекстыЯчеек — массив, содержащий значения всех ячеек текущей строки.
    • ТекущиеДанные — структура, в которой хранятся уже считанные и сопоставленные значения для текущего объекта.
    • Результат — переменная, в которую мы обязаны записать итоговое значение, предназначенное для записи в реквизит.
  2. События при загрузке. На вкладке настроек событий мы можем использовать обработчики, такие как ПередЗаписьюОбъекта или ПриЗаписиОбъекта. Здесь мы можем написать полноценный алгоритм: открыть транзакцию, создать или найти элементы в связанных справочниках, заполнить подчиненные структуры или табличные части, которые невозможно связать напрямую через сопоставление колонок.

Рассмотрим пример. Допустим, нам необходимо при загрузке номенклатуры динамически находить или создавать элемент справочника Контрагенты (производителя) по его ИНН, указанному в Excel. Для реквизита "Производитель" мы можем прописать следующее выражение:


НайденныйКонтрагент = Справочники.Контрагенты.НайтиПоРеквизиту("ИНН", ТекстЯчейки);
Если ЗначениеЗаполнено(НайденныйКонтрагент) Тогда
    Результат = НайденныйКонтрагент;
Иначе
    НовыйКонтрагент = Справочники.Контрагенты.СоздатьЭлемент();
    НовыйКонтрагент.Наименование = "Новый контрагент (создан автоматически)";
    НовыйКонтрагент.ИНН = ТекстЯчейки;
    НовыйКонтрагент.Записать();
    Результат = НовыйКонтрагент.Ссылка;
КонецЕсли;

Использование этого метода экономит огромное количество времени, избавляя нас от необходимости проектировать интерфейс выбора файла, обрабатывать чтение таблиц и программировать прогресс-бар загрузки.

Вариант 2. Программное чтение файла с помощью встроенного объекта «ТабличныйДокумент»

Если логика загрузки настолько специфична, что использовать стандартную обработку невозможно, или требуется реализовать жесткий контроль ошибок с выводом подробного лога пользователю, мы пишем собственную обработку. Самый надежный, быстрый и кроссплатформенный способ прочитать файл формата .xls или .xlsx — использовать встроенный в платформу объект ТабличныйДокумент.

Этот способ примечателен тем, что он работает полностью на стороне сервера 1С, не требует установленного на компьютере пакета Microsoft Office (что критически важно для серверов под управлением Linux) и работает на порядок быстрее устаревшего COM-соединения.

Разберем по шагам базовый алгоритм программного обхода строк файла Excel с помощью табличного документа:


ПутьКФайлу = "C:\Upload\DataFile.xlsx";
ТабДок = Новый ТабличныйДокумент;

Попытка
    // Используем способ чтения "Значение" для корректного получения типов данных (числа, даты)
    ТабДок.Прочитать(ПутьКФайлу, СпособЧтенияЗначенийТабличногоДокумента.Значение);
Исключение
    ВызватьИсключение "Не удалось прочитать файл! Ошибка: " + ОписаниеОшибки();
КонецПопытки;

ВсегоСтрок = ТабДок.ВысотаТаблицы;

// Начинаем обход со второй строки, предполагая, что первая строка — это шапка таблицы
Для НомерСтроки = 2 По ВсегоСтрок Цикл
    
    // Получаем значение ключевой ячейки (например, артикул или код в первой колонке)
    Артикул = ТабДок.Область(НомерСтроки, 1, НомерСтроки, 1).Текст;
    
    Если Не ЗначениеЗаполнено(Артикул) Тогда
        Продолжить; // Пропускаем пустые строки
    КонецЕсли;
    
    // Читаем остальные реквизиты
    Наименование = ТабДок.Область(НомерСтроки, 2, НомерСтроки, 2).Текст;
    Цена = Число(ТабДок.Область(НомерСтроки, 3, НомерСтроки, 3).Текст);
    
    // Выполняем создание или обновление элемента справочника
    НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();
    НовыйЭлемент.Наименование = Наименование;
    НовыйЭлемент.Артикул = Артикул;
    
    // Пример заполнения реквизита через поиск родительской группы
    ГруппаНоменклатуры = Справочники.Номенклатура.НайтиПоНаименованию("Импортные товары", Истина);
    НовыйЭлемент.Родитель = ГруппаНоменклатуры;
    
    Попытка
        НовыйЭлемент.Записать();
    Исключение
        ЗаписьЖурналаРегистрации("ЗагрузкаДанных", УровеньЖурналаРегистрации.Ошибка,,, 
            "Ошибка записи строки " + НомерСтроки + ": " + ОписаниеОшибки());
    КонецПопытки;
    
КонецЦикла;

Этот простой шаблон можно легко модифицировать под требования вашей задачи. Однако помните, что обращение к каждой ячейке через метод Область() при обработке файлов объемом более 10 000 строк может выполняться относительно медленно.

Вариант 3. Сверхбыстрая выгрузка Excel в Таблицу Значений через Построитель Запроса

Проанализируем продвинутый и очень изящный способ моментальной конвертации табличного документа в стандартный объект 1С — ТаблицаЗначений. Для этого мы задействуем системный механизм платформы — ПостроительЗапроса.

Этот метод позволяет прочитать весь лист Excel целиком за доли секунды и представить его в виде таблицы значений, с которой чрезвычайно удобно работать методами платформы (делать отборы, сортировки, сворачивать данные или обходить циклом без обращений к ячейкам макета).

Посмотрим на пример реализации этого метода:


ПутьКФайлу = "C:\Upload\DataFile.xlsx";
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(ПутьКФайлу, СпособЧтенияЗначенийТабличногоДокумента.Значение);

// Инициализируем построитель запроса
Построитель = Новый ПостроительЗапроса;

// Задаем область табличного документа в качестве источника данных
Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабДок.Область());
Построитель.ДобавлениеПредставлений = ТипДобавленияПредставлений.НеДобавлять;

// Заполняем настройки и выполняем построение
Построитель.ЗаполнитьНастройки();
Построитель.Выполнить();

// Выгружаем результат в классическую Таблицу Значений 1С
ТаблицаДанных = Построитель.Результат.Выгрузить();

// Теперь мы можем быстро обойти готовую таблицу значений в памяти
Для Каждого СтрокаДанных Из ТаблицаДанных Цикл
    // Имена колонок сформируются автоматически на основе первой строки файла (шапки)
    // или будут названы по шаблону "Колонка1", "Колонка2" и т.д.
    Если ЗначениеЗаполнено(СтрокаДанных.Колонка1) Тогда
        // Наш алгоритм заполнения реквизитов справочника
    КонецЕсли;
КонецЦикла;

Важное примечание: При использовании этого метода построитель запроса по умолчанию определяет типы данных всех колонок как строковые. Если вам необходимо проводить математические операции или записывать даты, выполняйте явное приведение типов (например, с помощью функций Число() или Дата()) в процессе обработки строк.

Практические советы по оптимизации загрузки в сложные справочники

Когда мы разрабатываем загрузчик данных для сложного справочника, скорость работы алгоритма и целостность базы данных выходят на первый план. Рассмотрим несколько ключевых правил, которые уберегут вас от критических ошибок и ускорят процесс загрузки в десятки раз:

Мы проанализировали основные и наиболее эффективные сценарии загрузки сложных структур из табличных документов Excel в информационные базы на платформе 1С:Предприятие. Выбор конкретного подхода зависит от архитектурных ограничений вашей задачи и объема загружаемых данных. Используйте встроенные механизмы с умом, оптимизируйте код и всегда тестируйте алгоритмы загрузки на копиях баз данных перед переносом информации в рабочие контуры.

← На главную