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