Почему при печати этикеток в 1С выводится по две штуки вместо одной и как это исправить?

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

В процессе работы с конфигурациями на базе современной платформы (например, 1С:Управление нашей фирмой 3.0 или 1С:Розница 3.0) пользователи часто сталкиваются с досадной проблемой: при попытке напечатать одну этикетку принтер выдает две. Проблема сохраняется даже при возврате к типовому макету, поэтому многие специалисты предпочитают использовать проверенные внешние печатные формы для УНФ 3.0, чтобы избежать ошибок стандартного функционала. В этой статье мы подробно разберем, почему это происходит, проанализируем программный код и найдем способы решения.

Разберем причину возникновения проблемы

Проанализируем ситуацию: задвоение (или дублирование) строк при печати обычно связано с тем, что на этапе подготовки данных в табличную часть попадает лишняя запись. Выясним причину такого поведения. Как показывает практика и анализ кода, корень проблемы кроется в обработке ПечатьЭтикетокИЦенников, а именно в процедуре ПодготовитьДанныеДляПечати модуля менеджера.

В современных релизах 1С алгоритм формирования данных для печати стал крайне сложным. Он включает в себя работу с временными таблицами, множественные соединения с регистрами цен, штрихкодов и остатков. Чтобы не разбираться в сложном коде, часто проще внедрить готовую обработку для печати ценников с показом остатков, где эти механизмы уже оптимизированы. Если системе не хватает данных для идентификации типа печати, она выполняет соединения (LEFT JOIN), которые могут приводить к декартову произведению строк.

Решение №1: Быстрое исправление через настройки шаблона

Рассмотрим самый простой способ, который помогает в 90% случаев без изменения программного кода. Выяснилось, что в логике конфигурации заложен жесткий фильтр по назначению шаблона. Если это поле не заполнено, запрос начинает «сходить с ума».

Выполним следующие шаги:

  1. Перейдем в справочник Шаблоны этикеток и ценников.
  2. Откроем тот шаблон, который используется для печати. Если вы создаете новые варианты, за основу можно взять набор примеров макетов ценников и этикеток для вашей версии программы.
  3. Найдем поле Тип ценника (в некоторых версиях оно может называться «Назначение»).
  4. Обязательно выберем значение из списка, например, Ценник или Этикетка.
  5. Запишем изменения и попробуем вывести печать повторно.

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

Решение №2: Программный анализ и «костыль» в коде

Если первый способ не помог, разберем ситуацию на уровне кода. Рассмотрим фрагмент формирования таблицы ЦеныНоменклатуры, где использование ОБЪЕДИНИТЬ ВСЕ без четких условий может привести к тому, что номенклатура попадет в выборку дважды.


ВЫБРАТЬ РАЗРЕШЕННЫЕ
    ТоварыСЦенами.Номенклатура КАК Номенклатура,
    ТоварыСЦенами.ВидЦен КАК ВидЦен,
    ТоварыСЦенами.Цена КАК Цена
ПОМЕСТИТЬ ЦеныНоменклатуры
ИЗ
    ТоварыСЦенамиПоВидамЦен КАК ТоварыСЦенами
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
    ТоварыСЦенами.Номенклатура,
    ТоварыСЦенами.ВидЦен,
    ТоварыСЦенами.Цена
ИЗ
    ТоварыСЦенами КАК ТоварыСЦенами;

Чтобы гарантированно исправить это программно, мы можем применить метод Свернуть() к результату выполнения запроса в модуле менеджера. Это особенно важно, когда реализуется печать этикеток и ценников из документа Заказ покупателя, где данные собираются из нескольких источников одновременно.


// Получаем результат запроса
ТаблицаРезультат = Запрос.Выполнить().Выгрузить();

// Сворачиваем таблицу по ключевым полям
ПоляГруппировки = "Номенклатура, Характеристика, Партия, Серия, ЕдиницаИзмерения, Штрихкод, ШаблонЭтикеткиДляПечати";
ПоляСуммирования = "КоличествоЭтикетокДляПечати, КоличествоЦенниковДляПечати";

ТаблицаРезультат.Svernut(ПоляГруппировки, ПоляСуммирования);

Решение №3: Проверка дублей в регистрах

Если для одной номенклатуры в регистре ШтрихкодыНоменклатуры создано два одинаковых штрихкода, типовой запрос выдаст две строки. Рекомендуется также установить расширение "Контроль ценников", которое помогает автоматизировать надзор за актуальностью данных и состоянием цен в магазине.

Что нужно проверить:

  1. Откроем карточку проблемного товара и перейдем в раздел Штрихкоды.
  2. Убедимся, что там нет дублирующихся записей для одной связки «Номенклатура + Характеристика» (поможет обработка поиска и устранения дублей в регистрах).

Дополнительные факторы: Параметры страницы и драйвер

Иногда причина кроется в настройках принтера. Если 1С формирует одну страницу, а принтер выдает две, проверьте Размер бумаги. Даже лишний миллиметр в макете заставляет принтер прогонять вторую ленту. В таких случаях хорошо себя показывает специализированная внешняя форма для термопринтера, которая более корректно работает с границами печати и дополнительными свойствами номенклатуры.

Подводя итог, в большинстве случаев для исправления задвоения в УНФ 3.0 достаточно просто указать Тип ценника в шаблоне. Это активирует правильные фильтры в запросе и устранит дубли без вмешательства в программный код. Если же вы разработчик, то добавление метода Свернуть() в модуль менеджера станет окончательным решением этой проблемы.

← На главную