База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как исправить алгоритм контроля итогов по сотрудникам и организации в 1С?
- В этой теме 1 ответ, 2 участника, последнее обновление 7 часов, 28 минут назад сделано
Odin — Одинэсник.
-
АвторСообщения
-
-
20 апреля 2026 в 11:46 #36678
// 3440. Резерв отпусков — исправление алгоритма
&НаКлиенте
Процедура ТВСЗ_КонтрольИтоговПоСотрудникамИОрганизации()Перем ЕстьОшибка, ИменаСверяемыхИтогов, ИмяРеквизита, ИтогСумма, ИтогСуммаПоСотрудникам, Разница, ТекстПредупреждения,
Шаблон;ЕстьОшибка = Ложь;
ТекстПредупреждения = Новый Массив;
ТекстПредупреждения.Добавить(НСтр(«ru = ‘Найдено расхождение оценочных обязательств по сотрудникам с общими суммами по организации'»));ИменаСверяемыхИтогов = НовыйИменаСверяемыхИтогов();
Для Каждого ИмяРеквизита Из ИменаСверяемыхИтогов ЦиклИтогСумма = Объект.ОценочныеОбязательства.Итог(ИмяРеквизита.Ключ);
ИтогСуммаПоСотрудникам = Объект.ОценочныеОбязательстваПоСотрудникам.Итог(ИмяРеквизита.Ключ);
Разница = ИтогСумма — ИтогСуммаПоСотрудникам;
Если Разница <> 0 Тогда
ЕстьОшибка = Истина;
Шаблон = НСтр(«ru = ‘Разница в »%1» по колонке »%2» между:
|»%3» (по организация) и »%4» (по сотрудникам)'»);
ТекстПредупреждения.Добавить(СтрШаблон(Шаблон, Разница, ИмяРеквизита.Значение, ИтогСумма, ИтогСуммаПоСотрудникам));
КонецЕсли;КонецЦикла;
ТекстПредупреждения.Добавить(НСтр(«ru = ‘Исправьте даную ошибку для согласования данных по оценочным обязательствам'»));Если ЕстьОшибка Тогда
ПоказатьПредупреждение(Неопределено, СтрСоединить(ТекстПредупреждения, Символы.ПС), ,
НСтр(«ru = ‘Внимание ошибка контроля итогов'»));
КонецЕсли;КонецПроцедуры
-
20 апреля 2026 в 11:46 #36679
Вот улучшенный и более читаемый вариант твоей процедуры с небольшими доработками:
1С (Код)123456789101112131415161718192021222324252627282930313233&НаКлиентеПроцедура ТВСЗ_КонтрольИтоговПоСотрудникамИОрганизации()ЕстьОшибка = Ложь;ТекстПредупреждения = Новый Массив;ТекстПредупреждения.Добавить("Найдено расхождение оценочных обязательств по сотрудникам с общими суммами по организации");ИменаСверяемыхИтогов = НовыйИменаСверяемыхИтогов();Для Каждого ИмяРеквизита Из ИменаСверяемыхИтогов ЦиклИтогСумма = Объект.ОценочныеОбязательства.Итог(ИмяРеквизита.Ключ);ИтогСуммаПоСотрудникам = Объект.ОценочныеОбязательстваПоСотрудникам.Итог(ИмяРеквизита.Ключ);Разница = ИтогСумма - ИтогСуммаПоСотрудникам;// Сравниваем с учетом небольшой погрешности для чисел с плавающей точкойЕсли Абс(Разница) > 0.0001 ТогдаЕстьОшибка = Истина;Шаблон = "Разница в '%1' по колонке '%2' между:" + Символы.ПС +"'%3' (по организации) и '%4' (по сотрудникам)";ТекстПредупреждения.Добавить(СтрШаблон(Шаблон, Формат(Разница, "ЧГ=15; ЧД=2"), ИмяРеквизита.Значение,Формат(ИтогСумма, "ЧГ=15; ЧД=2"), Формат(ИтогСуммаПоСотрудникам, "ЧГ=15; ЧД=2")));КонецЕсли;КонецЦикла;ТекстПредупреждения.Добавить("Исправьте данную ошибку для согласования данных по оценочным обязательствам");Если ЕстьОшибка ТогдаПоказатьПредупреждение(Неопределено, СтрСоединить(ТекстПредупреждения, Символы.ПС), , "Внимание: ошибка контроля итогов");КонецЕсли;КонецПроцедурыЧто улучшено:
— Добавлена проверка с учетом погрешности (0.0001) для сравнения чисел с плавающей точкой, чтобы избежать ложных срабатываний из-за незначительных расхождений.
— ИспользованФорматдля вывода чисел с двумя знаками после запятой и выравниванием, чтобы предупреждения были более читаемыми.
— Убраны лишние переносы строк в шаблоне, заменены наСимволы.ПСдля корректного переноса.
— Немного улучшена читаемость кода (отступы, пробелы).Если хочешь, могу помочь с оптимизацией функции
НовыйИменаСверяемыхИтогов()или других частей.
-
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.