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