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

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

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

Подготовка файла и выбор способа чтения

Первым делом рассмотрим, как правильно получить доступ к данным Excel-файла. В платформе 1С наиболее простым способом для небольших объемов данных является использование объекта ТабличныйДокумент. Этот метод позволяет считать содержимое листа в табличный формат, с которым удобно работать программно.

Важно помнить, что перед чтением файла необходимо получить его адрес во временном хранилище с помощью метода НачатьПомещениеФайла на стороне клиента. Это обеспечивает корректную работу в клиент-серверном варианте базы.


// Пример выбора файла на клиенте
&НаКлиенте
Процедура ПутьКФайлуНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    Оповещение = Новый ОписаниеОповещения("ОбработатьВыборФайла", ЭтотОбъект);
    НачатьПомещениеФайла(Оповещение, , , Истина, УникальныйИдентификатор);
КонецПроцедуры

Программный разбор данных и поиск элементов

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

Разберем логику поиска и создания элементов справочника. Мы используем метод НайтиПоНаименованию для проверки наличия записи. Если результат поиска возвращает ПустаяСсылка, мы создаем новый элемент.


Процедура СформироватьНаСервере(ПутьКФайлу)
    ТабДок = Новый ТабличныйДокумент;
    ТабДок.Прочитать(ПутьКФайлу, СпособЧтенияЗначенийТабличногоДокумента.Значение);
    
    // Получаем данные из листа Excel
    Построитель = Новый ПостроительЗапроса;
    Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабДок.Область("Sheet1"));
    Построитель.Выполнить();
    ТабЗнач = Построитель.Результат.Выгрузить();
    
    Для каждого СтрокаТЗ Из ТабЗнач Цикл
        // Проверяем наличие основной детали
        Запрос = Новый Запрос("ВЫБРАТЬ Ссылка ИЗ Справочник.Детали ГДЕ Наименование = &Наименование");
        Запрос.УстановитьПараметр("Наименование", СтрокаТЗ.Наименование);
        
        Если Запрос.Выполнить().Пустой() Тогда
            // Создаем, если не найдено
            Деталь = Справочники.Детали.СоздатьЭлемент();
            Деталь.Наименование = СтрокаТЗ.Наименование;
            // Заполняем остальные реквизиты
            Деталь.Артикул = СтрокаТЗ.Артикул;
            Деталь.Цена = СтрокаТЗ.Цена;
            Деталь.Записать();
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Почему реквизиты остаются пустыми и как это исправить?

Если после выполнения кода вы видите пустые поля, обратите внимание на следующие моменты:

  1. Очистка строк: Excel часто добавляет невидимые символы переноса или пробелы. Всегда используйте функцию СокрЛП() перед тем, как присвоить значение реквизиту объекта. Например: Деталь.Наименование = СокрЛП(СтрокаТЗ.Наименование);.
  2. Типизация данных: При чтении через ТабличныйДокумент Excel может передавать числовые значения как строковые. Если реквизит имеет тип Число, используйте приведение типа: Деталь.Цена = Число(СтрокаТЗ.Цена);.
  3. Поиск ссылочных типов: Когда вы заполняете реквизит, который является ссылкой на другой справочник (например, ЕдиницаИзмерения), убедитесь, что вы сначала находите или создаете этот объект, и только потом записываете его ссылку в основной справочник.

Рекомендации по надежности

Для создания по-настоящему профессионального решения придерживайтесь этих правил:

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

← На главную