Как печатать ценники в 3 столбца вместо 2 в стандартной обработке 1С?

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

Нам часто приходится сталкиваться с задачей оптимизации использования расходных материалов, и печать ценников не является исключением. Стандартная обработка 1С "Печать ценников" во многих конфигурациях по умолчанию выводит ценники в два столбца, что приводит к нерациональному расходу бумаги. В этой статье мы подробно разберем, как изменить эту логику и настроить печать ценников в три столбца, модифицируя программный код стандартной обработки. Это позволит нам не только экономить бумагу, но и печатать больше ценников на одном листе.

Хотя существуют различные внешние обработки, они не всегда универсальны и могут не подключаться к специфическим модулям (например, к модулю обновления цен), что делает прямое изменение стандартной обработки более привлекательным решением в некоторых случаях. Мы будем работать непосредственно с кодом 1С, поэтому нам потребуется доступ к "Конфигуратору".

Понимание принципа многоколоночной печати в 1С

Прежде чем погружаться в код, давайте выясним, как в 1С формируется табличный документ с несколькими колонками. Основной принцип заключается в последовательном "присоединении" секций. Система работает так:

  1. Первый элемент (ценник) выводится на строку с помощью метода Таб.ВывестиСекцию().
  2. Последующие элементы (ценники в той же строке) присоединяются к уже выведенной секции с помощью метода Таб.ПрисоединитьСекцию().
  3. Когда заданное количество столбцов заполнено, система переходит на новую строку, снова используя Таб.ВывестиСекцию() для первого элемента новой строки.

Этой логикой управляют счетчики столбцов и рядов. Наша задача — скорректировать эти счетчики так, чтобы они отсчитывали три столбца вместо двух.

Подготовка макета в "Конфигураторе"

Прежде чем изменять код, нам необходимо убедиться, что макет печатной формы в "Конфигураторе" готов для размещения трех столбцов. Если стандартный макет рассчитан строго на два столбца, нам придется его изменить. Рассмотрим шаги:

  1. Запустите 1С в режиме "Конфигуратор".
  2. Откройте конфигурацию, перейдя в меню "Конфигурация" -> "Открыть конфигурацию".
  3. В дереве конфигурации найдите раздел "Обработки" и разверните его.
  4. Найдите обработку, отвечающую за печать ценников (часто она называется "Печать ценников", "Ценники" или подобно). Откройте ее.
  5. Перейдите на вкладку "Макеты". Здесь вы увидите макеты печатных форм. Откройте макет, который используется для ценников (обычно это табличный документ).
  6. В табличном редакторе визуально проверьте или измените макет, чтобы он мог вмещать три ценника по горизонтали. Возможно, потребуется уменьшить ширину ячеек, отвечающих за один ценник, или изменить объединение ячеек. Убедитесь, что для ценника предусмотрена секция (например, "Товар|Ценник"), которая повторяется три раза по ширине. Если макет очень жестко привязан к двум столбцам, возможно, вам придется немного переработать его структуру.

После того как макет будет визуально готов, мы можем приступать к изменению кода.

Анализ исходного кода и постановка задачи

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


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

В этом коде строка Столбик = ?(Столбик = 0, 1 , 0); явно указывает на двухколоночную логику. Когда Столбик равен 0 (первый столбец), он становится 1 (второй столбец), а когда Столбик не равен 0 (то есть, он уже 1, второй столбец), он сбрасывается в 0, и происходит переход на новый ряд. Нам нужно изменить эту логику, чтобы счетчик проходил значения 0, 1, 2, а затем сбрасывался в 0.

Также нам важно посмотреть на вызов этой процедуры из основной процедуры формирования отчета Сформировать:


// ... (начало процедуры Сформировать) ...
Процедура Сформировать(ТаблицаТоваров,ПечФирма)
    Таб = СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("Таблица");
    Столбик = 1; // Исходное значение Столбик перед циклом
    Ряд = 0;
    ТаблицаТоваров.ВыбратьСтроки;
    Пока ТаблицаТоваров.ПолучитьСтроку = 1 Цикл
        // ... (формирование ПечРозн, ПечНаименование) ...
        ДобавитьЦенник(Таб, ПечФирма, ТаблицаТоваров.Товар, ТаблицаТоваров.Единица, ПечРозн, Столбик, Ряд);
        // ...
    КонецЦикла;
    // ...
КонецПроцедуры
// ... (конец процедуры Сформировать) ...

Обратите внимание на строку Столбик = 1;. Это начальное значение счетчика столбцов перед первым вызовом ДобавитьЦенник, которое также может влиять на корректность печати первого ценника.

Шаг 1: Изменяем логику счетчика столбцов в процедуре "ДобавитьЦенник"

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

  1. Откройте обработку "Печать ценников" в "Конфигураторе".
  2. Перейдите на вкладку "Модуль".
  3. Найдите процедуру ДобавитьЦенник.
  4. Найдите строку: Столбик = ?(Столбик = 0, 1 , 0);
  5. Замените ее на: Столбик = ?(Столбик = 2, 0, Столбик + 1);

Разберем это изменение подробнее:

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

Шаг 2: Корректируем начальное значение счетчика "Столбик" в процедуре "Сформировать"

После внесения изменений в процедуру ДобавитьЦенник, мы можем столкнуться с тем, что первый ценник на странице или в некоторых случаях на второй странице отображается некорректно (например, печатается только один ценник вместо трех). Это происходит из-за начального значения переменной Столбик, которая передается в процедуру ДобавитьЦенник при первом вызове.

В исходном коде перед циклом было установлено Столбик = 1;. Если мы оставим это значение, то при первом вызове ДобавитьЦенник переменная Столбик будет равна 1. Внутри процедуры она станет 2, и затем сбросится в 0. Это запутает логику. Нам нужно, чтобы при первом вызове ДобавитьЦенник (для первого ценника), счетчик Столбик сразу же стал 0, чтобы первый ценник был выведен как "первый в строке".

  1. В той же обработке "Печать ценников" найдите процедуру Сформировать.
  2. Найдите строку: Столбик = 1;
  3. Замените ее на: Столбик = 2;

Давайте проанализируем, почему Столбик = 2; является правильным начальным значением:

Это простое, но критически важное изменение позволяет синхронизировать начальное состояние счетчика с новой логикой трех столбцов.

Шаг 3: Проверка количества рядов на странице

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

Если вы хотите изменить количество рядов на странице (например, сделать 4 или 6), вам нужно изменить число 5 в этой строке:


Если Ряд > 5 Тогда // Измените 5 на нужное количество рядов
    Таб.НоваяСтраница;
    Ряд = 1;
КонецЕсли;

Альтернативный вариант кода для "ДобавитьЦенник"

Существует также немного иной, но функционально эквивалентный способ записи логики изменения Столбик в процедуре ДобавитьЦенник. Он может быть более понятным для тех, кто предпочитает явные условия вместо тернарного оператора:

  1. Найдите процедуру ДобавитьЦенник.
  2. Замените строку Столбик = ?(Столбик = 2, 0, Столбик + 1); на следующий блок кода:
    
    Если Столбик = 2 Тогда
        Столбик = 0;
    Иначе
        Столбик = Столбик + 1;
    КонецЕсли;
    

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


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

В данном примере также указано Ряд > 4, что соответствует тому, что на странице может быть 5 рядов (ряды 1, 2, 3, 4, 5). Когда Ряд становится 6, то есть Ряд > 5, происходит переход на новую страницу. Поэтому Ряд > 4 или Ряд > 5 зависит от того, как мы хотим считать количество рядов и какой максимальный номер ряда мы допускаем на одной странице.

Важные замечания и рекомендации

  1. Тестирование: После любых изменений в коде всегда проводите тщательное тестирование. Распечатайте несколько ценников, чтобы убедиться, что все столбцы и ряды заполняются корректно, нет пустых мест, и переход на новую страницу происходит в нужный момент.
  2. Резервное копирование: Перед внесением любых изменений в конфигурацию 1С обязательно создайте резервную копию базы данных. Это позволит вам вернуться к исходному состоянию в случае возникновения непредвиденных проблем.
  3. Версия 1С: Представленный код характерен для платформы 1С:Предприятие 7.7. В более современных версиях (1С:Предприятие 8.х) подход к настройке печатных форм может быть более гибким и включать визуальные редакторы макетов в пользовательском режиме (например, в "1С:Рознице" или "1С:УНФ" через рабочее место "Печать этикеток и ценников"). Однако базовый принцип программного управления секциями остается схожим.
  4. Добавление полей: Независимо от количества столбцов, вы всегда можете настроить шаблон ценника для вывода дополнительной информации: штрих-кода, артикула, акционных цен, логотипа. Это делается путем редактирования макета в "Конфигураторе" и соответствующего заполнения полей в коде.

Заключение

Мы успешно разобрали и применили изменения, которые позволяют стандартной обработке "Печать ценников" выводить ценники в три столбца вместо двух. Ключевыми моментами были корректировка логики счетчика Столбик в процедуре ДобавитьЦенник и правильная установка его начального значения в процедуре Сформировать. Понимание того, как работают методы ВывестиСекцию и ПрисоединитьСекцию, а также внимательное управление счетчиками столбцов и рядов, позволяет нам эффективно настраивать печатные формы 1С под наши нужды.

Такие точечные изменения помогают нам максимально использовать функционал стандартных обработок, избегая сложностей с внедрением и поддержкой внешних решений, если это не требуется для более сложных задач. Успехов в оптимизации вашей работы с 1С!

← На главную