В 1с можно создавать новые элементы управления. Но нельзя создавать для них новые реквизиты формы. Поэтому удобство работы с новыми элементами управления существенно ниже. Однако существует хитрый метод добавления любого количества реквизитов в форму.
Для этого используется объект Построитель. В форму добавляется единственный реквизит
с типом построитель, назовем его, например, ДинамическиеДанные.
В поле ДинамическиеДанные.Отбор
можно добавлять любое число реквизитов, и использовать их в качестве данных для
новых элементов управления. Реквизиты могут быть произвольного типа, причем
содержать даже такие экзотические типы, как Форма
или ЭлементУправления.
В обработке содержится небольшая библиотека функций, которая
позволяет добавлять, удалять динамические реквизиты и использовать путь к ним.
В результате работы обработки в Поле2 проставляется путь к данным Данные1, ссылающимся на Поле1 через Форму,
а в Поле3 и в Поле4 устанавливается одинаковый путь к данным Данные2. Соответственно, в Поле1 и Поле2, в Поле3
и Поле4 выводятся одинаковые
данные.
Библиотека
выглядит так:
//fixin 20081124
//Функция позволяет добавить новые данные в форму
Функция
ДобавитьДинамическиеДанныеПоЗначению(Форма, ИмяРеквизитаДД =
"ДинамическиеДанные", ИмяДанных, Значение) Экспорт
//Определяем тип значения
Т = ТипЗнч(Значение);
МТ = Новый Массив();
МТ.Добавить(Т);
ОписаниеТипов = Новый ОписаниеТипов(МТ);
ТекОтбор = ДобавитьДинамическиеДанныеПоТипу(Форма,
ИмяРеквизитаДД, ИмяДанных, ОписаниеТипов);
ТекОтбор.Значение = Значение;
Возврат ТекОтбор;
КонецФункции
Функция ДобавитьДинамическиеДанныеПоТипу(Форма,
ИмяРеквизитаДД = "ДинамическиеДанные", ИмяДанных, ОписаниеТипов)
Экспорт
//Сначала добавляем в поля
ТекПоляПостроителя =
Форма[ИмяРеквизитаДД].ДоступныеПоля;
ТекПоле = ТекПоляПостроителя.Найти(ИмяДанных);
Если ТекПоле <> Неопределено Тогда
//Если поле есть, то его удаляем
ТекПоляПостроителя.Удалить(ТекПоле);
КонецЕсли;
ТекПоле = ТекПоляПостроителя.Добавить(ИмяДанных,
ИмяДанных, ОписаниеТипов);
ТекПоле.Отбор = истина;
//Затем добавляем в отбор
ТекОтборПостроителя = Форма[ИмяРеквизитаДД].Отбор;
ТекОтбор = ТекОтборПостроителя.Найти(ИмяДанных);
Если ТекОтбор = Неопределено Тогда
ТекОтбор =
ТекОтборПостроителя.Добавить(ИмяДанных);
КонецЕсли;
Возврат ТекОтбор;
КонецФункции
//fixin 20081124
//Функция позволяет удалить добавленные новые
данные в форме
Функция УдалитьДинамическиеДанные(Форма,
ИмяРеквизитаДД = "ДинамическиеДанные", ИмяДанных) Экспорт
//Сначала удаляем из построителя
ТекОтборПостроителя = Форма[ИмяРеквизитаДД].Отбор;
ТекОтбор = ТекОтборПостроителя.Найти(ИмяДанных);
Если ТекОтбор <> Неопределено Тогда
ТекОтборПостроителя.Удалить(ТекОтборПостроителя.Индекс(ТекОтбор));
КонецЕсли;
//Затем удаляем из доступных полей
ТекПоляПостроителя =
Форма[ИмяРеквизитаДД].ДоступныеПоля;
ТекПоле = ТекПоляПостроителя.Найти(ИмяДанных);
Если ТекПоле <> Неопределено Тогда
ТекПоляПостроителя.Удалить(ТекПоле);
КонецЕсли;
КонецФункции
//fixin 20081124
//Функция позволяет получить путь к новым данным в
форме
Функция
ПолучитьПутьДинамическихДанных(ИмяРеквизитаДД = "ДинамическиеДанные",
ИмяДанных) Экспорт
Возврат ИмяРеквизитаДД + ".Отбор." +
ИмяДанных + ".Значение";
КонецФункции