При работе с конфигурацией 1С:Управление торговлей 10.3 часто возникает необходимость доработки типовых или внешних отчетов. Одной из наиболее распространенных задач является вывод штрихкодов номенклатуры в отчет остатков товаров (например, вместо колонок Код1С или Артикул). Это требуется для проведения инвентаризаций, сверки товаров или последующей выгрузки данных в сторонние системы и другие базы 1С.
В этом руководстве мы подробно разберем, как правильно изменить текст запроса, связать регистр сведений штрихкодов со справочником номенклатуры, настроить макет табличного документа и избежать распространенных ошибок, таких как задвоение остатков или вывод штрихкода на отдельной строке.
Проанализируем особенности хранения данных. В различных конфигурациях 1С регистры сведений для хранения штрихкодов называются по-разному, и их структура отличается:
РегистрСведений.Штрихкоды. Владелец товара хранится в измерении Владелец (типа СправочникСсылка.Номенклатура или СправочникСсылка.ХарактеристикиНоменклатуры), а сам код — в измерении Штрихкод.РегистрСведений.ШтрихкодыНоменклатуры, где поля номенклатуры называются Номенклатура, Характеристика и Упаковка.Если скопировать запрос из 1С:УТ 11 в 1С:УТ 10.3, платформа выдаст ошибку о том, что таблица или поле объекта не обнаружены. Поэтому при написании запроса в УТ 10.3 следует обращаться именно к регистру РегистрСведений.Штрихкоды и полю Владелец.
Выясним причину главной технической проблемы: у одной позиции номенклатуры может быть заведено несколько штрихкодов (например, штрихкоды разных производителей или разных упаковок). Если выполнить простое ЛЕВОЕ СОЕДИНЕНИЕ таблицы остатков с регистром штрихкодов, каждая строка с товаром продублируется столько раз, сколько штрихкодов привязано к этой номенклатуре. В результате показатели количества и стоимости остатков умножатся на число штрихкодов.
Чтобы избежать этого, разберем два основных подхода:
Рассмотрим наилучший способ: сгруппировать штрихкоды во временной таблице с использованием агрегатной функции МИНИМУМ или МАКСИМУМ. Это гарантирует, что для каждой номенклатуры вернется строго одна строка со штрихкодом.
Посмотрим на пример кода запроса:
// 1. Получаем уникальные штрихкоды по номенклатуре
ВЫБРАТЬ
Штрихкоды.Владелец КАК Номенклатура,
МИНИМУМ(Штрихкоды.Штрихкод) КАК Штрихкод
ПОМЕСТИТЬ ВТ_Штрихкоды
ИЗ
РегистрСведений.Штрихкоды КАК Штрихкоды
ГРУППИРОВАТЬ ПО
Штрихкоды.Владелец;
ИЗМЕНИТЬ ИНДЕКС ДЛЯ ВТ_Штрихкоды ПО Номенклатура;
// 2. Основной запрос остатков с левым соединением
ВЫБРАТЬ
ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
ТоварыНаСкладахОстатки.Номенклатура.Код КАК Код1С,
ТоварыНаСкладахОстатки.Номенклатура.Артикул КАК Артикул,
ЕСТЬНУЛЛ(ВТ_Штрихкоды.Штрихкод, "") КАК Штрихкод,
ТоварыНаСкладахОстатки.КоличествоОстаток КАК КоличествоОстаток,
ТоварыНаСкладахОстатки.СтоимостьОстаток КАК СтоимостьОстаток
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, Склад = &Склад) КАК ТоварыНаСкладахОстатки
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Штрихкоды КАК ВТ_Штрихкоды
ПО ТоварыНаСкладахОстатки.Номенклатура = ВТ_Штрихкоды.Номенклатура
Если требуется сохранить все штрихкоды номенклатуры, их склеивают в одну строку программно при обходе выборки в модуле отчета. Для этого штрихкоды выбираются отдельным запросом или индексированной таблицей значений, после чего сопоставляются с текущим товаром перед выводом строки макета.
Рассмотрим пример алгоритма склейки в коде 1С:
// Сбор всех штрихкодов номенклатуры в строку через запятую
ЗапросШК = Новый Запрос;
ЗапросШК.Текст =
"ВЫБРАТЬ
| Штрихкоды.Штрихкод КАК Штрихкод
|ИЗ
| РегистрСведений.Штрихкоды КАК Штрихкоды
|ГДЕ
| Штрихкоды.Владелец = &Номенклатура";
ЗапросШК.УстановитьПараметр("Номенклатура", Выборка.Номенклатура);
РезультатШК = ЗапросШК.Выполнить().Выбрать();
СтрокаШК = "";
Пока РезультатШК.Следующий() Цикл
СтрокаШК = СтрокаШК + ?(ЗначениеЗаполнено(СтрокаШК), ", ", "") + СокрЛП(РезультатШК.Штрихкод);
КонецЦикла;
// Присваиваем скомпонованную строку параметру макета
ОбластьМакета.Параметры.Штрихкод = СтрокаШК;
Разберем частую ошибку начинающих разработчиков: вызов метода ТабДок.Вывести() внутри дополнительного цикла по штрихкодам. Если вызывать Вывести() повторно, штрихкод будет печататься на новой строке под наименованием товара, нарушая структуру таблицы.
Проанализируем правильный порядок заполнения параметров макета табличного документа:
Строка) находим ячейку, в которую необходимо выводить штрихкод. Задаем ей имя параметра, например Код1с или Штрихкод.ТабДок.Вывести(ОбластьМакета) ровно один раз на каждую позицию номенклатуры.Посмотрим на исправление цикла вывода отчета:
Пока Выборка.Следующий() Цикл
Если Выборка.Номенклатура.ЭтоГруппа Тогда
ОбластьМакета = Макет.ПолучитьОбласть("Строка1");
Иначе
ОбластьМакета = Макет.ПолучитьОбласть("Строка");
КонецЕсли;
// Заполняем основные параметры из выборки
ОбластьМакета.Параметры.Заполнить(Выборка);
// Подставляем штрихкод в параметр ячейки Код1с
ОбластьМакета.Параметры.Код1с = Выборка.Штрихкод;
// Рассчитываем и выводим дополнительные показатели
Если Выборка.СтоимостьОстаток <> 0 Тогда
Попытка
ОбластьМакета.Параметры.Пр = Окр(100 * Выборка.НаценкаРуб / Выборка.СтоимостьОстаток, 2);
Исключение
ОбластьМакета.Параметры.Пр = 0;
КонецПопытки;
КонецЕсли;
// Выводим заполненную область в табличный документ один раз
Попытка
ТабДок.Вывести(ОбластьМакета, Выборка.Номенклатура.Уровень + 1, "", Ложь);
Исключение
ТабДок.Вывести(ОбластьМакета, 1, "", Ложь);
КонецПопытки;
КонецЦикла;
При доработке отчетов в 1С:УТ 10.3 рекомендуется проверить следующие моменты:
ОбластьМакета.Параметры.ИмяПараметра должно точно совпадать с именем ячейки в макете.Если ... Иначе: В типовых отчетах УТ 10.3 тексты запросов часто динамически формируются в зависимости от настроек (например, опции «По группам», «По категориям», типы складов — розничный или оптовый). Текст запроса необходимо скорректировать во всех ветках условия, иначе при изменении настроек штрихкоды перестанут выводиться.Штрихкоды для тестируемых товаров и убедитесь, что тип склада и условия отбора не отсекают записи.Если выгрузка штрихкодов в отчет потребовалась для переноса остатков из 1С:УТ 10.3 в 1С:УТ 11.4 через Excel, учтите важный нюанс. Выгрузка и загрузка через Excel часто приводит к рассинхронизации ссылок (GUID) и дублированию справочников.
Для переноса данных между базами 1С предпочтительнее использовать штатные инструменты:
Штрихкоды даже в уже задействованную рабочую базу-приемник.