При настройке пользовательских макетов печати в программе 1С:Зарплата и управление персоналом нередко возникает задача вывести в одной строке итоговой таблицы данные из разных табличных частей одного и того же документа. Например, в документе ВедомостьНаВыплатуЗарплатыВБанк присутствуют две независимые табличные части: Зарплата (где хранятся суммы к выплате) и НДФЛ (где фиксируется исчисленный налог). Попытка разместить реквизиты этих двух табличных частей в одной строке пользовательского макета приводит к тому, что одно из полей остается пустым, либо формируются две отдельные таблицы одна под другой. Разберем по шагам, почему так происходит и как правильно решить данную задачу.
Проанализируем работу пользовательского конструктора макетов печатных форм, реализованного на базе Библиотеки стандартных подсистем (БСП). Данный механизм решает типовые задачи по выводу реквизитов документа без программирования, однако имеет жесткие архитектурные ограничения:
Неопределено.Зарплата детализируются по статьям финансирования, статьям расходов и периодам взаиморасчетов. В то же время строки табличной части НДФЛ разбиваются по ставкам налога, датам получения дохода и документам-основаниям. По одному и тому же сотруднику может быть три строки с выплатами и две строки с налогом. Без предварительной группировки и суммирования показателей свести эти записи в одну строку физически невозможно.Рассмотрим основной способ решения задачи, который не требует изменения конфигурации и снятия с поддержки. Создадим внешнюю печатную форму, подключаемую через справочник ДополнительныеОтчетыИОбработки.
Разберем по шагам создание обработки:
СведенияОВнешнейОбработке(), указав тип печатной формы: Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма().Шапка, Строка и Подвал. В секцию Строка добавим параметры: Сотрудник, КВыплате и НДФЛ.Посмотрим на пример текста запроса для выборки и свертки данных:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ВедомостьЗарплата.Сотрудник КАК Сотрудник,
| ВедомостьЗарплата.КВыплате КАК КВыплате,
| 0 КАК СуммаНДФЛ
|ИЗ
| Документ.ВедомостьНаВыплатуЗарплатыВБанк.Зарплата КАК ВедомостьЗарплата
|ГДЕ
| ВедомостьЗарплата.Ссылка В(&МассивОбъектов)
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ВедомостьНДФЛ.Сотрудник,
| 0,
| ВедомостьНДФЛ.Налог
|ИЗ
| Документ.ВедомостьНаВыплатуЗарплатыВБанк.НДФЛ КАК ВедомостьНДФЛ
|ГДЕ
| ВедомостьНДФЛ.Ссылка В(&МассивОбъектов)
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВложенныйЗапрос.Сотрудник КАК Сотрудник,
| СУММА(ВложенныйЗапрос.КВыплате) КАК КВыплате,
| СУММА(ВложенныйЗапрос.СуммаНДФЛ) КАК НДФЛ
|ИЗ
| (ДанныеВыборки) КАК ВложенныйЗапрос
|СГРУППИРОВАТЬ ПО
| ВложенныйЗапрос.Сотрудник
|УПОРЯДОЧИТЬ ПО
| Сотрудник.Наименование";
После выполнения запроса выведем секции в результирующий табличный документ с помощью метода Вывести():
ТабличныйДокумент = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("Макет");
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
ОбластьСтрока.Параметры.Заполнить(Выборка);
ТабличныйДокумент.Вывести(ОбластьСтрока);
КонецЦикла;
Если в компании принято вести доработки в расширениях, рассмотрим этот вариант. Он позволяет переопределить существующую процедуру печати либо добавить новую команду в форму документа.
Адаптация или Дополнение.ВедомостьНаВыплатуЗарплатыВБанк и перехватим процедуру печати с помощью директивы &Вместо или &ИзменениеИКонтроль.Зарплата и НДФЛ по ключевому полю ФизическоеЛицо или Сотрудник, после чего передадим сгруппированную структуру в параметры области табличного документа.В ситуациях, когда печатная форма требуется исключительно для внутреннего контроля сумм и сверки расчетов, а не в качестве унифицированного бланка с подписями, воспользуемся внешним отчетом на Системе компоновки данных (СКД):
Сотрудник или объединим их через запрос.Таким образом, настроить единую строку средствами типового пользовательского редактора макетов невозможно из-за технической изоляции циклов табличных частей, однако задача надежно и быстро решается с помощью внешней печатной формы или расширения со сверткой данных в запросе.