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