Как правильно загрузить номенклатуру из Excel в 1С и заполнить артикул: разбираем ошибки и оптимизируем код

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

Загрузка данных из внешних файлов, таких как Excel, — одна из самых частых задач программиста 1С. Несмотря на кажущуюся простоту, новички часто сталкиваются с классическими проблемами: попыткой записать данные в «ссылку» вместо «объекта» или случайным обращением к реквизитам групп (папок), у которых нет артикула. В этой статье мы подробно разберем, как построить надежный алгоритм загрузки, проанализируем типичные ошибки и дополним решение важными нюансами для профессиональной работы.

Разбор основной проблемы: Ссылка vs Объект

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

Рассмотрим правильный подход: если элемент найден, нам необходимо получить его Объект. Только объектная сущность позволяет изменять данные и сохранять их в базу. Если же элемент не найден, мы создаем новый объект с нуля.

Посмотрим на пример правильной структуры кода:


// Сначала ищем номенклатуру по наименованию
НоменклатураСсылка = Справочники.Номенклатура.НайтиПоНаименованию(Наименование, Истина);

Если НоменклатураСсылка.Пустая() Тогда
    // Если не нашли — создаем новый элемент
    НоменклатураОбъект = Справочники.Номенклатура.СоздатьЭлемент();
Иначе
    // Если нашли — получаем объект для редактирования
    НоменклатураОбъект = НоменклатураСсылка.ПолучитьОбъект();
КонецЕсли;

// Теперь у нас в переменной НоменклатураОбъект всегда объект, готовый к записи
НоменклатураОбъект.Наименование = Наименование;
НоменклатураОбъект.Артикул = СтрокаДанных.ITEMNO;
// Устанавливаем родительскую папку
НоменклатураОбъект.Родитель = СоздатьГруппу(СтрокаДанных); 
НоменклатураОбъект.Записать();

Ошибка «Реквизит недоступен для группы»

Выясним причину еще одной популярной ошибки. В 1С справочник «Номенклатура» обычно является иерархическим. Это значит, что в нем есть Элементы (сами товары) и Группы (папки). У групп нет реквизита Артикул — это логично, так как артикул принадлежит конкретному товару, а не категории.

Если в вашем файле Excel в колонке наименований встречаются названия, которые уже заняты группами в 1С, метод НайтиПоНаименованию вернет ссылку на группу. Попытка записать в нее артикул приведет к падению программы. Чтобы этого избежать, добавим проверку на тип объекта:


Если Не НоменклатураСсылка.Пустая() Тогда
    // Проверяем, не является ли найденный объект группой
    Если НоменклатураСсылка.ЭтоГруппа Тогда
        Сообщить("Ошибка: Найдена группа с таким наименованием: " + Наименование);
        Продолжить; // Пропускаем эту строку файла
    КонецЕсли;
    
    НоменклатураОбъект = НоменклатураСсылка.ПолучитьОбъект();
    // ... заполнение реквизитов
КонецЕсли;

Работа с иерархией: программное создание папок

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

Рассмотрим алгоритм функции СоздатьГруппу, которая должна возвращать ссылку на папку:


Функция СоздатьГруппу(СтрокаДанных)
    ИмяПапки = СтрокаДанных.GENDER; // Например, делим по гендерному признаку
    ГруппаСсылка = Справочники.Номенклатура.НайтиПоНаименованию(ИмяПапки, Истина);
    
    Если ГруппаСсылка.Пустая() Тогда
        НоваяГруппа = Справочники.Номенклатура.СоздатьГруппу();
        НоваяГруппа.Наименование = ИмяПапки;
        НоваяГруппа.Записать();
        Возврат НоваяГруппа.Ссылка;
    Иначе
        Возврат ГруппаСсылка;
    КонецЕсли;
КонецФункции

Важный момент: если в справочнике могут быть папки с одинаковыми именами в разных ветках (например, папка «Обувь» в «Мужское» и в «Женское»), поиск только по наименованию может вернуть не ту папку. В таких случаях в метод НайтиПоНаименованию вторым параметром нужно передавать родителя.

Оптимизация и «подводные камни» загрузки из Excel

Проанализируем технические нюансы, которые часто остаются за рамками обсуждения на форумах, но критически важны в реальной эксплуатации:

  1. Типизация данных Excel: Артикулы в Excel часто содержат ведущие нули (например, 00123). При чтении через COM-объект 1С может интерпретировать это как число 123. Всегда используйте СокрЛП(Строка(Значение)) для обработки данных из ячеек.
  2. Скорость работы: Поиск в цикле НайтиПоНаименованию — очень тяжелая операция для базы данных. Если в файле 10 000 строк, загрузка может затянуться на часы. Рекомендуем предварительно выгрузить все артикулы и ссылки из 1С в Соответствие или индексированную ТаблицуЗначений и искать совпадения в оперативной памяти.
  3. Транзакции: Оборачивайте цикл загрузки в блок транзакции. Если на 99-й строке произойдет ошибка, 1С откатит изменения, и у вас не останется «мусора» из частично загруженных данных.
  4. Обязательные реквизиты: Для полноценной работы номенклатуры в типовых конфигурациях (УТ 11, БП 3.0) недостаточно заполнить только имя и артикул. Проверьте заполнение Вида номенклатуры, Единицы измерения и Ставки НДС.

Использование Табличного документа для чтения XLSX

Современным и быстрым способом чтения файлов Excel в 1С 8.3 является использование объекта ТабличныйДокумент. Это работает стабильнее, чем Excel.Application, и не требует наличия установленного Microsoft Office на сервере.


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

Для НомерСтроки = 2 По ТабДок.ВысотаТаблицы Цикл
    АртикулИзФайла = ТабДок.Область(НомерСтроки, 1).Текст; // Колонка 1 - Артикул
    // Далее следует логика поиска и создания объекта
КонецЦикла;

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

← На главную