Добрый день!
В каких-нибудь типовых ПП 1С есть такое?
Пример:
ТабличнаяЧасть(ФИО - Процент из 100):
Петров 33.35
Сидоров 33.35
Кузнецов 33.35
Ошибка = 100 - Итог("Процент") = -0.05;
Процедура РаспределитьОшибку(ТабличнаяЧасть, "Процент", Ошибка).
ТабличнаяЧасть(ФИО - Процент):
Петров 33.33
Сидоров 33.33
Кузнецов 33.34
Спасибо!
В каких-нибудь типовых ПП 1С есть такое?
Пример:
ТабличнаяЧасть(ФИО - Процент из 100):
Петров 33.35
Сидоров 33.35
Кузнецов 33.35
Ошибка = 100 - Итог("Процент") = -0.05;
Процедура РаспределитьОшибку(ТабличнаяЧасть, "Процент", Ошибка).
ТабличнаяЧасть(ФИО - Процент):
Петров 33.33
Сидоров 33.33
Кузнецов 33.34
Спасибо!
По теме из базы знаний
- Распределение и контроль перечисленного НДФЛ в ЗиК 7.7
- Произвольное закрытие 20,25,26 счетов
- Ошибки регламентированного отчета статистики «Форма №11 (краткая)» за 2017 год для БГУ 1.0 и их исправление
- Некоторые моменты обновления типовых конфигураций (доработанных типовых конфигураций)
- Консоль кода с поддержкой объявления процедур и функций, с дополнительными функциями отслеживания и вывода значений
Найденные решения
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Процедура ОкруглитьСлагаемыеПоСумме(Данные, ИмяКолонки, Сумма, Точность = 0, ИмяКлюча = "ФизЛицо") Экспорт
ВременнаяТаблица = Данные.Скопировать(, ИмяКлюча + "," + ИмяКолонки);
ВременнаяТаблица.Колонки.Добавить(ИмяКолонки + "Окр");
Для каждого СтрокаТЗ Из ВременнаяТаблица Цикл
СтрокаТЗ[ИмяКолонки + "Окр"] = Окр(СтрокаТЗ[ИмяКолонки],Точность)
КонецЦикла;
Данные.ЗагрузитьКолонку(ВременнаяТаблица.ВыгрузитьКолонку(ИмяКолонки + "Окр"),ИмяКолонки);
СуммаСлагаемых = ВременнаяТаблица.Итог(ИмяКолонки + "Окр");
Если СуммаСлагаемых <> Сумма Тогда
Шаг = Pow(10, -Точность);
РасхождениеСуммы = Сумма - СуммаСлагаемых;
Приращение = ?(РасхождениеСуммы > 0, Шаг, -Шаг);
ВсегоПриращений = Мин(РасхождениеСуммы / Приращение, ВременнаяТаблица.Количество());
ВременнаяТаблица.Колонки.Добавить(ИмяКолонки + "Расхождение");
ВременнаяТаблица.Колонки.Добавить(ИмяКолонки + "Изменение");
Для каждого СтрокаТЗ Из ВременнаяТаблица Цикл
СтрокаТЗ[ИмяКолонки + "Расхождение"] = ?(СтрокаТЗ[ИмяКолонки + "Окр"] < СтрокаТЗ[ИмяКолонки], СтрокаТЗ[ИмяКолонки] - СтрокаТЗ[ИмяКолонки + "Окр"], СтрокаТЗ[ИмяКолонки + "Окр"] - СтрокаТЗ[ИмяКолонки]);
СтрокаТЗ[ИмяКолонки + "Изменение"] = ?(СтрокаТЗ[ИмяКолонки + "Окр"] < СтрокаТЗ[ИмяКолонки], - Шаг, Шаг);
КонецЦикла;
ВременнаяТаблица.Сортировать(ИмяКолонки + "Изменение" + ?(Приращение > 0,""," Убыв") + ", " + ИмяКолонки + "Расхождение Убыв");
СтруктураПоиска = Новый Структура(ИмяКлюча);
Для Сч = 1 По ВсегоПриращений Цикл
Если ВременнаяТаблица[Сч-1][ИмяКолонки + "Изменение"] <> Приращение Тогда
ЗаполнитьЗначенияСвойств(СтруктураПоиска, ВременнаяТаблица[Сч-1]);
Данные.НайтиСтроки(СтруктураПоиска)[0][ИмяКолонки] = ВременнаяТаблица[Сч-1][ИмяКолонки + "Окр"] + Приращение;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Показать
(8) СергейКа, примерно так и сделал:
Сумма - это не ошибка, а правильный итог по колонке, ошибка считается в процедуре.
тз = ТабличнаяЧасть1.Выгрузить();
ОкруглитьСлагаемыеПоСумме(тз, "Руб", 100, 2,"ФИО");
ТабличнаяЧасть1.Загрузить(тз);
__получил:
Петров 33.34
Сидоров 33.34
Кузнецов 33.34
Сумма - это не ошибка, а правильный итог по колонке, ошибка считается в процедуре.
тз = ТабличнаяЧасть1.Выгрузить();
ОкруглитьСлагаемыеПоСумме(тз, "Руб", 100, 2,"ФИО");
ТабличнаяЧасть1.Загрузить(тз);
__получил:
Петров 33.34
Сидоров 33.34
Кузнецов 33.34
(9) Точность зависит от количества циклов.
То же пишу и увидел что нашли :)
Пример в приложенной обработке
То же пишу и увидел что нашли :)
Пример в приложенной обработке
Прикрепленные файлы:
ВнешняяОбработка1.epf
(11) СергейКа, я тоже подумал, что так можно решить, но это немного извращение :)
И в случае когда ФИО не заполнено, результат (при одном проходе, на вашем примере не пробовал) такой:
33.34 33.35 33.35
Буду свое простое, удобное использовать:
И в случае когда ФИО не заполнено, результат (при одном проходе, на вашем примере не пробовал) такой:
33.34 33.35 33.35
Буду свое простое, удобное использовать:
Процедура РаспределитьОшибкуКопейки(ТЧ, ИмяКолонки, СуммаИтог) Экспорт
Ошибка = Окр(СуммаИтог - ТЧ.Итог(ИмяКолонки), 2);
Если Ошибка = 0 Тогда
Возврат;
КонецЕсли;
Шаг = ?(Ошибка < 0, -0.01, 0.01);
КолСтр = ТЧ.Количество()-1;
Для сч=0 По КолСтр Цикл
ТЧ[сч][ИмяКолонки] = ТЧ[сч][ИмяКолонки] + Шаг;
Ошибка = Ошибка - Шаг;
Если не Ошибка Тогда
Прервать;
КонецЕсли;
сч = ?(сч = КолСтр, -1, сч);
КонецЦикла;
КонецПроцедуры
Показать
(15) aet, Ну как хотите:) Мелким шагом большие таблицы гонять, наверное все-таки долго.
А я вот так это вижу. В один проход:
P.S. и к тому же пропорционально начальным значениям.
А я вот так это вижу. В один проход:
Процедура РаспределитьОшибку(Таб,ИДколонки,Ошибка,ОкруглятьДо = Неопределено)
НакопленоОкруглением = 0;
ТекИтог = 0;
Итог = Таб.Итог(ИдКолонки) - Ошибка;
мЦелевой = Таб.ВыгрузитьКолонку(ИДколонки);
МаксИнд = мЦелевой.ВГраница();
ТочностьОкр = ?(НЕ ОкруглятьДо = Неопределено,Pow(10,-ОкруглятьДо),"");
Кф = 1 - Ошибка / Итог ;
Для инд = 0 По МаксИнд Цикл
Если Инд = МаксИнд Тогда мЦелевой[инд] = Итог - ТекИтог; Продолжить КонецЕсли;
текЗнач = мЦелевой[инд]*Кф;
Если НЕ ОкруглятьДо = Неопределено Тогда
НакопленоОкруглением = НакопленоОкруглением + ТекЗнач - Окр(ТекЗнач,ОкруглятьДо);
Если НакопленоОкруглением > ТочностьОкр Тогда
ТекЗнач = Окр(ТекЗнач,ОкруглятьДо) + ТочностьОкр;
НакопленоОкруглением = НакопленоОкруглением - ТочностьОкр;
ИначеЕсли НакопленоОкруглением < - ТочностьОкр Тогда
ТекЗнач = Окр(ТекЗнач,ОкруглятьДо) - ТочностьОкр;
НакопленоОкруглением = НакопленоОкруглением + ТочностьОкр;
КонецЕсли;
КонецЕсли;
мЦелевой[инд] = ?(ОкруглятьДо = Неопределено,ТекЗнач,Окр(текЗнач,ОкруглятьДо));
ТекИтог = ТекИтог + мЦелевой[инд];
КонецЦикла;
Таб.ЗагрузитьКолонку(мЦелевой,ИДколонки);
КонецПроцедуры
ПоказатьP.S. и к тому же пропорционально начальным значениям.
Прикрепленные файлы:
Распределялка.epf
(16) dusha0020, на моей реальной задаче распределить нужно копейки, и в большинстве случаев хватит 1го прохода.
Да, для общей задачи, конечно желательно, заранее вычислить дельту, а не бегать с наименьшим шагом.
А вот это в конце огорчило:
Пропорции не нужно, ошибку делим по-братски.
Да, для общей задачи, конечно желательно, заранее вычислить дельту, а не бегать с наименьшим шагом.
А вот это в конце огорчило:
и к тому же пропорционально начальным значениям
Пропорции не нужно, ошибку делим по-братски.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот