Нам часто приходится сталкиваться с задачей оптимизации использования расходных материалов, и печать ценников не является исключением. Стандартная обработка 1С "Печать ценников" во многих конфигурациях по умолчанию выводит ценники в два столбца, что приводит к нерациональному расходу бумаги. В этой статье мы подробно разберем, как изменить эту логику и настроить печать ценников в три столбца, модифицируя программный код стандартной обработки. Это позволит нам не только экономить бумагу, но и печатать больше ценников на одном листе.
Хотя существуют различные внешние обработки, они не всегда универсальны и могут не подключаться к специфическим модулям (например, к модулю обновления цен), что делает прямое изменение стандартной обработки более привлекательным решением в некоторых случаях. Мы будем работать непосредственно с кодом 1С, поэтому нам потребуется доступ к "Конфигуратору".
Прежде чем погружаться в код, давайте выясним, как в 1С формируется табличный документ с несколькими колонками. Основной принцип заключается в последовательном "присоединении" секций. Система работает так:
Таб.ВывестиСекцию().Таб.ПрисоединитьСекцию().Таб.ВывестиСекцию() для первого элемента новой строки.Этой логикой управляют счетчики столбцов и рядов. Наша задача — скорректировать эти счетчики так, чтобы они отсчитывали три столбца вместо двух.
Прежде чем изменять код, нам необходимо убедиться, что макет печатной формы в "Конфигураторе" готов для размещения трех столбцов. Если стандартный макет рассчитан строго на два столбца, нам придется его изменить. Рассмотрим шаги:
После того как макет будет визуально готов, мы можем приступать к изменению кода.
Давайте посмотрим на первоначальный код из обработки "Печать ценников", который отвечает за добавление ценника и управление столбцами и рядами:
// ... (начало процедуры ДобавитьЦенник) ...
Процедура ДобавитьЦенник(Таб, ПечФирма, ПечНаименование, ПечЕдиница, ПечРозн, Столбик, Ряд)
Столбик = ?(Столбик = 0, 1 , 0); // Исходная строка, которая управляет столбцами
Ряд = ?(Столбик = 0, Ряд + 1, Ряд);
Если Ряд > 5 Тогда
Таб.НоваяСтраница;
Ряд = 1;
КонецЕсли;
Если Столбик = 0 Тогда
Таб.ВывестиСекцию("Товар|Ценник");
Иначе
Таб.ПрисоединитьСекцию("Товар|Ценник");
КонецЕсли;
КонецПроцедуры
// ... (конец процедуры ДобавитьЦенник) ...
В этом коде строка Столбик = ?(Столбик = 0, 1 , 0); явно указывает на двухколоночную логику. Когда Столбик равен 0 (первый столбец), он становится 1 (второй столбец), а когда Столбик не равен 0 (то есть, он уже 1, второй столбец), он сбрасывается в 0, и происходит переход на новый ряд. Нам нужно изменить эту логику, чтобы счетчик проходил значения 0, 1, 2, а затем сбрасывался в 0.
Также нам важно посмотреть на вызов этой процедуры из основной процедуры формирования отчета Сформировать:
// ... (начало процедуры Сформировать) ...
Процедура Сформировать(ТаблицаТоваров,ПечФирма)
Таб = СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("Таблица");
Столбик = 1; // Исходное значение Столбик перед циклом
Ряд = 0;
ТаблицаТоваров.ВыбратьСтроки;
Пока ТаблицаТоваров.ПолучитьСтроку = 1 Цикл
// ... (формирование ПечРозн, ПечНаименование) ...
ДобавитьЦенник(Таб, ПечФирма, ТаблицаТоваров.Товар, ТаблицаТоваров.Единица, ПечРозн, Столбик, Ряд);
// ...
КонецЦикла;
// ...
КонецПроцедуры
// ... (конец процедуры Сформировать) ...
Обратите внимание на строку Столбик = 1;. Это начальное значение счетчика столбцов перед первым вызовом ДобавитьЦенник, которое также может влиять на корректность печати первого ценника.
Первое и ключевое изменение касается логики инкремента и сброса переменной Столбик. Вместо того чтобы переключаться между 0 и 1, нам нужно, чтобы Столбик принимал значения 0, 1, 2, а затем, достигнув 2 (третий столбец), сбрасывался в 0 для перехода на новую строку. Этого мы достигнем, заменив одну строку кода.
ДобавитьЦенник.
Столбик = ?(Столбик = 0, 1 , 0);
Столбик = ?(Столбик = 2, 0, Столбик + 1);
Разберем это изменение подробнее:
?(Столбик = 2, 0, Столбик + 1) — это тернарный оператор. Он означает:
Столбик равен 2 (то есть, мы только что обработали третий ценник в текущей строке), то присвоить Столбик значение 0. Это подготовит систему для вывода первого ценника в следующей строке, используя Таб.ВывестиСекцию().Столбик равен 0 или 1), увеличить Столбик на 1. Это позволит нам перейти к следующему столбцу в текущей строке, используя Таб.ПрисоединитьСекцию().Таким образом, счетчик Столбик будет последовательно принимать значения: 0 (для первого ценника), 1 (для второго), 2 (для третьего), а затем сбрасываться в 0. Эта логика идеально подходит для трехколоночной печати.
После внесения изменений в процедуру ДобавитьЦенник, мы можем столкнуться с тем, что первый ценник на странице или в некоторых случаях на второй странице отображается некорректно (например, печатается только один ценник вместо трех). Это происходит из-за начального значения переменной Столбик, которая передается в процедуру ДобавитьЦенник при первом вызове.
В исходном коде перед циклом было установлено Столбик = 1;. Если мы оставим это значение, то при первом вызове ДобавитьЦенник переменная Столбик будет равна 1. Внутри процедуры она станет 2, и затем сбросится в 0. Это запутает логику. Нам нужно, чтобы при первом вызове ДобавитьЦенник (для первого ценника), счетчик Столбик сразу же стал 0, чтобы первый ценник был выведен как "первый в строке".
Сформировать.
Столбик = 1;
Столбик = 2;
Давайте проанализируем, почему Столбик = 2; является правильным начальным значением:
ДобавитьЦенник, переменная Столбик передается со значением 2.ДобавитьЦенник, строка Столбик = ?(Столбик = 2, 0, Столбик + 1); сработает так: поскольку Столбик = 2, он будет сброшен на 0.Если Столбик = 0 Тогда Таб.ВывестиСекцию...).Это простое, но критически важное изменение позволяет синхронизировать начальное состояние счетчика с новой логикой трех столбцов.
В исходном коде была строка Если Ряд > 5 Тогда, которая определяет, сколько рядов ценников помещается на одной странице перед переходом на новую. Если вы хотите, чтобы на странице было, например, 5 рядов ценников, то эта строка останется актуальной. Однако, если вы меняли размеры ценников в макете, чтобы вместить три столбца, возможно, вам придется скорректировать и количество рядов. Например, если ценники стали больше или меньше, и на страницу помещается другое количество рядов. В данном случае, судя по форуму, 5 рядов остались удовлетворительными.
Если вы хотите изменить количество рядов на странице (например, сделать 4 или 6), вам нужно изменить число 5 в этой строке:
Если Ряд > 5 Тогда // Измените 5 на нужное количество рядов
Таб.НоваяСтраница;
Ряд = 1;
КонецЕсли;
Существует также немного иной, но функционально эквивалентный способ записи логики изменения Столбик в процедуре ДобавитьЦенник. Он может быть более понятным для тех, кто предпочитает явные условия вместо тернарного оператора:
ДобавитьЦенник.Столбик = ?(Столбик = 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С под наши нужды.
Такие точечные изменения помогают нам максимально использовать функционал стандартных обработок, избегая сложностей с внедрением и поддержкой внешних решений, если это не требуется для более сложных задач. Успехов в оптимизации вашей работы с 1С!