helpf.pro
Регистрация

Можно ли создать реквизит в форме Программным путем в V8.1

mp
09.02.2010 15:01Прочитано: 27847
Задача состоит в генерации формы "на лету".

Создаем ЭлементУправления:
Код 1C v 8.х
 ЭлементУправления = ЭлементыФормы.Добавить(...)   


Как привязать ЭлементУправления к данным, если реквизиты в конструкторе не созданы
Код 1C v 8.х
 ЭлементУправления.Данные = ???   
Yandex
Возможно, вас также заинтересует
Реклама на портале
E_Migachev
09.02.2010 19:20Ответ № 1
А данные вообще где будут храниться?
E_Migachev
09.02.2010 19:38Ответ № 2
Вот как пример, так я добавляю элементы на форму, а потом им присваиваю требуемое значение
Код 1C v 8.х
 Процедура ДобавитьЭлементыНаФормуИНП(Форма, ПодменюДействия) Экспорт
Перем МетаданныеОбъекта; Перем ЕстьИсточник; Перем ЕстьФлагРаспр; Перем Обработчик; Перем Кнопка; Перем ВычитаемаяШирина;
Перем НижняяПанель; Перем КоличествоКнопок; Перем КоличествоСимволов; Перем ТекКнопка; Перем Панель; Перем НовыйЭлемент;
МетаданныеОбъекта = Форма.ЭтотОбъект.Метаданные();
// Проверим есть ли реквизиты в документе
ЕстьИсточник = ЕстьРеквизитДокумента("ИНП_Источник",МетаданныеОбъекта);
ЕстьФлагРаспр = ЕстьРеквизитДокумента("ФлагРаспределенияИсточников",МетаданныеОбъекта);
Если (НЕ ЕстьИсточник И НЕ ЕстьФлагРаспр) Тогда
Возврат;
КонецЕсли;
//Вставим разделитель в командную панель
ПодменюДействия.Кнопки.Вставить(0,"РазделительМенюИНП",ТипКнопкиКоманднойПанели.Разделитель);
Если ЕстьИсточник Тогда
Если ПодменюДействия.Кнопки.Найти("ВыбратьИсточник") = Неопределено Тогда
Обработчик = Новый Действие("ДействияФормыВыбратьИсточник");
Кнопка = ПодменюДействия.Кнопки.Вставить(0,"ВыбратьИсточник",ТипКнопкиКоманднойПанели.Действие,"Выбрать источник",Обработчик);
Кнопка.ИзменяетДанные = Истина;
КонецЕсли;
КонецЕсли;
Если ЕстьФлагРаспр Тогда
Если ПодменюДействия.Кнопки.Найти("Распределять") = Неопределено Тогда
Обработчик = Новый Действие("ДействияФормыРаспределять");
Кнопка = ПодменюДействия.Кнопки.Вставить(0,"Распределять",ТипКнопкиКоманднойПанели.Действие,"Распределять",Обработчик);
Кнопка.ИзменяетДанные = Истина;
КонецЕсли;
КонецЕсли;
// Разместим Надпись Наименование Источника в левом нижнем углу
ВычитаемаяШирина = 350;
Попытка
НижняяПанель = Форма.ЭлементыФормы.ОсновныеДействияФормы;
КоличествоКнопок = 0;
КоличествоСимволов = 0;
Для каждого ТекКнопка Из НижняяПанель.Кнопки Цикл
Если ТекКнопка.ТипКнопки = ТипКнопкиКоманднойПанели.Разделитель Тогда
КоличествоСимволов = КоличествоСимволов + 3;
Иначе
КоличествоКнопок = КоличествоКнопок + 1;
КоличествоСимволов = КоличествоСимволов + СтрДлина(ТекКнопка.Текст);
КонецЕсли;
КонецЦикла;
Если КоличествоКнопок = 3 Тогда
ВычитаемаяШирина = 160;
ИначеЕсли КоличествоКнопок = 4 Тогда
ВычитаемаяШирина = 250;
ИначеЕсли КоличествоКнопок = 5 Тогда
ВычитаемаяШирина = 390;
ИначеЕсли КоличествоКнопок > 5 Тогда
ВычитаемаяШирина = 420;
КонецЕсли;
Исключение
КонецПопытки;
ВычитаемаяШирина = ВычитаемаяШирина + 16;
Панель = Форма.Панель;
НовыйЭлемент = Форма.ЭлементыФормы.Добавить(Тип("Надпись"),"НадписьНаименованиеИсточника",,Панель);
НовыйЭлемент.Верх = Форма.Высота - 22;
НовыйЭлемент.Лево = 8;
НовыйЭлемент.Ширина = Форма.Ширина - ВычитаемаяШирина;
НовыйЭлемент.Высота = 18;
НовыйЭлемент.ЦветФона = ЦветаСтиля.ЦветФонаКнопки;
НовыйЭлемент.ЦветТекста = ЦветаСтиля.ЦветГиперссылки;
НовыйЭлемент.Шрифт = ШрифтыСтиля.ШрифтВажнойНадписи;
НовыйЭлемент.УстановитьПривязку(ГраницаЭлементаУправления.Право,Панель,ГраницаЭлементаУправления.Право);
НовыйЭлемент.УстановитьПривязку(ГраницаЭлементаУправления.Верх,Панель,ГраницаЭлементаУправления.Низ);
НовыйЭлемент.УстановитьПривязку(ГраницаЭлементаУправления.Низ,Панель,ГраницаЭлементаУправления.Низ);
КонецПроцедуры
mp
10.02.2010 09:39Ответ № 3
В Вашем примере проверяется наличие РЕКВИЗИТОВ Объекта Конфигурации,
а в моей задаче необходимо Добавить РЕКВИЗИТЫ ФОРМЫ, при чем я знаю что их нет,
поскольку не создавались в конструкторе формы на вкладке "Реквизиты".
Вообще речь идет об элементах управления "Переключатель" , которые д.б.
програмно помещены на фому в момент ее открытия И привязаться к неким Данным
Значения которых при закрытии формы д.б. проанализировано и записано в табличнуючать документа.
Создать элемент управления получилось:
Код 1C v 8.х
 оПереключатель = ЭлементыФормы.Добавить(Тип("Переключатель"), ИмяПереключателя, Истина, ТабДок );   

Далее его н. связать с Данными:
Код 1C v 8.х
 оПереключатель.Данные = <РеквизитФормы>;   

А "РеквизитФормы" как раз и надо предварительно сгенерировать программно,
поскольку в конструкторе он естественно отсутствовал.
В V8.2 для управляемой формы есть что-то подобное
Код 1C v 8.2 УП
 Новый РеквизитФормы(<Имя>, <Тип>, <Путь>, <Заголовок>, <СохраняемыеДанные>)    

А как быть в V8.1?
--
mp
E_Migachev
10.02.2010 11:15Ответ № 4
Насколько я знаю, в 8.1 нет такой функции!
В данном случае придется работать только через Переменные, считал данные из табличной части, поместил в переменную и потом присвоил добавленному на форму объекту.
mp
10.02.2010 12:36Ответ № 5
Через переменные не получается - может не так что делаю:

Код 1C v 8.х
 //Создаю переменную:
Перем ДанныеЭУ;
...
// Помещаю в нее Нужный реквизит строки табличной части
ДанныеЭУ = ЭтотОбъект.ТаблЧасть.Получить(0).Группа;
// Присваиваю Переменную, добавленному на форму объекту
оПереключатель = ЭлементыФормы.Добавить(...);
оПереключатель.Данные = "ДанныеЭУ";

<br><br>
и ошибка при выполнении:
Ошибка при установке значения атрибута контекста (Данные):
Неправильный путь к данным
E_Migachev
10.02.2010 15:13Ответ № 6
mp, набросал для тебя примерчики )
Потом размести пожалуйста свой код!

Код 1C v 8.х
 //Для тестирования примеров можно создать новую обработку, в ней новую форму
//На форме создать панель - НашаПанель
//И нижеследующий код поместить в модуль формы в Процедура КнопкаВыполнитьНажатие(Кнопка)

//Пример 1: Вывод в табличное поле
ТЗДанных = Новый ТаблицаЗначений;
// Создать нужные колонки.
ТЗДанных.Колонки.Добавить("Фамилия");
ТЗДанных.Колонки.Добавить("Возраст");
// Добавить новую строку и задать значения в колонках таблицы.
НоваяСтрока = ТЗДанных.Добавить();
НоваяСтрока.Фамилия = "Иванов";
НоваяСтрока.Возраст = 23;
НоваяСтрока = ТЗДанных.Добавить();
НоваяСтрока.Фамилия = "Петров";
НоваяСтрока.Возраст = 35;
НоваяСтрока = ТЗДанных.Добавить();
НоваяСтрока.Фамилия = "Сидоров";
НоваяСтрока.Возраст = 49;

// Расположим на странице табличное поле
ПолеТабПоля = ЭлементыФормы.Добавить(Тип("ТабличноеПоле"), "ТабПолеФИО", Истина, ЭлементыФормы.НашаПанель);
ПолеТабПоля.Верх = 15;
ПолеТабПоля.Лево = 25;
ПолеТабПоля.Ширина = ЭтаФорма.Ширина - 150;
ПолеТабПоля.Высота = 50;
ПолеТабПоля.Значение = ТЗДанных;
ПолеТабПоля.СоздатьКолонки();

//Пример 2: Вывод в элемент надпись
НовыйЭлемент = ЭлементыФормы.Добавить(Тип("Надпись"),"НадписьНаименованиеИсточника",Истина, );
НовыйЭлемент.Верх = ЭтаФорма.Высота - 22;
НовыйЭлемент.Лево = 8;
НовыйЭлемент.Ширина = ЭтаФорма.Ширина - 150;
НовыйЭлемент.Высота = 18;
НовыйЭлемент.ЦветФона = ЦветаСтиля.ЦветФонаКнопки;
НовыйЭлемент.ЦветТекста = Новый Цвет(255,103,0);
//НовыйЭлемент.Шрифт = ШрифтыСтиля.ШрифтВажнойНадписи;
НовыйЭлемент.УстановитьПривязку(ГраницаЭлементаУправления.Право,Панель,ГраницаЭлементаУправления.Право);
НовыйЭлемент.УстановитьПривязку(ГраницаЭлементаУправления.Верх,Панель,ГраницаЭлементаУправления.Низ);
НовыйЭлемент.УстановитьПривязку(ГраницаЭлементаУправления.Низ,Панель,ГраницаЭлементаУправления.Низ);
//Создадим переменную с информацией для вывода в созданной надписи
ИнфаДляВывода="Сейчас "+ Строка(ТекущаяДата());
НовыйЭлемент.Значение = ИнфаДляВывода;

//Пример 3: Вывод преключателей
ПолеПерекл = ЭлементыФормы.Добавить(Тип("Переключатель"), "ПолеПерекл1", Истина, ЭлементыФормы.НашаПанель);
ПолеПерекл.ПервыйВГруппе = Истина;
ПолеПерекл.Заголовок = РабочаяДата;
ПолеПерекл.Верх = 85;
ПолеПерекл.Лево = 3;
ПолеПерекл.Ширина = ЭтаФорма.Ширина - 150;
ПолеПерекл.Высота = 10;

ПолеПерекл = ЭлементыФормы.Добавить(Тип("Переключатель"), "ПолеПерекл2", Истина, ЭлементыФормы.НашаПанель);
ПолеПерекл.Заголовок = ТекущаяДата();
ПолеПерекл.Верх = 100;
ПолеПерекл.Лево = 3;
ПолеПерекл.Ширина = ЭтаФорма.Ширина - 150;
ПолеПерекл.Высота = 10;
//Определим Выбираемые значения
ЭлементыФормы.ПолеПерекл1.ВыбираемоеЗначение = 1; // 1 - РабочаяДата
ЭлементыФормы.ПолеПерекл2.ВыбираемоеЗначение = 2; // 2 - ТекущаяДата()

//Установим значение переключателя на Текущая Дата
ЭлементыФормы.ПолеПерекл1.Значение = 2;
mp
11.02.2010 11:35Ответ № 7
*06 Спасибо! *06
Приведенный выше премер навел на верную технику исполнения - результат достигнут.
Делаю для себя следующие выводы:
1. в V8.1 создать реквизиты формы программным способом ("на лету") - НЕЛЬЗЯ
их можно создать т. в Конфигураторе
2. для решения вопроса (в случае использования "Переключателей") можно воспользоваться свойством "Значение" переключателя "ПервогоВГруппе".
Попытка инициировать Переменную с нужным типом и повесить ее на свойство "Данные" (куда обычно прописываются имеющиеся реквизиты формы) некорректна

Если интересно - привожу запрашиваемый код:

Код 1C v 8.х
 	// Задача:
// Организовать сбор сведений по Показателям (Группам)
// каждый их которых имеет несколько предопределенных значений (Характеристик)
// Для каждого Паказателя м. выбрать т. одну Характеристику
// Решение:
// Создаем Иерархический Справочник <Показатели> с реквизитом НаименованиеПолное
// Заполняем предопределенными элементами по правилу:
// Код для Групп - целое число {1,2,3...}, Код для Элемента - КодГруппы +"."+ ПорядокЭлемента {1.1, 1.2, ... 2.1,2.2}
// Требуется:
// Осуществить вывод справочника в ПолеТабличного документа формы
// в виде Иерархического списка с различным форматированием строк Групп и Элементов
// В первую колонку для Элементов поместить ЭлементУправления - Переключатель
// для осуществления выбора Характеристики для каждой группы
// Результаты:
// поместить в Табличную Часть в реквизиты: Группа и Характеристика

// Ссылка на Приемник - ЭлементУправления типа Табличный документ
ТабДок = ЭлементыФормы.ПолеТабличногоДокумента;
// Получаем Шаблоны формирования строк для Групп и Элементов справочника
Макет = ЭтотОбъект.ПолучитьМакет("МакетДокумента");
ТабДок.Вывести( Макет.ПолучитьОбласть("Шапка") );
СтрокаГруппы = Макет.ПолучитьОбласть("СтрокаГруппы");
СтрокаЭлемента = Макет.ПолучитьОбласть("СтрокаЭлемента");
// Осуществляем иерархическую выборку из справочника Показателей
Выборка = Справочники.Показатели.ВыбратьИерархически(,,,"Код");

ТабДок.НачатьАвтоГруппировкуСтрок();
Пока Выборка.Следующий() Цикл
лЭтоГруппа = Выборка.ЭтоГруппа;
тдШаблон = ?(лЭтоГруппа, СтрокаГруппы, СтрокаЭлемента);

тдШаблон.Область("R1C1").Значение = Выборка.Ссылка;
тдШаблон.Область("R1C2").Текст = ?(ПустаяСтрока(Выборка.Ссылка.НаименованиеПолное), Выборка.Ссылка.Наименование, Выборка.Ссылка.НаименованиеПолное);

СтрокаТД = ТабДок.Вывести(тдШаблон, Выборка.УровеньВВыборке(), , Истина);

//
Если лЭтоГруппа Тогда
фПервыйВГруппе = Истина;
Иначе
// Отстраиваемся от позиции Примечания, Левой колонки (оно находится над нужной ячейкой!!!)
чКолонкаВыбора = 1; // Выводить Переключатели в 1-ую колонку
Ячейка = ТабДок.Область("R"+СтрокаТД.Верх+"C"+?(чКолонкаВыбора=1,1,чКолонкаВыбора-1)).Примечание;
ИмяПереключателя = "ПереключательГруппы_" + стрЗаменить( ?(фПервыйВГруппе,Выборка.Родитель.Код,Выборка.Код), ".","_");
оПереключатель = ЭлементыФормы.Добавить(Тип("Переключатель"), ИмяПереключателя, Истина, ТабДок );
оПереключатель.Верх = Ячейка.Верх + 2;
оПереключатель.Лево = ?(чКолонкаВыбора=1, 0, Ячейка.Лево);
оПереключатель.Высота = 3; оПереключатель.Ширина = 3; // н. т. при оПереключатель.ВстроенВЯчейку = Ложь;
оПереключатель.ПоложениеЗаголовка = ПоложениеЗаголовка.ЗаголовокСлева;
оПереключатель.ВстроенВЯчейку = Истина;
оПереключатель.Видимость = Истина;

// Здесь некое "мухоморство"
// Поскольку строки табличного документа формируются последовательно
// с одновременным размещением в них элементов Переключателей
// каждый последующий переключатель НЕ "пристыковывается" к ПервыйВГруппе
// и не наследует от него ТипЗначения
// Поэтому: для ВСЕХ переключателей в Группе устанавливаем ПервыйВГруппе = Истина
// это дает возможности инициировать реквизиты ТипЗначения и ВыбираемоеЗначение
// НО после инициализации н. для всех не 1-х переключателей в группе сбросить соответствующий флаг
// Если организовать формирование Переключателей в отдельном цикле
// после цикла вывода всех элементов справочника - подобная техника не потребуется
оПереключатель.ПервыйВГруппе = Истина;

//оПереключатель.Данные = "ДанныеГруппы_"+ Выборка.Родитель.Код;
оПереключатель.ТипЗначения = Новый ОписаниеТипов("СправочникСсылка.Показатели");
оПереключатель.ВыбираемоеЗначение = Выборка.Ссылка;
// ВАЖНО! для НЕ первых элементов сбросить свойство в ложь
оПереключатель.ПервыйВГруппе = ( фПервыйВГруппе );
// Подключаем Обработчик при Изменении
оПереключатель.УстановитьДействие("ПриИзменении", Новый Действие("ПереключательВыбораПриИзменении"));
фПервыйВГруппе = Ложь;
КонецЕсли;

КонецЦикла;
ТабДок.ЗакончитьАвтоГруппировкуСтрок();

// Инициализация Значений групп
Для каждого тчСтрока Из ЭтотОбъект.ТабличнаяЧасть Цикл;
ИмяПереключателя = "ПереключательГруппы_" + стрЗаменить(тчСтрока.Группа,".","_");
ЭлементыФормы[ИмяПереключателя].Значение = тчСтрока.Характеристика;
КонецЦикла;

ТабДок.Показать();


По "ходу пьесы" возникло 2-а вопроса:
1. Формирование табличного документа осуществляется методом ТабДок.Вывести(...)
Как начать вывод не следом за последней выведенной строкой, а с какой-то произвольной строки? Нижеприведенная конструкция не помогает
ТабДок.ТекущаяОбласть = ТабДок.Область("R15C1");
2. Чтобы элемент управления "ВстроитьВЯчейку" табличного документа, требуется чтобы левый верхний угол ЭУ попадал на интересуемую ячейку.
Можно-ли у Ячейки ПоляТабличногоДокумента определить Абсолютные координаты?
Свойства "Верх" и "Лево" у ячеек возвращают номер строки и колонки а не координаты.
Я нашел "кривой" выход- от координат Примечания ячейки, Но может есть более изящные конструкции.
E_Migachev
15.02.2010 10:12Ответ № 8
По 1-му: выводить можно только последовательно, или в указанную ячейку
по 2-му, полуить можно только строку и столбец *11
mp
01.03.2010 13:18Ответ № 9
по 2-му нашел:
Чтобы ЭлементУправления "прикрепить" к нужной ячейке используется метод-
расширение элементов управления, расположенных в поле табличного документа
Код 1C v 8.х
 оПереключатель.Расположить(<ОбластьЯчеек>)   
E_Migachev
22.04.2010 23:01Ответ № 10
Вопрос закрыт!
Подсказка: Для быстрого поиска ответов - используйте 'Поиск'
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.