Как добавить штрихкод номенклатуры в отчет остатков товаров в 1С:Управление торговлей 10.3

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

При работе с конфигурацией 1С:Управление торговлей 10.3 часто возникает необходимость доработки типовых или внешних отчетов. Одной из наиболее распространенных задач является вывод штрихкодов номенклатуры в отчет остатков товаров (например, вместо колонок Код1С или Артикул). Это требуется для проведения инвентаризаций, сверки товаров или последующей выгрузки данных в сторонние системы и другие базы 1С.

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

Шаг 1. Понимание структуры хранения штрихкодов в 1С:УТ 10.3

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

  1. В 1С:Управление торговлей 10.3 (обычные формы): используется регистр сведений РегистрСведений.Штрихкоды. Владелец товара хранится в измерении Владелец (типа СправочникСсылка.Номенклатура или СправочникСсылка.ХарактеристикиНоменклатуры), а сам код — в измерении Штрихкод.
  2. В 1С:Управление торговлей 11 / ERP / Комплексная автоматизация 2 (управляемые формы): используется регистр РегистрСведений.ШтрихкодыНоменклатуры, где поля номенклатуры называются Номенклатура, Характеристика и Упаковка.

Если скопировать запрос из 1С:УТ 11 в 1С:УТ 10.3, платформа выдаст ошибку о том, что таблица или поле объекта не обнаружены. Поэтому при написании запроса в УТ 10.3 следует обращаться именно к регистру РегистрСведений.Штрихкоды и полю Владелец.

Шаг 2. Как избежать двоения остатков при соединении с регистром штрихкодов

Выясним причину главной технической проблемы: у одной позиции номенклатуры может быть заведено несколько штрихкодов (например, штрихкоды разных производителей или разных упаковок). Если выполнить простое ЛЕВОЕ СОЕДИНЕНИЕ таблицы остатков с регистром штрихкодов, каждая строка с товаром продублируется столько раз, сколько штрихкодов привязано к этой номенклатуре. В результате показатели количества и стоимости остатков умножатся на число штрихкодов.

Чтобы избежать этого, разберем два основных подхода:

Вариант А. Вывод одного (основного или первого) штрихкода через временную таблицу

Рассмотрим наилучший способ: сгруппировать штрихкоды во временной таблице с использованием агрегатной функции МИНИМУМ или МАКСИМУМ. Это гарантирует, что для каждой номенклатуры вернется строго одна строка со штрихкодом.

Посмотрим на пример кода запроса:


// 1. Получаем уникальные штрихкоды по номенклатуре
ВЫБРАТЬ
    Штрихкоды.Владелец КАК Номенклатура,
    МИНИМУМ(Штрихкоды.Штрихкод) КАК Штрихкод
ПОМЕСТИТЬ ВТ_Штрихкоды
ИЗ
    РегистрСведений.Штрихкоды КАК Штрихкоды
ГРУППИРОВАТЬ ПО
    Штрихкоды.Владелец;

ИЗМЕНИТЬ ИНДЕКС ДЛЯ ВТ_Штрихкоды ПО Номенклатура;

// 2. Основной запрос остатков с левым соединением
ВЫБРАТЬ
    ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
    ТоварыНаСкладахОстатки.Номенклатура.Код КАК Код1С,
    ТоварыНаСкладахОстатки.Номенклатура.Артикул КАК Артикул,
    ЕСТЬНУЛЛ(ВТ_Штрихкоды.Штрихкод, "") КАК Штрихкод,
    ТоварыНаСкладахОстатки.КоличествоОстаток КАК КоличествоОстаток,
    ТоварыНаСкладахОстатки.СтоимостьОстаток КАК СтоимостьОстаток
ИЗ
    РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, Склад = &Склад) КАК ТоварыНаСкладахОстатки
    ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Штрихкоды КАК ВТ_Штрихкоды
        ПО ТоварыНаСкладахОстатки.Номенклатура = ВТ_Штрихкоды.Номенклатура

Вариант Б. Вывод всех штрихкодов через запятую программным путем

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

Рассмотрим пример алгоритма склейки в коде 1С:


// Сбор всех штрихкодов номенклатуры в строку через запятую
ЗапросШК = Новый Запрос;
ЗапросШК.Текст = 
    "ВЫБРАТЬ
    |	Штрихкоды.Штрихкод КАК Штрихкод
    |ИЗ
    |	РегистрСведений.Штрихкоды КАК Штрихкоды
    |ГДЕ
    |	Штрихкоды.Владелец = &Номенклатура";

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

СтрокаШК = "";
Пока РезультатШК.Следующий() Цикл
    СтрокаШК = СтрокаШК + ?(ЗначениеЗаполнено(СтрокаШК), ", ", "") + СокрЛП(РезультатШК.Штрихкод);
КонецЦикла;

// Присваиваем скомпонованную строку параметру макета
ОбластьМакета.Параметры.Штрихкод = СтрокаШК;

Шаг 3. Настройка макета и модуля формирования отчета

Разберем частую ошибку начинающих разработчиков: вызов метода ТабДок.Вывести() внутри дополнительного цикла по штрихкодам. Если вызывать Вывести() повторно, штрихкод будет печататься на новой строке под наименованием товара, нарушая структуру таблицы.

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

  1. В макете отчета (в области Строка) находим ячейку, в которую необходимо выводить штрихкод. Задаем ей имя параметра, например Код1с или Штрихкод.
  2. В коде модуля перед выводом области заполняем параметр значением из выборки запроса.
  3. Вызываем метод ТабДок.Вывести(ОбластьМакета) ровно один раз на каждую позицию номенклатуры.

Посмотрим на исправление цикла вывода отчета:


Пока Выборка.Следующий() Цикл

    Если Выборка.Номенклатура.ЭтоГруппа Тогда
        ОбластьМакета = Макет.ПолучитьОбласть("Строка1");
    Иначе
        ОбластьМакета = Макет.ПолучитьОбласть("Строка");
    КонецЕсли;

    // Заполняем основные параметры из выборки
    ОбластьМакета.Параметры.Заполнить(Выборка);
    
    // Подставляем штрихкод в параметр ячейки Код1с
    ОбластьМакета.Параметры.Код1с = Выборка.Штрихкод;

    // Рассчитываем и выводим дополнительные показатели
    Если Выборка.СтоимостьОстаток <> 0 Тогда
        Попытка
            ОбластьМакета.Параметры.Пр = Окр(100 * Выборка.НаценкаРуб / Выборка.СтоимостьОстаток, 2);
        Исключение
            ОбластьМакета.Параметры.Пр = 0;
        КонецПопытки;
    КонецЕсли;

    // Выводим заполненную область в табличный документ один раз
    Попытка
        ТабДок.Вывести(ОбластьМакета, Выборка.Номенклатура.Уровень + 1, "", Ложь);
    Исключение
        ТабДок.Вывести(ОбластьМакета, 1, "", Ложь);
    КонецПопытки;

КонецЦикла;

Шаг 4. Чек-лист решения типичных проблем и ошибок

При доработке отчетов в 1С:УТ 10.3 рекомендуется проверить следующие моменты:

  1. Ошибка «Поле объекта не обнаружено (ШтрихКод)»: Проверьте имя параметра в свойствах ячейки макета. Имя параметра в коде ОбластьМакета.Параметры.ИмяПараметра должно точно совпадать с именем ячейки в макете.
  2. Отчет содержит несколько ветвей условий Если ... Иначе: В типовых отчетах УТ 10.3 тексты запросов часто динамически формируются в зависимости от настроек (например, опции «По группам», «По категориям», типы складов — розничный или оптовый). Текст запроса необходимо скорректировать во всех ветках условия, иначе при изменении настроек штрихкоды перестанут выводиться.
  3. Штрихкоды не выводятся, хотя ошибок нет: Проверьте заполненность регистра Штрихкоды для тестируемых товаров и убедитесь, что тип склада и условия отбора не отсекают записи.

Альтернатива: перенос данных между базами без промежуточного Excel

Если выгрузка штрихкодов в отчет потребовалась для переноса остатков из 1С:УТ 10.3 в 1С:УТ 11.4 через Excel, учтите важный нюанс. Выгрузка и загрузка через Excel часто приводит к рассинхронизации ссылок (GUID) и дублированию справочников.

Для переноса данных между базами 1С предпочтительнее использовать штатные инструменты:

← На главную