Как добавить оклад в расчетный листок в 1С:ЗУП 2.5 и исправить ошибку связи наборов данных в СКД

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

При доработке типовых отчетов в решениях на платформе 1С, особенно в таких сложных конфигурациях, как «Зарплата и Управление Персоналом 2.5» (ЗУП 2.5), разработчики часто сталкиваются с необходимостью вывода дополнительных данных. Одной из наиболее частых задач является добавление тарифной ставки (оклада) сотрудника в расчетный листок. Типовой расчетный листок в ЗУП 2.5 строится с использованием Системы компоновки данных (СКД), и попытка добавить новый набор данных для получения оклада часто приводит к системной ошибке: «Использование полей из не связанных наборов данных не допустимо».

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

---

Почему возникает ошибка «Использование полей из не связанных наборов данных не допустимо»?

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

  1. Отсутствие поля в списке «Ресурсы». Это самая распространенная ошибка начинающих разработчиков. Если вы добавляете поле Оклад из нового (подчиненного) набора данных в группировку или детальные записи отчета, но не добавляете его на вкладку «Ресурсы» с агрегатной функцией (например, Максимум(Оклад) или Сумма(Оклад)), СКД пытается интерпретировать это поле как измерение. Из-за этого система требует жесткой логической связи на всех уровнях группировок, что в структуре расчетного листка реализовать практически невозможно.
  2. Неверное направление связи. Связи в СКД работают по принципу левого соединения (LEFT JOIN). Ведущим (левым) набором данных должен выступать основной запрос отчета, содержащий данные о начислениях сотрудников, а подчиненным (правым) — ваш новый набор данных с окладами. Направление связи должно быть строго от главного набора к подчиненному.
  3. Проблемы с параметрами виртуальных таблиц. Если во втором наборе данных используется запрос к виртуальной таблице (например, СрезПоследних), то для корректной работы связи необходимо передавать период из первого набора данных в параметры связи второго набора. Если этого не сделать, система не сможет правильно сопоставить срез последних на каждую конкретную дату или период регистрации.
  4. Неверный разрез связи (Физлицо вместо Сотрудника). В программе ЗУП 2.5 ключевым разрезом учета кадров и начислений является справочник СотрудникиОрганизаций, а не ФизическиеЛица. Одно физическое лицо может работать в организации на нескольких должностях (например, по внутреннему совместительству). Если связать наборы по полю Физлицо, СКД не сможет однозначно определить, какой именно оклад выводить для конкретного сотрудника, что приведет к дублированию строк или ошибкам компоновки.

---

Пошаговое решение: Настройка связей наборов данных в СКД

Рассмотрим, как правильно настроить второй набор данных в СКД и связать его с основным набором, чтобы избежать ошибок компоновки.

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


ВЫБРАТЬ РАЗРЕШЕННЫЕ
    ТарифныеСтавки.Сотрудник КАК Сотрудник,
    ТарифныеСтавки.Организация КАК Организация,
    ТарифныеСтавки.Период КАК ПериодРегистрации,
    ТарифныеСтавки.Ставка КАК Оклад
ИЗ
    РегистрСведений.ТарифныеСтавкиРаботниковОрганизации.СрезПоследних(&ПериодСреза, ) КАК ТарифныеСтавки

После добавления этого запроса в качестве второго набора данных перейдем к настройке связей на вкладке «Связи наборов данных». Выполним следующие настройки:

  1. В колонке «Источник связи» укажем наш основной набор данных (например, НаборДанныхЗапрос).
  2. В колонке «Приемник связи» выберем новый набор — НаборДанныхОклады.
  3. В колонке «Условие связи» настроим сопоставление ключевых полей:
    • Сотрудник = Сотрудник
    • Организация = Организация
  4. В колонке «Параметры» для связи по периоду укажем связь даты регистрации из основного набора с параметром &ПериодСреза подчиненного набора. Это позволит получать оклад, актуальный на конкретный месяц начисления зарплаты.

Важный шаг: Перейдем на вкладку «Ресурсы» и обязательно перенесем поле Оклад в список ресурсов. В качестве выражения укажем Максимум(Оклад). Это действие является ключевым для устранения ошибки компоновки данных.

---

Альтернативный вариант: Левое соединение в основном запросе

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

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


ВЫБРАТЬ
    // Основные поля отчета расчетного листка
    ОсновныеНачисления.Сотрудник КАК Сотрудник,
    ОсновныеНачисления.Организация КАК Организация,
    ОсновныеНачисления.ПериодРегистрации КАК ПериодРегистрации,
    
    // Добавляемое поле оклада
    ЕСТЬNULL(ТарифныеСтавки.Ставка, 0) КАК Оклад
ИЗ
    РегистрРасчета.ОсновныеНачисленияРаботниковОрганизаций КАК ОсновныеНачисления
    
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ТарифныеСтавкиРаботниковОрганизации.СрезПоследних(
        &КонецПериода,
        Организация = &Организация
    ) КАК ТарифныеСтавки
    ПО ОсновныеНачисления.Сотрудник = ТарифныеСтавки.Сотрудник
    И ОсновныеНачисления.Организация = ТарифныеСтавки.Организация

При таком подходе поле Оклад сразу становится частью основного набора данных. Нам больше не нужно настраивать связи между наборами данных СКД, контролировать передачу параметров связи и беспокоиться об ошибках компоновки. Все данные выбираются за один шаг выполнения запроса к базе данных.

---

Сравнение регистров для получения оклада

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

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

---

Как обстоят дела в современных версиях ЗУП 3.1?

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

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

  1. Откройте отчет «Расчетный листок».
  2. Нажмите кнопку «Настройки...».
  3. Перейдите на вкладку «Дополнительно».
  4. Установите флажок «Выводить тарифную ставку».
  5. Нажмите «Закрыть и сформировать».

После этого оклад сотрудника будет автоматически выводиться в шапке его расчетного листка рядом с информацией о подразделении и должности.

← На главную