Алгоритм автоматического заполнения ячеек процентов

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

Реализовано в расширении в документе РеализацияТоваровУслуг.
В ФормаПодписиТовары созданы 5 выпадающих списков Инициаторов и проценты по ним (см.скриншот)
В ФормаДокументыТовары написал такой код:
&НаКлиенте
Процедура ДК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; 	
	КонецЕсли; 

КонецПроцедуры
Показать


Код работает через раз, возможны ли другие решения? БСП?
Прикрепленные файлы:
По теме из базы знаний
Найденные решения
2. usershmuser 26.07.24 10:52 Сейчас в теме
(1)
ПередЗаписьюПосле

Твой код работает только перед записью документа.
Нужно делать ПриИзменении реквизита ИнициаторПоТовару (по каждому реквизиту), что бы расчет происходил сразу, не дожидаясь записи.
Если более топорно, то можно кнопочку приделать, которая будет производить этот расчет.
user2070470; +1 Ответить
14. user2070470 02.08.24 13:18 Сейчас в теме
(9) Решение путём добавления нескольких строк:

Код в процедуре ДК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;     
    КонецЕсли; 
Показать

Хотя интуиция подсказывает, что использование массива было бы более правильным.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. usershmuser 26.07.24 10:52 Сейчас в теме
(1)
ПередЗаписьюПосле

Твой код работает только перед записью документа.
Нужно делать ПриИзменении реквизита ИнициаторПоТовару (по каждому реквизиту), что бы расчет происходил сразу, не дожидаясь записи.
Если более топорно, то можно кнопочку приделать, которая будет производить этот расчет.
user2070470; +1 Ответить
3. WasiliyMay 8 26.07.24 11:05 Сейчас в теме
(1) Так делать не надо. Сделайте табличную часть с инициаторами и при добавлении и удалении строк рассчитывайте проценты.
user2070470; +1 Ответить
4. user2070470 26.07.24 15:02 Сейчас в теме
usershmuser, WasiliyMay Спасибо.
Решением стало добавление в модуле ФормаПодписиТовары вставки содержимого обработчика через палитру свойств:
&НаКлиенте
Процедура ДК1_ИнициаторПоТовару1ПриИзмененииВместо(Элемент)
	ЭтаФорма.ПроцентИнициаторПоТовару1=100;
КонецПроцедуры

и т.д.
5. usershmuser 26.07.24 15:11 Сейчас в теме
(4)
ЭтаФорма.ПроцентИнициаторПоТовару1=100;


Это отработает добавление значения, а удаление или пересчет нет.
Данный момент так же стоит отработать! Т.е. проверить на наличие значения в реквизите, после этого заполнять значение или очищать, возможно еще и пересчитывать остальные поля
user2070470; +1 Ответить
6. user2070470 29.07.24 07:33 Сейчас в теме
(5)
Проверку суммы и внесения реализовал в ФормаДокументаТовары
&НаКлиенте
Процедура ДК1_ПередЗаписьюПосле(Отказ, ПараметрыЗаписи)

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

Если Не (ЗначениеЗаполнено (Объект.ИнициаторПоТовару1) И Объект.ПроцентИнициаторПоТовару1  > 0) Тогда
    Отказ = Истина;
    Сообщить("Введите процент выполнения инициатора по товару 1");  
    Возврат; 
КонецЕсли;
Показать
7. usershmuser 29.07.24 08:53 Сейчас в теме
(6) я не совсем это имел ввиду. Ты написал проверку заполнения реквизита.
Я тебе говорил о пересчете и удалении значения при удалении инициатора - работа с документом и правками, что бы юзер не запутался.
&НаКлиенте
Процедура ДК1_ИнициаторПоТовару1ПриИзмененииВместо(Элемент)
Если  ЗначениеЗаполнено (Объект.ИнициаторПоТовару1) = Истина Тогда  
ЭтаФорма.ПроцентИнициаторПоТовару1=100;
Иначе
ЭтаФорма.ПроцентИнициаторПоТовару1=0;
КонецЕсли;
КонецПроцедуры
Показать

Что то типа такого
Что бы код расчитывал и менял значения при условии заполнения "Инициатора", тем более это сделать очень просто именно при изменении
user2070470; +1 Ответить
8. user2070470 30.07.24 11:57 Сейчас в теме
(6) usershmuser, спасибо.
Применил тот же код из ФормаДокументыТовары из процедуры ДК1_ПередЗаписьюПосле(Отказ, ПараметрыЗаписи) (1) в модуле ФормаПодписиТовары в процедуре ДК1_ИнициаторПоТоваруПриИзмененииВместо(Элемент), заменил только
Объект.
на
ЭтаФорма.
9. user2070470 31.07.24 14:05 Сейчас в теме
Продолжая тему...
Код последовательно вычисляет остаток по процентам при внесении Исполнителей. Их количество может доходить до 5.
(Аналогично Товарам в организации реализуются Услуги , где аналогично Инициаторам заполняются Исполнители)
Исполнитель по услуге3 почему-то всегда выдаёт 50 (см. картинку) и изменить невозможно.
Хотя код по каждому из исполнителей прописан одинаково:
Если ЗначениеЗаполнено(ЭтаФорма.ИсполнительПоУслуге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%?
Прикрепленные файлы:
10. usershmuser 31.07.24 14:11 Сейчас в теме
(9)
Остаток3 = 100 - (ЭтаФорма.ПроцентИсполнительПоУслуге1 + ЭтаФорма.ПроцентИсполнительПоУслуге2);
ЭтаФорма.ПроцентИсполнительПоУслуге3 = Остаток3;

потому, что 100 - 20 - 30 = 50
user2070470; +1 Ответить
11. usershmuser 31.07.24 14:17 Сейчас в теме
(9) Если 4го исполнителя добавил и редактируешь 3го исполнителя, то вполне может такое всплывать, код последовательный, пользователь нет. Необходимо отработать подобные ошибки и пересчет. У тебя всего 5 вариантов заполнения этой таблицы, подставь топорно конкретные значения, либо развивай расчет с отработкой ошибок
user2070470; +1 Ответить
14. user2070470 02.08.24 13:18 Сейчас в теме
(9) Решение путём добавления нескольких строк:

Код в процедуре ДК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;     
    КонецЕсли; 
Показать

Хотя интуиция подсказывает, что использование массива было бы более правильным.
12. user2070470 31.07.24 16:07 Сейчас в теме
(10), (11) Спасибо.
Для 3-х всё отлично работает, жаль что нет решения последовательного заполнения остатков по процентам для 5-ти.
Хотя, меня бы спасла возможность изменить эти 50%, но код не даёт.
13. usershmuser 31.07.24 16:43 Сейчас в теме
(12)
жаль что нет решения

это вполне решаемо, строй логику в разрезе всех пяти позиций, пересчет должен происходить только при изменении реквизита "ИсполнительПоУслуге" (каждого), условия указывай явные.
На форме не дает редактировать - смотри настройки реквизитов в форме
user2070470; +1 Ответить
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот