Как загрузить номенклатуру из Excel в 1С 8.2 и исправить ошибку «Несоответствие типов» в СрезПоследних?

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

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

Разбор технической ошибки в запросе

Проанализируем ситуацию, описанную в сообщении №14. При выполнении обработки система выдала ошибку: «Ошибка обработки представления РегистрСведений.ЦеныНоменклатуры.СрезПоследних: Несоответствие типов (Параметр номер "1")». Это классическая проблема, возникающая при работе с виртуальными таблицами в 1С.

Выясним причину. Первым параметром виртуальной таблицы СрезПоследних является Период. Система ожидает здесь значение типа Дата. Ошибка возникает в следующих случаях:

  1. В параметр передается пустая ссылка или значение Неопределено.
  2. Дата считывается из ячейки Excel как строка (например, "01.01.2023") и не преобразуется в формат даты 1С.
  3. В коде запроса параметр просто не был инициализирован перед вызовом метода УстановитьПараметр().

Чтобы избежать подобных проблем, рассмотрим пример правильной установки параметров запроса:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ЦеныНоменклатурыСрезПоследних.Цена КАК Цена
    |ИЗ
    |	РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, Номенклатура = &Номенклатура) КАК ЦеныНоменклатурыСрезПоследних";

// Обязательная проверка и приведение типа
Если ТипЗнч(ДатаИзФайла) <> Тип("Дата") Тогда
    Попытка
        ПараметрПериод = Дата(ДатаИзФайла);
    Исключение
        ПараметрПериод = ТекущаяДата(); // Значение по умолчанию
    КонецПопытки;
Иначе
    ПараметрПериод = ДатаИзФайла;
КонецЕсли;

Запрос.УстановитьПараметр("Период", ПараметрПериод);
Запрос.УстановитьПараметр("Номенклатура", СсылкаНаТовар);
Результат = Запрос.Выполнить();

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

Если нам нужно быстро перебросить данные без написания кода, рассмотрим штатный инструмент от фирмы 1С. Для платформы 8.2 в обычных формах эта обработка является незаменимой. Она позволяет сопоставлять колонки файла с реквизитами справочника в визуальном режиме.

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

  1. Выбор объекта: В поле «Ссылка» выбираем справочник Номенклатура.
  2. Настройка колонок: Указываем, какой номер колонки из Excel соответствует реквизитам Наименование, Артикул и ПолноеНаименование.
  3. Поля поиска: Это критически важный момент. Чтобы не создать дубликаты, отметим галочкой «Поле поиска» для Артикула или Штрихкода. Если программа найдет товар с таким кодом, она обновит существующий, а не создаст новый.
  4. Создание новых элементов: Если мы хотим, чтобы программа сама создавала отсутствующие позиции, необходимо установить соответствующий флаг в настройках.

Особенности загрузки штрихкодов и единиц измерения

Посмотрим на ситуацию шире. Как отметил пользователь в сообщении №9, ему нужно загрузить не только имя, но и единицу измерения со штрихкодом. В 1С 8.2 (например, в Управлении Торговлей 10.3) эти данные хранятся в разных местах.

Единицы измерения: Это подчиненный справочник. Мы не можем просто записать в карточку товара строку «шт». Нам нужно:

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


МенеджерЗаписи = РегистрыСведений.Штрихкоды.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Владелец = СсылкаНаНоменклатуру;
МенеджерЗаписи.ЕдиницаИзмерения = СсылкаНаЕдиницу;
МенеджерЗаписи.ТипШтрихкода = ПланыВидовХарактеристик.ТипыШтрихкодов.EAN13;
МенеджерЗаписи.Штрихкод = СтрокаШтрихкодаИзExcel;
МенеджерЗаписи.Записать(Истина);

Программные методы чтения Excel (COM-соединение)

Проанализируем ситуацию, когда стандартная обработка не справляется (например, если файл имеет сложную структуру с объединенными ячейками). В этом случае мы используем COM-объект Excel.Application.

Рассмотрим пример открытия и чтения файла:


Попытка
    Эксель = Новый COMОбъект("Excel.Application");
Исключение
    Сообщить("Excel не установлен!");
    Возврат;
КонецПопытки;

Книга = Эксель.Workbooks.Open(ПутьКФайлу);
Лист = Книга.Sheets(1);

Для НомерСтроки = 2 По Лист.UsedRange.Rows.Count Цикл
    Наименование = Лист.Cells(НомерСтроки, 1).Value;
    Артикул = СокрЛП(Строка(Лист.Cells(НомерСтроки, 2).Value));
    
    // Здесь логика поиска или создания номенклатуры
КонецЦикла;

Книга.Close(Ложь);
Эксель.Quit();

Важное замечание: При использовании этого метода 1С часто считывает числовые штрихкоды в научном формате (например, 4.6E+12). Чтобы этого избежать, всегда приводите значение к строке и предварительно настраивайте формат ячеек в Excel как «Текстовый».

Подготовка файла Excel перед загрузкой

Выясним, как минимизировать ошибки еще на этапе подготовки данных. Большинство проблем с типами данных в 1С возникает из-за «грязных» исходных файлов. Проделаем следующие шаги:

  1. Очистка шапки: Удалим все строки над таблицей данных. Первая строка должна содержать либо заголовки, либо сразу данные.
  2. Проверка типов: Выделим колонку со штрихкодами и артикулами, установим формат ячеек «Текстовый». Это предотвратит обрезание ведущих нулей.
  3. Удаление лишних символов: Используем функцию Excel «Найти и заменить», чтобы убрать невидимые пробелы или переносы строк в наименованиях.
  4. Сохранение: Для стабильной работы через COM или ADO лучше сохранять файл в формате Excel 97-2003 (.xls), так как он более предсказуем для старых версий платформы 8.2.

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

← На главную