При работе с зарплатными отчетами в крупных организациях часто возникает задача оптимизации печати расчетных листков. Стандартно система может компоновать несколько листков на одной странице А4 для экономии бумаги, однако по требованиям конфиденциальности или для удобства выдачи сотрудникам часто требуется, чтобы каждый расчетный листок начинался с новой страницы. В этой статье мы подробно разберем, как реализовать этот функционал в различных конфигурациях 1С, таких как УПП 1.3, ЗУП 2.5 и современные версии ЗУП 3.1.
В конфигурациях «Управление производственным предприятием» или «Зарплата и управление персоналом» редакции 2.5 отчет РасчетныеЛисткиОрганизаций часто построен с использованием системы компоновки данных (СКД), но финальный вывод в табличный документ управляется программно в модуле объекта. Проанализируем, как можно вмешаться в этот процесс.
Разберем первый способ — принудительную установку свойства НачалоСтраницы. Для этого нам необходимо выполнить следующие шаги в конфигураторе:
РасчетныеЛисткиОрганизаций и откроем его Модуль объекта.ЗадатьИменаОбластямРазбитьТабличныйДокументПоСтраницам. Именно эта процедура отвечает за логику распределения данных по листу.Если ВыводитьПоСтраницам Тогда. Нам нужно изменить стандартную логику, которая пытается «впихнуть» данные, на жесткое разделение.
// Вместо стандартного алгоритма проверки помещаемости листка
// устанавливаем принудительный разрыв страницы для начала каждого листка
ТабличныйДокумент.Область(НомерСтрокиНачалаРЛ, , НомерСтрокиНачалаРЛ,).НачалоСтраницы = Истина;
Этот метод сообщает системе, что строка, с которой начинается новый расчетный листок (НомерСтрокиНачалаРЛ), всегда должна быть первой на новой странице. Это гарантирует, что даже если предыдущий листок занимал всего 1/3 страницы, следующий не напечатается ниже него.
Рассмотрим альтернативный, более простой программный метод, который часто оказывается эффективным в УПП. Проблема «двух листков на одной странице» часто связана с тем, что система пытается уместить данные, используя механизм АвтоМасштаб. Если расчетный листок по ширине или высоте чуть-чуть не проходит в границы, 1С сжимает его, освобождая место для следующего.
Выясним, как это исправить, на примере совета из практики. В той же процедуре ЗадатьИменаОбластямРазбитьТабличныйДокументПоСтраницам найдем строку, устанавливающую масштаб, и закомментируем её:
Процедура ЗадатьИменаОбластямРазбитьТабличныйДокументПоСтраницам(ТабличныйДокумент, ВыводитьПоСтраницам)
// ... какой-то код ...
Если ВыводитьПоСтраницам Тогда
// ТабличныйДокументДляПроверки.АвтоМасштаб = Истина; // закомментировано для вывода одного листка на страницу
КонецЕсли;
// ... продолжение процедуры ...
КонецПроцедуры
Отключение свойства АвтоМасштаб заставляет программу использовать реальные физические размеры областей макета. Если макет расчетного листка настроен так, что он занимает значительную часть страницы, то второй листок просто не поместится и будет перенесен автоматически.
Проанализируем ситуацию в современных версиях программы на управляемых формах. В ЗУП 3.1 разработчики предусмотрели пользовательские настройки, которые позволяют избежать изменения кода. Если нам нужно, чтобы каждый сотрудник выводился на отдельном листе, выполним следующие действия:
Организация, Сотрудник или просто Сотрудник).После применения этих настроек и формирования отчета система автоматически вставит разрывы страниц между данными разных сотрудников. Это штатный механизм СКД, который не требует участия программиста.
Если вышеуказанные способы не помогают, рассмотрим более глубокую настройку через Макеты в схеме компоновки данных. В конфигураторе мы можем открыть схему отчета и перейти на закладку «Макеты».
Посмотрим на ячейки, которые образуют шапку расчетного листка или его подвал. В свойствах этих ячеек (в палитре свойств табличного документа) есть флаг Начало страницы. Если установить его для самой верхней ячейки макета расчетного листка, то при каждой итерации вывода нового сотрудника 1С будет принудительно начинать новый лист.
Также важно обратить внимание на общие параметры страницы. Иногда один листок «налезает» на другой из-за слишком мелких полей. Рекомендуем проверить настройки через меню Файл — Параметры страницы непосредственно в режиме 1С:Предприятие после формирования отчета:
Важный нюанс: при использовании программного метода с ВывестиГоризонтальныйРазделительСтраниц() или свойством НачалоСтраницы, всегда проверяйте результат на предварительном просмотре. Если в цикле печати разрыв страницы ставится перед первым листком, у вас может появиться пустая первая страница. Чтобы этого избежать, добавим условие:
Если НомерСтрокиНачалаРЛ > 1 Тогда
ТабличныйДокумент.Область(НомерСтрокиНачалаРЛ, , НомерСтрокиНачалаРЛ,).НачалоСтраницы = Истина;
КонецЕсли;
Таким образом, мы проанализировали основные способы решения задачи. Выбор метода зависит от вашей конфигурации и того, насколько вы готовы вносить изменения в типовой код программы. Для старых систем (УПП, ЗУП 2.5) оптимально программное вмешательство, а для новых (ЗУП 3.1) — использование расширенных настроек компоновки данных.