Как настроить отбор по организации при получении данных графика в регистре расчета

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

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

Суть проблемы и механизм работы виртуальных таблиц

Когда мы используем метод ПолучитьДанныеГрафика() или обращаемся к виртуальной таблице ДанныеГрафика регистра расчета, платформа 1С выполняет сложную внутреннюю операцию соединения записей регистра расчета с записями регистра сведений, который назначен графиком. По умолчанию платформа связывает их только по основному полю графика (ссылка на справочник графиков) и по периоду времени.

Если мы добавляем в эту схему еще одно измерение, например Организация, платформа «не знает», что данные в регистре сведений нужно фильтровать еще и по этой организации. В результате, если в графике «График1» есть записи для «Организации А» и «Организации Б», метод ПолучитьДанныеГрафика() просто сложит эти значения, что приведет к неверным результатам расчета. Проанализируем, как правильно настроить метаданные, чтобы платформа учитывала дополнительные измерения автоматически.

Решение 1: Настройка свойства «Связь с графиком» в конфигураторе

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

  1. Откроем дерево метаданных и найдем наш Регистр расчета (например, Табель).
  2. Перейдем на закладку Измерения.
  3. Найдем измерение Организация.
  4. В палитре свойств этого измерения найдем раздел Использование и свойство Связь с графиком.
  5. В выпадающем списке выберем соответствующее измерение из регистра сведений, который является графиком (в нашем случае это также будет Организация).

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


// Получаем данные по периоду действия с учетом настроенной связи
СтруктураОтбора = Новый Структура("Регистратор", Ссылка);
НаборПД = РегистрыРасчета.Табель.ПолучитьДанныеГрафика(СтруктураОтбора, ВидПериодаРегистраРасчета.ПериодДействия);

// Теперь НаборПД будет содержать корректные данные только по той организации, 
// которая указана в записи регистра расчета.

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

Решение 2: Использование запросов к виртуальным таблицам

Хотя настройка через свойства метаданных решает вопрос для метода ПолучитьДанныеГрафика(), профессиональные разработчики часто предпочитают использовать запросы. Запросы работают быстрее и позволяют получить данные сразу по всему набору сотрудников или организаций, избегая вызовов методов в цикле. Проанализируем ситуацию, как получить те же данные через запрос к виртуальной таблице ДанныеГрафика.

Виртуальная таблица ДанныеГрафика предоставляет уже готовые вычисления. Посмотрим на пример запроса:


Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ
|	ТабельДанныеГрафика.НомерСтроки,
|	ТабельДанныеГрафика.ЗначениеПериодДействия КАК ОтработаноДней,
|	ТабельДанныеГрафика.ЗначениеФактическийПериодДействия КАК ФактДней
|ИЗ
|	РегистрРасчета.Табель.ДанныеГрафика(Регистратор = &Ссылка) КАК ТабельДанныеГрафика";

Запрос.УстановитьПараметр("Ссылка", Ссылка);
РезультатЗапроса = Запрос.Выполнить();
ТаблицаРезультатов = РезультатЗапроса.Выгрузить();

В чем преимущество такого подхода? Если мы настроили Связь с графиком в метаданных (как описано в Решении 1), то этот запрос вернет уже отфильтрованные данные по организации. Если же мы по каким-то причинам не можем менять метаданные, нам придется соединять таблицы вручную в самом запросе, что гораздо сложнее и менее эффективно.

Почему данные могут не сходиться?

Рассмотрим ситуацию, которую упомянул автор темы: количество строк в результате ПолучитьДанныеГрафика() превышает количество сотрудников. Это происходит потому, что платформа разбивает данные на периоды в соответствии с Фактическим периодом действия. Если у сотрудника в течение месяца есть вытесняющие начисления (например, отпуск или больничный), система «разрезает» основной период на несколько частей.

Выясним причину появления «лишних» строк:

Рекомендации по проектированию регистров

Разберем основные правила, которые помогут избежать подобных проблем в будущем:

  1. Имя измерений: Старайтесь называть связующие измерения (Организация, Сотрудник, График) одинаково в регистре расчета и регистре сведений. Это упрощает понимание структуры кода другими разработчиками.
  2. Типы данных: Проверьте, чтобы типы данных связанных измерений полностью совпадали. Если в одном месте это СправочникСсылка.Организации, а в другом — ЛюбаяСсылка, связь может работать некорректно.
  3. Использование ресурсов: Помните, что в регистре сведений (графике) ресурс должен иметь имя, которое указано в настройках регистра расчета на закладке «Основные» в полях Значение графика и Значение базового периода. Обычно это Значение или Часы.
  4. Периодичность: Регистр сведений, используемый как график, должен быть непериодическим. Датой в нем выступает одно из измерений с типом Дата.

Проанализировав все вышесказанное, мы видим, что платформа 1С предоставляет мощный инструментарий для автоматизации расчетов, но он требует точной настройки связей между объектами метаданных. Установка свойства Связь с графиком — это фундамент, без которого корректная работа многофирменного учета в регистрах расчета практически невозможна.

← На главную