Имя: Пароль:
1C
 
ЗУП 3.1 Справка для пособия по безработице
0 DomenER
 
13.08.25
12:05
Всем привет.

При формировании справки для пособия по безработице из документа увольнения доход учитывается как максимальный за 3 месяца в течении последнего года. При этом коэффициент индексации не учитывается.
Если сформировать другую справку "Расчет среднего заработка(для выходного пособия)" то там выводится колонка индексации заработка и колонка заработка с учетом индексации.

Бухгалтера говорят, что в справке выходного пособия в доходах также должен учитываться коэффициент индексации.

В общем модуле забыли включить данные индексации?
1 Гена
 
гуру
13.08.25
12:17
ЗУП всегда прав (с) Гена

А бухгалтеров просто тихо спросите: вы что, против бюджета нашей Родины прёте? С какой стати платить пособие больше только из-за того, что какой-то работодатель индексировал когда-то зарплату.

Приказ 57н
https://www.garant.ru/products/ipo/prime/doc/408650865/
2 DomenER
 
13.08.25
12:18
(1) проще говоря выходное пособие платится государством и коэффициент индексации при этом участвовать не должен.
3 DomenER
 
13.08.25
12:19
(1) Спасибо
4 DomenER
 
18.08.25
11:30
(1) Продолжение истории. Бухгалтер прислала письмо с утверждением, что коэффициенты индексации должны учитываться при расчёте среднего заработка.
Приводят следующий текст:

Постановление Минтруда РФ от 12.08.2003 N 62
ОБ УТВЕРЖДЕНИИ ПОРЯДКА ИСЧИСЛЕНИЯ СРЕДНЕГО ЗАРАБОТКА ДЛЯ ОПРЕДЕЛЕНИЯ РАЗМЕРА ПОСОБИЯ ПО БЕЗРАБОТИЦЕ И СТИПЕНДИИ, ВЫПЛАЧИВАЕМОЙ ГРАЖДАНАМ В ПЕРИОД ПРОФЕССИОНАЛЬНОЙ ПОДГОТОВКИ, ПЕРЕПОДГОТОВКИ И ПОВЫШЕНИЯ КВАЛИФИКАЦИИ ПО НАПРАВЛЕНИЮ ОРГАНОВ СЛУЖБЫ ЗАНЯТОСТИ
10.При повышении в организации (филиале, структурном подразделении) тарифных ставок (должностных окладов, денежного вознаграждения) средний заработок работников повышается в следующем порядке:
если повышение произошло в расчетный период, выплаты, учитываемые при определении среднего заработка и начисленные за предшествующий повышению период времени, повышаются на коэффициенты, которые рассчитываются путем деления тарифной ставки (должностного оклада, денежного вознаграждения), установленной в месяце наступления случая, с которым связано сохранение среднего заработка, на тарифные ставки (должностные оклады, денежное вознаграждение) каждого из месяцев расчетного периода;
если повышение произошло после расчетного периода до дня увольнения, повышается средний заработок, исчисленный за расчетный период;
если повышение произошло после увольнения работника, повышение среднего заработка не производится.
5 DomenER
 
18.08.25
11:33
6 DomenER
 
18.08.25
11:39
(5) Выдержки приводят к тому, что неправильно определяются периоды трёх месяцев. Типа ЗУП сам решил, что надо брать периоды с максимальным доходом.
7 Гена
 
гуру
18.08.25
11:40
Приказ Министерства труда и социальной защиты РФ от 14 сентября 2021 г. N 628н "О признании утратившим силу постановления Министерства труда и социального развития Российской Федерации от 12 августа 2003 г. N 62 "Об утверждении Порядка исчисления среднего заработка для определения размера пособия по безработице и стипендии, выплачиваемой гражданам в период профессиональной подготовки, переподготовки и повышения квалификации по направлению органов службы занятости"
https://base.garant.ru/402948058/#block_1
8 Гена
 
гуру
18.08.25
11:43
(6) Релиз?
Давайте конкретные цифры расчёта ЗУПа и что хочет видеть бухгалтер.
9 DomenER
 
18.08.25
11:43
(7) Спасибо. Им переслал ознакомиться.
10 DomenER
 
18.08.25
11:45
(8) У нас 3.1.30.248.
Статью ещё не разбирал. Мне надо вчитываться.
11 DomenER
 
18.08.25
12:08
(8) В общем у них претензия к тому, что ЗУП определяет свой период с максимальным доходом. И написали следующее:

Приказ Министерства труда и социальной защиты РФ от 13.02.2024 № 57н действующий, где указано что
•    В расчетный период нужно включить 3 месяца перед увольнением – п. 1 Порядка
•    Расчетный период может сдвигаться, если внутри него есть периоды болезни или весь расчетный период состоит из отсутствий – пп. а — в пункта 3 Порядка
При этом требование о выборе месяцев с максимальным доходом отсутствует.
12 Гена
 
гуру
18.08.25
12:21
(11) Статью - в мусорку. Во-первых, там в ЗУПе рассмотрено увольнение в ноябре 2023 года, а тогда программа считала по-другому, т.к. 57н начал действовать с апреля 2024. И надо рассматривать поздние случаи в программе.

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

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

В последний раз:
Давайте конкретные цифры расчёта ЗУПа и что хочет видеть бухгалтер.
13 Гена
 
гуру
18.08.25
17:57
Итак, вся эта лабудень расситывается в Общем модуле КадровыйУчетРасширенный

В нём самая свежая функция только эта:
Функция СведенияОСреднемЗаработкеДляСправкиПоБезработицеС2023

А новой, с апреля 2024 года - нет. Поэтому и захватывается месяц перед увольнением, а не месяц ему предшествующий.
Завёл кекса с з/п в каждом месяце 40к кроме сентября, где 100к.
Уволил 01.05.2025
(см. рис.)
14 DomenER
 
18.08.25
18:01
(13) В данном примере период возьмётся с июля по сентябрь 2024, а не период 2025 года
15 DomenER
 
18.08.25
18:08
(14) Вот по данному примеру бухгалтера считают, что должны учитываться последние 3 месяца перед увольнением.
Февраль, март и апрель 2025 при полной отработке месяцев сотрудником.
16 Гена
 
гуру
18.08.25
18:13
В Функция СреднийЗаработокСотрудников происходит следующее.
Начиная с первого месяца этого интервала в 12 месяцев Июнь_2024 - Май_2025 идёт цикл перебора интервальчиков в три месяца:
Июнь_2024 - Август_2024
Июль_2024 - Сентябрь_2024
...
Март_2025 - Май_2025

Каждый раз рассчитывается суммарный заработок интервальчика и по условию:
Если СуммаЗаработка >= ДанныеПериодаСотрудника.Сумма Тогда
                ДанныеПериодаСотрудника.Сумма = СуммаЗаработка;
                ДанныеПериодаСотрудника.Время = Время;
                ДанныеПериодаСотрудника.НачалоПериода = ДанныеСотрудника.Значение[Индекс].НачалоПериода;
                ДанныеПериодаСотрудника.ОкончаниеПериода = ОкончаниеПериода;
            КонецЕсли;

Закрепляется максимальный. В нашем случае это Сентябрь_2024 - Ноябрь_2024

Данный интервальчик назначается расчётным периодом (РП), ну и рассчитывает средний заработок для пособия по безработице, который потом плюхается в Справку для безработицы. Кстати новой действующей печатной формы.

Полная хрень, естественно. Только укуренный вусмерть методист фирмы 1С мог задать такой алгоритм.

Вывод: стандартный. ЗУП не умеет напрочь выбирать алгоритмически РП для расчёта средних. И никогда не умел. Да и не надо. Пользователь всегда вручную выбирал РП, например, для увольнений тех же долгих декретниц.

Для пособия по безработице надо вручную выбирать РП для каждого кекса.

Тем более, что его размер может быть как 3 месяца, так и два, и даже 1.

В нашем примере необходимо и достаточно установить РП: Февраль_2025 - Апрель_2025
Распечатать Справку по безработице и вернуть период как булО для тех же КНО и выходных пособий.
17 Гена
 
гуру
18.08.25
18:18
(14) Ошибаетесь, там стоит не "больше", а "больше/равно".
Поэтому одинаковые три интервальчика с заработком в 180к в конце концов остановятся на Сентябрь_2025 - Ноябрь_2025
18 Гена
 
гуру
18.08.25
18:17
Вроде закруглились. А то нельзя оставлять недоделку )
19 DomenER
 
19.08.25
11:02
(16) Это мы визуально поняли, что нужен этот период. Это получается каждый раз бухгалтеру нужно вывести справку о среднем заработке, чтобы понять какой период ему нужен. А потом менять периоды, чтобы сформировать корректно справку и возвращать периоды обратно. Со стороны выглядит как "танцы с бубнами". Учитывая, что это во всей России, то надо бы в 1С черкануть.
20 Гена
 
гуру
19.08.25
11:16
(19) Да что Вы сразу "черкануть" да "написать"... Не 37-ой )

Согласен, коряво. Надо подумать.
21 Гена
 
гуру
19.08.25
11:34
Поехали. Девки за орехами.
Выше мы выяснили, что ЗУП прекрасно рассчитывает среднедневной заработок (СДЗ) если задан расчётный период (РП). Последний ЗУП сам точно не считает, а отдаёт на ручное изменение пользователю. Для «одной кнопки» расчёта СЗ по безработице нам необходимо и достаточно лишь только закодить точный выбор расчётного периода РП в нашей программе.
Сделать это несложно, потому что в отличие от обычных средних у нас есть простая схема определения РП. Для наглядности откройте картинку из поста #13.

1.    Сначала строго берём 9-11 месяцы из года до месяца увольнения (12-й месяц предшествует месяцу увольнения).
В примере с картинки для увольнения в июне: РП = РП_1 = Февраль – Апрель
Если в нашем массиве нет сумм или отработанных дней, то переходи к следующему пункту.

2. Берём предыдущие 3 месяца, а именно 6-8 из года до месяца увольнения.
В примере с картинки для увольнения в июне: РП_2 = Ноябрь – Январь
Если в нашем массиве нет сумм или отработанных дней, то переходим к следующему пункту.

3. РП_3 = один только 12-й Месяц (Май)

Пруф: Приказ 57н пункты 8 и 9.

Согласитесь, что схема примитивная и легко исполнима.
Итак, кодим расширение для одной только функции:
Функция СреднийЗаработокСотрудников(ДанныеОЗаработкеСотрудников)
Никакого дурацкого цикла. Прямо по нашей схеме. Учтём только индексы по номерам месяцев большого годового расчётного периода, чтоб не запутаться.
Функция СреднийЗаработокСотрудников(ДанныеОЗаработкеСотрудников)       //Домен и Гена
    
    ДанныеСреднегоЗаработка = Новый Соответствие;
    Для Каждого ДанныеСотрудника Из ДанныеОЗаработкеСотрудников Цикл
        
        ДанныеПериодаСотрудника = Новый Структура("Сумма,Время,НачалоПериода,ОкончаниеПериода",
            0, 0, '00010101', '00010101');
            
        //Инд + номер месяца в большом обычном годовом расчётном периоде    
        Инд6 = ДанныеСотрудника.Значение.Количество() - 7;
        Инд7 = ДанныеСотрудника.Значение.Количество() - 6;
        Инд8 = ДанныеСотрудника.Значение.Количество() - 5;
        Инд9 = ДанныеСотрудника.Значение.Количество() - 4;
        Инд10 = ДанныеСотрудника.Значение.Количество() - 3;
        Инд11= ДанныеСотрудника.Значение.Количество() - 2;
        Инд12= ДанныеСотрудника.Значение.Количество() - 1;

        ДанныеПериодаСотрудника.Сумма = ДанныеСотрудника.Значение[Инд9].Сумма + ДанныеСотрудника.Значение[Инд10].Сумма + ДанныеСотрудника.Значение[Инд11].Сумма;
        ДанныеПериодаСотрудника.Время = ДанныеСотрудника.Значение[Инд9].Время + ДанныеСотрудника.Значение[Инд10].Время + ДанныеСотрудника.Значение[Инд11].Время;
        ДанныеПериодаСотрудника.НачалоПериода = ДанныеСотрудника.Значение[Инд9].НачалоПериода;
        ДанныеПериодаСотрудника.ОкончаниеПериода = ДанныеСотрудника.Значение[Инд11].ОкончаниеПериода;

        Если (ДанныеПериодаСотрудника.Сумма = 0) Или (ДанныеПериодаСотрудника.Время = 0) Тогда
            ДанныеПериодаСотрудника.Сумма = ДанныеСотрудника.Значение[Инд6].Сумма + ДанныеСотрудника.Значение[Инд7].Сумма + ДанныеСотрудника.Значение[Инд8].Сумма;
            ДанныеПериодаСотрудника.Время = ДанныеСотрудника.Значение[Инд6].Время + ДанныеСотрудника.Значение[Инд7].Время + ДанныеСотрудника.Значение[Инд8].Время;  
            ДанныеПериодаСотрудника.НачалоПериода = ДанныеСотрудника.Значение[Инд6].НачалоПериода;
            ДанныеПериодаСотрудника.ОкончаниеПериода = ДанныеСотрудника.Значение[Инд8].ОкончаниеПериода;
        КонецЕсли;

        Если (ДанныеПериодаСотрудника.Сумма = 0) Или (ДанныеПериодаСотрудника.Время = 0) Тогда
            ДанныеПериодаСотрудника.Сумма = ДанныеСотрудника.Значение[Инд12].Сумма;
            ДанныеПериодаСотрудника.Время = ДанныеСотрудника.Значение[Инд12].Время;
            ДанныеПериодаСотрудника.НачалоПериода = ДанныеСотрудника.Значение[Инд12].НачалоПериода;
            ДанныеПериодаСотрудника.ОкончаниеПериода = ДанныеСотрудника.Значение[Инд12].ОкончаниеПериода;
        КонецЕсли;

        ДанныеСреднегоЗаработка.Вставить(ДанныеСотрудника.Ключ, ДанныеПериодаСотрудника);
    КонецЦикла;    
    Возврат ДанныеСреднегоЗаработка;    
КонецФункции

Осталось только прогнать эту новую функцию, поправить синтаксис и оформить в виде расширения.
Действуйте.

P.S. Интуиция подсказывает, что покатит легко и свободно, потому что код красивый. Потратил на ветку в общем около двух часов. Многовато. Поэтому если кому понравится и будет использовать, то не обижусь на скромный бонус )
Волшебник, не щурьтесь – я столько времени на задачу никогда не тратил… из вопросов по 1С…
22 DomenER
 
19.08.25
11:58
(21) Эм. А если сотрудник отработал всего полгода, то получится отрицательная цифра
Инд6 =  ДанныеСотрудника.Значение.Количество() - 7;


Может лучше так

Инд6 =  ?(ДанныеСотрудника.Значение.Количество() - 7>0,ДанныеСотрудника.Значение.Количество() - 7,0);

Тут либо 0 подставлять, либо Неопределено и дальше по коду это учитывать
23 Гена
 
гуру
19.08.25
12:01
(22) Это уже рюшечки... на Ваше усмотрение.
24 DomenER
 
19.08.25
12:34
(23) Ещё тут проверяется, что сразу 3 месяца подряд должны быть 0, чтобы период сместился. А если какой-то 1 месяц содержат нули?
25 Гена
 
гуру
19.08.25
12:46
(24) Пусть содержат. Сдвиг только когда во всём "квартале" ноль.
8. В случае если работник за расчетный период [Февраль-Апрель] не имел фактически начисленных выплат или фактически отработанных дней либо этот период состоял из времени, исключаемого из расчетного периода в соответствии с пунктом 7 настоящего Порядка, средний заработок определяется исходя из суммы выплат, фактически начисленных за предшествующий период, равный расчетному [Ноябрь-Январь], в пределах 12 календарных месяцев, предшествующих месяцу увольнения.
26 Гена
 
гуру
20.08.25
07:24
Справку-то мы сделали, надеюсь, дописали не отрицательность индексов. Но можно пойти дальше.  
Профи по ККМ могут покинуть ветку, у них сейчас первосентябрьский чёс. А вот зарплатным гурманам предлагаю остаться.

Обратили внимание на «странный» расчётный период в Приказе 57н, заменившим Постановление 1026?
Три календарных месяца, предшествующих календарному месяцу перед месяцем увольнения гражданина с последнего места работы.
?

А до того в 2022 году действовало Постановление 1552 и там вообще было для расчётного периода:
3 месяца, предшествующие календарному кварталу перед месяцем подачи заявления в ЦЗН.
Кстати именно в этом году справки о среднем заработке для работодателей стали выборочными для редких категорий работников.

Дело в том, что четыре года назад бюрократические шестерёнки наконец прокрутились и при Мишустине наладился почти мгновенный межведомственный обмен электронными документами.
Биржа труда стала достаточно быстро получать данные из ФНС по ежемесячным суммам наших заработков по сданным нами РСВ. Ну а трудовой стаж и БЛ – из СФР.
Вот почему с начала мишустинской перестройки брался квартал, предшествующий кварталу. Потому что месяц ещё после окончания квартала сдавался РСВ и ещё месяц шли межведомственные сроки. Биржа труда стала самостоятельно рассчитывать пособие по безработице и наши справки стали ей не нужны.

А в 2023 году появился новый отчёт в ФНС – Персы – Персонифицированные сведения о физических лицах. Он как раз ежемесячный и в нём просто сумма этого заработка. Теперь ЦЗН больше не требуется ждать квартального РСВ, достаточно дождаться только наших Персов, а это месяц. Вот поэтому такой «странный» РП как три месяца, предшествующих месяцу перед месяцем увольнения. На нашем примере при увольнении 1-го июня расчётным периодом будет Февраль-Апрель. Понятно, что ведомства всё успевают, т.к. срок сдачи Персов за апрель – 25 мая.
Естественно, что в знаменателе расчёта СЗ_ЦЗН биржа труда берёт количество месяцев расчётного периода. Ведь данных о точном отработанном времени у них нет.

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

Если сотни работников в программе и достаточная текучка, то насколько удобнее было бы пользователям, если бы они сразу видели в доке Увольнения СЗ для безработицы по данным в ЦЗН и сообщение: этому кексу справка о расчёте нашего заработка по безработицы НЕ НУЖНА. Можно не печатать. А вот этому кренделю – нужна, т.к. в ЦЗН нулевой заработок.

Алгоритм простой как грабли:
1. Мы берём 12 месяцев увольняемого, суммы – по нашим сданным Персам.  
2. Отмечаем «грязные» месяцы на выкидыш по условию нулевого дохода или хотя бы одного дня БЛ.
3. По чистым месяцам запускаем типовую функцию выше, которую мы обхаяли и заменили на свою. Она, как ни смешно, годится именно для расчёта ЦЗН. Она нам и найдёт среди чистых либо три месяца подряд, либо два, либо даже один, ближайшие к дате увольнения. Либо выдаст: ноль, требуется печатать нашу справку.
СЗ_ЦЗН = ЗаработокРП_по_Персам / КоличествоМесяцевРП

Ну и бантики: снимается напряжение уволенного. Если раньше он врывался в бухгалтерию с криком:
- Хочу справку для безработицы!
То теперь расчётчица покажет ему СЗ_ЦЗН:
- Придурок, тебя и так уже посчитала биржа труда, будешь получать пособие по максимуму, мотай лучше за справкой в психушку!

При желании можно добавить два новых поля на форме дока увольнения под средними для компенсаций и выходных пособий: СЗ_ЦЗН и СЗ_безработицы_по нашей справке. Флажок: включать или нет эту справку в комплект документов к печати при увольнении.
27 SleepyHead
 
гуру
20.08.25
08:10
(0) Отличный план, но попробуй убеди работника, что справка не нужна! Поднимется скандал, что бухгалтерия не хочет работать.
28 BublikNM
 
21.08.25
05:16
У меня тоже клиент обратился с вопросом почему 1С берет не тот период для справки, после изучения статей пришел к выводу, что надо исправить))) исправили, теперь период берется согласно постановлению, бухгалтер доволен и это хорошо)))
29 Гена
 
гуру
21.08.25
08:30
Нужен Внешний отчёт. Нахождение СЗ_ЦЗН как числа с дробной частью равно 2.
Плачу 2к.
ТЗ
Организация, Сотрудник, ДатаУвольнения = выбираются пользователем. Используются на входе в функцию.  
1. Определяем Интервал работы с данными. Функция. На выходе НачалоИнтервала, КонецИнтервала
а) 12 месяцев до месяца увольнения, т.е. конец интервала = ДатаКонец(МесяцУвольнения - 1)
б) начало интервала первичное = ДатаНачала(МесяцУвольнения – 12)
в) Находим ДатаПриема для данной ДатаУвольнения
г) Если приём на работу ранее или равно началу интервала первичное, то конец, выход из функции. Интервал найден.
д) Если приём на работу позднее начала интервала первичное, то ветвление:
Если дата приёма 1-е число, то именно она и есть НачалоИнтервала. Выход из функции.
А если не первое число, то НачалоИнтервала = ДатаНачала(МесяцПриема + 1) = 1-е число следующего месяца
е) Выход из функции, которая, получив на входе Организация, Сотрудник, ДатаУвольнения, выдала на выходе НачалоИнтервала, КонецИнтервала

Если НачалоИнтервала > КонецИнтервала Тогда большой выход из отчёта с выдачей СЗ_ЦЗН = 0

2. Итак имеем Сотрудник и Интервал от 1-го до 12 конкретных месяцев
Маркировка Да/Нет этих месяцев (хороший или плохой)
Идём в РС СостоянияСотрудников
По нашему сотруднику внутри найденного ранее Интервала проверяем ресурс Состояние на предмет равенства Перечисление.Состояния.Болезнь или БолезньБезОплаты или ОтпускПоБеременностиИРодам
Месяцы, в которых присутствуют эти состояния маркируем Нет (плохой)
Если не осталось ни одного хорошего, то большой выход из отчёта с выдачей СЗ_ЦЗН = 0

Если хорошие месяцы в Интервале остались, то только по ним находим Доход. Для этого идём в РН СведенияОДоходахСтраховыеВзносы
Важно: здесь берём не реквизит сотрудника, а измерение ФизическоеЛицо, потому что суммируем доходы и по совместительствам.
Нас интересуют только доходы, для которых для Период = рассматриваемый пока хороший месяц измерение ВидДохода = Справочник. ВидыДоходовПоСтраховымВзносам.ВходитВБазу2023 или ОблагаетсяВзносамиЧастично = Истина
Забираем числа из ресурсов Сумма и Скидка: Доход = Сумма – Скидка
К плохим месяцам Интервала добавляем те месяца, для которых Доход = 0
Если в Интервале не осталось хороших месяцев, то большой выход из отчёта с выдачей СЗ_ЦЗН = 0

3. Окончательно имеем Таблицу, сортируем от настоящего в прошлое:
1-ый Месяц до увольнения = Месяц КонецИнтервала … Доход1
2-ой Месяц до увольнения = Месяц КонецИнтервала - 1 … Доход2

Месяц НачалоИнтервала = Месяц КонецИнтервала – N … ДоходN+1
В Таблице всего N+1 строк
Маркировка хороший/плохой уже не нужна, т.к. всегда уже для плохих месяцев Доход = 0. Это и есть уже цвет месяца, т.к. месяца с БЛ мы даже не искали в РН доходов, значит они остались нулевыми.
В нашей таблице хороший месяцi = когда Доходi > 0.
Для отладки давайте пока выведем эту табличку на просмотр.

4. Проверяем на хорошесть основной расчётный период = три месяца, предшествующих месяцу перед месяцем увольнения, т.е. (Доход2 > 0) И (Доход3 > 0) И (Доход4 > 0)
Если Истина Тогда большой выход из отчёта с выдачей СЗ_ЦЗН = (Доход2 + Доход3 + Доход4) / 3
Иначе продолжаем.

5. Перебор одиночных интервальчиков.
Находим в цикле перебора i от 1 до N+1 первый же хороший месяц (очевидно ближайший к дате увольнения) Доходi > 0
Запоминаем: ДоходУно и K=1 (как количество месяцев одиночных интервальчиков)
Если нет - то большой выход из отчёта с выдачей СЗ_ЦЗН = 0

6. Перебор двойных интервальчиков
Цикл перебора: i от 1 до N
Только теперь смотрим два подряд хороших (доходных) месяца (Доходi > 0) И (Доходi+1 > 0)
Если нашли, то запоминаем ДоходДабл = Доходi + Доходi+1 и K=2 (как количество месяцев в дабле)
Если не нашли, то большой выход из отчёта с выдачей СЗ_ЦЗН = ДоходУно

7. Перебор тройных интервальчиков
Цикл перебора: i от 1 до N-1
Только теперь смотрим три подряд хороших (доходных) месяца (Доходi > 0) И (Доходi+1 > 0) И (Доходi+2 > 0)
Если нашли, то запоминаем ДоходТребл = Доходi + Доходi+1 + Доходi+2 и K=3 (как количество месяцев в требле)
Большой выход из отчёта с выдачей СЗ_ЦЗН = ДоходТребл / 3
Если не нашли, то большой выход из отчёта с выдачей СЗ_ЦЗН = ДоходДабл / 2

Всё.
30 DomenER
 
21.08.25
17:43
(28) Какой алгоритм написали в общем модуле?
31 DomenER
 
22.08.25
15:23
(21) Так пока сделал.

&Вместо("СреднийЗаработокСотрудников")
Функция РасшОтп_СреднийЗаработокСотрудников(ДанныеОЗаработкеСотрудников)
        ДанныеСреднегоЗаработка = Новый Соответствие;
    Для Каждого ДанныеСотрудника Из ДанныеОЗаработкеСотрудников Цикл
        //Таб = Новый ТаблицаЗначений;
        //Таб.Колонки.Добавить("Сумма",Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(12, 2));
        //Таб.Колонки.Добавить("Время",Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(3, 0));
        //Таб.Колонки.Добавить("НачалоПериода",Новый ОписаниеТипов("Дата",Новый КвалификаторыДаты(ЧастиДаты.Дата));
        //Таб.Колонки.Добавить("ОкончаниеПериода",Новый ОписаниеТипов("Дата",Новый КвалификаторыДаты(ЧастиДаты.Дата));
        //Для каждого СтрокаМассива ИЗ ДанныеСотрудника.Значение Цикл
        //    НоваяСтрокаТЧ = Таб.Добавить();
        //    ЗаполнитьЗначенияСвойств(НоваяСтрокаТЧ,СтрокаМассива);
        //КонецЦикла;
        ДанныеПериодаСотрудника = Новый Структура("Сумма,Время,НачалоПериода,ОкончаниеПериода",
            0, 0, '00010101', '00010101');
        //++ 2025.08.22
        //Для Индекс = 0 по ДанныеСотрудника.Значение.Количество() - 1 Цикл
        //    СуммаЗаработка = ДанныеСотрудника.Значение[Индекс].Сумма;
        //    Время = ДанныеСотрудника.Значение[Индекс].Время;
        //    ОкончаниеПериода = ДанныеСотрудника.Значение[Индекс].ОкончаниеПериода;
        //    Если Индекс + 1 < ДанныеСотрудника.Значение.Количество() Тогда
        //        СуммаЗаработка = СуммаЗаработка + ДанныеСотрудника.Значение[Индекс + 1].Сумма;
        //        Время = Время + ДанныеСотрудника.Значение[Индекс + 1].Время;
        //        ОкончаниеПериода = ДанныеСотрудника.Значение[Индекс + 1].ОкончаниеПериода;
        //        Если Индекс + 2 < ДанныеСотрудника.Значение.Количество() Тогда
        //            СуммаЗаработка = СуммаЗаработка + ДанныеСотрудника.Значение[Индекс + 2].Сумма;
        //            Время = Время + ДанныеСотрудника.Значение[Индекс + 2].Время;
        //            ОкончаниеПериода = ДанныеСотрудника.Значение[Индекс + 2].ОкончаниеПериода;
        //        КонецЕсли;
        //    КонецЕсли;
        //    Если СуммаЗаработка >= ДанныеПериодаСотрудника.Сумма Тогда
        //        ДанныеПериодаСотрудника.Сумма = СуммаЗаработка;
        //        ДанныеПериодаСотрудника.Время = Время;
        //        ДанныеПериодаСотрудника.НачалоПериода = ДанныеСотрудника.Значение[Индекс].НачалоПериода;
        //        ДанныеПериодаСотрудника.ОкончаниеПериода = ОкончаниеПериода;
        //    КонецЕсли;
        //КонецЦикла;
        //Инд + номер месяца в большом обычном годовом расчётном периоде    
        Если ДанныеСотрудника.Значение.Количество()=1 Тогда
            ДанныеПериодаСотрудника.Сумма = ДанныеСотрудника.Значение[0].Сумма;
            ДанныеПериодаСотрудника.Время = ДанныеСотрудника.Значение[0].Время;
            ДанныеПериодаСотрудника.НачалоПериода = ДанныеСотрудника.Значение[0].НачалоПериода;
            ДанныеПериодаСотрудника.ОкончаниеПериода = ДанныеСотрудника.Значение[0].ОкончаниеПериода;
            ДанныеСреднегоЗаработка.Вставить(ДанныеСотрудника.Ключ, ДанныеПериодаСотрудника);
            Возврат ДанныеСреднегоЗаработка;
        КонецЕсли;
        Индекс = ДанныеСотрудника.Значение.Количество()-2;
        //Для Индекс = 0  по Колво Цикл
        Пока Индекс>0 Цикл
            СуммаЗаработка = ДанныеСотрудника.Значение[Индекс].Сумма;
            Время = ДанныеСотрудника.Значение[Индекс].Время;
            НачалоПериода = ДанныеСотрудника.Значение[Индекс].НачалоПериода;
                Если Индекс - 1 >= 0 Тогда // ДанныеСотрудника.Значение.Количество()
                    СуммаЗаработка = СуммаЗаработка + ДанныеСотрудника.Значение[Индекс - 1].Сумма;
                    Время = Время + ДанныеСотрудника.Значение[Индекс - 1].Время;
                    НачалоПериода = ДанныеСотрудника.Значение[Индекс - 1].НачалоПериода;
                    Если Индекс - 2 >=0  Тогда //ДанныеСотрудника.Значение.Количество()
                        СуммаЗаработка = СуммаЗаработка + ДанныеСотрудника.Значение[Индекс - 2].Сумма;
                        Время = Время + ДанныеСотрудника.Значение[Индекс - 2].Время;
                        НачалоПериода = ДанныеСотрудника.Значение[Индекс - 2].НачалоПериода;
                    КонецЕсли;
                КонецЕсли;
            Если СуммаЗаработка>0 И Время>0 Тогда
                ДанныеПериодаСотрудника.Сумма = СуммаЗаработка;
                ДанныеПериодаСотрудника.Время = Время;
                ДанныеПериодаСотрудника.НачалоПериода = НачалоПериода;
                ДанныеПериодаСотрудника.ОкончаниеПериода = ДанныеСотрудника.Значение[Индекс].ОкончаниеПериода;
                Прервать;
            КонецЕсли;
            Индекс = Индекс - 1;
        КонецЦикла;
        //-- 2025
        
        ДанныеСреднегоЗаработка.Вставить(ДанныеСотрудника.Ключ, ДанныеПериодаСотрудника);
    КонецЦикла;
    
    Возврат ДанныеСреднегоЗаработка;
КонецФункции
32 Гена
 
гуру
22.08.25
17:01
(31) Вот здесь сразу надо поправить:
Индекс = Индекс - 13;
А то при нулевом РП у Вас будет сдвиг в прошлое только на 1 месяц, а надо на 3.

И ещё. У вас продолжится сдвиг в прошлое, если полугодие нулевое, а это неверно.

Надо строго для нашего примера:
1. Февраль-Апрель
2. Если ноль, то Ноябрь-Январь
3. Если ноль, то выход с нулём. Далее алгоритм сам возьмёт в другом модуле текущий месяц увольнения.
33 Гена
 
гуру
22.08.25
17:22
Вас 19 августа попросили в рабочем алгоритме #21 только добавить в массив ДанныеСотрудника.Значение строчки с нулями на тот случай, если большой период среднего по настройке пользователя укорочен датой приёма на работу. 10 минут работы.
Вы три дня мастерили своё, которое опять не сработает для недавней даты приёма.
34 Волшебник
 
22.08.25
18:15
(32) У Вас в пунктах 2 и 3 одинаковое условие "Если ноль".
35 Гена
 
гуру
22.08.25
18:27
(34) Это я кратко. Там по алгоритму #21 так:
1. Февраль-Апрель
2. Если п.1 ноль, то Ноябрь-Январь
3. Если п.2 ноль, то выход с нулём.

Проще всего для неполного количества строк месяцев сделать лесенку. Пусть громоздко, зато понятно.
Если ДанныеСотрудника.Значение.Количество() < 2 => выход с нулем в ДанныеПериодаСотрудника
Если ДанныеСотрудника.Значение.Количество() < 3 => выход с месячным значением в ДанныеПериодаСотрудника
Если ДанныеСотрудника.Значение.Количество() < 4 => выход с дабл-месячным значением в ДанныеПериодаСотрудника
Если ДанныеСотрудника.Значение.Количество() < 5 => выход с требл-месячным значением в ДанныеПериодаСотрудника
...
36 Волшебник
 
22.08.25
18:29
(35) 👍 Тогда понятно.
37 Гена
 
гуру
22.08.25
18:30
Ну или найти в другом месте кода, где формируетс обрезанный по дате приёма входящий в нашу функцию массив и отменить обрез. Чтоб всегда было 12 строк или 13, если была годова премия.
38 Гена
 
гуру
22.08.25
19:35
Нашёл! Вот что значит покурить и подумать )

Как раз в предыдущей Функция СведенияОСреднемЗаработкеДляСправкиПоБезработицеС2023
есть дурацкая строчка:
ДатаНачалаПериода = Макс(ДанныеСотрудника.ДатаПриема, ДобавитьМесяц(ДатаОкончанияПериода, - 12));

Вместо неё естественно
ДатаНачалаПериода = ДобавитьМесяц(ДатаОкончанияПериода, - 12);    //Гена

Всё! Функция #21 полностью рабочая. Кто умеет - делайте расширение. Ну и поделитесь )

Домен, спасибо за интересную задачку. Мне понравилось.
https://www.youtube.com/watch?v=Jg3sEE18WsE
39 Гена
 
гуру
23.08.25
07:40
Коллеги, нужна помощь.
Рис.
Есть Структура ДанныеСотрудника.Значение всегда из 4-х строк.
Как мне вывести окошко пользователю для наглядности в виде сообщения или предупреждения?

Пытаюсь через ОбщегоНазначения.СообщитьПользователю(НСтр("ru='…
но совершенно запутался в кавычках и апострофах… не моё это )

Мне нужно чтобы пользователь увидел окошко:
Расчётный период = Ноябрь 2024 – Январь 2025
Заработок = 60 000.00
Отработано = 59
Программист всегда исправляет последнюю ошибку.