Как увеличить количество ценников в строке на листе А4 в 1С:Торговля и Склад 7.7?

Программист 1С v7.7 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При печати ценников в типовой конфигурации «Торговля и Склад» для платформы 1С:Предприятие 7.7 (внешняя печатная форма или обработка Printcen.ert) по умолчанию на листе формата А4 формируется сетка из двух колонок. Часто возникает задача экономии бумаги или использования ценников меньшего формата, когда требуется уместить три и более ценника по горизонтали. Простого визуального уменьшения ширины ячеек в макете печатной формы недостаточно, так как логика переноса строк и колонок жестко заложена в программном коде модуля. Разберем по шагам, как правильно изменить код и настроить параметры формирования таблицы.

Анализ типового механизма формирования сетки

Рассмотрим, как работает типовой алгоритм вывода ценников. В модуле обработки за размещение элементов на листе отвечает процедура ДобавитьЦенник(). Проанализируем исходный код типовой процедуры:


Процедура ДобавитьЦенник(Таб, ПечФирма, ПечНаименование, ПечЕдиница, ПечРозн, Столбик, Ряд)
    Столбик = ?(Столбик = 0, 1, 0);
    Ряд     = ?(Столбик = 0, Ряд + 1, Ряд);
    Если Ряд > 3 Тогда
        Таб.НоваяСтраница();
        Ряд = 1;
    КонецЕсли;
    
    Если Столбик = 0 Тогда
        Таб.ВывестиСекцию("Товар|Ценник");
    Иначе
        Таб.ПрисоединитьСекцию("Товар|Ценник");
    КонецЕсли;
КонецПроцедуры // ДобавитьЦенник()

Выясним причину, почему изменение ширины секции в макете не дает результата без правки кода:

  1. Переменная Столбик в типовом варианте принимает всего два значения: 0 (первая колонка) и 1 (вторая колонка). Как только выводится вторая колонка, значение переключается обратно в 0, а счетчик Ряд увеличивается на единицу.
  2. Метод Таб.ВывестиСекцию() всегда начинает вывод с новой строки таблицы, а метод Таб.ПрисоединитьСекцию() дописывает секцию справа в текущую строку. При значении Столбик = 0 происходит принудительный перенос на следующую строку.
  3. Условие Если Ряд > 3 Тогда отсчитывает количество строк на листе и принудительно вызывает метод Таб.НоваяСтраница(), сбрасывая счетчик строк.

Пошаговая доработка кода для вывода трех ценников в ряд

Чтобы разместить три ценника по горизонтали, нам необходимо изменить логику переключения переменной Столбик (значения 0, 1, 2) и скорректировать начальную инициализацию переменных перед циклом обхода товаров.

  1. Изменение процедуры вывода ценника. В процедуре ДобавитьЦенник() заменим условие переключения колонок, чтобы переход на новый ряд происходил только после третьей колонки (индекс 2):

Процедура ДобавитьЦенник(Таб, Фирма, ПечНаименование, ПечЕдиница, ПечРозн, Столбик, Ряд) Экспорт
    // Перебираем индексы колонок: 0 -> 1 -> 2 -> 0
    Столбик = ?(Столбик = 2, 0, Столбик + 1);
    Ряд     = ?(Столбик = 0, Ряд + 1, Ряд);
    
    Если Ряд > 3 Тогда
        Таб.НоваяСтраница();
        Ряд = 1;
    КонецЕсли;
    
    Если Столбик = 0 Тогда
        Таб.ВывестиСекцию("Товар|Ценник");
    Иначе
        Таб.ПрисоединитьСекцию("Товар|Ценник");
    КонецЕсли;
КонецПроцедуры // ДобавитьЦенник()
  1. Инициализация переменных перед формированием печатной формы. Посмотрим, как должны быть инициализированы переменные в основной процедуре печати перед началом цикла вывода:

Таб = СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("Таблица");

ПечФирма = СокрЛП(Докум.Фирма.ЮрЛицо.ПолнНаименование);

// Устанавливаем начальное значение счетчиков:
Столбик = 2; // При первом вызове (Столбик = 2) инкремент переведет его в 0
Ряд     = 0; // Первый вызов увеличит Ряд до 1

Корректировка макета и параметров страницы

После изменения программного кода обязательно проверим настройки печатной формы и физические параметры страницы:

  1. Ширина секции в макете. Откроем макет печатной таблицы и убедимся, что суммарная ширина трех секций Товар|Ценник помещается в рабочую область страницы формата А4 с учетом непечатаемых областей принтера.
  2. Программная настройка полей и масштаба. Чтобы избежать случайного урезания колонок драйвером принтера, зададим параметры страницы непосредственно в коде перед выводом таблицы:

// Параметры: Ориентация (1 - портрет), Масштаб, Автомасштаб (1 - включен), Поля: Слева, Справа, Сверху, Снизу
Таб.ПараметрыСтраницы(1, 100, 1, 5, 5, 5, 5);

Важный момент: Если наименование товара занимает несколько строк, включенный автоматический перенос текста в ячейке может увеличить высоту ценника. Если высота секций будет динамически меняться, это может привести к лишнему переносу страницы драйвером принтера до срабатывания программного условия Таб.НоваяСтраница(). Чтобы этого избежать, зафиксируйте высоту строк в свойствах секции макета или отрегулируйте количество рядов на странице (Если Ряд > N Тогда) под реальный размер ваших ценников.

← На главную