Загрузка данных из внешних файлов Excel — одна из самых частых задач, с которыми сталкивается разработчик 1С. Часто функционал ограничивается простым переносом наименований и штрихкодов, но для полноценной работы системы этого недостаточно. Необходимо сразу устанавливать закупочные и розничные цены, чтобы складской учет и продажи могли начаться незамедлительно. В этой статье мы подробно разберем, как расширить модуль загрузки и правильно реализовать механизм установки цен.
Основная ошибка начинающих разработчиков заключается в попытке найти реквизит «Цена» непосредственно в справочнике Номенклатура или напрямую записать данные в регистр сведений ЦеныНоменклатуры. Рассмотрим, почему это не работает:
ЦеныНоменклатуры является подчиненным. Это означает, что записи в нем могут создаваться только документами-регистраторами. Прямая запись набором записей программно ограничена для сохранения целостности данных.УстановкаЦенНоменклатуры фиксирует этот переход и сохраняет историю, что важно для формирования отчетов.ТипыЦенНоменклатуры (например, «Закупочная», «Розничная», «Оптовая»).Следовательно, для успешной загрузки цен нам необходимо не только создать элемент справочника, но и сформировать документ установки цен, заполнить его табличную часть и провести его.
Разберем по шагам правильный алгоритм работы нашей обработки:
COMОбъект.УстановкаЦенНоменклатуры, заполняем его данными из нашей таблицы и проводим.Рассмотрим пример кода, который необходимо вставить в основной цикл обработки. Предположим, что вы уже успешно создали или нашли товар (переменная ТоварСсылка) и получили значения цен из колонок Excel.
Сначала подготовим таблицу значений для хранения цен перед созданием документа. Это позволит нам создать один документ на весь файл, что значительно ускорит работу системы.
ТЗ_Цены = Новый ТаблицаЗначений;
ТЗ_Цены.Колонки.Добавить("Номенклатура");
ТЗ_Цены.Колонки.Добавить("Цена");
ТЗ_Цены.Колонки.Добавить("ТипЦен");
ТЗ_Цены.Колонки.Добавить("ЕдиницаИзмерения");
В основном цикле чтения Excel-файла, после создания номенклатуры, добавляем строки в эту таблицу:
// Добавляем закупочную цену
НоваяСтрока = ТЗ_Цены.Добавить();
НоваяСтрока.Номенклатура = ТоварСсылка;
НоваяСтрока.Цена = Число(НашЛист.Cells(й2, 6).Value); // Колонка с закупочной ценой
НоваяСтрока.ТипЦен = Справочники.ТипыЦенНоменклатуры.НайтиПоНаименованию("Закупочная");
НоваяСтрока.ЕдиницаИзмерения = ТоварСсылка.ОсновнаяЕдиницаИзмерения;
// Добавляем розничную цену
НоваяСтрока = ТЗ_Цены.Добавить();
НоваяСтрока.Номенклатура = ТоварСсылка;
НоваяСтрока.Цена = Число(НашЛист.Cells(й2, 10).Value); // Колонка с розничной ценой
НоваяСтрока.ТипЦен = Справочники.ТипыЦенНоменклатуры.НайтиПоНаименованию("Розничная");
НоваяСтрока.ЕдиницаИзмерения = ТоварСсылка.ОсновнаяЕдиницаИзмерения;
После того как все строки файла обработаны, необходимо создать сам документ. Проанализируем пример кода для создания документа УстановкаЦенНоменклатуры:
Если ТЗ_Цены.Количество() > 0 Тогда
ДокУстановка = Документы.УстановкаЦенНоменклатуры.СоздатьДокумент();
ДокУстановка.Дата = ТекущаяДата();
// В некоторых конфигурациях нужно сначала заполнить таблицу типов цен в документе
Для Каждого СтрТЗ Из ТЗ_Цены Цикл
// Проверяем, есть ли уже такая номенклатура и тип цены в документе
// (чтобы не дублировать типы цен в шапке/таблице)
НоваяСтрокаДок = ДокУстановка.Товары.Добавить();
НоваяСтрокаДок.Номенклатура = СтрТЗ.Номенклатура;
НоваяСтрокаДок.ТипЦен = СтрТЗ.ТипЦен;
НоваяСтрокаДок.Цена = СтрТЗ.Цена;
НоваяСтрокаДок.ЕдиницаИзмерения = СтрТЗ.ЕдиницаИзмерения;
НоваяСтрокаДок.Валюта = СтрТЗ.ТипЦен.Валюта;
КонецЦикла;
Попытка
ДокУстановка.Записать(РежимЗаписиДокумента.Проведение);
Сообщить("Цены успешно установлены документом: " + ДокУстановка.Ссылка);
Исключение
Сообщить("Ошибка при проведении цен: " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
Рассмотрим несколько критических моментов, которые помогут избежать ошибок при загрузке:
Число в 1С обязательно используйте функцию СтрЗаменить(ТекстИзExcel, " ", "") и СтрЗаменить(ТекстИзExcel, ",", "."), иначе возникнет ошибка преобразования типа.Штрихкоду, так как наименования в Excel могут содержать лишние пробелы или опечатки.Мы выяснили причину, по которой прямая запись цен в базу не является правильной, и разобрали по шагам создание документа УстановкаЦенНоменклатуры. Использование промежуточной таблицы значений для накопления данных — наиболее эффективный способ решения задачи. Это позволяет минимизировать количество обращений к базе данных и гарантирует, что все цены будут установлены корректно и с сохранением истории изменений.