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