РеквизитФормыВЗначение / ЗначениеВРеквизитФормы
Всем привет! В период майских праздников решил выделить немного времени на новую заметку и сегодня мы разберем 2 часто используемых метода формы клиентского приложения ‘РеквизитФормыВЗначение’ и ‘ЗначениеВРеквизитФормы’.
Два данных метода доступны только на сервере с контекстом формы – следовательно исполняются только под директивой ‘&НаСервере’ :
- РеквизитФормыВЗначение – преобразовывает реквизит формы (УФ) в объект прикладного типа.
- ЗначениеВРеквизитФормы – наоборот, преобразовывает объект прикладного типа в реквизит формы (УФ).
Если прочитать определения этих методов, то все равно не понятно, а как и для чего их использовать на практике. Но сейчас мы с этим разберемся на примерах.
Итак, один из самых частых примеров использования метода ‘РеквизитФормыВЗначение’ это когда нам из формы объекта (к примеру документа) необходимо произвести заполнение данных объекта (к примеру табличной части) с помощью процедуры, которая находится в модуле нашего объекта:
1 2 3 4 5 6 7 8 9 |
&НаСервере Процедура ПартнерПриИзмененииСервер() ДокументЗакупки = РеквизитФормыВЗначение("Объект"); ДокументЗакупки.ЗаполнитьУсловияЗакупокПоУмолчанию(Ложь); ЗначениеВРеквизитФормы(ДокументЗакупки, "Объект"); ///.... КонецПроцедуры |
В самой процедуре ‘ЗаполнитьУсловияЗакупокПоУмолчанию’ (в модуле объекта) произойдет заполнение нашего объекта, а затем мы уже отображаем их на форме с помощью метода ‘ЗначениеВРеквизитФормы(ДокументЗакупки, “Объект”)’:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Процедура ЗаполнитьУсловияЗакупокПоУмолчанию(ПересчитатьЦены = Истина) Экспорт Если ЗначениеЗаполнено(Партнер) Тогда Комментарий = "Тест Тест +++craft1c"; //craft1c УсловияЗакупокПоУмолчанию = ЗакупкиСервер.ПолучитьУсловияЗакупокПоУмолчанию(Партнер, Новый Структура("УчитыватьГруппыСкладов, ВыбранноеСоглашение", Истина, Соглашение)); ЦеныЗаполнены = Ложь; Если УсловияЗакупокПоУмолчанию <> Неопределено Тогда ///.... КонецПроцедуры |
Если мы на форме изменили значения реквизитов, а затем преобразовали реквизит формы ‘Объект’ в значение, то он будет содержать уже новые значения, которые мы изменили на форме (при этом объект базы данных (наш документ) – будет содержать еще старые значения):
- ЗначениеВРеквизитФормы – получает объект, значения которого по сути взяты с формы (заполнены данными формы);
- ПолучитьОбъект() – получает объект из базы данных.
Допустим мы можем сам программно вызвать проверку заполнения объекта (с данными формы):
1 2 3 4 5 6 7 |
&НаСервере Процедура ПартнерПриИзмененииСервер() //... ДокументЗакупки = РеквизитФормыВЗначение("Объект"); ДокументЗакупки.ПроверитьЗаполнение(); КонецПроцедуры |
В результате чего для нашего объекта будет вызвана процедура из модуля объекта ‘ОбработкаПроверкиЗаполнения‘:
Допустим у нас есть реквизит формы ‘ТаблицаЗначенийПроекты’, которая отображается на форме. Мы можем на сервере получить таблицу с такими же колонками и заполнить её данными, а затем преобразовать её в этот реквизит:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Запрос = Новый Запрос( "ВЫБРАТЬ | Проекты.Ссылка КАК Проект |ИЗ | Справочник.Проекты КАК Проекты"); ТЗИзКода = Запрос.Выполнить().Выгрузить(); ЗначениеВРеквизитФормы(ТЗИзКода, "ТаблицаЗначенийПроекты"); КонецПроцедуры |
Важный нюанс: К примеру реквизиты с типом ‘Строка’/’Число’/’Булево’ и т.д. не удастся преобразовать в прикладной объект:
Если вы все же попробуете это сделать, то получите ошибку ‘Недопустимое значение параметра (параметр номер ‘1’).’:
В общем что бы разобраться полностью с этим вопросом, можете поискать в своей конфигурации все места, где используются данные методы. И вы увидите как разработчики типовых конфигураций их применяют в своих решениях.
Так стоит обратить и еще на один важный момент:
Так же данный метод ‘РеквизитФормыВЗначение’ часто используют что бы получить макет внешней обработки:
1 2 3 4 5 6 7 |
&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) ОбъектОбработка = РеквизитФормыВЗначение("Объект"); ОбъектОбработка.ПолучитьМакет("НашКрутойМакет"); КонецПроцедуры |
Многие также могут столкнуться с двумя похожими методами: ‘ДанныеФормыВЗначение’ и ‘ЗначениеВДанныеФормы’. Это в принципе аналогичные методы (как говорит нам 1с эти методы взаимозаменяемы) – вот что по этому поводу говорит 1с (статья на сайте 1с):
Единственно существенно отличие ‘ДанныеФормыВЗначение‘ от ‘РеквизитФормыВЗначение‘ ‘это то, что первый метод может использоваться на сервере без контекста формы, именно поэтому важно указывать тип данных. Очень часто этот метод используют в общих модулях:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
Функция ДанныеРезультатовПроверки(Форма) Экспорт ДанныеРезультатовСканированияАлкогольнойПродукции = Новый Структура; ДанныеРезультатовСканированияАлкогольнойПродукции.Вставить("ДеревоМаркированнойПродукции", ДанныеФормыВЗначение(Форма.ДеревоМаркированнойПродукции, Тип("ДеревоЗначений"))); ДанныеРезультатовСканированияАлкогольнойПродукции.Вставить("ТаблицаНеМаркируемойПродукции", ДанныеФормыВЗначение(Форма.ТаблицаНеМаркируемойПродукции, Тип("ТаблицаЗначений"))); ДанныеРезультатовСканированияАлкогольнойПродукции.Вставить("ПулНеизвестныхАкцизныхМарок", ДанныеФормыВЗначение(Форма.ПулНеизвестныхАкцизныхМарок, Тип("ТаблицаЗначений"))); ДанныеРезультатовСканированияАлкогольнойПродукции.Вставить("АлкогольнаяПродукцияКОпределениюСправок2", ДанныеФормыВЗначение(Форма.АлкогольнаяПродукцияКОпределениюСправок2, Тип("ДеревоЗначений"))); ДанныеРезультатовСканированияАлкогольнойПродукции.Вставить("УпаковкиДокумента", Форма.УпаковкиДокумента); ДанныеРезультатовСканированияАлкогольнойПродукции.Вставить("ДетализацияСтруктурыХранения", Форма.ДетализацияСтруктурыХранения); ДанныеРезультатовСканированияАлкогольнойПродукции.Вставить("РежимПроверки", Форма.РежимПроверки); ДанныеРезультатовСканированияАлкогольнойПродукции.Вставить("ДобавленныеУпаковки", Форма.ДобавленныеУпаковки); ДанныеРезультатовСканированияАлкогольнойПродукции.Вставить("ДоступныеДляПроверкиУпаковки", Форма.ДоступныеДляПроверкиУпаковки); ДанныеРезультатовСканированияАлкогольнойПродукции.Вставить("СледующийСтикерОтложено", Форма.СледующийСтикерОтложено); ДанныеРезультатовСканированияАлкогольнойПродукции.Вставить("СохраненВыборПоМаркируемойПродукции", Форма.СохраненВыборПоМаркируемойПродукции); ДанныеРезультатовСканированияАлкогольнойПродукции.Вставить("ДанныеВыбораПоМаркируемойПродукции", Форма.ДанныеВыбораПоМаркируемойПродукции); ДанныеРезультатовСканированияАлкогольнойПродукции.Вставить("ШтрихкодТекущейПроверяемойУпаковки", ШтрихкодТекущейПроверяемойУпаковки(Форма)); ДанныеРезультатовСканированияАлкогольнойПродукции.Вставить("ДанныеРанееСгенерированныхШтрихкодов", ?(ЭтоАдресВременногоХранилища(Форма.АдресПредыдущихШтрихкодов), ПолучитьИзВременногоХранилища(Форма.АдресПредыдущихШтрихкодов), Неопределено) ); Возврат ДанныеРезультатовСканированияАлкогольнойПродукции; КонецФункции |
В принципе все не так уж и сложно. Особенно если пару раз использовать эти методы в своих решения. Практикуйтесь и вы все поймете!