Почему возникают расхождения сумм при соединении данных в запросах 1С и как их устранить?

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

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

Выясняем причины расхождений

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

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

Решаем проблему: правильная связь по периоду

Чтобы данные отображались корректно, необходимо расширить условия соединения, добавив в них период. В отчетах, где анализируются начисления и табельный учет, таким ключом чаще всего выступает ПериодМесяц или ПериодРегистрации. Разберем процесс на пошаговом примере.

Шаг 1: Формируем временные таблицы

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

Пример структуры первого запроса:


ВЫБРАТЬ
    ТабельныйУчет.ПериодМесяц КАК ПериодМесяц,
    ТабельныйУчет.Сотрудник КАК Сотрудник,
    СУММА(ТабельныйУчет.КолвоДОЗаСвойСчет) КАК КолвоДОЗаСвойСчет
ПОМЕСТИТЬ ВТ_ТабельныйУчет
ИЗ
    РегистрНакопления.ДанныеТабельногоУчетаРабочегоВремениСотрудников.Обороты(&НачДата, &КонДата, Авто, ) КАК ТабельныйУчет
СГРУППИРОВАТЬ ПО
    ТабельныйУчет.ПериодМесяц,
    ТабельныйУчет.Сотрудник

Шаг 2: Подготавливаем таблицу начислений

Аналогичным образом подготавливаем данные из регистра расчета, не забывая включить период в группировку:


ВЫБРАТЬ
    Начисления.Сотрудник КАК Сотрудник,
    Начисления.ПериодРегистрации КАК ПериодРегистрации,
    СУММА(Начисления.Результат) КАК Результат
ПОМЕСТИТЬ ВТ_Начисления
ИЗ
    РегистрРасчета.Начисления КАК Начисления
ГДЕ
    Начисления.ПериодРегистрации МЕЖДУ &НачДата И &КонДата
СГРУППИРОВАТЬ ПО
    Начисления.Сотрудник,
    Начисления.ПериодРегистрации

Шаг 3: Соединяем данные по полному ключу

Теперь самое главное — выполнить соединение, указав в секции ПО оба ключевых поля: и сотрудника, и период. Это позволит 1С точно сопоставить начисления конкретного месяца с табельными данными того же месяца.


ВЫБРАТЬ
    ВТ_ТабельныйУчет.ПериодМесяц КАК ПериодМесяц,
    ВТ_ТабельныйУчет.Сотрудник КАК Сотрудник,
    СУММА(ВТ_Начисления.Результат) КАК Результат
ИЗ
    ВТ_ТабельныйУчет КАК ВТ_ТабельныйУчет
    ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Начисления КАК ВТ_Начисления
    ПО ВТ_ТабельныйУчет.Сотрудник = ВТ_Начисления.Сотрудник
    И ВТ_ТабельныйУчет.ПериодМесяц = ВТ_Начисления.ПериодРегистрации
СГРУППИРОВАТЬ ПО
    ВТ_ТабельныйУчет.ПериодМесяц,
    ВТ_ТабельныйУчет.Сотрудник

Практические советы по отладке

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

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

← На главную