В розничной торговле одеждой и обувью часто возникает необходимость отображать на одном ценнике весь доступный размерный ряд конкретной модели, который есть в наличии на складе магазина. Стандартный функционал 1С:Розница 2.3 работает по принципу «одна строка — один ценник», где каждая характеристика (размер) печатается на отдельном бланке. В этой статье мы разберем, как изменить этот подход и вывести перечисление всех размеров (например, 42, 44, 48, S, M, L) на единую этикетку.
Давайте проанализируем, как система формирует данные для печати. За этот процесс отвечает обработка ПечатьЭтикетокИЦенников. Когда вы выбираете товар в обработке, система обращается к схеме компоновки данных (СКД). По умолчанию запрос этой схемы вытягивает данные в плоском виде: каждая комбинация Номенклатура + Характеристика — это отдельная запись. Наша задача — заставить систему найти все характеристики одной номенклатуры, по которым есть положительный остаток на конкретном складе, и объединить их в одну строку.
Рассмотрим вариант модификации основной схемы компоновки данных. Поскольку мы работаем в типовой конфигурации, наиболее правильным методом будет использование расширения, чтобы не снимать обработку с поддержки. Нам необходимо изменить текст запроса в наборе данных СКД.
В запросе нам нужно обратиться к виртуальной таблице остатков ТоварыНаСкладах.Остатки. Разберем пример логики запроса, который должен быть добавлен в качестве вложенного или левого соединения к основной номенклатуре:
ВЫБРАТЬ
ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
ТоварыНаСкладахОстатки.Характеристика.Наименование КАК РазмерНаименование
ПОМЕСТИТЬ ВТ_ОстаткиХарактеристик
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, Склад = &Склад) КАК ТоварыНаСкладахОстатки
ГДЕ
ТоварыНаСкладахОстатки.КоличествоОстаток > 0
;
После получения списка всех характеристик с остатками, нам нужно передать эти данные в ресурсы СКД для агрегации в одну строку.
Выясним, как превратить список строк в одну строку через запятую. В системе компоновки данных 1С есть мощный инструмент — выражения ресурсов. Вместо того чтобы пытаться соединить строки в коде запроса (что в языке запросов 1С сделать довольно сложно), мы воспользуемся функцией СтрСоединить.
Выполним следующие шаги в редакторе СКД:
СписокДоступныхРазмеров.
СтрСоединить(Массив(Различные Представление(Характеристика)), ", ")
Эта функция соберет все уникальные наименования характеристик, которые попали в выборку по данной номенклатуре, и объединит их через запятую. Важно использовать ключевое слово Различные, чтобы избежать дублей, если логика запроса вдруг зацепит остатки по разным ячейкам одного склада.
Зачастую в Наименование характеристики включена лишняя информация (например, цвет или артикул), а на ценнике нам нужны только цифры размера. Проанализируем ситуацию, когда размер хранится в дополнительном реквизите характеристики.
В этом случае в запросе СКД нам нужно обращаться не к Характеристика.Наименование, а к значению этого реквизита. Рассмотрим, как это выглядит в коде:
ВЫБРАТЬ
ДополнительныеСведения.Значение КАК РазмерноеЗначение
ИЗ
РегистрСведений.ДополнительныеСведения КАК ДополнительныеСведения
ГДЕ
ДополнительныеСведения.Объект = &СсылкаНаХарактеристику
И ДополнительныеСведения.Свойство = &СвойствоРазмер
Если мы внедрим это в общий запрос печати, то в ресурс СписокДоступныхРазмеров попадут именно чистые значения размеров. Это сделает ценник более профессиональным и читабельным.
После того как мы подготовили данные в программной части, нам нужно вывести их в визуальном редакторе шаблонов. Рассмотрим важные моменты настройки самого макета:
СписокДоступныхРазмеров.Размещение текста в значение Переносить.Чтобы не изменять типовую конфигурацию, создадим расширение и перехватим процедуру, формирующую дерево значений для печати. Нам нужно добавить колонку в таблицу данных перед тем, как она будет передана на печать. Проанализируем примерный алгоритм в коде:
&После("СформироватьТаблицуТоваров")
Процедура Расш_СформироватьТаблицуТоваров(ТаблицаТоваров)
Для Каждого СтрокаТовара Из ТаблицаТоваров Цикл
// Запрос к остаткам по конкретной номенклатуре
СписокРазмеров = ПолучитьСписокРазмеровВНаличии(СтрокаТовара.Номенклатура, СтрокаТовара.Склад);
СтрокаТовара.ДоступныеРазмеры = СписокРазмеров;
КонецЦикла;
КонецПроцедуры
Здесь ПолучитьСписокРазмеровВНаличии — это ваша функция, которая выполняет запрос к регистру ТоварыНаСкладах и возвращает строку. Этот метод более гибкий, так как позволяет использовать всю мощь встроенного языка 1С для обработки строк и условий.
При внедрении данного функционала вы можете столкнуться со следующими проблемами:
Склад в запрос остатков. Если склад не указан, остатки могут не подтянуться.КоличествоОстаток > 0. Иногда система может учитывать зарезервированный товар, если использовать КоличествоВНаличии.Таким образом, мы разобрали комплексное решение задачи. Совмещая возможности языка запросов, ресурсов СКД и механизмов расширений, вы сможете гибко настроить печать ценников под нужды конкретного магазина, обеспечив покупателей всей необходимой информацией о наличии размерного ряда.