В процессе автоматизации кадрового учета часто возникает необходимость дополнить стандартные печатные формы 1С, например, приказ о предоставлении отпуска (Т-6), специфическими данными. Если печатная форма реализована на базе Системы Компоновки Данных (СКД), простое добавление поля в запрос не всегда приводит к желаемому результату. Давайте разберем, почему это происходит и как правильно решить задачу, не внося изменений в типовую конфигурацию.
При использовании СКД в печатных формах 1С вывод данных жестко ограничен настройками компоновки. Даже если вы добавили нужное поле в Запрос и Выбранные поля, отчет может не вывести это значение, если оно отсутствует в Структуре отчета. СКД воспринимает поле как лишнее, если оно не участвует в группировке или детальных записях. Кроме того, прямое изменение типовых отчетов затрудняет последующее обновление конфигурации.
Наиболее корректный способ модификации — создание Внешней печатной формы (ВПФ). Это позволяет перехватить процесс формирования документа и программно изменить настройки отчета перед его выводом. Рассмотрим этот процесс по шагам.
Для начала нам необходимо определить процедуру СведенияОВнешнейОбработке, чтобы 1С «увидела» нашу разработку как печатную форму для конкретных документов. Мы регистрируем ее как заменяемую форму для Документ.Отпуск и Документ.ОтпускБезСохраненияОплаты.
Функция СведенияОВнешнейОбработке Экспорт
ТекущаяВерсияБСП = СтандартныеПодсистемыСервер.ВерсияБиблиотеки;
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке(ТекущаяВерсияБСП);
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма;
ПараметрыРегистрации.Назначение.Добавить("Документ.Отпуск");
ПараметрыРегистрации.Назначение.Добавить("Документ.ОтпускБезСохраненияОплаты");
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить;
НоваяКоманда.Представление = НСтр("ru = 'Приказ о предоставлении отпуска (Т-6)'");
НоваяКоманда.Идентификатор = "ПФ_MXL_Т6";
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода;
НоваяКоманда.Модификатор = "ПечатьMXL";
НоваяКоманда.ЗаменяемыеКоманды = "ПФ_MXL_Т6";
Возврат ПараметрыРегистрации;
КонецФункции
В процедуре Печать мы создаем отчет ПечатнаяФормаТ6, программно настраиваем его КомпоновщикНастроек и добавляем нужные нам поля. Ключевой момент здесь — не только добавить поле в Выбранные поля, но и обязательно включить его в Структуру отчета (в группировку).
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
Отчет = Отчеты.ПечатнаяФормаТ6.Создать();
// Настройка отбора
ПолеСсылка = Новый ПолеКомпоновкиДанных("СсылкаНаОбъект");
// ... здесь размещается логика поиска и установки отбора по МассивуОбъектов ...
// Добавление вычисляемого поля
НовоеВычисляемоеПоле = Отчет.СхемаКомпоновкиДанных.ВычисляемыеПоля.Добавить();
НовоеВычисляемоеПоле.Выражение = """Привет!"""; // Здесь может быть логика получения ФИО
НовоеВычисляемоеПоле.ПутьКДанным = "Привет";
НовоеВычисляемоеПоле.ТипЗначения = Новый ОписаниеТипов("Строка");
// Добавление в выбранные поля
НовоеВыбранноеПоле = Отчет.КомпоновщикНастроек.Настройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
НовоеВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("Привет");
// ВАЖНО: Добавляем в группировку для вывода
НовоеПолеГруппировки = Отчет.КомпоновщикНастроек.Настройки.Структура[0].ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
НовоеПолеГруппировки.Поле = Новый ПолеКомпоновкиДанных("Привет");
// Формирование результата
ТабДок = Новый ТабличныйДокумент;
Отчет.ИнициализироватьОтчет();
Отчет.СкомпоноватьРезультат(ТабДок);
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм, "ПФ_MXL_Т6", "Приказ", ТабДок);
КонецПроцедуры
Если ваша задача — вывести фамилию в родительном падеже, не обязательно усложнять запрос СКД. Рекомендуем использовать типовую функцию ОбщегоНазначения.ПросклонятьПредставление(ФизЛицо, 2). Этот метод использует встроенные в БСП алгоритмы склонения, что гарантирует корректную работу без лишних манипуляций с данными внутри СКД.
Помните, что при работе с КомпоновщикомНастроек важно корректно находить элементы отбора по ссылке. Если при выполнении кода вы получаете ошибку о том, что значение не является объектным типом, проверьте, был ли найден элемент в коллекции Отбор.Элементы перед тем, как присваивать ему ПравоеЗначение.