Как программно загрузить номенклатуру и цены из Excel в 1С?

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

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

Анализ проблемы: почему нельзя просто записать цену в карточку

Основная ошибка начинающих разработчиков заключается в попытке найти реквизит «Цена» непосредственно в справочнике Номенклатура или напрямую записать данные в регистр сведений ЦеныНоменклатуры. Рассмотрим, почему это не работает:

  1. Подчинение регистратору: В большинстве типовых конфигураций (Управление торговлей, Розница, ERP) регистр сведений ЦеныНоменклатуры является подчиненным. Это означает, что записи в нем могут создаваться только документами-регистраторами. Прямая запись набором записей программно ограничена для сохранения целостности данных.
  2. История цен: Цены в 1С хранятся в разрезе времени. Сегодня цена одна, завтра — другая. Документ УстановкаЦенНоменклатуры фиксирует этот переход и сохраняет историю, что важно для формирования отчетов.
  3. Типы цен: Цена всегда привязана к определенному справочнику ТипыЦенНоменклатуры (например, «Закупочная», «Розничная», «Оптовая»).

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

Алгоритм реализации комплексной загрузки

Разберем по шагам правильный алгоритм работы нашей обработки:

  1. Инициализация Excel: Подключаемся к файлу через COMОбъект.
  2. Создание/Поиск номенклатуры: Проверяем наличие товара в базе (по наименованию или штрихкоду). Если товара нет — создаем его.
  3. Работа с единицами измерения: Создаем единицы измерения и привязываем к ним штрихкоды из файла.
  4. Сбор данных о ценах: В процессе цикла обхода строк Excel мы не записываем цены сразу, а собираем их во временную таблицу значений.
  5. Создание документа установки цен: После завершения цикла по строкам файла создаем один общий документ УстановкаЦенНоменклатуры, заполняем его данными из нашей таблицы и проводим.

Программная реализация: создаем документ установки цен

Рассмотрим пример кода, который необходимо вставить в основной цикл обработки. Предположим, что вы уже успешно создали или нашли товар (переменная ТоварСсылка) и получили значения цен из колонок Excel.

Сначала подготовим таблицу значений для хранения цен перед созданием документа. Это позволит нам создать один документ на весь файл, что значительно ускорит работу системы.


ТЗ_Цены = Новый ТаблицаЗначений;
ТЗ_Цены.Колонки.Добавить("Номенклатура");
ТЗ_Цены.Колонки.Добавить("Цена");
ТЗ_Цены.Колонки.Добавить("ТипЦен");
ТЗ_Цены.Колонки.Добавить("ЕдиницаИзмерения");

В основном цикле чтения Excel-файла, после создания номенклатуры, добавляем строки в эту таблицу:


// Добавляем закупочную цену
НоваяСтрока = ТЗ_Цены.Добавить();
НоваяСтрока.Номенклатура = ТоварСсылка;
НоваяСтрока.Цена = Число(НашЛист.Cells(й2, 6).Value); // Колонка с закупочной ценой
НоваяСтрока.ТипЦен = Справочники.ТипыЦенНоменклатуры.НайтиПоНаименованию("Закупочная");
НоваяСтрока.ЕдиницаИзмерения = ТоварСсылка.ОсновнаяЕдиницаИзмерения;

// Добавляем розничную цену
НоваяСтрока = ТЗ_Цены.Добавить();
НоваяСтрока.Номенклатура = ТоварСсылка;
НоваяСтрока.Цена = Число(НашЛист.Cells(й2, 10).Value); // Колонка с розничной ценой
НоваяСтрока.ТипЦен = Справочники.ТипыЦенНоменклатуры.НайтиПоНаименованию("Розничная");
НоваяСтрока.ЕдиницаИзмерения = ТоварСсылка.ОсновнаяЕдиницаИзмерения;

Финальный этап: Запись документа

После того как все строки файла обработаны, необходимо создать сам документ. Проанализируем пример кода для создания документа УстановкаЦенНоменклатуры:


Если ТЗ_Цены.Количество() > 0 Тогда
    ДокУстановка = Документы.УстановкаЦенНоменклатуры.СоздатьДокумент();
    ДокУстановка.Дата = ТекущаяДата();
    
    // В некоторых конфигурациях нужно сначала заполнить таблицу типов цен в документе
    Для Каждого СтрТЗ Из ТЗ_Цены Цикл
        // Проверяем, есть ли уже такая номенклатура и тип цены в документе
        // (чтобы не дублировать типы цен в шапке/таблице)
        
        НоваяСтрокаДок = ДокУстановка.Товары.Добавить();
        НоваяСтрокаДок.Номенклатура = СтрТЗ.Номенклатура;
        НоваяСтрокаДок.ТипЦен = СтрТЗ.ТипЦен;
        НоваяСтрокаДок.Цена = СтрТЗ.Цена;
        НоваяСтрокаДок.ЕдиницаИзмерения = СтрТЗ.ЕдиницаИзмерения;
        НоваяСтрокаДок.Валюта = СтрТЗ.ТипЦен.Валюта;
    КонецЦикла;
    
    Попытка
        ДокУстановка.Записать(РежимЗаписиДокумента.Проведение);
        Сообщить("Цены успешно установлены документом: " + ДокУстановка.Ссылка);
    Исключение
        Сообщить("Ошибка при проведении цен: " + ОписаниеОшибки());
    КонецПопытки;
КонецЕсли;

Важные нюансы при работе с Excel и ценами

Рассмотрим несколько критических моментов, которые помогут избежать ошибок при загрузке:

  1. Формат чисел: Excel часто хранит числа с разделителями (пробелы, запятые). Перед преобразованием в Число в 1С обязательно используйте функцию СтрЗаменить(ТекстИзExcel, " ", "") и СтрЗаменить(ТекстИзExcel, ",", "."), иначе возникнет ошибка преобразования типа.
  2. Транзакции: Не рекомендуется открывать одну транзакцию на весь процесс загрузки, если файл содержит более 1000 строк. Это может привести к блокировке таблиц базы данных для других пользователей. Лучше записывать номенклатуру порциями.
  3. Поиск существующих товаров: Всегда проверяйте наличие товара в базе перед созданием. Лучший способ — поиск по Штрихкоду, так как наименования в Excel могут содержать лишние пробелы или опечатки.
  4. Единицы измерения: Убедитесь, что цена в Excel соответствует базовой единице измерения в 1С. Если в файле цена за упаковку, а в 1С установлены штуки, и вы это не учтете, данные в системе будут некорректными.

Заключение

Мы выяснили причину, по которой прямая запись цен в базу не является правильной, и разобрали по шагам создание документа УстановкаЦенНоменклатуры. Использование промежуточной таблицы значений для накопления данных — наиболее эффективный способ решения задачи. Это позволяет минимизировать количество обращений к базе данных и гарантирует, что все цены будут установлены корректно и с сохранением истории изменений.

← На главную