Имя: Пароль:
1C
 
Расчетный листок в 8 раз увеличивает суммы
0 DJ Anthon
 
22.09.23
07:05
Тема уже была Расчетный листок в 8 раз увеличивает суммы, но там ответа нет.

все с начислениями в порядке, но расчетный листок в стандартной конфиге ЗУП (версия 3.1.25.40, 8.3.22.1923) по одному сотруднику в одном месяце удвоил записи начислений, а их суммы умножены в 2 или 4 раза. При этом умножены и дни, и часы. Перехватить расчетный листок в консоли запросов не получается, он формируется программно. Надо какую-то продвинутую консоль, но их в инете тысячи.

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

Если вызывается типовая процедура
    ОтчетРасчетныйЛисток = ЗарплатаКадрыОтчеты.ОтчетРасчетныйЛисток();
    Результат = Отчеты.АнализНачисленийИУдержаний.РасчетныйЛисток(ФизическиеЛица, Организация, МесяцФормированияОтчета, ОтчетРасчетныйЛисток);

то отчет врёт.

нашел, где получаются данные в конфигурации

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

запрос там тот же, что и в моем программном формировании, но результаты разные. параметров там десятки. есть возможность как-то сравнить эти запросы и параметры? на глаз никаких отличий не вижу. ну или перехватить их. запрос 3000 строк, глаза сломать можно.
1 Гена
 
22.09.23
07:22
Давайте картинки трёх месяцев р/л: до плохого, плохой и после плохого.
2 mgreat
 
22.09.23
08:03
Может, кэш? сервак давно перегружали, где 1с крутится? странно как-то все. в регистрах по отработанному времени и начислениям и удержаниям за этот проблемный месяц записи верные?
3 DJ Anthon
 
22.09.23
08:05
(1) так, анализ проблемы показал, что этот сотрудник попадал под удаление дубликатов. полез повторно в кадровую информацию, нашёл несколько подозрительных записей, удалил их, а именно в регистрах Текущие кадровые данные сотрудников и текущая тарифная ставка сотрудников.
исправление первого регистра убрало ошибку задвоения записей начислений, исправление второго регистра убрало дублирование записей в карточке сотрудника и вернула нормальный расчетный листок.
всем спасибо, вопрос решён.
4 Гена
 
22.09.23
08:08
Ну... так неинтересно )
5 2S
 
22.09.23
08:21
(3) было такое, регистр состояний сотрудников некорректно перенесли. У людей по несколько лямов в расчетках было )
6 Гена
 
22.09.23
09:48
Раз это уже вторая ветка за короткое время, то нельзя оставлять непонятым баг учетверения. Открыл демо и порылся. Гадит вот этот регистр сведений: ПлановыйФОТИтоги
Как ни странно, но программа ЗУП 27.51 позволяет править этот регистр вручную напрямую:
https://i.ibb.co/XjJPJ77/2023-09-22-09-11-25.png

Экспериментальные данные:
1. Если по сотруднику две записи любого интервала действия (хоть и с пересечением), но значения ресурса ТарифнаяСтавка совпадают, то с р/л всё нормально.
2. Чудеса с учетверением начинаются, если значения ресурса ТарифнаяСтавка отличаются в записях хоть на одну копейку. И здесь уже важна дата действия.

3. Возьмём текущий сентябрь и проставим в одной записи дату окончания 30.09.2023 23:59:58
https://i.ibb.co/Y23XKF0/2023-09-22-09-04-25.png

Смотрим р/л:
https://i.ibb.co/yNxMHcN/2023-09-22-09-07-53.png
Всё нормально.

4. А теперь добавим одну секунду в дату окончания первой записи регистра:
https://i.ibb.co/G7wNmdK/2023-09-22-09-14-43.png

Смотрим р/л:
https://i.ibb.co/9G81Jrb/2023-09-22-09-17-05.png
Пошло учетверение.

Теперь понятно как быстро исправлять учетверение р/л у клиентов. Просто закрывать по-раньше дату окончания старой записи РС "Плановый ФОТ Итоги".

А перфекционисты могут глянуть код и найти баг, если будет время и желание )
7 DJ Anthon
 
22.09.23
10:19
Еще нашлись кривые записи в регистре Данные для подбора сотрудников, правда, их там нельзя удалять/редактировать, но через Поиск ссылок на объект можно.
8 Web00001
 
22.09.23
10:30
(6) >Как ни странно, но программа ЗУП 27.51 позволяет править этот регистр вручную напрямую
Этот регистр не может иметь регистратора так как заполняется сервисными фоновыми заданиями и по моему разными другими регистрами. В следствии чего писать туда можно(но не нужно) хоть кому. Это служебный регистр и есть средства его пересчитать, что удалит все "кривые записи".
Записи двоятся и троятся скорее всего по тому, что по этим записям при формировании отчета строятся соединения в запросе при формировании РЛ. Никакого бага здесь нет. Есть кривые исходные данные. Тоже самое касается упомянутого в (7)"Данные для подбора сотрудников" в модуле менеджера этого регистра есть метод который позволяет перезаполнить его по указанным сотрудникам.
9 DJ Anthon
 
22.09.23
10:37
(8) Да, согласен. Просто при удалении помеченных на удаление сотрудников расчетчик заменяла в регистрах сведений помеченных на удаление сотрудников рабочими, а не удаляла, потому что тупая обработка удаления помеченных объектов не умеет работать с регистрами сведений. Так в этих регистрах появились лишние и некорректные данные. при перепроведении исходных документов обновляются правильные записи, а лишние могут и проигнорироваться. Так что иногда и руками можно залезть, зная, что исходные данные верные, тем более что некоторые документы нельзя перепроводить из-за их фиксации.
10 Гена
 
22.09.23
11:03
(8) Как скажете... не баг, так не баг...
Добавил третью запись - р/л вырос уже в 9 раз.
Добавил 4-ю - в 16 раз.
Добавил 5-ю - в 25 раз.

Интересно )
В р/л собирается N2 дней и сумм, где N - число записей регистра "Плановый ФОТ Итоги" с отличающимися тарифными ставками.

Если это не баг, то я Жан-Поль Бельмондо )
11 Bigbro
 
22.09.23
11:09
хочешь быстро и много заработать - спроси меня как! (с) )))
12 Гена
 
22.09.23
11:21
Давайте подумаем. Где-то в кишочках кода р/л вместо выбора одной записи стоит обход всех с суммированием и счётчиком, сориентированным на количество записей.

1. Одна запись. После прохода Счётчик = 1. Цикл закончен.
2. Две записи. Первый проход: Счётчик = 1, но Число записей = 2. Пока удвоение после суммирования. Второй проход: Счётчик = 2 = Число Записей. Цикл закончен. Итоговое учетверение.
3. Три записи. Вальс: 1-2-3, 1-2-3, 1-2-3. Счётчик = 3 = Число записей. Итоговое удевятерение.
4. и т.д. Точный квадрат.
13 DJ Anthon
 
22.09.23
12:54
(6) насчет перфекционизма, не могу понять одну мелочь в запросе, который формирует ВТКадровыеДанныеСотрудников. В нём
формируется ВТСведенияКадровойИсторииСотрудников,
в которой в самом конце подзапроса есть условие
    И (РегистрСведений.Сотрудник = ИзмеренияДаты.Сотрудник)
    И (РегистрСведений.ФизическоеЛицо = ИзмеренияДаты.Сотрудник.ФизическоеЛицо)

Зачем писать ИзмеренияДаты.Сотрудник.ФизическоеЛицо, если у таблицы ИзмеренияДаты уже есть реквизит ФизическоеЛицо?

Из-за этой мелочи запрос не перехватывался, после замены
ИзмеренияДаты.ФизическоеЛицо он сработал, и ошибка была найдена. только кучу времени убил.
14 Web00001
 
24.09.23
07:25
(10)>Добавил третью запись - р/л вырос уже в 9 раз.
Ждем поста: "Добавил запись в регистр расчетов, увеличилась сумма в расчетном листке. Что за баг и как обойти". Если это баг подсказываю решение: Не создавай ненужных записей, там где этих записей не должно быть. Я уже написал, записи в этот регистр руками добавлять не нужно. Но если уж так вышло, что они там кривые, можно убить и пересчитать. Или просто пересчитать. И после этого не создавать ситуаций в исходных данных которые приводят к ошибкам в отчетах. Я не понимаю почему это простое решение не укладывается в твоей голове жан поль

>Если это не баг, то я Жан-Поль Бельмондо )
Хорошо.  Хоть горшком назови. Только в печь не ставь.
15 Гена
 
24.09.23
08:21
(14) И после этого не создавать ситуаций в исходных данных которые приводят к ошибкам в отчетах
В жизни такое неосуществимо. Всегда существовали, существуют и будут существовать неправильные действия расчётчиц.
Хорошо, баг - слишком сильный термин. Будем считать отсутствие "защиты от дурака" недоработкой.

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

Вывод: программисту-перфекционисту надо прописать в коде вывод сообщения об ошибке по данному сотруднику, когда алгоритм наталкивается в РС ПлановыйФОТИтоги на пересечение записей во времени с различной тарифной ставкой.
16 Web00001
 
25.09.23
07:26
(15)Тогда невозможно в принципе получить рабочую систему. Расчетчик просто внесет на один ноль больше или на один ноль меньше цифру разнося премию. Пусть 1С и это проверяет тоже. Ведь крику будет до небес. Я думаю это самый правильный аргумент, чтобы свои ошибки перевесить на кого-то другого.
17 Web00001
 
25.09.23
07:43
> надо прописать в коде вывод сообщения об ошибке по данному сотруднику, когда алгоритм наталкивается в РС
А когда документ заполняется и рассчитывается в фоновом режиме и пользователя просто нет, кому это сообщение показывать? А когда это ожидаемое поведение и в регистре должно быть несколько записей, что делать?
Никто не против. Если ты вдруг обнаружил мельницу, то есть поведение которое можно сделать лучше, следует вооружиться отладчиком, разобрать код и сделать его лучше. У меня есть доступ к партнерской подписке. Я попробую отправить твое предложение об улучшении. Я не работаю с ЗУП уже больше года. Но помню, что там не просто так может быть несколько записей в одном периоде.
18 novichok79
 
25.09.23
12:15
Эх, вы.
Берете ваш конечный запрос, который увеличивает суммы.
Удаляете соединения в нем, смотрите на каком перестанет 8рить.
Далее копаете в сторону того регистра или временной таблицы.
Всегда так делал, всегда помогало.
19 Web00001
 
26.09.23
05:40
(18)>Берете ваш конечный запрос, который увеличивает суммы.
Удаляете соединения в нем, смотрите на каком перестанет 8рить.Далее...

Слишком длинно написал неуниверсально. Надо вот так: Эх вы берете запрос. Анализируете. Всегда помогало.
20 DJ Anthon
 
26.09.23
06:38
(18) Ну так в том-то и вопрос, что запрос трудно достать. В конфигурации его нет, надо ловить его программно, а он не ловится, потому что в нем ошибка. Повезло, что она легко исправилась, тогда запрос сработал, и даже никакие соединения убирать не надо, достаточно посмотреть, какая ВТ содержит нужные данные и с какими регистрами она связана. Дело в том, что простые динамические списки перехватываются без проблем, а тут сложный список - в нем идет подготовка временных таблиц, получается нужный результат, а потом таблицы уничтожаются. текст запроса затирается. и мы видим при перехвате урезанный запрос, который получил нужные данные и все за собой удалил. То есть надо лезть в код и ловить запрос по пути. И промежуточный запрос не хочет формироваться в консоли запросов. Там что-то связано с типизацией, при перехвате запроса она как-то слетает. Обычно достаточно убрать из входных данных запроса в колонках таблиц составность (null), но тут это не помогло. А в ERP, например, так просто и не разберешься, что можно убирать, а что нельзя, там море сложных типов данных.
21 novichok79
 
26.09.23
15:17
(19) типа я в ЗУПе 3.1 не копался? копался и даже собирал этот запрос с временными таблицами, использовал консоль Кораблева, которую он удалил почему-то с ИС.
22 novichok79
 
26.09.23
15:19
(20) пиздоус, как говорится, как тяжко в 1Се.
уже забыл совсем. ну да, если там портянка длиннющая перехватывается, то делать нехер, придется лезть.
другое дело - как они такое в прод катнули, типа в 1С тестирование отсутствует как явление? у них же может быть набор реальных данных с базок, которые им клиенты посылают.
23 novichok79
 
26.09.23
15:21
(20) и да, вспомнил про удаляемые в процессе сбора данных запросы, у меня как-то была даже консоль своя, которая типа если есть такое имя таблицы в собираемом запросе, переименовывает ее.
к сожалению, сейчас уже не помню где, конфигуратор не открывал уже 3 года.
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс