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