Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
13 апр 2024, 04:09

Помогите новичку

Автор User2, 19 авг 2017, 19:34

0 Пользователей и 1 гость просматривают эту тему.

User2

Помогите описать процедуру
есть вычисляемые реквизиты
реквизит1
реквизит2
реквизит Итого
при заполнении "реквизита1" сравнить заполняемое число с условием (например если 5>x>2) то записать в поле значения
реквизита "Итого" значение 100
при заполнении "реквизита2" сделать тоже сравнение и прибавить результат к значению реквизита "Итог"

AIFrame

Для каждого ЧтоТоТам из ЧегоТоТам Цикл
    Если ЧтоТоТам.реквизит1 > 2 И ЧтоТоТам.реквизит1 < 5 Тогда
        ЧтоТоТам.Итого = ЧтоТоТам.Итого + 100;
    КонецЕсли;
    Если ЧтоТоТам.реквизит2 > 2 И ЧтоТоТам.реквизит2 < 5 Тогда
        ЧтоТоТам.Итого = ЧтоТоТам.Итого + 100;
    КонецЕсли;
КонецЦикла;

User2

я изменил форму см. вложение. помогите разобраться. первый мой опыт в 1С, затрудняюсь сделать правильно описание в модуле

oleg-x

Напиши в событие при изменение времени и отклонение процедуру "РасчитатьБаллы"
В которой будет рассчитываться баллы при изменения одного из параметров.
Как то так:
Баллы = 0;  //очищаем значение, иначе при каждом изменение, количество баллов будет расти.
Если время = 1 Тогда
    Баллы = 1;
ИначеЕсли время = 2 Тогда
    Баллы = 2;
ИначеЕсли Время = 3 Тогда
    Баллы = 3;
Иначе
    Баллы = 4;
КонецЕсли; //Здесь мы расчитали баллы в зависимости от времени.

Если Отклонение =1 Тогда
    Баллы = Баллы + 1;
ИначеЕсли Отклонения =2 Тогда
    Баллы = Баллы + 2;
Иначе
    Баллы = Баллы + 3;
КонецЕсли;
Помог, нажми спасибо. Не помог, нажми спасибо :-)
Если у Вас есть проблема, то её уже кто то решил @Yandex, @Google

3030

Во первых, ты в обработке создай реквизит "Баллы" с типом "Число", если ты этого еще не сделал.
Потом жми на поле ввода "Баллы" в конфигураторе, и убери галку с поля "Доступность" (чтобы вручную никто не подправил), для этого выдели окошко "Баллы", правый клик - свойства и ищи (рис.1)

Некст. Жми на поле "Время Валки" и ищи штуку, которая называется "При изменении" и жми на лупу (рис.2). У тебя будет создана процедура, куда ты напишешь следующий код:
Процедура ВремяВалкиПриИзменении(Элемент)
Если ВремяВалки >= 0 И ВремяВалки <= 180 Тогда
Баллы = Баллы + 100;
ИначеЕсли ВремяВалки > 180 Тогда
Баллы = Баллы + 50;
КонецЕсли;
КонецПроцедуры


Прмичем "ПРоцедура..." и "КонецПроцедуры" у тебя уже будет написано.
Далее таким же макаром щелкаем по полю "Отклонение", создаем обработчик для события "ПриИзменении" и пишем туда:
Процедура ОтклонениеПриИзменении(Элемент)
Если Отклонение >= 0 И Отклонение <= 35 Тогда
Баллы = Баллы + 40;
ИначеЕсли Отклонение > 35 Тогда
Баллы = Баллы + 50;
КонецЕсли;
КонецПроцедуры


Жмем на "СлишкомВысокийПень", создаем такую же процедуру-обработчик "ПриИзменении"
Процедура СлишкомВысокийПеньПриИзменении(Элемент)
Если СлишкомВысокийПень = Истина Тогда
Баллы = Баллы - 50;
Иначе
Баллы = Баллы + 50;
//а то вдруг кто-нибудь будет шаловливо дергать туда-сюда
//эту галку
КонецЕсли;
КонецПроцедуры


Ну и подумай еще, как задачу поставить, а то смотри, ввел ты во время валки 150, тебе накинулось к баллам сотню, потом передумал и ввел 190, и к сотне баллов докинется еще 150. Такие подсчеты лучше делать при/перед записи/сью документа, я щитаю.



Добавлено: 22 авг 2017, 01:38


Чот я фигню какую-то выше написал, надо просто вынести перерасчет в отдельную процедуру и при каждом изменении его пересчитывать

Процедура ВремяВалкиПриИзменении(Элемент)
    Перерасчет();
КонецПроцедуры

Процедура ОтклонениеПриИзменении(Элемент)
    Перерасчет();
КонецПроцедуры

Процедура СлишкомВысокийПеньПриИзменении(Элемент)
    Перерасчет();
КонецПроцедуры

Процедура Перерасчет()
    Баллы = 0;
   
    Если ВремяВалки >= 0 И ВремяВалки <= 180 Тогда
        Баллы = Баллы + 100;
    ИначеЕсли ВремяВалки > 180 Тогда
        Баллы = Баллы + 50;
    КонецЕсли;
   
    Если Отклонение >= 0 И Отклонение <= 35 Тогда
        Баллы = Баллы + 40;
    ИначеЕсли Отклонение > 35 Тогда
        Баллы = Баллы + 50;
    КонецЕсли;

    Если СлишкомВысокийПень = Истина Тогда
        Баллы = Баллы - 50;
    КонецЕсли;
КонецПроцедуры

User2

Спасибище буду пробовать :zebzdr:
Добавлено: 22 авг 2017, 19:54


Процедура ВремяПриИзменении(Элемент)
   Баллы =0;
   Если объект.Время >240  Тогда
      Баллы = Баллы +0;
   ИначеЕсли объект.Время > 0 И объект.Время <= 180 Тогда
      Баллы = Баллы + 60;
   ИначеЕсли объект.Время > 180  Тогда
       Баллы = Баллы + (60-(объект.Время-180));
   КонецЕсли;   
КонецПроцедуры
Пробовал как работает... при изменении времени валки баллы как были 0 так и остались:dfbbdrfb:
Добавлено: 22 авг 2017, 20:04


&НаКлиенте
Процедура ВремяПриИзменении(Элемент)
   объект.Баллы =0;
   Если объект.Время >240  Тогда
      объект.Баллы = объект.Баллы +0;
   ИначеЕсли объект.Время > 0 И объект.Время <= 180 Тогда
      объект.Баллы = объект.Баллы + 60;
   ИначеЕсли объект.Время > 180  Тогда
       объект.Баллы = объект.Баллы + (60-(объект.Время-180));
   КонецЕсли;   
КонецПроцедуры
так переписал заработало )
Добавлено: 22 авг 2017, 21:12


Заработало но не совсем так как надо (((
каждый реквизит считает правильно но не суммируются баллы  т.е. в поле "баллы" подставляется  значение последнего изменяемого реквизита

&НаКлиенте
Процедура ВремяПриИзменении(Элемент)
   объект.Баллы =0;
   Если объект.Время > 240  Тогда
      объект.Баллы = объект.Баллы +0;
   ИначеЕсли объект.Время > 0 И объект.Время <= 180 Тогда
      объект.Баллы = объект.Баллы + 60;
   ИначеЕсли объект.Время > 180  Тогда
      объект.Баллы = объект.Баллы + (60 - (объект.Время - 180));
   КонецЕсли;   
КонецПроцедуры
&НаКлиенте
Процедура ОтклонениеПриИзменении(Элемент)
   Если объект.Отклонение >= 0 И объект.Отклонение <= 400 Тогда
       объект.Баллы =(400 -объект.Отклонение);
   Иначе   
       объект.Баллы = объект.Баллы + 0;
   КонецЕсли;
КонецПроцедуры
&НаКлиенте
   Процедура Команда1(Команда)
      объект.Баллы =0;
   Если объект.Время > 240  Тогда
      объект.Баллы = объект.Баллы +0;
   ИначеЕсли объект.Время > 0 И объект.Время <= 180 Тогда
      объект.Баллы = объект.Баллы + 60;
   ИначеЕсли объект.Время > 180  Тогда
       объект.Баллы = объект.Баллы + (60 - (объект.Время - 180));
   КонецЕсли;   
     
   Если объект.Отклонение >= 0 И объект.Отклонение <= 400 Тогда
       объект.Баллы =(400 -объект.Отклонение);
   Иначе   
       объект.Баллы = объект.Баллы + 0;
   КонецЕсли;
   КонецПроцедуры

oleg-x

ЦитироватьЗаработало но не совсем так как надо (((
каждый реквизит считает правильно но не суммируются баллы  т.е. в поле "баллы" подставляется  значение последнего изменяемого реквизита
Потому что не так сделал.
У каждого реквизита при изменение пропиши процедуру "РасчитатьБаллы"
И сделай эту процедуру. То есть

Процедура ПриИзмененииЛюбогоРеквизита();
    РассчитатьБаллы();
КонецПроцедуры

Процедура ПриИзмененииЛюбогоРеквизита();
    РассчитатьБаллы();
КонецПроцедуры

Процедура ПриИзмененииЛюбогоРеквизита();
    РассчитатьБаллы();
КонецПроцедуры

Процедура РассчитатьБаллы()
    Объект.Баллы = 0; //очищаем поле для полного расчета
    //Сюда прописать все что ты написал в каждый реквизит.
КонецПроцедуры
Помог, нажми спасибо. Не помог, нажми спасибо :-)
Если у Вас есть проблема, то её уже кто то решил @Yandex, @Google

AIFrame

Процедура ПриИзмененииЛюбогоРеквизита();
    РассчитатьБаллы();
КонецПроцедуры

Процедура ПриИзмененииЛюбогоРеквизита();
    РассчитатьБаллы();
КонецПроцедуры

Процедура ПриИзмененииЛюбогоРеквизита();
    РассчитатьБаллы();
КонецПроцедуры

Можно какбы вешать одну процедуру на несколько элементов.
Т.е. на все реквизиты, попадающие под необходимость этой процедуры, повесить один обработчик. Писать n раз одно и то же не нужно.

oleg-x

Так можно сделать, но не стоит.
Если потом что то захотят добавить, только при изменение одного реквизита, придется переписывать.
Помог, нажми спасибо. Не помог, нажми спасибо :-)
Если у Вас есть проблема, то её уже кто то решил @Yandex, @Google

AIFrame

Цитата: oleg-x от 23 авг 2017, 10:41
Так можно сделать, но не стоит.
Если потом что то захотят добавить, только при изменение одного реквизита, придется переписывать.
Поэтому у хуков формы почти всегда есть передаваемый параметр "Элемент". Двуручный если тогда иначеесли поможет разрешить эту сложную ситуацию.

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск