Как убрать повторение подразделений в печатных формах Т-3 и Т-7 в 1С?

Программист 1С v8.3 (Обычные формы) Управленческий учет
← На главную

При формировании унифицированных печатных форм кадрового учета, таких как «Штатное расписание» (форма Т-3) или «График отпусков» (форма Т-7) в типовых конфигурациях (например, «Управление производственным предприятием 1.3»), пользователи часто сталкиваются с тем, что наименование одного и того же структурного подразделения дублируется в каждой строке по всем входящим в него должностям. Разберем, почему типовой алгоритм работает именно так и как правильно доработать вывод печатной формы, чтобы исключить визуальные дубли без потери информативности при печати.

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

Способ 1. Алгоритм с фиксацией текущего подразделения в цикле вывода

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

Разберем этот алгоритм на примере обработки выборки данных перед выводом секции строки в результирующий ТабличныйДокумент:


ТекущееПодразделение = Неопределено;

Пока ВыборкаСтрок.Следующий() Цикл
    ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
    ОбластьСтрока.Параметры.Заполнить(ВыборкаСтрок);
    
    // Проверяем, изменилось ли подразделение
    Если ВыборкаСтрок.Подразделение = ТекущееПодразделение Тогда
        // Если подразделение то же самое, очищаем его вывод в строке
        ОбластьСтрока.Параметры.Подразделение = "";
    Иначе
        // Если подразделение изменилось, фиксируем новое значение
        ТекущееПодразделение = ВыборкаСтрок.Подразделение;
    КонецЕсли;
    
    ТабДокумент.Вывести(ОбластьСтрока);
КонецЦикла;

Такой подход прост в реализации, однако при многостраничной печати возникает скрытая проблема: если группа должностей одного отдела переносится на следующую страницу, верхняя строка на новом листе окажется с пустым подразделением. Кадровику или проверяющему будет невозможно понять, к какому отделу относятся должности вверху страницы.

Способ 2. Контроль переноса на новую страницу

Чтобы избежать ситуации, когда на новом листе строка начинается с пустого подразделения, дополним алгоритм проверкой разрыва страницы. Для этого воспользуемся методом ТабличныйДокумент.ПроверитьВывод(). Если строка не помещается на текущую страницу, мы принудительно восстанавливаем наименование подразделения в первой строке нового листа, даже если подразделение не изменилось.

Посмотрим на практическую реализацию такого контроля:


ТекущееПодразделение = Неопределено;

Пока ВыборкаСтрок.Следующий() Цикл
    ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
    ОбластьСтрока.Параметры.Заполнить(ВыборкаСтрок);
    
    // Формируем массив для проверки умещаемости строки на текущей странице
    МассивВыводимыхОбластей = Новый Массив;
    МассивВыводимыхОбластей.Добавить(ОбластьСтрока);
    
    НоваяСтраница = НЕ ТабДокумент.ПроверитьВывод(МассивВыводимыхОбластей);
    
    Если НоваяСтраница Тогда
        // Вставляем разделитель страницы для корректной верстки
        ТабДокумент.ВывестиГоризонтальныйРазделительСтраниц();
        // На новой странице обязательно выводим наименование подразделения
        ТекущееПодразделение = ВыборкаСтрок.Подразделение;
    Иначе
        // На текущей странице проверяем совпадение с предыдущей строкой
        Если ВыборкаСтрок.Подразделение = ТекущееПодразделение Тогда
            ОбластьСтрока.Параметры.Подразделение = "";
        Иначе
            ТекущееПодразделение = ВыборкаСтрок.Подразделение;
        КонецЕсли;
    КонецЕсли;
    
    ТабДокумент.Вывести(ОбластьСтрока);
КонецЦикла;

Способ 3. Псевдообъединение ячеек через настройку границ

Использование метода Объединить() для вертикальных диапазонов в коде нередко приводит к визуальным искажениям, если объединенная область пересекает разрыв страницы (текст может обрезаться или пропадать). Вместо физического объединения ячеек часто применяют визуальное псевдообъединение за счет управления границами ячеек.

Разберем порядок оформления границ для группы строк одного подразделения:

  1. У первой строки подразделения выводится текст и отключается нижняя граница ячейки подразделения (ТипЛинииЯчейкиТабличногоДокумента.НетЛинии).
  2. У всех промежуточных строк этого же отдела текст очищается, а у ячейки отключаются и верхняя, и нижняя границы.
  3. У последней строки группы восстанавливается стандартная нижняя граница. Левые и правые границы колонок остаются непрерывными.

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

Способ 4. Разделение макета на заголовок подразделения и состав должностей

Альтернативный архитектурный вариант — изменить саму структуру макета печатной формы:

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

Такой подход полностью устраняет необходимость в скрытии ячеек и очистке параметров, обеспечивая естественную иерархическую структуру штатного расписания.

Рекомендация по сохранению типовой конфигурации на поддержке

Чтобы конфигурация оставалась на полной поддержке и не возникало трудностей при последующих обновлениях типовой конфигурации, не следует изменять типовые общие модули или встроенные макеты документов. Рекомендуется реализовать доработанную форму Т-3 или Т-7 в виде внешней печатной формы (ВПФ) и подключить ее через справочник дополнительных отчетов и обработок.

← На главную