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

20.10.25

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

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

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

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

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

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

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

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

Для этого:

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

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

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

 

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

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

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

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

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

См. также

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

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

27.12.2024    23031    Begemoth80    33    

91

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

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

03.06.2024    14492    SergDobrodelov    40    

130

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

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

21.05.2024    46523    dimanich70    83    

165

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    6883    6    John_d    13    

59

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

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

12.02.2024    57655    atdonya    31    

68

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

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

28.12.2023    10437    mrXoxot    11    

117

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

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

30.11.2023    8656    ke.92@mail.ru    17    

68

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

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

08.11.2023    22511    ids79    30    

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