значение формы в объект
gvk2009 подробно и доходчиво описал разницу методов, за что ему огромное спасибо:
РеквизитФормыВЗначение()
Является методом управляемой формы, компилируется только &НаСервере, контекст формы является для него необходимым, поэтому компиляция &НаСервереБезКонтекста недоступна. На клиенте не работает, поскольку в результате получаем прикладной объект.
Где и когда его нужно использовать?
Метод РеквизитФормыВЗначение() необходим, если требуется из модуля формы вызвать стандартный метод объекта или метод (процедуру, функцию) из модуля объекта, из общего модуля.
Этот метод будет отрабатывать с данными, взятыми из формы, т.е. еще не записанными в базу.
Для того, чтобы измененные данные вернуть на форму, используется метод ЗначениеВРеквизитФормы().
Вторым параметром метода РеквизитФормыВЗначение является тип значения. Это необязательный параметр. Если обрабатываемый реквизит не является составным типом, то тип будет автоматически получен из реквизита формы. Иначе генерируется исключение времени выполнения.
ДанныеФормыВзначение()
В отличие от метода управляемой формы РеквизитФормыВЗначение(), процедура глобального контекста ДанныеФормыВЗначение() может работать без контекста формы, но именно поэтому, в частности, ей необходимо указывать тип конвертируемых данных.
Обратной процедурой является ЗначениеВДанныеФормы().
В этом примере на форме отображен набор записей регистра бухгалтерии. При отработке процедуры, активность набора меняется только на форме, в базе при этом ничего не происходит. Активность у набора записей регистра в базе поменяется только после выполнения операции Записать.
В этом примере на клиент возвращается ОснРеквизит, содержащий измененные данные. Но его еще нужно «запихать» в отображаемую форму. Для этого используем процедуру глобального контекста КопироватьДанныеФормы().
В качестве иллюстрации взаимозаменяемости Пример 2 еще в двух вариантах:
Передача значения из формы документа в модуль объекта
Хочу передать значение из формы документа в модуль объекта и сделать проверку при проведении.
В модуле формы в какой-либо процедуре:
———————
ЗначениеПеременной = Истина;
УстановитьГлобальноеЗначениеПеременнойВОбъекте(ЗначениеПеременной);
Перем мПеременная;
Функция УстановитьГлобальноеЗначениеПеременнойВОбъекте(Переменная) Экспорт
мПеременная = Переменная;
КонецФункции
Не работает, подскажите ошибку.
Зараннее спасибо.
лучше через доп. свойства объекта. при каждом обращении к объекту он занаво инициализируется..
вот пример аналогичного вопроса:
В модуле объекта справочника объявляю переменную:
Перем м_Перем Экспорт;
В этом же модуле инициализирую переменную значением:
м_Перем = «1»;
Далее, в обработчике ОбработкаЗаполнения() или ПриКопировании() этой переменной присваивается другое значение:
м_Перем = «2»;
Вопрос: почему в модуле формы в процедурах ПриСозданииНаСервере() или ПриЧтенииНаСервере() значение выражения РеквизитФормыВЗначение(«Объект»).м_Перем равно «1», а не «2»? Естественно, либо ОбработкаЗаполнения(), либо ПриКопировании() обрабатывается. Кто мне может объяснить это поведение? Как нужно менять значение экспортируемой переменной модуля объекта, чтобы её изменённое значение было доступно в форме?
почитайте про видимость экспортных переменных в 8.2
(5) может и так.. не пробовал из формы менять
Преобразование данных прикладных объектов в данные формы и обратно
Для конвертирования прикладных объектов в данные формы и обратно существует набор глобальных методов:
Методы, работающие с прикладными объектами, доступны только в серверных процедурах. Метод для копирования значений между данными формы доступен на сервере и на клиенте, так как не требует прикладных объектов в качестве параметров.
Во время конвертирования данных формы в прикладной объект нужно учитывать их совместимость.
При преобразовании данных формы в прикладные объекты и обратно используется кеширование объектов, но при этом выполняется проверка актуальности версии объекта в кеше.
ПРИМЕЧАНИЕ. При выполнении стандартных действий (открытие формы, выполнение стандартной команды Записать и т. д.) в форме с основным реквизитом преобразование выполняется автоматически.
Приведем пример, как использовать преобразование данных в собственных алгоритмах.
Также у объекта ФормаКлиентскогоПриложения существуют методы, доступные на сервере:
Также следует помнить, что при преобразовании в данные формы (как с помощью метода ЗначениеВДанныеФормы(), так и с помощью метода ЗначениеВРеквизитФормы()) объектов типа ТаблицаЗначений или ДеревоЗначений нужно учитывать следующую особенность: в преобразуемом объекте должны существовать все колонки, которые существуют в данных формы.
При переносе объекта в данные формы платформой, или при вызове методов ЗначениеВДанныеФормы(), ЗначениеВРеквизитФормы(), переносятся только данные объекта. Внутренние состояние объекта в данные формы не переносится. Например, значение ссылки нового, которая установлена в объект методом УстановитьСсылкуНового(), будет утеряна в процессе преобразования объекта в данные формы и обратно.
В качестве первого параметра методов РеквизитФормыВЗначение() и ДанныеФормыВЗначение() могут выступать только реквизиты формы следующих типов:
Приведем пример использования этих методов.
реквизит Объекта (тип ТаблицаЗначений) преобразовывает в тип ДанныеФормыКоллекция
(1) egorover, там на клиенте есть похожие методы.
Вам какого не хватило?
(2) ture, ооо приветствую Вас.
переделываю с 8.2 на 8.3, в модуле формы прописана расшифровка из таблицы, заполнение расшифровок этой таблицы в модуле объекта
РасшПериод = тт_пер.Скопировать(); //копирую ТаблицуЗначений тт_пер в РасшПериод
теперь в модуле формы хочу обратится к реквизиту объекта РасшПериод, но он уже ДанныеФормыКоллекция
и методы типа фф=РасшПериод.Найти(Отб.Период); уже не действуют
(13) Boneman,
ТекущаяТаблица = Новый ТаблицаЗначений;
ТекущаяТаблица = РеквизитФормыВЗначение(«Объект.Расш»);
так то же пустая ТекущаяТаблица
(3) Meteorage, да я уже с клиента обращаюсь к реквизиту РасшПериод, 1С уходит в исключение
&НаСервере
Функция тт_расшНайтиСтроки(Знач СтруктураНайти)
ТекущаяТаблица = РеквизитФормыВЗначение(«ОбъектРасш»);// т.е. «ОбъектРасш» реквизит формы, который Объект.Расш
по причине:
Недопустимое значение параметра (параметр номер ‘1’)
А вот, если будешь программно к объекту обращатся, то там уже будут только реквизиты объекта и все.
(26) Boneman, заполняю в модуле объекта с директивой
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
черт там же функция
(32) egorover, ты хоть вчитайся что тебе пишут, и как нужно применять методы.
Иван в (30) уже тебе кодом написал, как сделать мои 3 пункта.
Данные формы, в модуле объекта, ты не получишь никогда, потому-что формы там просто нет и не может быть.
Туда ты должен передавать готовые для переваривания объекты.
(25) egorover, если нет обратного преобразования, то надо использовать:
+ (28) точнее надо использовать название переменной объекта, с помощью которой вызывался метод модуля объекта: например,
Типы данных формы
Для представления в форме объектов конфигурации (справочники, документы и т.п.) существуют специальные типы данных:
Прикладной объект представлен либо одним, либо несколькими элементами данных формы. Например, документ, содержащий табличную часть, будет представлен объектом типа ДанныеФормыСтруктура (собственно документ), которому подчинен объект типа ДанныеФормыКоллекция (табличная часть документа).
Таким образом форма содержит некоторую «проекцию» данных объектов в виде своих собственных типов данных и автоматически выполняет преобразование между ними при необходимости. Однако, можно и самостоятельно преобразовать объект в данные формы и обратно с использованием глобальных методов:
Аналогичные методы, предназначенные для конвертирования значений реквизитов формы в прикладные объекты и обратно, существуют и у самой управляемой формы:
Методы, работающие с прикладными объектами, доступны только в серверных процедурах формы. При выполнении стандартных действий формы с основным реквизитом (открытие формы, выполнение стандартной команды Записать() и т. д.) преобразование выполняется автоматически.
Как уже упоминалось, у формы также есть методы, позволяющие преобразовать прикладные данные в реквизит формы и наоборот. Использование данных методов обычно удобнее, так как они имеют, например, информацию о типе реквизита формы. Кроме этого, метод РеквизитФормыВЗначение() выполняет установку соответствия данных формы и объекта, которая используется при формировании сообщений.