Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Работа с множеством одинаковы елементов
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 7.7
Sede
Доброго дня.

Уважаемые знатоки, специалисты, профессионалы, гуру 1с! Преподайте пожалуйста урок грамотности 47067070.gif .

Часто стыкаюсь с необходимостью выполнять одно и тоже действие с несколькими схожими элементами, постоянно спрашивать - не вариант, найти толкового урока, объяснения по этому вопросу не получается.
Любые советы, рекомендации касательно одинаковой множественной обработки (обработка одинаковая но с разными параметрами, либо одна для множества элементов).
Интересуют как бы такие варианты (например):

1. На форме несколько элементов "Поле ввода" содержимое должно обрабатываться по одному и тому-же принципу (одна процедура) но с разными параметрами, как правильно это оформлять?
3. Аналогично п.1 проверка элементов "Поле со списком" (на предмет Текущего значения к примеру).
2. На форме несколько элементов "Флажок", необходимо: проверить их содержимое/массово снять флажок(или установить).

В общем нужны рекомендации касательно обработок нескольких схожих элементов.


Увы мой уровень пока позволяем мне решать такие задачи весьма не грамотно :

// проверка флажков на выбор
Если Флаг1=1 тогда сообщить("первый флажок");
Если Флаг2=0 Тогда сообщить ("второй флажок не выбран"); // и т.д.
//*****
// выбор только 1го флажка из 4х (аналог переключателя но нужны именно флажки, потому как нужен вариант без выбора)
Если Флаг1=1 Тогда
Флаг2=0;
Флаг3=0;
Флаг4=0;
Конец Если;

Если Флаг2=1 Тогда
Флаг1=0;
Флаг3=0;
Флаг4=0;
Конец Если; // и т.д.

// А если название флажков/элементов разные?
флАльфа=1;
флБета=1;
...
флОмега=1;
// аналогично флАльфа=0; и т.д. все в 0


несомненно такие операции можно заключать в циклы и обрабатывать все сразу, а не делать немереным количеством одинаковых строк. Код при это становится в разы короче и выглядит грамотнее.

Всем заранее спасибо! За наглядные примеры отдельная благодарность.
Нонна
Описать отдельную процедуру на установку одинаковых флажков
необходимо зарегистрироваться для просмотра ссылки
sava1
Формекс - АттрибутФормы (это коллекция)
TipsyKID
Перем мСписокФлаговОднойГруппы;
Функция Присвоить(Чему,Что) Экспорт
     Чему = Что;
     Возврат "";
КонецФункции
//======================================================================
Процедура ПриИзмененииФлагов(НомерФлага)
    для инд = 1 по мСписокФлаговОднойГруппы.РазмерСписка() Цикл
        Шаблон("[Присвоить("+(мСписокФлаговОднойГруппы.ПолучитьЗначение(инд))+","+(?(НомерФлага = инд,1,0))+")]");
    КонецЦикла;
КонецПроцедуры // ПриИзмененииФлагов(НомерФлага)

//Наименование флагов которые связаны между собой ! (Их порядок важен)
//Аналогичные должны быть на форме, с теми-же Идентификаторами, а на вкладке дополнительно вызывать ПриИзмененииФлагов() с соотвецтвующим значением
//Значение = порядковый номер флага

мСписокФлаговОднойГруппы = СоздатьОбъект("СписокЗначений");
мСписокФлаговОднойГруппы.ДобавитьЗначение("Фл1"); //1-й по порядку
мСписокФлаговОднойГруппы.ДобавитьЗначение("Флаг2");//2-й
мСписокФлаговОднойГруппы.ДобавитьЗначение("ОченьКлассныйФлаг");//3-й
Naghual
Решение чуть проще и чуть быстрее БЕЗ СпискаЗнаачений

Перем индФлаги[6];

Функция Задать(Чему,Что)
    Чему = Что; Возврат "";
КонецФункции

Процедура ИзмФлаги(ИмяЭлемента)
    Перем чЗначенияДругих;
    
    чЗначенияДругих = 1 - Число(Шаблон("["+ИмяЭлемента+"]"));
    Для чИнд = 1 По 6 Цикл
        Если индФлаги[чИнд] <> ИмяЭлемента Тогда
            Шаблон("[Задать("+индФлаги[чИнд]+","+чЗначенияДругих+")]");
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Процедура ПриОткрытии()
    индФлаги[1] = "флАльфа";
    индФлаги[2] = "флБета";
    индФлаги[3] = "флГамма";
    индФлаги[4] = "флЗета";
    индФлаги[5] = "флФита";
    индФлаги[6] = "флПета";
КонецПроцедуры


А в строку Формула в свойствах флажка пишем такой вызов процедуры: ИзмФлаги(Форма.АктивныйЭлемент())
И в данном примере абсолютно не важна последовательность флажков.
TipsyKID
Зато абсолютно важно, что Ваш код не работает, когда снимается галочка.
Naghual
Цитата(TipsyKID @ 28.07.15, 15:38) необходимо зарегистрироваться для просмотра ссылки
Зато абсолютно важно, что Ваш код не работает, когда снимается галочка.

Код специально написан так, чтобы при снятии галочки, устанавливались галочки на все остальные. Это не баг - это фича! wink.gif
Проверьте если не верите.
TipsyKID
Я так понял нас просили проимитировать переключатель, только галочками.
У Вас странный, слишком фичевый, переключатель.
Цитата
// выбор только 1го флажка из 4х (аналог переключателя но нужны именно флажки, потому как нужен вариант без выбора)

Хотя мой вариант тоже не работает так, как просил автор.
Naghual
Цитата(Sede @ 28.07.15, 13:59) необходимо зарегистрироваться для просмотра ссылки
массово снять флажок(или установить)

smile.gif На том и стоим! icon_beer17.gif

Наше дело научить (научится?) возможностям реализации.
А конкретную реализацию уже пусть сам топикстартер делает.
TipsyKID
Моё дело научиться!
Задача показалась мне интерестной, вот я и решил сделать, в первую очередь для себя.
Вот рабочий вариант :
Перем мСписокФлаговОднойГруппы;
//*******************************************
Функция Присвоить(Чему,Что) Экспорт
     Чему = Что;
     Возврат "";
КонецФункции

Функция ПолучитьЗначение(Значение) Экспорт
     Возврат Значение;
КонецФункции

//======================================================================
Процедура ПриИзмененииФлагов(НомерФлага)
    для инд = 1 по мСписокФлаговОднойГруппы.РазмерСписка() Цикл
        ТекЗнач = Шаблон("[ПолучитьЗначение("+(мСписокФлаговОднойГруппы.ПолучитьЗначение(инд))+")]");
        Шаблон("[Присвоить("+(мСписокФлаговОднойГруппы.ПолучитьЗначение(инд))+","+(?(((НомерФлага = инд) И (ТекЗнач = "1")),1,0))+")]");
    КонецЦикла;
КонецПроцедуры // ПриИзмененииФлагов(НомерФлага)

мСписокФлаговОднойГруппы = СоздатьОбъект("СписокЗначений");
мСписокФлаговОднойГруппы.ДобавитьЗначение("Фл1");
мСписокФлаговОднойГруппы.ДобавитьЗначение("Флаг2");
мСписокФлаговОднойГруппы.ДобавитьЗначение("ОченьКлассныйФлаг");
Naghual
Ну а мне показалось интересным реализовать именно так.
В твоем примере было бы проще не условие впихивать в шаблон и на каждой итерации его считать, а в конце, за циклом, присвоить 1 первичному флажку.
Ну то такое.
Мир, Дружба, Жвачка!
TipsyKID
Цитата(Naghual @ 28.07.15, 15:58) необходимо зарегистрироваться для просмотра ссылки
В твоем примере было бы проще не условие впихивать в шаблон и на каждой итерации его считать, а в конце, за циклом, присвоить 1 первичному флажку.

Вот так у Вас и получаются "фичи".
Ничего, что условие зависит от ТекЗнач которое рассчитывается в цикле ?
Если попытаться вынести его за цикл, то у нас получится включить галочку, но не "выключить".
Если, вдруг, я не понял Вашей идеи, прошу код в студию.


Разобрался :

Вы наверно хотели вот так ?
    ТекЗнач = Шаблон("[ПолучитьЗначение("+(мСписокФлаговОднойГруппы.ПолучитьЗначение(НомерФлага))+")]");
    для инд = 1 по мСписокФлаговОднойГруппы.РазмерСписка() Цикл
        Шаблон("[Присвоить("+(мСписокФлаговОднойГруппы.ПолучитьЗначение(инд))+",0)]");
    КонецЦикла;
    
    Шаблон("[Присвоить("+(мСписокФлаговОднойГруппы.ПолучитьЗначение(НомерФлага))+","+ТекЗнач +")]");


Согласен, чисто академически правильнее выходит.
Naghual
smile.gif Именно так.
sava1
Формекс - перебор кнопок формы
рФорма=СоздатьОбъект("РасширениеФормы");
    Для н=0 По рФорма.КоличествоАтрибутов()-1 Цикл
        Атрибут=рФорма.ПолучитьАтрибут(н);
        Тип=Атрибут.Тип;
        Если Тип=3 Тогда
            Сообщить("Поймали кнопку ");
            Сообщить(Атрибут.Идентификатор);
        КонецЕсли;
    КонецЦикла;
Sede
Всем спасибо за науку! Наглядные примеры очень информативны и познавательны.
12201689.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.