При печати ценников в типовой конфигурации «Торговля и Склад» для платформы 1С:Предприятие 7.7 (внешняя печатная форма или обработка Printcen.ert) по умолчанию на листе формата А4 формируется сетка из двух колонок. Часто возникает задача экономии бумаги или использования ценников меньшего формата, когда требуется уместить три и более ценника по горизонтали. Простого визуального уменьшения ширины ячеек в макете печатной формы недостаточно, так как логика переноса строк и колонок жестко заложена в программном коде модуля. Разберем по шагам, как правильно изменить код и настроить параметры формирования таблицы.
Рассмотрим, как работает типовой алгоритм вывода ценников. В модуле обработки за размещение элементов на листе отвечает процедура ДобавитьЦенник(). Проанализируем исходный код типовой процедуры:
Процедура ДобавитьЦенник(Таб, ПечФирма, ПечНаименование, ПечЕдиница, ПечРозн, Столбик, Ряд)
Столбик = ?(Столбик = 0, 1, 0);
Ряд = ?(Столбик = 0, Ряд + 1, Ряд);
Если Ряд > 3 Тогда
Таб.НоваяСтраница();
Ряд = 1;
КонецЕсли;
Если Столбик = 0 Тогда
Таб.ВывестиСекцию("Товар|Ценник");
Иначе
Таб.ПрисоединитьСекцию("Товар|Ценник");
КонецЕсли;
КонецПроцедуры // ДобавитьЦенник()
Выясним причину, почему изменение ширины секции в макете не дает результата без правки кода:
Столбик в типовом варианте принимает всего два значения: 0 (первая колонка) и 1 (вторая колонка). Как только выводится вторая колонка, значение переключается обратно в 0, а счетчик Ряд увеличивается на единицу.Таб.ВывестиСекцию() всегда начинает вывод с новой строки таблицы, а метод Таб.ПрисоединитьСекцию() дописывает секцию справа в текущую строку. При значении Столбик = 0 происходит принудительный перенос на следующую строку.Если Ряд > 3 Тогда отсчитывает количество строк на листе и принудительно вызывает метод Таб.НоваяСтраница(), сбрасывая счетчик строк.Чтобы разместить три ценника по горизонтали, нам необходимо изменить логику переключения переменной Столбик (значения 0, 1, 2) и скорректировать начальную инициализацию переменных перед циклом обхода товаров.
ДобавитьЦенник() заменим условие переключения колонок, чтобы переход на новый ряд происходил только после третьей колонки (индекс 2):
Процедура ДобавитьЦенник(Таб, Фирма, ПечНаименование, ПечЕдиница, ПечРозн, Столбик, Ряд) Экспорт
// Перебираем индексы колонок: 0 -> 1 -> 2 -> 0
Столбик = ?(Столбик = 2, 0, Столбик + 1);
Ряд = ?(Столбик = 0, Ряд + 1, Ряд);
Если Ряд > 3 Тогда
Таб.НоваяСтраница();
Ряд = 1;
КонецЕсли;
Если Столбик = 0 Тогда
Таб.ВывестиСекцию("Товар|Ценник");
Иначе
Таб.ПрисоединитьСекцию("Товар|Ценник");
КонецЕсли;
КонецПроцедуры // ДобавитьЦенник()
Таб = СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("Таблица");
ПечФирма = СокрЛП(Докум.Фирма.ЮрЛицо.ПолнНаименование);
// Устанавливаем начальное значение счетчиков:
Столбик = 2; // При первом вызове (Столбик = 2) инкремент переведет его в 0
Ряд = 0; // Первый вызов увеличит Ряд до 1
После изменения программного кода обязательно проверим настройки печатной формы и физические параметры страницы:
Товар|Ценник помещается в рабочую область страницы формата А4 с учетом непечатаемых областей принтера.
// Параметры: Ориентация (1 - портрет), Масштаб, Автомасштаб (1 - включен), Поля: Слева, Справа, Сверху, Снизу
Таб.ПараметрыСтраницы(1, 100, 1, 5, 5, 5, 5);
Важный момент: Если наименование товара занимает несколько строк, включенный автоматический перенос текста в ячейке может увеличить высоту ценника. Если высота секций будет динамически меняться, это может привести к лишнему переносу страницы драйвером принтера до срабатывания программного условия Таб.НоваяСтраница(). Чтобы этого избежать, зафиксируйте высоту строк в свойствах секции макета или отрегулируйте количество рядов на странице (Если Ряд > N Тогда) под реальный размер ваших ценников.