Получение данных о фактических начислениях по регламентированному и управленческому учету в ЗУП КОРП 3.1

20.10.25

Разработка - Универсальные функции

Всем бодрого дня! В данной статье покажу - как можно в коде получить данные по начислениям (а при желании - и по остальным разделам) через стандартный отчет

У нас в компании используется ЗУП КОРП со включенной опцией управленческих начислений.

Недавно встала задача: необходимо было реализовать свой вариант доначисления управленческого учета до регламентированного с разбивкой по периодам действия и прочими нюансами, несущественными для данной статьи.

И для этого, конечно, надо было сначала понять - какие суммы по сотруднику у нас есть по разным учетам.

Конечно, было бы неплохо найти что-то из программного интерфейса ЗУП.

Но покопавшись в модулях - не нашел ничего подходящего

Было принято решение воспользоваться механикой стандартного отчета "Анализ начислений и удержаний".

Для этого:

  1. Добавим необходимые поля
  2. Захардкодим группировки отчета
  3. Установим отборы. В частности список сотрудников и организацию, для которой надо получить данные
  4. Получим данные по регламентированному учету для организации сотрудников
  5. Установим в отбор управленческую организацию
  6. Повторим п.4, но уже для управленческой организации

Код представлен одной функцией. Не стал ее декомпозировать - здесь, как мне кажется, это не будет иметь большого смысла. Комментариями отметил блоки

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

 

Возможно, кто-то скажет - для решения этой задачи можно было создать простой запрос с параметрами!

И будет прав - данная задача действительно может быть решена через запрос с параметрами.

Но, во-первых, хотелось для себя решить задачу с использованием только стандартных средств.

Во-вторых - данный код можно легко докрутить до получения данных в более сложных разрезах и группировок и, возможно, кому-то понадобится именно в качестве такого примера.

Вступайте в нашу телеграмм-группу Инфостарт

См. также

Механизмы типовых конфигураций Программист 1С v8.3 1C:Бухгалтерия Бесплатно (free)

Расчет себестоимости в типовых конфигурациях 1С – для многих «черный ящик», работающий по жестко зашитым в него алгоритмам. Реализация этого «черного ящика» может меняться в зависимости от конкретной конфигурации – УПП, БП 3.0, ERP. Но принцип работы везде одинаковый. Расскажем о том, как устроен расчет себестоимости, как его дорабатывать, и какие методы могут быть эффективны и без доработок.

27.12.2024    20848    Begemoth80    33    

91

Механизмы типовых конфигураций Программист 1С v8.3 1C:ERP Бесплатно (free)

Статистическая выборка сценариев и точек изменения отчетов на общей форме ФормаОтчета в типовых конфигурациях. Примеры кода.

03.06.2024    12691    SergDobrodelov    40    

129

Универсальные функции Программист 1С v8.3 1C:Бухгалтерия Бесплатно (free)

Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.

21.05.2024    43385    dimanich70    83    

159

Универсальные функции Программист Стажер 1С v8.3 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    53016    atdonya    31    

67

Инструментарий разработчика БСП (Библиотека стандартных подсистем) Механизмы типовых конфигураций Программист Стажер 1С v8.3 1С:Бухгалтерия 3.0 Бесплатно (free)

Используются для создания новых объектов в конфигурации, чтобы не забыть, что нужно сделать. Сделано на примере 1С:Бухгалтерия предприятия, в других конфигурациях могут быть другие, а могут быть и похожие объекты.

28.12.2023    9703    mrXoxot    11    

115

Универсальные функции Программист 1С v8.3 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    8159    ke.92@mail.ru    17    

67

Механизмы типовых конфигураций Программист 1С v8.3 1С:ERP Управление предприятием 2 Россия Управленческий учет Бесплатно (free)

Разбираемся, зачем в системе ЕРП созданы справочники: ключи аналитик учета, зачем созданы аналогичные по набору измерений регистры сведений. Какие проблемы они решают, какие создают новые и что с этим делать.

08.11.2023    21246    ids79    29    

87
Для отправки сообщения требуется регистрация/авторизация