Алгоритм автоматического заполнения ячеек процентов
1С:Бухгалтерия 3.0
Бухгалтерский учет
Энергетика и ЖКХ
Windows
Россия
1С
Бухгалтерский учет
Программист
Внешняя обработка (ert,epf)
Вопрос
В 1С 8.3 БП КОРП 3.0.135.22 необходимо реализовать автоматическое заполнение ячеек процентов напротив внесенного Инициатора продаж. Если внесёт первый Инициатор, то 100%.
Если Инициаторов два, то 50 на 50% или остаток от вручную внесенной суммы процентов первого Инициатора.
И так далее до 5 Инициаторов.
Реализовано в расширении в документе РеализацияТоваровУслуг.
В ФормаПодписиТовары созданы 5 выпадающих списков Инициаторов и проценты по ним (см.скриншот)
В ФормаДокументыТовары написал такой код:
Код работает через раз, возможны ли другие решения? БСП?
Если Инициаторов два, то 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;
КонецЕсли;
КонецПроцедуры
ПоказатьКод работает через раз, возможны ли другие решения? БСП?
Прикрепленные файлы:
По теме из базы знаний
Найденные решения
(1)
Твой код работает только перед записью документа.
Нужно делать ПриИзменении реквизита ИнициаторПоТовару (по каждому реквизиту), что бы расчет происходил сразу, не дожидаясь записи.
Если более топорно, то можно кнопочку приделать, которая будет производить этот расчет.
ПередЗаписьюПосле
Твой код работает только перед записью документа.
Нужно делать ПриИзменении реквизита ИнициаторПоТовару (по каждому реквизиту), что бы расчет происходил сразу, не дожидаясь записи.
Если более топорно, то можно кнопочку приделать, которая будет производить этот расчет.
(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;
КонецЕсли;
ПоказатьХотя интуиция подсказывает, что использование массива было бы более правильным.
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1)
Твой код работает только перед записью документа.
Нужно делать ПриИзменении реквизита ИнициаторПоТовару (по каждому реквизиту), что бы расчет происходил сразу, не дожидаясь записи.
Если более топорно, то можно кнопочку приделать, которая будет производить этот расчет.
ПередЗаписьюПосле
Твой код работает только перед записью документа.
Нужно делать ПриИзменении реквизита ИнициаторПоТовару (по каждому реквизиту), что бы расчет происходил сразу, не дожидаясь записи.
Если более топорно, то можно кнопочку приделать, которая будет производить этот расчет.
usershmuser, WasiliyMay Спасибо.
Решением стало добавление в модуле ФормаПодписиТовары вставки содержимого обработчика через палитру свойств:
и т.д.
Решением стало добавление в модуле ФормаПодписиТовары вставки содержимого обработчика через палитру свойств:
&НаКлиенте
Процедура ДК1_ИнициаторПоТовару1ПриИзмененииВместо(Элемент)
ЭтаФорма.ПроцентИнициаторПоТовару1=100;
КонецПроцедуры
и т.д.
(4)
Это отработает добавление значения, а удаление или пересчет нет.
Данный момент так же стоит отработать! Т.е. проверить на наличие значения в реквизите, после этого заполнять значение или очищать, возможно еще и пересчитывать остальные поля
ЭтаФорма.ПроцентИнициаторПоТовару1=100;
Это отработает добавление значения, а удаление или пересчет нет.
Данный момент так же стоит отработать! Т.е. проверить на наличие значения в реквизите, после этого заполнять значение или очищать, возможно еще и пересчитывать остальные поля
(5)
Проверку суммы и внесения реализовал в ФормаДокументаТовары
Проверку суммы и внесения реализовал в ФормаДокументаТовары
&НаКлиенте
Процедура ДК1_ПередЗаписьюПосле(Отказ, ПараметрыЗаписи)
Если (Объект.ПроцентИнициаторПоТовару1 + Объект.ПроцентИнициаторПоТовару2 + Объект.ПроцентИнициаторПоТовару3 + Объект.ПроцентИнициаторПоТовару4 + Объект.ПроцентИнициаторПоТовару5)>100 Тогда
Отказ = Истина;
Сообщить("Сумма процентов не может превышать 100");
Возврат;
КонецЕсли;
Если Не (ЗначениеЗаполнено (Объект.ИнициаторПоТовару1) И Объект.ПроцентИнициаторПоТовару1 > 0) Тогда
Отказ = Истина;
Сообщить("Введите процент выполнения инициатора по товару 1");
Возврат;
КонецЕсли;
Показать
(6) я не совсем это имел ввиду. Ты написал проверку заполнения реквизита.
Я тебе говорил о пересчете и удалении значения при удалении инициатора - работа с документом и правками, что бы юзер не запутался.
Что то типа такого
Что бы код расчитывал и менял значения при условии заполнения "Инициатора", тем более это сделать очень просто именно при изменении
Я тебе говорил о пересчете и удалении значения при удалении инициатора - работа с документом и правками, что бы юзер не запутался.
&НаКлиенте
Процедура ДК1_ИнициаторПоТовару1ПриИзмененииВместо(Элемент)
Если ЗначениеЗаполнено (Объект.ИнициаторПоТовару1) = Истина Тогда
ЭтаФорма.ПроцентИнициаторПоТовару1=100;
Иначе
ЭтаФорма.ПроцентИнициаторПоТовару1=0;
КонецЕсли;
КонецПроцедуры
ПоказатьЧто то типа такого
Что бы код расчитывал и менял значения при условии заполнения "Инициатора", тем более это сделать очень просто именно при изменении
Продолжая тему...
Код последовательно вычисляет остаток по процентам при внесении Исполнителей. Их количество может доходить до 5.
(Аналогично Товарам в организации реализуются Услуги , где аналогично Инициаторам заполняются Исполнители)
Исполнитель по услуге3 почему-то всегда выдаёт 50 (см. картинку) и изменить невозможно.
Хотя код по каждому из исполнителей прописан одинаково:
В чём может быть ошибка, что не отрабатывает именно по ПроцентИсполнительПоУслуге3, принудительно оставляя 50%?
Код последовательно вычисляет остаток по процентам при внесении Исполнителей. Их количество может доходить до 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%?
Прикрепленные файлы:
(9) Если 4го исполнителя добавил и редактируешь 3го исполнителя, то вполне может такое всплывать, код последовательный, пользователь нет. Необходимо отработать подобные ошибки и пересчет. У тебя всего 5 вариантов заполнения этой таблицы, подставь топорно конкретные значения, либо развивай расчет с отработкой ошибок
(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)
это вполне решаемо, строй логику в разрезе всех пяти позиций, пересчет должен происходить только при изменении реквизита "ИсполнительПоУслуге" (каждого), условия указывай явные.
На форме не дает редактировать - смотри настройки реквизитов в форме
жаль что нет решения
это вполне решаемо, строй логику в разрезе всех пяти позиций, пересчет должен происходить только при изменении реквизита "ИсполнительПоУслуге" (каждого), условия указывай явные.
На форме не дает редактировать - смотри настройки реквизитов в форме
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот