Как вывести данные из двух табличных частей документа в одну строку печатной формы?

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

При настройке пользовательских макетов печати в программе 1С:Зарплата и управление персоналом нередко возникает задача вывести в одной строке итоговой таблицы данные из разных табличных частей одного и того же документа. Например, в документе ВедомостьНаВыплатуЗарплатыВБанк присутствуют две независимые табличные части: Зарплата (где хранятся суммы к выплате) и НДФЛ (где фиксируется исчисленный налог). Попытка разместить реквизиты этих двух табличных частей в одной строке пользовательского макета приводит к тому, что одно из полей остается пустым, либо формируются две отдельные таблицы одна под другой. Разберем по шагам, почему так происходит и как правильно решить данную задачу.

Выясним причину: почему встроенный редактор макетов не объединяет строки

Проанализируем работу пользовательского конструктора макетов печатных форм, реализованного на базе Библиотеки стандартных подсистем (БСП). Данный механизм решает типовые задачи по выводу реквизитов документа без программирования, однако имеет жесткие архитектурные ограничения:

  1. Раздельный обход коллекций: конструктор макетов не умеет выполнять реляционное соединение таблиц по ключевым полям. Для каждой табличной части алгоритм генерирует собственный изолированный цикл обхода строк. Если в одну строку макета поместить реквизиты из разных табличных частей, система свяжет область строки только с одной из них, а реквизиты второй табличной части получат значение Неопределено.
  2. Разная детализация данных (отсутствие соответствия 1:1): в документе ведомости строки табличной части Зарплата детализируются по статьям финансирования, статьям расходов и периодам взаиморасчетов. В то же время строки табличной части НДФЛ разбиваются по ставкам налога, датам получения дохода и документам-основаниям. По одному и тому же сотруднику может быть три строки с выплатами и две строки с налогом. Без предварительной группировки и суммирования показателей свести эти записи в одну строку физически невозможно.

Способ 1. Разработка внешней печатной формы (ВПФ)

Рассмотрим основной способ решения задачи, который не требует изменения конфигурации и снятия с поддержки. Создадим внешнюю печатную форму, подключаемую через справочник ДополнительныеОтчетыИОбработки.

Разберем по шагам создание обработки:

  1. Создадим новую внешнюю обработку в конфигураторе и добавим в модуль объекта стандартную экспортную функцию СведенияОВнешнейОбработке(), указав тип печатной формы: Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма().
  2. Добавим макет табличного документа с секциями Шапка, Строка и Подвал. В секцию Строка добавим параметры: Сотрудник, КВыплате и НДФЛ.
  3. В процедуре печати соберем данные единым запросом, где объединим обе табличные части и сгруппируем суммы по сотруднику.

Посмотрим на пример текста запроса для выборки и свертки данных:


Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ
|   ВедомостьЗарплата.Сотрудник КАК Сотрудник,
|   ВедомостьЗарплата.КВыплате КАК КВыплате,
|   0 КАК СуммаНДФЛ
|ИЗ
|   Документ.ВедомостьНаВыплатуЗарплатыВБанк.Зарплата КАК ВедомостьЗарплата
|ГДЕ
|   ВедомостьЗарплата.Ссылка В(&МассивОбъектов)
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
|   ВедомостьНДФЛ.Сотрудник,
|   0,
|   ВедомостьНДФЛ.Налог
|ИЗ
|   Документ.ВедомостьНаВыплатуЗарплатыВБанк.НДФЛ КАК ВедомостьНДФЛ
|ГДЕ
|   ВедомостьНДФЛ.Ссылка В(&МассивОбъектов)
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|   ВложенныйЗапрос.Сотрудник КАК Сотрудник,
|   СУММА(ВложенныйЗапрос.КВыплате) КАК КВыплате,
|   СУММА(ВложенныйЗапрос.СуммаНДФЛ) КАК НДФЛ
|ИЗ
|   (ДанныеВыборки) КАК ВложенныйЗапрос
|СГРУППИРОВАТЬ ПО
|   ВложенныйЗапрос.Сотрудник
|УПОРЯДОЧИТЬ ПО
|   Сотрудник.Наименование";

После выполнения запроса выведем секции в результирующий табличный документ с помощью метода Вывести():


ТабличныйДокумент = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("Макет");
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");

Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
    ОбластьСтрока.Параметры.Заполнить(Выборка);
    ТабличныйДокумент.Вывести(ОбластьСтрока);
КонецЦикла;

Способ 2. Реализация через расширение конфигурации

Если в компании принято вести доработки в расширениях, рассмотрим этот вариант. Он позволяет переопределить существующую процедуру печати либо добавить новую команду в форму документа.

  1. Подключим расширение с назначением Адаптация или Дополнение.
  2. Добавим в расширение менеджер документа ВедомостьНаВыплатуЗарплатыВБанк и перехватим процедуру печати с помощью директивы &Вместо или &ИзменениеИКонтроль.
  3. По аналогии с внешней печатной формой используем запрос со сверткой строк из табличных частей Зарплата и НДФЛ по ключевому полю ФизическоеЛицо или Сотрудник, после чего передадим сгруппированную структуру в параметры области табличного документа.

Способ 3. Построение отчета на СКД без доработки форм документов

В ситуациях, когда печатная форма требуется исключительно для внутреннего контроля сумм и сверки расчетов, а не в качестве унифицированного бланка с подписями, воспользуемся внешним отчетом на Системе компоновки данных (СКД):

  1. В схеме компоновки данных создадим два набора данных: один по табличной части выплат, второй по табличной части налога (или по соответствующим регистрам накопления).
  2. Настроим связь наборов данных по полю Сотрудник или объединим их через запрос.
  3. В настройках отчета укажем группировку по сотруднику и выведем ресурсы сумм в единую строку отчета.

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

← На главную