В процессе работы с конфигурациями на базе современной платформы (например, 1С:Управление нашей фирмой 3.0 или 1С:Розница 3.0) пользователи часто сталкиваются с досадной проблемой: при попытке напечатать одну этикетку принтер выдает две. Проблема сохраняется даже при возврате к типовому макету, поэтому многие специалисты предпочитают использовать проверенные внешние печатные формы для УНФ 3.0, чтобы избежать ошибок стандартного функционала. В этой статье мы подробно разберем, почему это происходит, проанализируем программный код и найдем способы решения.
Проанализируем ситуацию: задвоение (или дублирование) строк при печати обычно связано с тем, что на этапе подготовки данных в табличную часть попадает лишняя запись. Выясним причину такого поведения. Как показывает практика и анализ кода, корень проблемы кроется в обработке ПечатьЭтикетокИЦенников, а именно в процедуре ПодготовитьДанныеДляПечати модуля менеджера.
В современных релизах 1С алгоритм формирования данных для печати стал крайне сложным. Он включает в себя работу с временными таблицами, множественные соединения с регистрами цен, штрихкодов и остатков. Чтобы не разбираться в сложном коде, часто проще внедрить готовую обработку для печати ценников с показом остатков, где эти механизмы уже оптимизированы. Если системе не хватает данных для идентификации типа печати, она выполняет соединения (LEFT JOIN), которые могут приводить к декартову произведению строк.
Рассмотрим самый простой способ, который помогает в 90% случаев без изменения программного кода. Выяснилось, что в логике конфигурации заложен жесткий фильтр по назначению шаблона. Если это поле не заполнено, запрос начинает «сходить с ума».
Выполним следующие шаги:
Почему это работает? Проанализируем программную логику: когда тип шаблона указан явно, запрос в процедуре ПодготовитьДанныеДляПечати получает жесткое условие для фильтрации данных. Если тип не указан, система пытается подготовить данные «на все случаи жизни», что приводит к дублированию строк в итоговой таблице.
Если первый способ не помог, разберем ситуацию на уровне кода. Рассмотрим фрагмент формирования таблицы ЦеныНоменклатуры, где использование ОБЪЕДИНИТЬ ВСЕ без четких условий может привести к тому, что номенклатура попадет в выборку дважды.
ВЫБРАТЬ РАЗРЕШЕННЫЕ
ТоварыСЦенами.Номенклатура КАК Номенклатура,
ТоварыСЦенами.ВидЦен КАК ВидЦен,
ТоварыСЦенами.Цена КАК Цена
ПОМЕСТИТЬ ЦеныНоменклатуры
ИЗ
ТоварыСЦенамиПоВидамЦен КАК ТоварыСЦенами
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ТоварыСЦенами.Номенклатура,
ТоварыСЦенами.ВидЦен,
ТоварыСЦенами.Цена
ИЗ
ТоварыСЦенами КАК ТоварыСЦенами;
Чтобы гарантированно исправить это программно, мы можем применить метод Свернуть() к результату выполнения запроса в модуле менеджера. Это особенно важно, когда реализуется печать этикеток и ценников из документа Заказ покупателя, где данные собираются из нескольких источников одновременно.
// Получаем результат запроса
ТаблицаРезультат = Запрос.Выполнить().Выгрузить();
// Сворачиваем таблицу по ключевым полям
ПоляГруппировки = "Номенклатура, Характеристика, Партия, Серия, ЕдиницаИзмерения, Штрихкод, ШаблонЭтикеткиДляПечати";
ПоляСуммирования = "КоличествоЭтикетокДляПечати, КоличествоЦенниковДляПечати";
ТаблицаРезультат.Svernut(ПоляГруппировки, ПоляСуммирования);
Если для одной номенклатуры в регистре ШтрихкодыНоменклатуры создано два одинаковых штрихкода, типовой запрос выдаст две строки. Рекомендуется также установить расширение "Контроль ценников", которое помогает автоматизировать надзор за актуальностью данных и состоянием цен в магазине.
Что нужно проверить:
Иногда причина кроется в настройках принтера. Если 1С формирует одну страницу, а принтер выдает две, проверьте Размер бумаги. Даже лишний миллиметр в макете заставляет принтер прогонять вторую ленту. В таких случаях хорошо себя показывает специализированная внешняя форма для термопринтера, которая более корректно работает с границами печати и дополнительными свойствами номенклатуры.
Подводя итог, в большинстве случаев для исправления задвоения в УНФ 3.0 достаточно просто указать Тип ценника в шаблоне. Это активирует правильные фильтры в запросе и устранит дубли без вмешательства в программный код. Если же вы разработчик, то добавление метода Свернуть() в модуль менеджера станет окончательным решением этой проблемы.