Скорая Компьютерная Помощь г. Калуга

Полный спектр компьютерных услуг!

Здравствуйте, гость ( Вход | Регистрация )

> Внимание!

  • Вся информация, расположенная в данном и других разделах форума получена из открытых источников (интернет-ресурсы, средства массовой информации, печатные издания и т.п.) и/или добавлена самими пользователями. Администрация форума предоставляет его участникам площадку для общения / размещения файлов / статей и т.п. и не несет ответственности за содержание сообщений, а также за возможное нарушение авторских, смежных и каких-либо иных прав, которое может повлечь за собой информация, содержащаяся в сообщениях.
Ремонт компьютеров в калуге Рекламное место сдается
 
Ответить в эту темуОткрыть новую тему
> 1С 7.7, "скрытые" возможности функции Шаблон., Получение и установка реквизита формы по его имени.
Decker
сообщение 4.7.2011, 0:11
Сообщение #1


Администратор
*****

Группа: Главные администраторы
Сообщений: 14349
Регистрация: 12.10.2007
Из: Twilight Zone
Пользователь №: 1



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

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

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

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

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

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

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


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


--------------------

Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
Decker
сообщение 4.7.2011, 0:15
Сообщение #2


Администратор
*****

Группа: Главные администраторы
Сообщений: 14349
Регистрация: 12.10.2007
Из: Twilight Zone
Пользователь №: 1



Ну и вот интересная тема Обращение к метаданным во внешних обработках, собственно две последние функции в предыдущем посте взять из поста WaRDeR'а.


--------------------

Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
Decker
сообщение 9.7.2011, 20:18
Сообщение #3


Администратор
*****

Группа: Главные администраторы
Сообщений: 14349
Регистрация: 12.10.2007
Из: Twilight Zone
Пользователь №: 1



Ну и собственно с использованием той же функции. Ответим на вопрос, как получить значение перечисления по его идентификатору?

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

//*******************************************
Процедура Сформировать()
ОчиститьОкноСообщений();
Для
Номер = 1 По Метаданные.Перечисление("СтавкиНДС").Значение() Цикл
Значение = ""; ПолучитьАтрибут("Перечисление.СтавкиНДС."+Метаданные.Перечисление("СтавкиНДС").Значение(Номер).Идентификатор,Значение);
Сообщить(
""+Значение+" ("+ТипЗначенияСтр(Значение)+")");
КонецЦикла;
КонецПроцедуры


Соответственно получаем результат:

Код
Без НДС (Перечисление)
10% (Перечисление)
20% (Перечисление)
9.09% (Перечисление)
16.67% (Перечисление)
20% / 120% (Перечисление)
10% / 110% (Перечисление)
18% (Перечисление)
18% / 118% (Перечисление)
15.25% (Перечисление)


Стандартными методами то же самое можно получить следующим образом:

Код
Для Номер=1 По Перечисление.СтавкиНДС.КоличествоЗначений() Цикл
        Значение = Перечисление.СтавкиНДС.ЗначениеПоНомеру(Номер);  
        Сообщить(""+Значение+" ("+ТипЗначенияСтр(Значение)+")");    
    КонецЦикла;


--------------------

Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения

Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

Рекламное место сдается Рекламное место сдается
Текстовая версия Сейчас: 26.4.2024, 21:58
Рейтинг@Mail.ru
Яндекс.Метрика Яндекс цитирования