diamond АШ Tlg

Программный интерфейс 1С ЗУП 3.1: как получить постоянные и периодические кадровые данные различными способами

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

Получение кадровых данных в таблицу значений

Наиболее часто используемый в написании отчетов метод получения кадровых данных из ЗУП через "программный интерфейс". Функция делает выборку за период, как правило в один месяц, т.к. в типичных зарплатных постановках задач обычно требуется учитывать и принятых на работу в течении этого периода, и уволенных в периоде.

Парам = КадровыйУчет.ПараметрыПолученияСотрудниковОрганизацийПоСпискуФизическихЛиц();
	
// основные отборы
Парам.РаботникиПоДоговорамГПХ = Истина;
Парам.ПодработкиРаботниковПоТрудовымДоговорам = Истина;
Парам.НачалоПериода = Период.ДатаНачала;
Парам.ОкончаниеПериода = Период.ДатаОкончания;
	
// дополнительные отборы
Если ЗначениеЗаполнено(Организация) Тогда
	ЗарплатаКадрыОбщиеНаборыДанных.ДобавитьВКоллекциюОтбор(
		Парам.Отборы, "Организация", "=", Организация);
КонецЕсли; 
Если ЗначениеЗаполнено(Подразделение) Тогда
	ЗарплатаКадрыОбщиеНаборыДанных.ДобавитьВКоллекциюОтбор(
		Парам.Отборы, "Подразделение", "В ИЕРАРХИИ", Подразделение);
КонецЕсли; 
	
Парам.КадровыеДанные = "ФамилияИО,Пол,ДатаРождения,Организация,Подразделение,"
	+ "Должность,ТабельныйНомер,ДатаПриема,ДатаУвольнения,"
	+ "ОформленПоТрудовомуДоговору,РазрядКатегория,ТарифнаяСетка,ФОТ,"
	+ "ОсновноеНачисление,ПоказательТарифнойСтавки,Надбавка,"
	+ "СовокупнаяТарифнаяСтавка,СрочныйДоговор,ДатаНачала,ДатаОкончания";
	
Результат = КадровыйУчет.СотрудникиОрганизации(Истина, Парам);  // ТЗ со всеми запрашиваемыми данными

В примере выше далеко не полный перечень данных, которые можно запросить. Сотрудник и/или ФизическоеЛицо включены в результат по умолчанию, их указывать не нужно. Для запроса доступны все реквизиты этих справочников, а полный список можно найти в описаниях к функциям:

  • КадровыйУчетВнутренний.ЗапросВТКадровыеДанныеСотрудников
  • КадровыйУчетВнутренний.ЗапросВТПостоянныеКадровыеДанныеСотрудников
  • КадровыйУчетВнутренний.ЗапросВТКадровыеДанныеФизическихЛиц
  • КадровыйУчетВнутренний.ЗапросВТПостоянныеКадровыеДанныеФизическихЛиц

Вариант, если данные нужны только на одного сотрудника, на указанную дату (получаем строку таблицы значений):

КадровыеДанные = "МестоВСтруктуреПредприятия,ДолжностьПоШтатномуРасписанию";
Результат = КадровыйУчет.КадровыеДанныеСотрудника(Истина, Сотрудник, КадровыеДанные, Период);

То же самое, но по физлицу, но в этом варианте нельзя запросить поля, относящиеся только к сотруднику, например 'Должность':

КадровыеДанные = "ФИОПолные,СтатусНалогоплательщика,ОбщийСтажЛет";
Результат = КадровыйУчет.КадровыеДанныеФизическогоЛица(Истина, Физлицо, КадровыеДанные, Период);

Вариант запроса, когда у нас есть массив с сотрудниками, и по ним нужны данные на определённую дату:

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

То же самое, но по списку физических лиц (помним про ограничения к полям сотрудников):

Физлица = ОбщегоНазначения.ВыгрузитьКолонку(Объект.ФизическиеЛица, "ФизическоеЛицо", Истина);
Результат = КадровыйУчет.КадровыеДанныеФизическихЛиц(Истина, Физлица, "ИННВСтранеГражданства,ДокументПредставление", Период);

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

ПоляОтбора = Новый Структура;

ПоляОтбора.Вставить("КадроваяИсторияСотрудников", Новый Массив);	
ЗарплатаКадрыОбщиеНаборыДанных.ДобавитьВКоллекциюОтбор(
	ПоляОтбора.КадроваяИсторияСотрудников, "Регистратор", "НЕ В", ИсключаемыеРегистраторы);
	
ПоляОтбора.Вставить("ВидыЗанятостиСотрудников", Новый Массив);	
ЗарплатаКадрыОбщиеНаборыДанных.ДобавитьВКоллекциюОтбор(
	ПоляОтбора.ВидыЗанятостиСотрудников, "Регистратор", "НЕ В", ИсключаемыеРегистраторы);	

Результат = КадровыйУчет.КадровыеДанныеСотрудников(Ложь, Сотрудники, "Организация,Должность", Период, ПоляОтбора);

Получение кадровых данных во временные таблицы

Второй способ получения кадровых данных, используется если вы хотите сами самостоятельно соединить их с какими то данными сразу на сервере СУБД. Ничем не хуже и не лучше первого метода, т.к. оба связаны между собой и беспощадно эксплуатируют TempDb на СУБД.

Также этот способ позволяет получить кадровые данные на разные даты по каждому сотруднику, например если вы обрабатываете движения кадровых документов списочного типа. Предварительно требуется создать менеджер временных таблиц и временную таблицу, содержащую отборы, в примере ниже это таблица "ВТ_Отборы":

МВТ = Новый МенеджерВременныхТаблиц;

// Здесь заполняете отборы во временную таблицу 'ВТ_Отборы' с  полями 'Сотрудник' и 'Период'
// из таблицы значений 'ТаблицаОтборов':

Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МВТ;
Запрос.Текст = "ВЫБРАТЬ Т.Сотрудник, Т.Период ПОМЕСТИТЬ ВТ_Отборы ИЗ &Таблица КАК Т;";
Запрос.УстановитьПараметр("Таблица", ТаблицаОтборов);
Запрос.Выполнить();

// Описание временной таблицы, которую только что создали:

ОписательВременнойТаблицыОтборов = КадровыйУчет.ОписаниеВременнойТаблицыОтборовСотрудников(
	"ВТ_Отборы", "Сотрудник", "Период"	
);

// Получаем сам запрос:

Запрос = КадровыйУчетРасширенный.ЗапросВТКадровыеДанныеСотрудников(
	Истина,
	ОписательВременнойТаблицыОтборов,
	"Подразделение,Должность,ГрафикРаботы",
	Неопределено,
	Истина,
	Неопределено,
	"ВТ_КадровыеДанные",
	Ложь,
	Истина
);

// Выполняем запрос. Не забываем указать менеджер временных таблиц:

Запрос.МенеджерВременныхТаблиц = МВТ;
Результат = Запрос.Выполнить();

// Во временной таблице 'ВТ_КадровыеДанные' лежат запрошенные данные:

Запрос.Текст = "ВЫБРАТЬ * ИЗ ВТ_КадровыеДанные";
ТаблицаКадровыеДанные = Запрос.Выполнить().Выгрузить();