Как загрузить остатки по партиям с уникальными характеристиками в программу «1С:Розница 2»?

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

Перенос начальных остатков из старых систем автоматизации (например, «1С:Торговля и Склад 7.7» или сторонних конфигураций) в современную «1С:Розница 2» — стандартная, но часто вызывающая трудности задача. Особую сложность представляет учет по партиям. В «1С:Розница 2» полноценного партионного учета в привычном виде нет, однако его роль успешно выполняют индивидуальные характеристики номенклатуры. Каждая такая характеристика может выступать в роли уникальной партии (например, содержать информацию о серии, сроке годности, дате поступления или номере прихода).

В этой статье мы подробно разберем, как с помощью стандартной обработки «Загрузка данных из табличного документа» автоматически создавать уникальные характеристики для каждой строки при импорте остатков в документ «Оприходование товаров», а также решим сопутствующую проблему — как программно отсекать и пропускать строки с отрицательными остатками прямо в процессе загрузки.

Шаг 1. Настройка видов номенклатуры в «1С:Розница 2»

Прежде чем приступать к загрузке данных, подготовим базу данных «1С:Розница» к работе с индивидуальными характеристиками. Если этого не сделать, система не позволит записать характеристики для загружаемых позиций.

Проанализируем структуру справочника ВидыНоменклатуры. Откроем настройки видов номенклатуры и выполним следующие действия:

  1. Перейдем в раздел НСИ — Классификатор номенклатуры — Виды номенклатуры.
  2. Откроем нужный вид номенклатуры (например, «Товары» или «Лекарственные средства»).
  3. В карточке вида номенклатуры установим флаг «Использовать характеристики».
  4. В выпадающем списке выберем вариант «Индивидуальные для номенклатуры». Это критически важно, так как общие характеристики принадлежат виду номенклатуры, а индивидуальные — конкретной карточке товара (владельцем в базе данных выступает элемент справочника Номенклатура).
  5. Сохраним настройки вида номенклатуры.

Шаг 2. Создание индивидуальных характеристик «на лету»

Перейдем к работе с универсальной обработкой «Загрузка данных из табличного документа». Наша задача — настроить загрузку в табличную часть документа «Оприходование товаров» так, чтобы для каждой строки автоматически искалась или создавалась уникальная индивидуальная характеристика.

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


// Из уже заполненных реквизитов строки получаем ссылку на загруженную Номенклатуру
НоменклатураСсылка = ТекущиеДанные.Номенклатура; 

// Из массива ТекстыЯчеек извлекаем наименование характеристики/партии.
// Предположим, что текстовое обозначение партии находится в колонке 5 вашего файла Excel
НаименованиеХарактеристики = СокрЛП(ТекстыЯчеек[5]); 

Если ЗначениеЗаполнено(НоменклатураСсылка) И Не ПустаяСтрока(НаименованиеХарактеристики) Тогда
    // Выполняем поиск уже существующей характеристики для данной номенклатуры
    НайденнаяХарактеристика = Справочники.ХарактеристикиНоменклатуры.НайтиПоНаименованию(
        НаименованиеХарактеристики, 
        Истина, 
        , 
        НоменклатураСсылка
    );
    
    Если НайденнаяХарактеристика.Пустая() Тогда
        // Если такой индивидуальной характеристики еще нет в базе — создаем её программно
        НовыйОбъектХарактеристики = Справочники.ХарактеристикиНоменклатуры.СоздатьЭлемент();
        НовыйОбъектХарактеристики.Владелец = НоменклатураСсылка; // Задаем владельца
        НовыйОбъектХарактеристики.Наименование = НаименованиеХарактеристики;
        
        Попытка
            НовыйОбъектХарактеристики.Записать();
            Результат = НовыйОбъектХарактеристики.Ссылка;
        Исключение
            Результат = Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка();
            // В случае критической ошибки можно вывести описание во внешний лог
            ЗаписьЖурналаРегистрации("ЗагрузкаОстатков", УровеньЖурналаРегистрации.Ошибка, , , 
                "Не удалось записать характеристику для номенклатуры '" + НоменклатураСсылка + "': " + ОписаниеОшибки());
        КонецПопытки;
    Иначе
        // Если характеристика уже существует, просто подставляем её ссылку
        Результат = НайденнаяХарактеристика;
    КонецЕсли;
Иначе
    Результат = Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка();
КонецЕсли;

Разберем подробнее, как работает этот код. Во время обхода строк обработка сначала считывает номенклатуру. Когда очередь доходит до вычисляемого поля «Характеристика», мы берем уже полученную ссылку НоменклатураСсылка и ищем в справочнике ХарактеристикиНоменклатуры элемент с нужным названием, жестко ограничив поиск владельцем (четвертый параметр метода НайтиПоНаименованию). Если элемент отсутствует, мы создаем его, заполняем реквизит Владелец и записываем.

Шаг 3. Исключение строк с отрицательными значениями

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

В стандартной обработке «Загрузка данных из табличного документа» нет явного события «ПропуститьСтроку». Однако мы можем решить эту задачу элегантно. Программа сначала считывает строку, добавляет её в табличную часть документа, а затем вызывает обработчик события «После добавления строки» табличной части. Мы можем перехватить этот момент и просто удалить некорректную строку.

Настроим обработчик события «После добавления строки» (его можно найти в настройках загрузки табличной части):


// Предположим, что колонка с количеством товара в Excel-файле идет под номером 10.
// ТекстыЯчеек[10] содержит строковое значение этой ячейки.

// Предварительно очищаем строку от неразрывных пробелов и обычных разделителей триад
СтрокаЧисла = СтрЗаменить(ТекстыЯчеек[10], Символы.НПП, "");
СтрокаЧисла = СтрЗаменить(СтрокаЧисла, " ", "");
СтрокаЧисла = СтрЗаменить(СтрокаЧисла, ",", "."); // Заменяем запятую на точку для корректного преобразования

ЗначениеКоличества = Число(СтрокаЧисла);

Если ЗначениеКоличества <= 0 Тогда
    // Удаляем только что добавленную строку из заполняемой табличной части документа
    // Объект — это ссылка на создаваемый в памяти документ (например, ОприходованиеТоваров)
    // СтрокаТабличнойЧасти — предопределенная переменная обработки, указывающая на текущую строку
    Объект.Товары.Удалить(СтрокаТабличнойЧасти);
КонецЕсли;

Выясним причину использования функции СтрЗаменить. При выгрузке чисел из других систем часто добавляются разделители тысяч (пробелы или неразрывные пробелы Символы.НПП). Если попытаться передать такую строку напрямую в функцию Число(), платформа выдаст ошибку преобразования. Предварительная очистка строки гарантирует стабильную работу импорта.

Шаг 4. Важные нюансы ведения партионного учета через характеристики

Проанализируем сопутствующие задачи, которые обязательно возникнут после успешной загрузки остатков с индивидуальными характеристиками:

  1. Регистрация штрихкодов: В конфигурации «1С:Розница 2» штрихкоды регистрируются не просто для номенклатуры, а для связки «Номенклатура + Характеристика». Если ваши уникальные партии (характеристики) имеют собственные штрихкоды в исходном файле, вам потребуется загрузить их в регистр сведений ШтрихкодыНоменклатуры. Это можно сделать отдельным проходом загрузки или дописать логику создания записи регистра в событие «После записи объекта» вашей обработки.
  2. Установка цен номенклатуры: Документ «Оприходование товаров» фиксирует лишь себестоимость партий на складе. Но для успешных продаж на кассе (в РМК) для каждой уникальной характеристики должна быть задана розничная цена. Если этого не сделать, при сканировании штрихкода конкретной партии программа выдаст ошибку «Не задана розничная цена». Не забудьте после оприходования создать документ УстановкаЦенНоменклатуры, где новые характеристики будут оценены по розничным ценам.

Используя предложенные методики, мы полностью автоматизируем процесс переноса партий и исключим ручной ввод данных, защитив систему от попадания ошибочных отрицательных остатков.

← На главную