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