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