Добрый день дорогие друзья! Есть задача распределить сумму распределения по двум табличным частям документа. Как это реализовать для одной табличной части мне понятно пример приведу ниже. Но вот как сделать так, чтобы сумма распределилась по двум тч и правильно - непонятно. НИД ХЕЛП!

Исходные данные:
1.) 2 табличные части документа "ТЧ1" - "Запасы" и "ТЧ2" - "Услуги".

2.) "СуммаРаспределения" - Сумма которую необходимо распределить по базе распределения,.

3.) "СуммаБазыРаспределения"- должна быть сумма итога по строке "ТЧ1" + Сумма итога по строке "ТЧ2", но сейчас только итог по строке из Первой ТЧ1.

4.) Сумма распределения должна распределяться пропорционально сумме базы распределения я использую такой алгоритм, но он подходит только для одной ТЧ:

```1c
    Процедура РаспределитьСуммуПропорциональноБазе(Таблица, СуммаБазыРаспределения, ИмяКолонкиБазы, ИмяКолонкиДляРаспределения, СуммаРаспределения, Объект)

    СуммаБазыК = СуммаБазыРаспределения;
    СуммаК = СуммаРаспределения;

    Для каждого СтрокаТаблицы ИЗ Таблица Цикл
    Если СтрокаТаблицы.ИмяКолонкиБазы > 0 Тогда
    К = Сумма / СуммаБазыРаспределения;

    СуммаКРаспределению = Окр(СтрокаТаблицы[ИмяКолонкиБазы] * К, 2);

    СтрокаТаблицы[ИмяКолонкиДляРаспределения] = СуммаКРаспределению;

    СтрокаТаблицы.Сумма = СтрокаТаблицы.Цена * СтрокаТаблицы.Количество;
    СтрокаТаблицы.ПроцентСкидкиНаценки = (СуммаКРаспределению * 100) / СтрокаТаблицы.Сумма;
    СтрокаТаблицы.Сумма = СтрокаТаблицы.Сумма * (1 - СтрокаТаблицы.ПроцентСкидкиНаценки / 100);
    СтрокаТаблицы.Сумма = Окр(СтрокаТаблицы.Сумма, 0,РежимОкругления.Окр15как20);
    СтрокаТаблицы.Всего = СтрокаТаблицы.Сумма;

    СуммаК = СуммаК - СуммаКРаспределению;

    СуммаБазыК = СуммаБазыК - СтрокаТаблицы[ИмяКолонкиБазы];

    КонецЕсли;
    КонецЦикла;

    Объект.ИмяКолонкиБазы = Объект.Запасы.Итог("ИмяКолонкиБазы");
    КонецПроцедуры
```

Буду очень благодарен за примеры реализации!
Всем отозвавшимся добра и удачи!
---
В результате получилось так:

```1c
    ИтогТЧ1 = Объект.Запасы.Итог("ИмяКолонкиБазы");
    ИтогТЧ2 = Объект.Услуги.Итог("ИмяКолонкиБазы");

    СуммаРаспределения = СуммаРаспределения;

    СуммаБазыРаспределения1 = Окр(СуммаРаспределения * ИтогТЧ1 / (ИтогТЧ1 + ИтогТЧ2), 2);
    СуммаБазыРаспределения2 = СуммаРаспределения - СуммаБазыРаспределения1;

    РаспределитьСуммуПропорциональноБазеЗапасы(Объект.Запасы, ИтогТЧ1, "ИмяКолонкиБазы", "ИмяКолонкиБазы", СуммаРаспределения1,Объект);
    РаспределитьСуммуПропорциональноБазеУслуги(Объект.Услуги, ИтогТЧ1, "ИмяКолонкиБазы", "ИмяКолонкиБазы", СуммаРаспределения2,Объект);
```
---
"СуммаБазыРаспределения"- должна быть сумма итога по строке "ТЧ1" + Сумма итога по строке "ТЧ2" Ну так элементарно сначала разделить СуммаРаспределения на СуммаРаспределения1 и СуммаРаспределения2 пропорционально итогам ТЧ1 и ТЧ2, а дальше для каждой выполнить ваш алгоритм распределения - для ТЧ1 и для ТЧ2.
---
Возможно. А как пропорционально разделить между суммами ТЧ1 и ТЧ2?
Имею ввиду: "СуммаРаспределения" из "ТЧ1" Может быть 500, а "СуммаРаспределения2" из "ТЧ2" может быть - 100 ...
---
Сумма ТЧ1 и ТЧ2 = 100%
ТЧ1 / (ТЧ1 + ТЧ2) = коэф ТЧ1
ТЧ2 / (ТЧ1 + ТЧ2) = коэф ТЧ2
---
Таким образом теоритически могу посчитать Сумму распределения отдельно для каждой ТЧ?
---
Да. Если раньше была СуммаРаспределения только на одну таблицу, то сейчас можно взять СуммаРаспределения х ВесовойКоэффициент1 для первой таблицы и СуммаРаспределения х ВесовойКоэффициент2 для второй таблицы
---
теоритически могу посчитать Сумму распределения отдельно для каждой ТЧ?
Теоретически - да, но могут быть ошибки округления.

Лучше всего сделать так:

```1c
    СуммаРаспределения1 = Окр(СуммаРаспределения * ИтогТЧ1 / (ИтогТЧ1 + ИтогТЧ2), 2);
    СуммаРаспределения2 = СуммаРаспределения - СуммаРаспределения1;
```
---
Да. Забыл про копейки
---
"СуммаРаспределения" из "ТЧ1" Может быть 500, а "СуммаРаспределения2" из "ТЧ2" может быть - 100 ... Зависит от соотношения ИтогТЧ1 и ИтогТЧ2: если ИтогТЧ1 в 5 раз больше, чем ИтогТЧ2, то цифры будут такими,. при другом соотношении - они будут другими.
---
не совсем понятно, в чем именно трудности применить все тоже самое ко второй таблице.

Точно так же находите К для значений второй таблицы и вычисляете сумму с использованием полученного К.
---
ДРУЗЬЯ, ДО МЕНЯ ДОШЛО! Не в ту степь мысль завела! Я же и правда по итогу суммы распределения по каждой из табличных частей могу пробежаться процедурой распределения!

ЗЫ. Не дошло...
---
А нет не могу "СуммаРаспределения" то одна!
---
"СуммаРаспределения" то одна! Еще раз: разбиваете ее на две суммы: СуммаРаспределения1 и СуммаРаспределения2, потом для ТЧ1 распределяете СуммаРаспределения1, а для ТЧ2 - СуммаРаспределения2.
---
Сделайте две из одной. Итоги же вам известны.
---
у вас же есть два значения в таблицах, по ним найдите некий К от общей суммы распределения и получите СуммаРаспределенияТЧ1 и СуммаРаспределенияТЧ2.
Дальше все то, что вы делали для распределения.
---
СуммаРаспределения - Число из регистра сведений его в ТЧ нет. Ее необходимо распределить.
Эту суммураспределения я значит пересчитываю по весу между СуммаБазыРаспределения(Что является итогами по колонкам в ТЧ1 и ТЧ2) этих ТЧ, а далее выполняю алгоритм распределения.
Мысль такова?
---
СуммаКРаспределению = Окр(СтрокаТаблицы[ИмяКолонкиБазы] * К, 2);
СтрокаТаблицы[ИмяКолонкиБазы] - это значение есть в обеих таблицах?
---
Сейчас пришлю результат, вы мне очень помогли!
---
К = Сумма / СуммаБазыРаспределения;
Здесь Сумма или СуммаК?
И проверку на ноль добавьте
---
Эту суммураспределения я значит пересчитываю по весу между СуммаБазыРаспределения(Что является итогами по колонкам в ТЧ1 и ТЧ2) этих ТЧ, а далее выполняю алгоритм распределения. Можно сделать еще проще: СуммаБазыРаспределения считаем, как и раньше, СуммаРаспределения сначала распределяем по ТЧ1 вашим же алгоритмом, она распределится не вся - СуммаБазыРаспределения больше, чем ИтогТЧ1.

А потом остаток СуммаРаспределения распределяем по ТЧ2 точно так же.

То есть, вызываем РаспределитьСуммуПропорциональноБазе() дважды: один раз для ТЧ1 с исходной СуммаРаспределения, второй - для ТЧ2 с остатком СуммаРаспределения.

Надо только сохранить этот остаток между вызовами. Например, можно процедуру переделать в функцию и возвращать СуммаК как результат.
---
Итог = ТЧ1.Итог("Сумма") + ТЧ2.Итог("Сумма");
Половина= Итог /2;

Для каждого стр из ТЧ1 Цикл
    стр.Цена = Половина/ТЧ1 .Количество();
Конеццикла

Для каждого стр из ТЧ2 Цикл
    стр.Цена = Половина/ТЧ2 .Количество();
Конеццикла
---
М-да... Советую сменить... поставщика. ;-)
---
В результате получилось так:

```1c
    ИтогТЧ1 = Объект.Запасы.Итог("ИмяКолонкиБазы");
    ИтогТЧ2 = Объект.Услуги.Итог("ИмяКолонкиБазы");

    СуммаРаспределения = СуммаРаспределения;

    СуммаБазыРаспределения1 = Окр(СуммаРаспределения * ИтогТЧ1 / (ИтогТЧ1 + ИтогТЧ2), 2);
    СуммаБазыРаспределения2 = СуммаРаспределения - СуммаБазыРаспределения1;

    РаспределитьСуммуПропорциональноБазеЗапасы(Объект.Запасы, ИтогТЧ1, "ИмяКолонкиБазы", "ИмяКолонкиБазы", СуммаРаспределения1,Объект);
    РаспределитьСуммуПропорциональноБазеУслуги(Объект.Услуги, ИтогТЧ1, "ИмяКолонкиБазы", "ИмяКолонкиБазы", СуммаРаспределения2,Объект);
```
---
Еще проще, как иллюстрация к (23):
```1c
    ИтогТЧ1 = Объект.Запасы.Итог("ИмяКолонкиБазы");
    ИтогТЧ2 = Объект.Услуги.Итог("ИмяКолонкиБазы");

    СуммаРаспределения = СуммаРаспределения;

    СуммаРаспределения=РаспределитьСуммуПропорциональноБазе(Объект.Запасы, ИтогТЧ1+ИтогТЧ2, "ИмяКолонкиБазы", "ИмяКолонкиБазы", СуммаРаспределения,Объект);
    РаспределитьСуммуПропорциональноБазе(Объект.Услуги, ИтогТЧ1+ИтогТЧ2, "ИмяКолонкиБазы", "ИмяКолонкиБазы", СуммаРаспределения,Объект);

    Функция РаспределитьСуммуПропорциональноБазе(Таблица, СуммаБазыРаспределения, ИмяКолонкиБазы, ИмяКолонкиДляРаспределения, СуммаРаспределения, Объект)
    СуммаБазыК = СуммаБазыРаспределения;
    СуммаК = СуммаРаспределения;

    ...
    Объект.ИмяКолонкиБазы = Объект.Запасы.Итог("ИмяКолонкиБазы");
    Возврат СуммаК;
    КонецФункции
```
---
Зачем внизу две процедуры? в свою передаете имя табличной части и сумму распределения с учетом коэффициента. Алгоритм распределения остался тот же
---
У меня по этой логике работают 2 документа
В одном из документов нет табличной части "Услуги" а в конце процедуры я пересчитываю:
Объект.ИмяКолонкиБазы = Объект.Запасы.Итог("ИмяКолонкиБазы")+Объект.Услуги.Итог("ИмяКолонкиБазы");
После распределения естесственно.
---
А если 10 документов будет? Может лучше будет добавить проверку на наличие ТЧ.Услуги у документа. Если Услуги есть, то запускаем процедуру еще раз, предварительно подставив нужную сумму распределения и имя ТЧ
---
Например:

```1c
    РаспределитьСуммуПропорциональноБазе(Объект[ИмяТабличнойЧасти], СуммаБазыРаспределения, ИмяКолонкиБазы, ИмяКолонкиДляРаспределения, СуммаРаспределения, Объект)
```

Так?
---
РаспределитьСуммуПропорциональноБазе(Объект[ИмяТабличнойЧасти], СуммаБазыРаспределения, ИмяКолонкиБазы, ИмяКолонкиДляРаспределения, СуммаРаспределения, Объект)

РаспределитьСуммуПропорциональноБазе(Объект.Товары, СуммаБазыРаспределения1, ИмяКолонкиБазы, ИмяКолонкиДляРаспределения, СуммаРаспределения1, Объект);
РаспределитьСуммуПропорциональноБазе(Объект.Услуги, СуммаБазыРаспределения2, ИмяКолонкиБазы, ИмяКолонкиДляРаспределения, СуммаРаспределения2, Объект);

ИменаКолонок разные? Зачем их передавать?
---
После распределения подсчитываю в ТЧ:

```1c
    Объект.ИмяКолонкиБазы = Объект.Запасы.Итог("ИмяКолонкиБазы")+Объект.Услуги.Итог("ИмяКолонкиБазы");
```

И если не существует "Объект.Услуги.Итог" в таком случае ошибка будет.
---
Так сделайте заранее проверку на наличие ТЧ. Если ТЧ нет, то и ИтогТЧ = 0. и коэффициент1 = 1
---
Все работает! Спасибо дорогие друзья!
---
Отлично, но удивительно сколько труда потребовалось чтоб вспомнить математику средней школы))
---
Дело не в математике средней школы. Я и сейчас решаю все задания ЕГЭ по математике... ХD
Я просто по какой то причине не думал о банальном решении, а громоздил одну временную таблицу в которую запихивал две свои табличные части с определением в дальнейшем строк в цикле по каждой, и пытался распределить сумму распределения по этому "динозавру"...
Собираюсь в отпуск...
---
Уместно будет процитировать: "Все гениальное - просто..."