При разработке внешних печатных форм в среде 1С:Предприятие 8.3, особенно для конфигурации Зарплата и управление персоналом 3.1, программисты часто сталкиваются с необходимостью изменить визуальное представление стандартных отчетов, таких как Унифицированная форма Т-2. Проблема заключается в том, что типовые отчеты построены на системе компоновки данных (СКД), и простая подмена макета в коде не всегда очевидна. Разберем подробно, как правильно «подменить» типовой макет своим собственным, сохранив при этом бизнес-логику формирования данных.
Рассмотрим ситуацию, когда разработчик пытается создать внешнюю печатную форму, используя следующий код:
ОтчетТ2 = Отчеты.УнифицированнаяФормаТ2.Создать();
ОтчетТ2.ИнициализироватьОтчет();
// ... настройка компоновщика ...
ОтчетТ2.СкомпоноватьРезультат(ДокументРезультат);
Основная ошибка здесь заключается в строке Отчеты.УнифицированнаяФормаТ2.Создать(). В этом случае система обращается к объекту метаданных, который находится внутри основной конфигурации. Даже если вы создали внешнюю обработку и добавили в неё измененный макет, вызов этого кода всегда будет приводить к выполнению оригинального кода и использованию оригинального макета из состава конфигурации. Чтобы изменения вступили в силу, нам необходимо полностью изолировать логику во внешнем объекте или использовать механизм расширений.
Это классический путь, когда конфигурация находится на поддержке и мы не хотим её менять. Посмотрим на последовательность действий, которую необходимо выполнить:
УнифицированнаяФормаТ2.Проанализируем правильный вариант программного вызова внутри внешней печатной формы:
Функция СформироватьТабДок(МассивОбъектов, ОбъектыПечати) Экспорт
ДокументРезультат = Новый ТабличныйДокумент;
// Получаем схему из макета нашей ВНЕШНЕЙ обработки
СхемаКД = ЭтотОбъект.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
// Инициализируем настройки
Настройки = СхемаКД.НастройкиПоУмолчанию;
// Устанавливаем отборы по сотрудникам
Отбор = Настройки.Отбор;
Отбор.Элементы.Очистить();
ОбщегоНазначенияКлиентСервер.ДобавитьЭлементКомпоновки(Отбор, "РабочееМесто.Сотрудник", ВидСравненияКомпоновкиДанных.ВСписке, МассивОбъектов);
// Компоновка макета
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКД, Настройки);
// Выполнение компоновки
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
// Вывод результата
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
Возврат ДокументРезультат;
КонецФункции
В данном примере мы используем ЭтотОбъект.ПолучитьМакет(), что гарантирует использование схемы, встроенной именно в вашу внешнюю обработку, а не типовой схемы из конфигурации.
Если ваша задача — изменить не просто шрифт, а структуру печатной формы (расположение ячеек, объединение строк), лучше всего воспользоваться штатным механизмом макетов внутри самой СКД. Рассмотрим, как это работает:
В конструкторе схемы компоновки данных есть вкладка «Макеты». Вместо того чтобы полагаться на автоматическую генерацию таблицы, мы можем жестко задать области макета:
РабочееМесто.Сотрудник.ФИО).СкомпоноватьРезультат СКД автоматически подставит ваш оформленный макет вместо стандартного серого оформления.Это наиболее гибкий способ, так как он позволяет сохранить все преимущества СКД (отборы, сортировки, пользовательские настройки), но при этом получить полностью индивидуальный внешний вид отчета.
В некоторых случаях типовой отчет Т-2 в ЗУП 3.1 использует программную установку макетов оформления через настройки. Если мы хотим изменить только цветовое решение или стиль, мы можем воздействовать на ПараметрыВывода. Разберем пример кода:
ПараметрМакета = ОтчетТ2.КомпоновщикНастроек.Настройки.ПараметрыВывода.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("AppearanceCustomObject"));
Если ПараметрМакета <> Неопределено Тогда
ПараметрМакета.Значение = "МойСобственныйМакетОформления";
ПараметрМакета.Использование = Истина;
КонецЕсли;
Важно помнить, что AppearanceCustomObject (Макет оформления) должен быть предварительно создан в метаданных или доступен системе. Однако для глубокой кастомизации формы Т-2 этот способ редко бывает достаточным, так как Т-2 — это сложный многостраничный документ.
Если политика обслуживания системы позволяет использовать расширения, это будет самым современным и правильным решением. В расширении мы можем перехватить метод формирования отчета. Выясним, как это реализовать:
УнифицированнаяФормаТ2.&Вместо для процедуры, отвечающей за печать или компоновку.Пример перехвата метода в модуле менеджера или объекта отчета через расширение:
&Вместо("СформироватьТабличныйДокумент")
Функция Мой_СформироватьТабличныйДокумент(Параметры)
// Здесь мы можем либо вызвать основной код и потом его доработать,
// либо полностью заменить логику, указав путь к нашему макету в расширении
ТабДок = ПродолжитьВызов(Параметры);
// Дополнительная обработка ТабДок...
Возврат ТабДок;
КонецФункции
Проанализируем специфику конкретно формы Т-2. В последних редакциях ЗУП 3.1 формирование Т-2 завязано на сложные механизмы БСП (Библиотеки стандартных подсистем). Часто данные собираются не одним запросом в СКД, а серией вызовов функций в модулях КадровыйУчет, ЗарплатаКадрыСоставОбъектов и других.
Важный совет: Если вы решили полностью скопировать код формирования во внешнюю печатную форму, приготовьтесь к тому, что вам придется «вытягивать» и многие сопутствующие функции из модулей менеджера типового отчета, так как они могут иметь область видимости БезКонтекста или быть экспортными, но завязанными на внутреннюю структуру отчета. Проверьте, чтобы в коде внешней формы не осталось вызовов типа ЭтотОбъект.Метаданные().Имя, которые во внешней обработке вернут имя файла на диске, а не имя отчета в конфигурации.
Выясним причину, по которой часто не удается просто «подменить макет» в СКД. СКД — это декларативный механизм. Когда вы вызываете СкомпоноватьРезультат, вы отдаете управление процессору вывода. Чтобы он использовал ваш макет, он должен знать о его существовании либо через вкладку «Макеты» внутри схемы, либо через программную инициализацию ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент с предварительной ручной обработкой областей.
Для успешной реализации задачи во внешней печатной форме мы рекомендуем придерживаться Способа 1 (полный перенос схемы и логики компоновки в объект внешней обработки). Это обеспечит независимость вашего кода от обновлений конфигурации и даст полный контроль над процессом вывода. Если же вы хотите лишь слегка поправить визуальную часть, используйте вкладку «Макеты» в конструкторе СКД вашей внешней обработки — это самый надежный способ «приручить» оформление компоновки данных.