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