При доработке типовых отчетов в решениях на платформе 1С, особенно в таких сложных конфигурациях, как «Зарплата и Управление Персоналом 2.5» (ЗУП 2.5), разработчики часто сталкиваются с необходимостью вывода дополнительных данных. Одной из наиболее частых задач является добавление тарифной ставки (оклада) сотрудника в расчетный листок. Типовой расчетный листок в ЗУП 2.5 строится с использованием Системы компоновки данных (СКД), и попытка добавить новый набор данных для получения оклада часто приводит к системной ошибке: «Использование полей из не связанных наборов данных не допустимо».
В этой статье мы подробно разберем причины возникновения этой ошибки, рассмотрим правильную настройку связей наборов данных в СКД, а также изучим альтернативные и более надежные способы решения этой задачи.
---
При проектировании отчетов в СКД добавление нового набора данных (например, отдельного запроса к регистру сведений для получения окладов) требует от разработчика четкого понимания того, как СКД объединяет эти данные при выводе. Даже если вы перейдете на вкладку «Связи наборов данных» и укажете поля для соединения, платформа все равно может выдать ошибку. Проанализируем основные причины этого поведения:
Оклад из нового (подчиненного) набора данных в группировку или детальные записи отчета, но не добавляете его на вкладку «Ресурсы» с агрегатной функцией (например, Максимум(Оклад) или Сумма(Оклад)), СКД пытается интерпретировать это поле как измерение. Из-за этого система требует жесткой логической связи на всех уровнях группировок, что в структуре расчетного листка реализовать практически невозможно.LEFT JOIN). Ведущим (левым) набором данных должен выступать основной запрос отчета, содержащий данные о начислениях сотрудников, а подчиненным (правым) — ваш новый набор данных с окладами. Направление связи должно быть строго от главного набора к подчиненному.СрезПоследних), то для корректной работы связи необходимо передавать период из первого набора данных в параметры связи второго набора. Если этого не сделать, система не сможет правильно сопоставить срез последних на каждую конкретную дату или период регистрации.СотрудникиОрганизаций, а не ФизическиеЛица. Одно физическое лицо может работать в организации на нескольких должностях (например, по внутреннему совместительству). Если связать наборы по полю Физлицо, СКД не сможет однозначно определить, какой именно оклад выводить для конкретного сотрудника, что приведет к дублированию строк или ошибкам компоновки.---
Рассмотрим, как правильно настроить второй набор данных в СКД и связать его с основным набором, чтобы избежать ошибок компоновки.
Сначала проанализируем запрос для получения оклада. Для этого лучше всего использовать срез последних из регистра сведений ТарифныеСтавкиРаботниковОрганизации или ПлановыеНачисленияРаботниковОрганизаций. Напишем оптимальный запрос для второго набора данных (назовем его НаборДанныхОклады):
ВЫБРАТЬ РАЗРЕШЕННЫЕ
ТарифныеСтавки.Сотрудник КАК Сотрудник,
ТарифныеСтавки.Организация КАК Организация,
ТарифныеСтавки.Период КАК ПериодРегистрации,
ТарифныеСтавки.Ставка КАК Оклад
ИЗ
РегистрСведений.ТарифныеСтавкиРаботниковОрганизации.СрезПоследних(&ПериодСреза, ) КАК ТарифныеСтавки
После добавления этого запроса в качестве второго набора данных перейдем к настройке связей на вкладке «Связи наборов данных». Выполним следующие настройки:
НаборДанныхЗапрос).НаборДанныхОклады.Сотрудник = СотрудникОрганизация = Организация&ПериодСреза подчиненного набора. Это позволит получать оклад, актуальный на конкретный месяц начисления зарплаты.Важный шаг: Перейдем на вкладку «Ресурсы» и обязательно перенесем поле Оклад в список ресурсов. В качестве выражения укажем Максимум(Оклад). Это действие является ключевым для устранения ошибки компоновки данных.
---
Использование нескольких наборов данных в СКД и их последующее связывание может снижать производительность отчета, особенно при формировании расчетных листков по всей организации за длительный период. Более профессиональным и надежным подходом является интеграция получения оклада непосредственно в основной запрос отчета через ЛЕВОЕ СОЕДИНЕНИЕ.
Выясним, как это реализовать. В тексте основного запроса отчета найдем таблицу выборки начислений и добавим к ней соединение с виртуальной таблицей среза последних регистра тарифных ставок:
ВЫБРАТЬ
// Основные поля отчета расчетного листка
ОсновныеНачисления.Сотрудник КАК Сотрудник,
ОсновныеНачисления.Организация КАК Организация,
ОсновныеНачисления.ПериодРегистрации КАК ПериодРегистрации,
// Добавляемое поле оклада
ЕСТЬNULL(ТарифныеСтавки.Ставка, 0) КАК Оклад
ИЗ
РегистрРасчета.ОсновныеНачисленияРаботниковОрганизаций КАК ОсновныеНачисления
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ТарифныеСтавкиРаботниковОрганизации.СрезПоследних(
&КонецПериода,
Организация = &Организация
) КАК ТарифныеСтавки
ПО ОсновныеНачисления.Сотрудник = ТарифныеСтавки.Сотрудник
И ОсновныеНачисления.Организация = ТарифныеСтавки.Организация
При таком подходе поле Оклад сразу становится частью основного набора данных. Нам больше не нужно настраивать связи между наборами данных СКД, контролировать передачу параметров связи и беспокоиться об ошибках компоновки. Все данные выбираются за один шаг выполнения запроса к базе данных.
---
При реализации вывода оклада важно выбрать правильный источник данных. В конфигурации ЗУП 2.5 присутствуют два регистра, хранящих информацию о тарифных ставках:
Для простых задач вывода «текущего оклада» вполне достаточно использовать регистр ТарифныеСтавкиРаботниковОрганизации. Если же требуется выводить оклад с привязкой к конкретному виду расчета, лучше использовать регистр плановых начислений.
---
Разработчики фирмы «1С» учли пожелания пользователей и в редакции 3.1 полностью переработали механизм формирования расчетных листков. В ЗУП 3.1 расчетный листок формируется на основании данных регистра накопления НачисленияУдержанияПоСотрудникам.
В современных версиях программы больше не требуется привлекать программистов для изменения структуры СКД или написания запросов. Вывод оклада (тарифной ставки) настраивается пользователем в режиме предприятия за несколько кликов:
После этого оклад сотрудника будет автоматически выводиться в шапке его расчетного листка рядом с информацией о подразделении и должности.