Динамические данные формы

В 1с можно создавать новые элементы управления. Но нельзя создавать для них новые реквизиты формы. Поэтому удобство работы с новыми элементами управления существенно ниже. Однако существует хитрый метод добавления любого количества реквизитов в форму.

Для этого используется объект Построитель. В форму добавляется единственный реквизит с типом построитель, назовем его, например, ДинамическиеДанные. В поле ДинамическиеДанные.Отбор можно добавлять любое число реквизитов, и использовать их в качестве данных для новых элементов управления. Реквизиты могут быть произвольного типа, причем содержать даже такие экзотические типы, как Форма или ЭлементУправления.

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

В результате работы обработки в Поле2 проставляется путь к данным Данные1, ссылающимся на Поле1 через Форму, а в Поле3 и в Поле4 устанавливается одинаковый путь к данным Данные2. Соответственно, в Поле1 и Поле2, в Поле3 и Поле4 выводятся одинаковые данные.

Библиотека выглядит так:

//fixin 20081124

//Функция позволяет добавить новые данные в форму

Функция ДобавитьДинамическиеДанныеПоЗначению(Форма, ИмяРеквизитаДД = "ДинамическиеДанные", ИмяДанных, Значение) Экспорт

//Определяем тип значения

Т = ТипЗнч(Значение);

МТ = Новый Массив();

МТ.Добавить(Т);

ОписаниеТипов = Новый ОписаниеТипов(МТ);

ТекОтбор = ДобавитьДинамическиеДанныеПоТипу(Форма, ИмяРеквизитаДД, ИмяДанных, ОписаниеТипов);

ТекОтбор.Значение = Значение;

Возврат ТекОтбор;

КонецФункции

 

Функция ДобавитьДинамическиеДанныеПоТипу(Форма, ИмяРеквизитаДД = "ДинамическиеДанные", ИмяДанных, ОписаниеТипов) Экспорт

//Сначала добавляем в поля

ТекПоляПостроителя = Форма[ИмяРеквизитаДД].ДоступныеПоля;

ТекПоле = ТекПоляПостроителя.Найти(ИмяДанных);

Если ТекПоле <> Неопределено Тогда

//Если поле есть, то его удаляем

ТекПоляПостроителя.Удалить(ТекПоле);

КонецЕсли;

ТекПоле = ТекПоляПостроителя.Добавить(ИмяДанных, ИмяДанных, ОписаниеТипов);

ТекПоле.Отбор = истина;

 

//Затем добавляем в отбор

ТекОтборПостроителя = Форма[ИмяРеквизитаДД].Отбор;

ТекОтбор = ТекОтборПостроителя.Найти(ИмяДанных);

Если ТекОтбор = Неопределено Тогда

ТекОтбор = ТекОтборПостроителя.Добавить(ИмяДанных);

КонецЕсли;

 

Возврат ТекОтбор;

КонецФункции

//fixin 20081124

//Функция позволяет удалить добавленные новые данные в форме

Функция УдалитьДинамическиеДанные(Форма, ИмяРеквизитаДД = "ДинамическиеДанные", ИмяДанных) Экспорт

//Сначала удаляем из построителя

ТекОтборПостроителя = Форма[ИмяРеквизитаДД].Отбор;

ТекОтбор = ТекОтборПостроителя.Найти(ИмяДанных);

Если ТекОтбор <> Неопределено Тогда

ТекОтборПостроителя.Удалить(ТекОтборПостроителя.Индекс(ТекОтбор));

КонецЕсли;

 

//Затем удаляем из доступных полей

ТекПоляПостроителя = Форма[ИмяРеквизитаДД].ДоступныеПоля;

ТекПоле = ТекПоляПостроителя.Найти(ИмяДанных);

Если ТекПоле <> Неопределено Тогда

ТекПоляПостроителя.Удалить(ТекПоле);

КонецЕсли;

КонецФункции

 

//fixin 20081124

//Функция позволяет получить путь к новым данным в форме

 

Функция ПолучитьПутьДинамическихДанных(ИмяРеквизитаДД = "ДинамическиеДанные", ИмяДанных) Экспорт

Возврат ИмяРеквизитаДД + ".Отбор." + ИмяДанных + ".Значение";

КонецФункции

Скачать