8.х 1С 8.2 УФ. Программно созданные переключатели на форме. Как управлять, опрашивать ?

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем 1CZigor, 15 июн 2014.

  1. TopicStarter Overlay
    1CZigor
    Offline

    1CZigor

    Регистрация:
    8 дек 2013
    Сообщения:
    5
    Симпатии:
    0
    Баллы:
    1
    1С 8.2 Управляемые формы.
    ПРОГРАММНО создал переключатели на форме. То есть не в конфигураторе.

    Код:
        ДобавляемыеРеквизиты = новый Массив;
        Родитель = "";
        НомерГруппы = 0;
        Для Каждого Строка Из ТаблицаСвойств Цикл
        
            Если Родитель <> Строка.Родитель Тогда // сменился родитель
                Родитель = Строка.Родитель;
                НомерГруппы = НомерГруппы + 1;
            
                НовыйРеквизит = Новый РеквизитФормы("Пер"+НомерГруппы,Новый ОписаниеТипов("Число"),,Строка.Родитель); // группа переключателей
                ДобавляемыеРеквизиты.Добавить(НовыйРеквизит);
            КонецЕсли;
        КонецЦикла;                 
        ИзменитьРеквизиты(ДобавляемыеРеквизиты);
        // добавляем строки в переключатели
        Родитель = "";
        НомерГруппы = 0;  НомерСтроки = 0;
        Для Каждого Строка Из ТаблицаСвойств Цикл
            Если Родитель <> Строка.Родитель Тогда // сменился родитель добавляем нзвание колонки и первую строку
                Родитель = Строка.Родитель;
                НомерГруппы = НомерГруппы + 1;
            
            
                НазваниеГруппы = "НоваяКолонка"+НомерГруппы;
                НовыйЭлемент = Элементы.Добавить(НазваниеГруппы, Тип("ПолеФормы"),Элементы.ГруппаВариантов);
                НовыйЭлемент.ПутьКДанным = "Пер"+НомерГруппы;
                НовыйЭлемент.Вид = ВидПоляФормы.ПолеПереключателя;
                НовыйЭлемент.КоличествоКолонок=1;
                //ДействиеПриИзменении = Новый Событие("НовыйПриИзменении");
                НовыйЭлемент.УстановитьДействие("ПриИзменении", "НовыйПриИзменении");
            
                НазваниеСтроки = "Стр"+НомерСтроки;
                НомерСтроки = НомерСтроки+1;      // добавляем первую строчку
                НовыйЭлемент.СписокВыбора.Добавить(НазваниеСтроки, Строка.Значение);
                НовыйЭлемент.ПервыйВГруппе = Истина;
          
            Иначе          // добавляем остальные строки
                НомерСтроки = НомерСтроки+1;
                НовыйЭлемент.СписокВыбора.Добавить(НазваниеСтроки, Строка.Значение);
            КонецЕсли;
    

    Создал процедуру ПриИзменении на Клиенте. В процедуру , при выборе мышкой любого пункта из програмно созданных переключателей , попадаю. Переключатель выбранный вижу. Но вот как дальше управлять - не пойму.
    1 - надо узнать, какой пункт переключателя был выбран.
    2 - надо установить в положение включено выбранную строку ( пункт ) конкретного переключателя.
    3 - сбросить другой выбранный пункт , если он был.

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

    В переключателе , созданном в конфигураторе выбранный пункт есть в Объекте

    Но программно созданного переключателя в главное реквизите - ДокументОбъекте нет. Он существует только на форме в Управляемой форме ЭтаФорма. Повторяюсь - Управляемые формы.
    Последнее редактирование модератором: 16 июн 2014
  2. gennadyantropov
    Offline

    gennadyantropov Новичок в 1С

    Регистрация:
    19 июл 2011
    Сообщения:
    29
    Симпатии:
    3
    Баллы:
    4
    Попробуйте вместо
    Код:
    НомерСтроки = 0;
    ...
    НомерСтроки = НомерСтроки+1; // добавляем первую строчку
    НовыйЭлемент.СписокВыбора.Добавить(НазваниеСтроки, Строка.Значение);
    следующее
    Код:
    НомерСтроки = 0; // только в ветке для Родителя
    НовыйЭлемент.СписокВыбора.Добавить(НомерСтроки, Строка.Значение);
    НомерСтроки = НомерСтроки + 1; // добавляем первую строчку
    
    Последнее редактирование: 16 июн 2014
  3. TopicStarter Overlay
    1CZigor
    Offline

    1CZigor

    Регистрация:
    8 дек 2013
    Сообщения:
    5
    Симпатии:
    0
    Баллы:
    1
    Спасибо. Но сами радиокнопки формируются корректно.
    Формат ТаблицыСвойств такой:
    Родитель1 Значение1
    Родитель1 Значение2
    Родитель1 Значение3
    Родитель2 Значение1
    Родитель2 Значение2 и т.д.

    В обходе в цикле родителя выбираются оба параметра, а в остальных проходах цикла используется только второй параметр, и так до смены родителя.

    Вопрос был в том, КАК словить положение переключателя, его выбор пользователем. Как-то привязать к реквизитам Объекта надо. А как?
  4. gennadyantropov
    Offline

    gennadyantropov Новичок в 1С

    Регистрация:
    19 июл 2011
    Сообщения:
    29
    Симпатии:
    3
    Баллы:
    4
    У меня так получилось:
    Код:
    &НаКлиенте
    Процедура НовыйПриИзменении(Элемент)
      
        Родитель = Сред(Элемент.Имя, СтрДлина("НоваяКолонка") + 1);
        Сообщить("Родитель: " + Родитель + ", сынок: " + ЭтотОбъект["Пер" + Родитель]);
      
    КонецПроцедуры
    Может и корявасто, но работает... Пойдет?
  5. TopicStarter Overlay
    1CZigor
    Offline

    1CZigor

    Регистрация:
    8 дек 2013
    Сообщения:
    5
    Симпатии:
    0
    Баллы:
    1
    Управляемые формы !!! Тонкий клиент то бишь ! Вы скорее всего пробуете на неуправляемом толстом клиенте. В управляемых формах на сервере и на клиенте есть только Объект и ЭтаФорма.
    У ЭтаФорма есть ТекущийЭлемент.Имя - "Колонка2" или 1-3 в зависимости от выбора. Есть ЭтаФорма.ТекущийЭлемент.СписокВыбора - ( WiFi: Без WiFi ) например. Но то, какой из них выбран - ни гугу. Всё обыскал. Событие у Радиокнопки - одно только ( у оригинала , добавляемого в конфигураторе - ПриИзменении). Кстати, кроме того , что не опрашивается, ещё и не устанавливается точка в выбранном.

    Есть ещё Элемент - Но он повторяет данные с ЭтаФорма.

    ЭтаФорма.ТекущийЭлемент.ПутьКДанным - Ошибка чтения значения - похоже данные должны быть тут. Но как установить их ?

    У переключателя, добавленного в конфигураторе, есть данные на сервере в Объект.Реквизит1 . Но для программно-добавленного реквизита в Объекте на сервере нет ничего. Даже его самого нет. Вызов сервера контекстный делаю.
    Последнее редактирование: 17 июн 2014
  6. TopicStarter Overlay
    1CZigor
    Offline

    1CZigor

    Регистрация:
    8 дек 2013
    Сообщения:
    5
    Симпатии:
    0
    Баллы:
    1
    Вопрос решён. Привожу текст ( кому надо - пользуйтесь )создания переключателя с( радиокнопки ) с комментариями .Вся проблема была в типизации. Описание типов для возвращаемого (выбираемого) значения было число, а задавал при формировании - строку. Вот платформа и не могла преобразовать строку в число.

    Код:
    Родитель = "";       // родитель для сравнения - определения факта смены родителя
        НомерГруппы = 0;
        Для Каждого Строка Из ТаблицаСвойств Цикл
            Если Родитель <> Строка.Родитель Тогда // сменился родитель
                ДобавляемыеРеквизиты = новый Массив;  // создаём массив для добавляемого реквизита
           
                НомерСтроки = 0;
                Родитель = Строка.Родитель;
                НомерГруппы = НомерГруппы + 1;
                НазваниеГруппы = "Переключатель"+НомерГруппы;
                ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(НазваниеГруппы, // имя создаваемого реквизита
                Новый ОписаниеТипов("Число")  // тип реквизита
                ,,Строка.Родитель));      // заголовок
                ИзменитьРеквизиты(ДобавляемыеРеквизиты); // добавляем реквизит
                // добавляем элемент формы
                НазваниеГруппы = "Переключатель"+НомерГруппы;
                НовыйЭлемент = Элементы.Добавить(НазваниеГруппы, Тип("ПолеФормы"), Элементы.ГруппаВариантов);
                // связываем реквизит и элемент формы
                НовыйЭлемент.ПутьКДанным = НазваниеГруппы; // "Пер"+НомерГруппы;
                // установим некоторые свойства
                НовыйЭлемент.Вид = ВидПоляФормы.ПолеПереключателя;
                НовыйЭлемент.КоличествоКолонок=1;
                // установим имя события и процедуру, его обрабатывающую
                НовыйЭлемент.УстановитьДействие("ПриИзменении", "НовыйПриИзменении");
           
                НомерСтроки = НомерСтроки+1;      // добавляем первую строчку         // ЭтаФорма
                НазваниеСтроки =НомерСтроки;
                НовыйЭлемент.СписокВыбора.Добавить(НазваниеСтроки, Строка.Значение); // Объект
            Иначе          // добавляем остальные строки
                НомерСтроки = НомерСтроки+1;
                НазваниеСтроки =НомерСтроки;
                НовыйЭлемент.СписокВыбора.Добавить(НазваниеСтроки, Строка.Значение);
            КонецЕсли;
    Последнее редактирование модератором: 18 июн 2014
  7. gennadyantropov
    Offline

    gennadyantropov Новичок в 1С

    Регистрация:
    19 июл 2011
    Сообщения:
    29
    Симпатии:
    3
    Баллы:
    4
    Я ж, собственно, на это и указывал в своем первом сообщении. :О)

Поделиться этой страницей