В 1С 8.3 БП КОРП 3.0.135.22 необходимо реализовать автоматическое заполнение ячеек процентов напротив внесенного Инициатора продаж. Если внесёт первый Инициатор, то 100%.
Если Инициаторов два, то 50 на 50% или остаток от вручную внесенной суммы процентов первого Инициатора.
И так далее до 5 Инициаторов.

Реализовано в расширении в документе РеализацияТоваровУслуг.
В ФормаПодписиТовары созданы 5 выпадающих списков Инициаторов и проценты по ним (см.скриншот)
В ФормаДокументыТовары написал такой код:

```1c
    &НаКлиенте
    Процедура ДК1_ПередЗаписьюПосле(Отказ, ПараметрыЗаписи)

    Если ЗначениеЗаполнено(Объект.ИнициаторПоТовару1)
    И Не ЗначениеЗаполнено (Объект.ИнициаторПоТовару2) Тогда
    Объект.ПроцентИнициаторПоТовару1 = 100;
    ИначеЕсли ЗначениеЗаполнено(Объект.ИнициаторПоТовару1)
    И ЗначениеЗаполнено (Объект.ИнициаторПоТовару2)
    И ЗначениеЗаполнено (Объект.ИнициаторПоТовару3) Тогда
    Остаток3 = 100 - (Объект.ПроцентИнициаторПоТовару1 + Объект.ПроцентИнициаторПоТовару2);
    Объект.ПроцентИнициаторПоТовару3 = Остаток3;
    ИначеЕсли ЗначениеЗаполнено(Объект.ИнициаторПоТовару1)
    И ЗначениеЗаполнено (Объект.ИнициаторПоТовару2)
    И ЗначениеЗаполнено (Объект.ИнициаторПоТовару3)
    И ЗначениеЗаполнено (Объект.ИнициаторПоТовару4) Тогда
    Остаток4 = 100 - (Объект.ПроцентИнициаторПоТовару1 + Объект.ПроцентИнициаторПоТовару2 + Объект.ПроцентИнициаторПоТовару3);
    Объект.ПроцентИнициаторПоТовару4 = Остаток4;
    ИначеЕсли ЗначениеЗаполнено(Объект.ИнициаторПоТовару1)
    И ЗначениеЗаполнено (Объект.ИнициаторПоТовару2)
    И ЗначениеЗаполнено (Объект.ИнициаторПоТовару3)
    И ЗначениеЗаполнено (Объект.ИнициаторПоТовару4)
    И ЗначениеЗаполнено (Объект.ИнициаторПоТовару5) Тогда
    Остаток5 = 100 - (Объект.ПроцентИнициаторПоТовару1 + Объект.ПроцентИнициаторПоТовару2 + Объект.ПроцентИнициаторПоТовару3 + Объект.ПроцентИнициаторПоТовару4);
    Объект.ПроцентИнициаторПоТовару5 = Остаток5;
    Иначе
    Остаток2 = 100 - Объект.ПроцентИнициаторПоТовару1;
    Объект.ПроцентИнициаторПоТовару2 = Остаток2;
    КонецЕсли;

    КонецПроцедуры
```

Код работает через раз, возможны ли другие решения? БСП?
---
ПередЗаписьюПосле
Твой код работает только перед записью документа.
Нужно делать ПриИзменении реквизита ИнициаторПоТовару (по каждому реквизиту), что бы расчет происходил сразу, не дожидаясь записи.
Если более топорно, то можно кнопочку приделать, которая будет производить этот расчет.
---
Решение путём добавления нескольких строк:

```1c
    Код в процедуре ДК1_ИнициаторПоТоваруПриИзмененииВместо(Элемент)

    Если ЗначениеЗаполнено(ЭтаФорма.ИсполнительПоУслуге1)
    И Не ЗначениеЗаполнено (ЭтаФорма.ИсполнительПоУслуге2) Тогда
    ЭтаФорма.ПроцентИсполнительПоУслуге1 = 100;
    ИначеЕсли ЗначениеЗаполнено(ЭтаФорма.ИсполнительПоУслуге1)
    И ЗначениеЗаполнено (ЭтаФорма.ИсполнительПоУслуге2)
    И ЗначениеЗаполнено (ЭтаФорма.ИсполнительПоУслуге3)
    И Не ЗначениеЗаполнено (ЭтаФорма.ИсполнительПоУслуге4) Тогда //добавлено
    Остаток3 = 100 - (ЭтаФорма.ПроцентИсполнительПоУслуге1 + ЭтаФорма.ПроцентИсполнительПоУслуге2);
    ЭтаФорма.ПроцентИсполнительПоУслуге3 = Остаток3;
    ИначеЕсли ЗначениеЗаполнено(ЭтаФорма.ИсполнительПоУслуге1)
    И ЗначениеЗаполнено (ЭтаФорма.ИсполнительПоУслуге2)
    И ЗначениеЗаполнено (ЭтаФорма.ИсполнительПоУслуге3)
    И ЗначениеЗаполнено (ЭтаФорма.ИсполнительПоУслуге4)
    И Не ЗначениеЗаполнено (ЭтаФорма.ИсполнительПоУслуге5) Тогда //добавлено
    Остаток4 = 100 - (ЭтаФорма.ПроцентИсполнительПоУслуге1 + ЭтаФорма.ПроцентИсполнительПоУслуге2 + ЭтаФорма.ПроцентИсполнительПоУслуге3);
    ЭтаФорма.ПроцентИсполнительПоУслуге4 = Остаток4;
    ИначеЕсли ЗначениеЗаполнено(ЭтаФорма.ИсполнительПоУслуге1)
    И ЗначениеЗаполнено (ЭтаФорма.ИсполнительПоУслуге2)
    И ЗначениеЗаполнено (ЭтаФорма.ИсполнительПоУслуге3)
    И ЗначениеЗаполнено (ЭтаФорма.ИсполнительПоУслуге4)
    И ЗначениеЗаполнено (ЭтаФорма.ИсполнительПоУслуге5) Тогда
    Остаток5 = 100 - (ЭтаФорма.ПроцентИсполнительПоУслуге1 + ЭтаФорма.ПроцентИсполнительПоУслуге2 + ЭтаФорма.ПроцентИсполнительПоУслуге3 + ЭтаФорма.ПроцентИсполнительПоУслуге4);
    ЭтаФорма.ПроцентИсполнительПоУслуге5 = Остаток5;
    ИначеЕсли ЗначениеЗаполнено(ЭтаФорма.ИсполнительПоУслуге2) Тогда //исправлено
    Остаток2 = 100 - ЭтаФорма.ПроцентИсполнительПоУслуге1;
    ЭтаФорма.ПроцентИсполнительПоУслуге2 = Остаток2;
    КонецЕсли;
```

Хотя интуиция подсказывает, что использование массива было бы более правильным.
---
ПередЗаписьюПосле
Твой код работает только перед записью документа.
Нужно делать ПриИзменении реквизита ИнициаторПоТовару (по каждому реквизиту), что бы расчет происходил сразу, не дожидаясь записи.
Если более топорно, то можно кнопочку приделать, которая будет производить этот расчет.
---
Так делать не надо. Сделайте табличную часть с инициаторами и при добавлении и удалении строк рассчитывайте проценты.
---
usershmuser, WasiliyMay Спасибо.
Решением стало добавление в модуле ФормаПодписиТовары вставки содержимого обработчика через палитру свойств:

```1c
    &НаКлиенте
    Процедура ДК1_ИнициаторПоТовару1ПриИзмененииВместо(Элемент)
    ЭтаФорма.ПроцентИнициаторПоТовару1=100;
    КонецПроцедуры
```

и т.д.
---
```1c
    ЭтаФорма.ПроцентИнициаторПоТовару1=100;
```

Это отработает добавление значения, а удаление или пересчет нет.
Данный момент так же стоит отработать! Т.е. проверить на наличие значения в реквизите, после этого заполнять значение или очищать, возможно еще и пересчитывать остальные поля
---
Проверку суммы и внесения реализовал в ФормаДокументаТовары

```1c
    &НаКлиенте
    Процедура ДК1_ПередЗаписьюПосле(Отказ, ПараметрыЗаписи)

    Если (Объект.ПроцентИнициаторПоТовару1 + Объект.ПроцентИнициаторПоТовару2 + Объект.ПроцентИнициаторПоТовару3 + Объект.ПроцентИнициаторПоТовару4 + Объект.ПроцентИнициаторПоТовару5)>100 Тогда
    Отказ = Истина;
    Сообщить("Сумма процентов не может превышать 100");
    Возврат;
    КонецЕсли;

    Если Не (ЗначениеЗаполнено (Объект.ИнициаторПоТовару1) И Объект.ПроцентИнициаторПоТовару1 > 0) Тогда
    Отказ = Истина;
    Сообщить("Введите процент выполнения инициатора по товару 1");
    Возврат;
    КонецЕсли;
```
---
я не совсем это имел ввиду. Ты написал проверку заполнения реквизита.
Я тебе говорил о пересчете и удалении значения при удалении инициатора - работа с документом и правками, что бы юзер не запутался.

```1c
    &НаКлиенте
    Процедура ДК1_ИнициаторПоТовару1ПриИзмененииВместо(Элемент)
    Если ЗначениеЗаполнено (Объект.ИнициаторПоТовару1) = Истина Тогда
    ЭтаФорма.ПроцентИнициаторПоТовару1=100;
    Иначе
    ЭтаФорма.ПроцентИнициаторПоТовару1=0;
    КонецЕсли;
    КонецПроцедуры
```

Что то типа такого
Что бы код расчитывал и менял значения при условии заполнения "Инициатора", тем более это сделать очень просто именно при изменении
---
usershmuser, спасибо.
Применил тот же код из ФормаДокументыТовары из процедуры ДК1_ПередЗаписьюПосле(Отказ, ПараметрыЗаписи) (1) в модуле ФормаПодписиТовары в процедуре ДК1_ИнициаторПоТоваруПриИзмененииВместо(Элемент), заменил только
```1c
    Объект.
```
 на
```1c
    ЭтаФорма.
```
---
Продолжая тему...
Код последовательно вычисляет остаток по процентам при внесении Исполнителей. Их количество может доходить до 5.
(Аналогично Товарам в организации реализуются Услуги , где аналогично Инициаторам заполняются Исполнители)
Исполнитель по услуге3 почему-то всегда выдаёт 50 (см. картинку) и изменить невозможно.
Хотя код по каждому из исполнителей прописан одинаково:

```1c
    Если ЗначениеЗаполнено(ЭтаФорма.ИсполнительПоУслуге1)
    И Не ЗначениеЗаполнено (ЭтаФорма.ИсполнительПоУслуге2) Тогда
    ЭтаФорма.ПроцентИсполнительПоУслуге1 = 100;
    ИначеЕсли ЗначениеЗаполнено(ЭтаФорма.ИсполнительПоУслуге1)
    И ЗначениеЗаполнено (ЭтаФорма.ИсполнительПоУслуге2)
    И ЗначениеЗаполнено (ЭтаФорма.ИсполнительПоУслуге3) Тогда
    Остаток3 = 100 - (ЭтаФорма.ПроцентИсполнительПоУслуге1 + ЭтаФорма.ПроцентИсполнительПоУслуге2);
    ЭтаФорма.ПроцентИсполнительПоУслуге3 = Остаток3;
    ИначеЕсли ЗначениеЗаполнено(ЭтаФорма.ИсполнительПоУслуге1)
    И ЗначениеЗаполнено (ЭтаФорма.ИсполнительПоУслуге2)
    И ЗначениеЗаполнено (ЭтаФорма.ИсполнительПоУслуге3)
    И ЗначениеЗаполнено (ЭтаФорма.ИсполнительПоУслуге4) Тогда
    Остаток4 = 100 - (ЭтаФорма.ПроцентИсполнительПоУслуге1 + ЭтаФорма.ПроцентИсполнительПоУслуге2 + ЭтаФорма.ПроцентИсполнительПоУслуге3);
    ЭтаФорма.ПроцентИсполнительПоУслуге4 = Остаток4;
    ИначеЕсли ЗначениеЗаполнено(ЭтаФорма.ИсполнительПоУслуге1)
    И ЗначениеЗаполнено (ЭтаФорма.ИсполнительПоУслуге2)
    И ЗначениеЗаполнено (ЭтаФорма.ИсполнительПоУслуге3)
    И ЗначениеЗаполнено (ЭтаФорма.ИсполнительПоУслуге4)
    И ЗначениеЗаполнено (ЭтаФорма.ИсполнительПоУслуге5) Тогда
    Остаток5 = 100 - (ЭтаФорма.ПроцентИсполнительПоУслуге1 + ЭтаФорма.ПроцентИсполнительПоУслуге2 + ЭтаФорма.ПроцентИсполнительПоУслуге3 + ЭтаФорма.ПроцентИсполнительПоУслуге4);
    ЭтаФорма.ПроцентИсполнительПоУслуге5 = Остаток5;
    Иначе
    Остаток2 = 100 - ЭтаФорма.ПроцентИсполнительПоУслуге1;
    ЭтаФорма.ПроцентИсполнительПоУслуге2 = Остаток2;
    КонецЕсли;
```

В чём может быть ошибка, что не отрабатывает именно по ПроцентИсполнительПоУслуге3, принудительно оставляя 50%?
---
Остаток3 = 100 - (ЭтаФорма.ПроцентИсполнительПоУслуге1 + ЭтаФорма.ПроцентИсполнительПоУслуге2);
        ЭтаФорма.ПроцентИсполнительПоУслуге3 = Остаток3;
потому, что 100 - 20 - 30 = 50
---
Если 4го исполнителя добавил и редактируешь 3го исполнителя, то вполне может такое всплывать, код последовательный, пользователь нет. Необходимо отработать подобные ошибки и пересчет. У тебя всего 5 вариантов заполнения этой таблицы, подставь топорно конкретные значения, либо развивай расчет с отработкой ошибок
---
Решение путём добавления нескольких строк:

```1c
    Код в процедуре ДК1_ИнициаторПоТоваруПриИзмененииВместо(Элемент)

    Если ЗначениеЗаполнено(ЭтаФорма.ИсполнительПоУслуге1)
    И Не ЗначениеЗаполнено (ЭтаФорма.ИсполнительПоУслуге2) Тогда
    ЭтаФорма.ПроцентИсполнительПоУслуге1 = 100;
    ИначеЕсли ЗначениеЗаполнено(ЭтаФорма.ИсполнительПоУслуге1)
    И ЗначениеЗаполнено (ЭтаФорма.ИсполнительПоУслуге2)
    И ЗначениеЗаполнено (ЭтаФорма.ИсполнительПоУслуге3)
    И Не ЗначениеЗаполнено (ЭтаФорма.ИсполнительПоУслуге4) Тогда //добавлено
    Остаток3 = 100 - (ЭтаФорма.ПроцентИсполнительПоУслуге1 + ЭтаФорма.ПроцентИсполнительПоУслуге2);
    ЭтаФорма.ПроцентИсполнительПоУслуге3 = Остаток3;
    ИначеЕсли ЗначениеЗаполнено(ЭтаФорма.ИсполнительПоУслуге1)
    И ЗначениеЗаполнено (ЭтаФорма.ИсполнительПоУслуге2)
    И ЗначениеЗаполнено (ЭтаФорма.ИсполнительПоУслуге3)
    И ЗначениеЗаполнено (ЭтаФорма.ИсполнительПоУслуге4)
    И Не ЗначениеЗаполнено (ЭтаФорма.ИсполнительПоУслуге5) Тогда //добавлено
    Остаток4 = 100 - (ЭтаФорма.ПроцентИсполнительПоУслуге1 + ЭтаФорма.ПроцентИсполнительПоУслуге2 + ЭтаФорма.ПроцентИсполнительПоУслуге3);
    ЭтаФорма.ПроцентИсполнительПоУслуге4 = Остаток4;
    ИначеЕсли ЗначениеЗаполнено(ЭтаФорма.ИсполнительПоУслуге1)
    И ЗначениеЗаполнено (ЭтаФорма.ИсполнительПоУслуге2)
    И ЗначениеЗаполнено (ЭтаФорма.ИсполнительПоУслуге3)
    И ЗначениеЗаполнено (ЭтаФорма.ИсполнительПоУслуге4)
    И ЗначениеЗаполнено (ЭтаФорма.ИсполнительПоУслуге5) Тогда
    Остаток5 = 100 - (ЭтаФорма.ПроцентИсполнительПоУслуге1 + ЭтаФорма.ПроцентИсполнительПоУслуге2 + ЭтаФорма.ПроцентИсполнительПоУслуге3 + ЭтаФорма.ПроцентИсполнительПоУслуге4);
    ЭтаФорма.ПроцентИсполнительПоУслуге5 = Остаток5;
    ИначеЕсли ЗначениеЗаполнено(ЭтаФорма.ИсполнительПоУслуге2) Тогда //исправлено
    Остаток2 = 100 - ЭтаФорма.ПроцентИсполнительПоУслуге1;
    ЭтаФорма.ПроцентИсполнительПоУслуге2 = Остаток2;
    КонецЕсли;
```

Хотя интуиция подсказывает, что использование массива было бы более правильным.
---
, (11) Спасибо.
Для 3-х всё отлично работает, жаль что нет решения последовательного заполнения остатков по процентам для 5-ти.
Хотя, меня бы спасла возможность изменить эти 50%, но код не даёт.
---
жаль что нет решения
это вполне решаемо, строй логику в разрезе всех пяти позиций, пересчет должен происходить только при изменении реквизита "ИсполнительПоУслуге" (каждого), условия указывай явные.
На форме не дает редактировать - смотри настройки реквизитов в форме