понедельник, 14 октября 2019 г.

1С 7.7, "скрытые" возможности функции Шаблон., Получение и установка реквизита формы по его имени.

Отсюда: http://dml.compkaluga.ru/forum/index.php?showtopic=35958

На днях решал тут одну задачу, пришлось столкнуться вот с чем. Допустим на форме у нас есть несколько десятков реквизитов, типа Строка, с именами, к примеру Строка1, Строка2, Строка3 и т.п. Хотелось бы получить доступ к значениям этих реквизитов по имени. Эксперименты с Форма.ПолучитьАтрибут("Строка1") собственно ничего не дали. Полез копаться дальше и накопал вот что. Оказывается в 1С есть крайне полезная функция Шаблон, которая возвращает строку, полученную по шаблону заменой встроенных выражений на значения и форматированием. Так вот, получить значение реквизита формы по его имени можно следующим образом:

Значение = Шаблон("["+ИмяРеквизитаФормы+"]");

Однако в этом случае возвращаемое значение всегда является строкой, т.е. если реквизит формы имеет тип справочника или любой другой агрегатный тип, то мы получим лишь его строковое представление. Для того чтобы обойти это ограничение, применим следующую конструкцию:

Значение=ЗначениеИзСтрокиВнутр(Шаблон("[ЗначениеВСтрокуВнутр("+ИмяРеквизитаФормы+")]")); // - это чтение реквизита формы через шаблон

Ну и напоследок самое вкусное. Две функции, которые можно прописать и в глобальном модуле, которые позволяют читать и записывать реквизит формы по его имени:

//_______________________________________________________Функция УстАтрибут(Атр,Зн)
    
Атр = Зн;
     Возврат
"";
КонецФункции
// УстАтрибут(Атр,Зн) 

Процедура УстановитьАтрибут(Атр,Зн);
     Шаблон(
"[УстАтрибут("+ Атр + ",Зн)]");
КонецПроцедуры
// УстановитьАтрибут(Атр,Зн);

//_________________________________________________________
Функция ПолАтрибут(Атр,Зн)
    
Зн = Атр;
    Возврат
"";
КонецФункции
// УстАтрибут(Атр,Зн)


Процедура ПолучитьАтрибут(Атр,Зн);
     Шаблон(
"[ПолАтрибут("+ Атр + ",Зн)]");
КонецПроцедуры
// УстановитьАтрибут(Атр,Зн);


Использовать, естественно, через ПолучитьАтрибут(...) и УстановитьАтрибут(...) ... вот такой вот нестандартный подход.