Как получить значение из табличной части «Показатели» для печатной формы в 1С:ЗУП 3.1?

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

При разработке внешних печатных форм в конфигурациях 1С:Зарплата и управление персоналом 3.1 или 1С:ERP разработчики часто сталкиваются с необходимостью вывести данные об оплате труда. В этих системах сведения о начислениях (оклад, доплаты, надбавки) хранятся в табличной части Показатели. Особенность заключается в том, что при использовании вложенного запроса к табличной части результат возвращается не в виде плоской таблицы, а в виде структуры, где одна из колонок сама является таблицей значений. Рассмотрим, как правильно извлечь нужный показатель, например, «Размер доплаты», и вывести его в макет.

Анализ структуры данных и проблемы

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

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

Решение №1: Поиск значения во вложенной таблице (через код)

Разберем самый быстрый способ решения «в лоб». Если мы уже получили результат запроса с вложенной таблицей, нам нужно перебрать строки этой таблицы и найти ту, где реквизит Показатель совпадает с искомым (например, «Надбавка» или «Оклад»).

Рассмотрим пример кода, который необходимо вставить в цикл обработки документов для печати:


Для Каждого ДокументДляПечати Из РезультатыЗапроса Цикл
    
    // Преобразуем строку результата в структуру для удобства
    ДанныеПечати = ОбщегоНазначения.СтрокаТаблицыЗначенийВСтруктуру(ДокументДляПечати);
    
    // Получаем вложенную таблицу показателей
    ТаблицаПоказателей = ДокументДляПечати.Показатели;
    
    // Предположим, нам нужен конкретный показатель "Надбавка за стаж"
    // Важно: лучше использовать ссылку, а не поиск по наименованию
    СсылкаНаПоказатель = Справочники.ПоказателиРасчетаЗарплаты.НайтиПоНаименованию("Надбавка");
    
    // Ищем строку в ТЧ документа
    ПараметрыОтбора = Новый Структура("Показатель", СсылкаНаПоказатель);
    НайденныеСтроки = ТаблицаПоказателей.НайтиСтроки(ПараметрыОтбора);
    
    Если НайденныеСтроки.Количество() > 0 Тогда
        РазмерДоплаты = НайденныеСтроки[0].Значение;
    Иначе
        РазмерДоплаты = 0;
    КонецЕсли;
    
    ДанныеПечати.Вставить("РазмерДоплаты", РазмерДоплаты);
    
    // Далее заполняем макет...
КонецЦикла;

Важный момент: использование метода НайтиПоНаименованию внутри цикла является «плохим тоном» и замедляет работу. Рекомендуется найти ссылку на нужный показатель заранее (до цикла) или передавать её как параметр запроса.

Решение №2: Оптимизация запроса (Левое соединение)

Проанализируем более профессиональный подход. Вместо того чтобы выгружать все показатели документа в память, мы можем изменить текст запроса так, чтобы он сразу возвращал плоскую таблицу с нужной колонкой. Для этого используем Левое Соединение с табличной частью документа.

Посмотрим на пример измененного запроса:


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

Запрос.УстановитьПараметр("НужныйПоказатель", Справочники.ПоказателиРасчетаЗарплаты.Оклад);
Запрос.УстановитьПараметр("МассивОбъектов", МассивОбъектов);

В этом случае в переменной ДокументДляПечати.РазмерДоплаты сразу будет лежать числовое значение. Это избавляет нас от необходимости писать дополнительные циклы и условия внутри кода на 1С.

Вывод суммы прописью

Выясним, как красиво вывести полученный размер доплаты в печатную форму. Часто в кадровых приказах или соглашениях требуется указывать сумму прописью. Для этого в типовых конфигурациях предусмотрены специальные функции.

Выполним следующие шаги в коде:

  1. Получим валюту учета (обычно это рубль).
  2. Используем функцию формирования суммы прописью.
  3. Вставим результат в структуру данных для печати.

// Получаем валюту (для РФ по умолчанию рубль)
ВалютаУчета = ЗарплатаКадры.ВалютаУчетаЗаработнойПлаты();

// Формируем строковое представление суммы
СуммаПрописью = РаботаСКурсамиВалют.СформироватьСуммуПрописью(ДанныеПечати.РазмерДоплаты, ВалютаУчета);

// Добавляем в структуру для вывода в параметр [РазмерДоплатыПрописью] на макете
ДанныеПечати.Вставить("РазмерДоплатыПрописью", СуммаПрописью);

Особенности работы с предопределенными показателями

Рассмотрим ситуацию, когда необходимо вывести именно основной оклад. В ЗУП 3.1 показатель Оклад является предопределенным. В коде к нему можно обратиться через Справочники.ПоказателиРасчетаЗарплаты.Оклад. Если же ваша доплата создана пользователем вручную, то правильнее будет идентифицировать её по идентификатору или наименованию, которое зафиксировано в техническом задании на разработку печатной формы.

Полезный совет: при работе с кадровыми документами помните, что в таблице Показатели могут быть записи с разным действием (Изменить, Начать, Не изменять). Если вы выводите данные из документа Кадровый перевод, убедитесь, что вы берете именно актуальное значение (где Действие не равно Отменить).

Итоговый алгоритм действий

Подведем итог. Чтобы успешно добавить РазмерДоплаты в вашу печатную форму, выполните следующее:

  1. Определите способ получения данных: либо через поиск во вложенной таблице в цикле, либо через левое соединение в запросе (рекомендуется).
  2. Найдите ссылку на показатель: используйте справочник ПоказателиРасчетаЗарплаты.
  3. Обработайте числовое значение: примените форматирование (например, Формат(Значение, "ЧДЦ=2")) и, если нужно, переведите в сумму прописью.
  4. Заполните структуру: убедитесь, что ключ в структуре ДанныеПечати совпадает с именем параметра в квадратных скобках в макете [РазмерДоплаты].

Использование этих методов позволит вам создавать гибкие и надежные печатные формы, которые будут корректно отображать данные об оплате труда сотрудников даже при сложных схемах начислений.

← На главную