Расчет заработной платы на Платформе 1С 8: можно ли обойтись без реквизита КатегорияРасчета?

25.07.10

Разработка - Математика и алгоритмы

В статье делается попытка обосновать алгоритм расчета по базе с автоматическим вычислением приоритета расчета - т.е. без применения реквизита ПВР КатегорияРасчета.

Выгрузки информационных баз загружаются в пустую базу 1С 8.2 и работают в обычном режиме.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Бесплатно
Files.rar
.rar 1,12Mb
53
53 Скачать бесплатно

Расчет заработной платы на Платформе 1С 8: можно ли обойтись без реквизита КатегорияРасчета?

Все, кто работает в 1С 8 с расчетными механизмами, знают, что такое План видов расчета (ПВР), а также знают, каким образом изначально организуется порядок следования расчета отдельных начислений и удержаний в соответствии с "глубиной" их зависимости  по базе.

Изначально, с самых первых версий ЗУП, в объекты конфигурации План видов расчета вводится реквизит КатегорияРасчета, значение которого пользователь должен задавать в соответствии с определенным "уровнем глубины" базовой зависимости каждого вида расчета (ВР). Например, ВР Оклад по дням, Оклад по часам, Оплата сверхурочных часов - не зависят по базе от других ВР, поэтому им пользователь назначает категорию расчета Первичное. Виды расчета Месячная премия и Квартальная премия - зависят по базе только от "первичных" ВР, поэтому им назначается категория расчета Зависимое первого уровня. Виды расчета Районный коэффициент и Северная надбавка зависят по базе как от "первичных" ВР, так и от "зависимых первого уровня" - следовательно, им назначается категория Зависимое второго уровня - и т.п.

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

Современная версия ЗУП, правда, отслеживает ситуацию, когда в состав базы некоторого ВР вводится такой, категория расчета которого имеет больший либо равный уровень - в этом случае программа предлагает пользователю "повысить" категорию расчета данного ВР. Например, если в состав базы ВР Месячная премия (категория расчета Зависимое первого уровня) ввести вид расчета с такой же категорией, то будет предложено повысить категорию Месячной премии до Зависимое второго уровня. Однако для тех видов расчета, в базу которых входит Месячная премия, категория  расчета не изменится, и пользователю все равно надо будет изменить все категории вручную, что по-прежнему чревато серьезными ошибками.

Таким образом, в общем случае неправильно установленное значение категории расчета влечет за собой длинный и широкий "хвост" ошибок расчета для всей информационной базы ЗУП. А учитывая, что состав базовых ВР у отдельных видов расчета может достигать нескольких десятков, а также то, что "глубина зависимости" по базе у некоторых созданных пользователем ВР может достигать четвертого и даже пятого уровня, ошибка в значении категории расчета может грозить срывом расчетного регламента у всего предприятия - и чем предприятие крупнее, тем последствия такого срыва значительнее.

Автор уже третий год ведет учебные занятия по курсу "Решение расчетных задач на Платформе 1С 8", и практически на каждом потоке находятся учащиеся, задающие один и тот же резонный вопрос: А зачем вообще нужен реквизит КатегорияРасчета, если структура ("дерево") базовой зависимости потенциально определяется из содержания табличных частей БазовыеВидыРасчета всех ПВР, следовательно, категория расчета в принципе может быть получена автоматически, расчетным путем?

В предлагаемой статье сделана попытка дать пример реализации такого алгоритма автоматического определения "категории расчета" каждого ВР перед началом расчетов.

Довольно широко известен алгоритм, который позволяет получить "дерево базовой зависимости" для видов расчета всех ПВР ЗУП примерно такого вида (приводится фрагмент для ВР Районный коэффициент):

Вид расчета

План видов расчета

Районный коэффициент

Основные начисления организаций

Доплата за вечерние часы

Основные начисления организаций

Доплата за ночные часы

Основные начисления организаций

Доплата за работу в праздники и выходные

Основные начисления организаций

Квартальная премия

Дополнительные начисления организаций

Месячная премия

Дополнительные начисления организаций

Доплата за вечерние часы

Основные начисления организаций

Доплата за ночные часы

Основные начисления организаций

Доплата за работу в праздники и выходные

Основные начисления организаций

Оклад по дням

Основные начисления организаций

Оклад по часам

Основные начисления организаций

Оплата по дневному тарифу

Основные начисления организаций

Оплата по производственным нарядам

Основные начисления организаций

Оплата по часовому тарифу

Основные начисления организаций

Оплата праздничных и выходных дней

Основные начисления организаций

Оплата сверхурочных часов

Основные начисления организаций

Оклад по дням

Основные начисления организаций

Оклад по часам

Основные начисления организаций

Оплата по дневному тарифу

Основные начисления организаций

Оплата по производственным нарядам

Основные начисления организаций

Оплата по часовому тарифу

Основные начисления организаций

Оплата праздничных и выходных дней

Основные начисления организаций

Оплата сверхурочных часов

Основные начисления организаций

По итогам работы за год

Дополнительные начисления организаций

Доплата за вечерние часы

Основные начисления организаций

Доплата за ночные часы

Основные начисления организаций

Доплата за работу в праздники и выходные

Основные начисления организаций

Оклад по дням

Основные начисления организаций

Оклад по часам

Основные начисления организаций

Оплата по дневному тарифу

Основные начисления организаций

Оплата по производственным нарядам

Основные начисления организаций

Оплата по часовому тарифу

Основные начисления организаций

Оплата праздничных и выходных дней

Основные начисления организаций

Оплата сверхурочных часов

Основные начисления организаций

Т.е. в дереве состав базы каждого ВР представляются дочерними ветвями элемента дерева, представляющего данный ВР. Таким образом, мы имеем полную картину базовой зависимости для всех ВР информационной базы ЗУП.

Модифицируем дерево базовой зависимости, программно проставив напротив каждого ВР номер уровня "глубины", который этот элемент занимает в дереве (приведен фрагмент; см. прилагаемый файл Глубина.mxl):

Вид расчета

План видов расчета

Глубина

Районный коэффициент

Основные начисления организаций

0

Доплата за вечерние часы

Основные начисления организаций

1

Доплата за ночные часы

Основные начисления организаций

1

Доплата за работу в праздники и выходные

Основные начисления организаций

1

Квартальная премия

Дополнительные начисления организаций

1

Доплата за вечерние часы

Основные начисления организаций

2

Доплата за ночные часы

Основные начисления организаций

2

Доплата за работу в праздники и выходные

Основные начисления организаций

2

Оклад по дням

Основные начисления организаций

2

Оклад по часам

Основные начисления организаций

2

Оплата по дневному тарифу

Основные начисления организаций

2

Оплата по производственным нарядам

Основные начисления организаций

2

Оплата по часовому тарифу

Основные начисления организаций

2

Оплата праздничных и выходных дней

Основные начисления организаций

2

Оплата сверхурочных часов

Основные начисления организаций

2

Месячная премия

Дополнительные начисления организаций

1

Доплата за вечерние часы

Основные начисления организаций

2

Доплата за ночные часы

Основные начисления организаций

2

Доплата за работу в праздники и выходные

Основные начисления организаций

2

Оклад по дням

Основные начисления организаций

2

Оклад по часам

Основные начисления организаций

2

Оплата по дневному тарифу

Основные начисления организаций

2

Оплата по производственным нарядам

Основные начисления организаций

2

Оплата по часовому тарифу

Основные начисления организаций

2

Оплата праздничных и выходных дней

Основные начисления организаций

2

Оплата сверхурочных часов

Основные начисления организаций

2

Оклад по дням

Основные начисления организаций

1

Оклад по часам

Основные начисления организаций

1

Оплата по дневному тарифу

Основные начисления организаций

1

Оплата по производственным нарядам

Основные начисления организаций

1

Оплата по часовому тарифу

Основные начисления организаций

1

Оплата праздничных и выходных дней

Основные начисления организаций

1

Оплата сверхурочных часов

Основные начисления организаций

1

По итогам работы за год

Дополнительные начисления организаций

1

Мы видим, что в таком дереве одни и те же виды расчета имеют разные уровни "глубины": например, вид расчета Оклад по дням в одной строчке имеет уровень 1, поскольку он входит в базу ВР Районный коэффициент, в других строчках он имеет уровень 2, поскольку входит также в базу ВР Квартальная премия и Месячная премия, которые, в свою очередь, являются базовыми для ВР Районный коэффициент.

Вопрос: что является мерой "категории расчета" для каждого ВР? Ответ будет такой: мерой категории расчета, а точнее, мерой очередности расчета каждого ВР будет максимальное значение уровня глубины его расположения в этом дереве. Чем "глубже" мы находим данный ВР в этом дереве, тем раньше мы его должны рассчитать, чтобы получить правильный состав базы для тех ВР, которые от него зависят. И максимальное значение уровня для данного ВР в этом дереве можно рассматривать как приоритет порядка расчета этого ВР при расчете всего документа.

Из этого следует, что, получив максимальное значение уровня каждого ВР в этом дереве, сгруппировав ВР по полученным максимумам и отсортировав по ним в убывающем порядке, мы получим дерево приоритетов расчета:

Приоритет расчета

Вид расчета

3

 

3

Доплата за вечерние часы

3

Доплата за ночные часы

3

Доплата за работу в праздники и выходные

3

Оклад по дням

3

Оклад по часам

3

Оплата по дневному тарифу

3

Оплата по производственным нарядам

3

Оплата по часовому тарифу

3

Оплата праздничных и выходных дней

3

Оплата сверхурочных часов

2

 

2

Квартальная премия

2

Месячная премия

2

По итогам работы за год

1

 

1

БЛ по травме в быту (не оплачивается)

1

Дивиденды акционеров

1

Дивиденды работников

1

Доплата до среднего заработка

1

Компенсация отпуска по календарным дням

1

Компенсация отпуска по шестидневке

1

Компенсация отпуска при увольнении по календарным дням

1

Компенсация отпуска при увольнении по шестидневке

1

Оплата авторских договоров

1

Оплата БЛ по травме на производстве

1

Оплата больничных листов

1

Оплата дополнительных выходных дней по уходу за детьми - инвалидами

1

Оплата лицензионных договоров

1

Оплата отпуска по календарным дням

1

Оплата отпуска по шестидневке

1

Оплата по договорам подряда

1

Оплата по среднему заработку

1

Оплата простоя от оклада по дням

1

Оплата простоя от оклада по часам

1

Оплата простоя по дневному тарифу

1

Оплата простоя по часовому тарифу

1

Простой по вине работодателя

1

Районный коэффициент

1

Северная надбавка

0

 

0

Удержание по исп. листу процентом

Таким образом, приоритет являет собой величину, "дополнительную" по отношению к категории расчета: чем "выше" категория расчета у ВР, тем ниже его приоритет расчета.

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

 

Изложенный алгоритм реализован в учебной каркасной базе. Файл выгрузки загружается в пустую базу версии 1С 8.2; конфигурация работает в обычном режиме. Исходная конфигурация (с использованием для расчетов реквизитов КатегорияРасчета в Планах видов расчета) находится в файле ИсходнаяКонфигурация.dt, реализация описанного алгоритма расчета без реквизита КатегорияРасчета - в файле РасчетБезКатегорииРасчета.dt.

Демонстрация происходит при помощи документа Начисление зарплаты (расчет в форме): для автозаполнения документа нужно нажать кнопку Заполнить, для производства расчета начислений и удержаний - нажать кнопку Рассчитать. Можно убедиться, что результаты расчета в исходном варианте конфигурации и в варианте "без реквизита КатегорияРасчета" идентичны.

Расчетные алгоритмы находятся в общем модуле ПроведениеРасчетов.

При желании можно доработать конфигурацию так, что пользователь сможет устанавливать приоритет расчета "принудительно". В этом случае, если приоритет установлен, то для расчета суммы начисления берется установленное пользователем значение приоритета, если не установлен (равен 0), то берется значение приоритета, рассчитанное при помощи вышеописанного алгоритма. Этот вариант находится в файле РасчетБезКатегорииРасчетаСНазначениемПриоритета.dt, там в Планы видов расчета добавлен числовой реквизит ПриоритетРасчета, значение по умолчанию которого равно 0 - т.е. приоритет рассчитывается программно.

 

В заключение - несколько замечаний.

1. Цель алгоритма такова, чтобы рассчитанный приоритет ВР был просто меньше всех приоритетов его базовых начислений, а не в точности на единицу меньше. Поэтому не стоит удивляться, если вид расчета, в базу которого входит ВР с приоритетом 3, получает приоритет 1, а не 2 - на правильность расчета по базе это не повлияет.

2. Согласно алгоритму "невовлеченные" виды расчета - т.е. такие, которые сами не имеют зависимости по базе и от них также не зависит по базе ни один ВР - получают наинизший приоритет, т.е. рассчитываются в последнюю очередь. (В ЗУП "невовлеченным" ВР присваивается категория Первичные - т.е. они рассчитываются в первую очередь). Это тоже не влияет на правильность расчета, поскольку для таких ВР очередность расчета значения вообще не имеет.

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

См. также

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

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

03.06.2024    4894    Serg2000mr    32    

108

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

Уже не одна веб-страница исписана знаниями о дополнительных обработках, как создать, как подключить. Есть масса вариантов, как их можно отладить. Я разобрался в кишках работы библиотеки и покажу, как можно расширить возможности дополнительных отчетов, а также покажу удобный способ отладки.

07.02.2024    4043    YA_418728146    11    

53

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

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

28.12.2023    6427    mrXoxot    11    

112

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

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

08.11.2023    12733    ids79    25    

81

Математика и алгоритмы Инструментарий разработчика Программист Платформа 1С v8.3 Мобильная платформа Россия Абонемент ($m)

Что ж... лучше поздно, чем никогда. Подсистема 1С для работы с регулярными выражениями: разбор выражения, проверка на соответствие шаблону, поиск вхождений в тексте.

1 стартмани

09.06.2023    10906    7    SpaceOfMyHead    18    

61

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

Во второй части статьи рассмотрим вопрос преобразования адреса из старого формата в новый. Рассмотрим реальные задачи, связанные с контактной информацией.

05.06.2023    9889    biimmap    4    

46

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

Уверен, все в курсе, что контактная информация опять во всех конфигурациях хранится по-новому. Связано это с появлением так называемых муниципальных адресов, где районы заменили городские округа. Сейчас происходит массовый отказ от УПП и других устаревших решений, а также массовый переход с зарубежных систем. Возникает потребность преобразовать старые адреса в новые. И тут нас всех ждёт масса неприятных сюрпризов от разработчиков БСП. О программном интерфейсе контактной информации и пойдёт речь в данной статье.

23.05.2023    17467    biimmap    43    

63

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

Вот и до меня дошел обновленный механизм проведения документов. С прошлой статьи механизм сильно изменился, и решено было кратко описать нововведения и изменения по сравнению с тем, что было раньше. А также разобрать создание и добавления в УМ (учетный механизм) регистра накопления и неподчиненного регистратору регистра сведений. Поэтому в этой статье могут быть опущены какие-то ключевые моменты.

13.02.2023    13615    skv_79    15    

105
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. script 128 22.07.10 16:58 Сейчас в теме
Гы-гы. Может вернуться к семерочному реквизиту Приоритет в компоненте Расчет ? ;)
2. ixijixi 1913 17.10.11 11:15 Сейчас в теме
Спасибо за статью, это именно то, что нужно.
3. acces969 362 23.09.17 07:27 Сейчас в теме
Такие задачи решаются рекурсией, но она сами знаете чем чревата.

&НаСервере
Функция ОпределениеПорядкаВидовРасчетов(ТЗ)
	
	ИзмененПорядок = Ложь;
	Для каждого СтрокаВидаРасчета Из ТЗ Цикл
		
		Для каждого БазовыйВидРасчета Из СтрокаВидаРасчета.ВидРасчета.БазовыеВидыРасчета Цикл
			СтруктураПоиска = Новый Структура("ВидРасчета", БазовыйВидРасчета.ВидРасчета);
			БазовыеВидыРасчета = ТЗ.НайтиСтроки(СтруктураПоиска);
			Для каждого СтрокаБазовогоВидаРасчета Из БазовыеВидыРасчета Цикл
				Если СтрокаБазовогоВидаРасчета.Порядок < СтрокаВидаРасчета.Порядок + 1 Тогда 
					СтрокаБазовогоВидаРасчета.Порядок = СтрокаВидаРасчета.Порядок + 1;	
					ИзмененПорядок = Истина;
				КонецЕсли;
				
			КонецЦикла;		
		КонецЦикла;	
	КонецЦикла;	
	
	Если ИзмененПорядок Тогда
		ТЗ = ОпределениеПорядкаВидовРасчетов(ТЗ);
	КонецЕсли;
	
	Возврат ТЗ;
		
КонецФункции
Показать
4. boln 1041 23.09.17 10:07 Сейчас в теме
(3)
Такие задачи решаются рекурсией, но она сами знаете чем чревата.

"В России две беды - рекурсия и две беды"(с) :)))

А чем чревата рекурсия? Переполнением стека? Но это становится вероятным на очень большой глубине вложения вызовов, что, в свою очередь, зависит от количества обрабатываемых элементов. А количество видов расчета - несколько десятков. Любой стек, по-моему, не треснет от такого заполнения.

Я в своем коде, в прикрепленной базе, использую рекурсивный поиск по дереву значений. По таблице значений, конечно, круче, но она становится эффективной на большой глубине вложения вызовов. На небольшой глубине дерево тормозит не сильно, ТЗ и ДЗ работают примерно с одинаковой производительностью.

И, конечно, если передавать ТЗ параметром в функцию, стек может быстро треснуть. Можно обойтись без передачи ТЗ через параметр.
Оставьте свое сообщение