Разберем классическую задачу разработчиков в 1С:ЗУП 3.1 — создание внешней печатной формы табеля учета рабочего времени (форма Т-12), в которой дни выводятся в одну строку (в один "этаж"), а не разбиваются на две строки по 15 дней. Рассмотрим подробнее, с какими архитектурными особенностями мы столкнемся, как правильно выводить данные и раскрашивать ячейки выходных дней. Для сопоставления результатов или вывода альтернативной структуры отчета можно использовать отчет для план-фактного анализа отработанного времени с итогами по видам времени.
Стандартные типовые формы (Т-13 и Т-12) разбиты на два «этажа» (с 1 по 15 и с 16 по 31 число) исключительно ради экономии места. Это позволяет форме нормально читаться на стандартном листе формата А4 при книжной ориентации. Если мы разместим все 31 день в одну строку плюс добавим колонки с итогами отработанных часов за месяц, таблица значительно расширится вправо.
Чтобы итоговый табличный документ корректно выводился на печать и не обрезался, проанализируем настройки вывода. Нам необходимо программно задать жесткие параметры страницы результирующего документа:
ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
ТабДок.АвтоМасштаб = Истина;
В конфигурации 1С:ЗУП 3.1 существует известная архитектурная особенность учета рабочего времени. Если сотрудник в середине месяца был переведен на другую должность или в другое подразделение, типовой табель может вести себя двояко:
При написании собственного запроса для внешней печатной формы этот момент нужно обязательно учесть. Убедитесь, что часы до и после перевода ложились корректно в привязке к правильному подразделению и должности.
Выясним причину еще одной сложности. Если у сотрудника в один день зарегистрирована Явка (Я) и Ночные часы (Н) или Сверхурочные (С), в типовом «двухэтажном» табеле под это выделяются верхняя и нижняя ячейки в рамках одного дня. В однострочном табеле нам придется программно склеивать эти данные через разделитель. Например, выводить в одной ячейке строку вида Я8/Н2.
Обратите внимание: это потребует небольшого расширения колонок дней в макете, иначе сдвоенный текст при печати просто обрежется.
Часто заказчики просят визуально выделить (раскрасить) праздничные и выходные дни в шапке табеля. Посмотрим на пример решения этой задачи без изменения текста в макете на параметры. Пройтись по области шапки можно программно уже на этапе вывода в табличный документ.
Алгоритм действий следующий:
// Вывод области и получение ее координат
ОбластьОформления = ТабДок.Вывести(ОбластьШапка);
// Пример обхода ячеек (условный код)
Для НомерДня = 1 По КоличествоДнейВМесяце Цикл
Если ЭтоВыходной(НомерДня) Тогда
ТабДок.Область(НомерСтроки, КолонкаДня).ЦветФона = WebЦвета.Красный;
КонецЕсли;
КонецЦикла;
Важное замечание: категорически нельзя опираться только на функцию ДеньНедели(). Необходимо делать запрос к регистру сведений данных производственного календаря (с учетом вашей локализации, например, календаря Республики Казахстан). Только так вы учтете национальные праздники и переносы выходных дней, и раскраска будет достоверной.
Разработка сложных печатных форм через Систему Компоновки Данных (СКД) — это мощный современный подход, который отлично подходит для табелей и позволяет сэкономить массу времени на ручной отрисовке.
Разберем по шагам, как это работает:
Сотрудник, а колонки — группировка по полю Дата (от 1 до конца месяца).Чтобы решить проблему с шапкой и подвалом, применяют следующий подход: макет СКД генерируют программно в невидимый (временный) табличный документ. Затем из него аккуратно копируют готовую сгенерированную сетку дней и сотрудников в итоговый документ печати, прикрепляя к ней сверху и снизу нужные стандартизированные области из обычного Макет.ПолучитьОбласть(). Это позволяет объединить мощь условного оформления СКД и строгие стандарты регламентированных печатных форм. Для модификации сформированных табличных документов печатных форм без изменения типового кода можно использовать методику постобработки печатных форм на базе БСП.