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