Значение реквизитов объекта в реквизиты формы

Преобразование данных прикладных объектов в данные формы и обратно

Для конвертирования прикладных объектов в данные формы и обратно существует набор глобальных методов:

  • ЗначениеВДанныеФормы(),
  • ДанныеФормыВЗначение(),
  • КопироватьДанныеФормы().

Методы, работающие с прикладными объектами, доступны только в серверных процедурах. Метод для копирования значений между данными формы доступен на сервере и на клиенте, так как не требует прикладных объектов в качестве параметров.

Во время конвертирования данных формы в прикладной объект нужно учитывать их совместимость.

  • ЗначениеВДанныеФормы() ‑ преобразует объект прикладного типа в данные формы.
  • ДанныеФормыВЗначение() ‑ преобразует данные формы в объект прикладного типа.
  • КопироватьДанныеФормы() ‑ производит копирование данных формы, обладающих совместимой структурой. Возвращает значение Истина, если копирование произведено, или Ложь, если структура объектов несовместима.

При преобразовании данных формы в прикладные объекты и обратно используется кеширование объектов, но при этом выполняется проверка актуальности версии объекта в кеше.

ПРИМЕЧАНИЕ. При выполнении стандартных действий (открытие формы, выполнение стандартной команды Записать и т. д.) в форме с основным реквизитом преобразование выполняется автоматически.

Приведем пример, как использовать преобразование данных в собственных алгоритмах.

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ОбъектТовар = Товары.НайтиПоНаименованию("Кофейник").ПолучитьОбъект(); ЗначениеВДанныеФормы(ОбъектТовар, Объект);
КонецПроцедуры
&НаКлиенте
Процедура Записать()
ЗаписатьНаСервере();
КонецПроцедуры
&НаСервере
Процедура ЗаписатьНаСервере()
ОбъектТовар = ДанныеФормыВЗначение(Объект,Тип("СправочникОбъект.Товары"));
ОбъектТовар.Записать();
КонецПроцедуры

Также у объекта ФормаКлиентскогоПриложения существуют методы, доступные на сервере:

  • ЗначениеВРеквизитФормы() ‑ выполняет преобразование объекта прикладного типа в заданный реквизит формы.
  • РеквизитФормыВЗначение() ‑ преобразует реквизит данных формы в объект прикладного типа.

Использование данных методов обычно удобнее, так как они имеют, например, информацию о типе реквизита формы. Кроме того, метод РеквизитФормыВЗначение() выполняет установку соответствия данных формы и объекта, которая используется при формировании сообщений .

Также следует помнить, что при преобразовании в данные формы (как с помощью метода ЗначениеВДанныеФормы(), так и с помощью метода ЗначениеВРеквизитФормы()) объектов типа ТаблицаЗначений или ДеревоЗначений нужно учитывать следующую особенность: в преобразуемом объекте должны существовать все колонки, которые существуют в данных формы.

ВНИМАНИЕ! Колонки реквизитов, не связанные с данными , не участвуют в преобразовании значений между данными формы и объектами информационной базы и обратно. Колонки, отсутствующие в данных объекта, очищаются при преобразовании в данные формы.

При переносе объекта в данные формы платформой, или при вызове методов ЗначениеВДанныеФормы(), ЗначениеВРеквизитФормы(), переносятся только данные объекта. Внутренние состояние объекта в данные формы не переносится. Например, значение ссылки нового, которая установлена в объект методом УстановитьСсылкуНового(), будет утеряна в процессе преобразования объекта в данные формы и обратно.

В качестве первого параметра методов РеквизитФормыВЗначение() и ДанныеФормыВЗначение() могут выступать только реквизиты формы следующих типов:

  •  ДанныеФормыСтруктура, 
  • ДанныеФормыКоллекция,
  •  ДанныеФормыСтруктураСКоллекцией, 
  • ДанныеФормыДерево.

Приведем пример использования этих методов.

&НаСервере
Процедура ПересчитатьНаСервере()
// Преобразует реквизит Объект в прикладной объект. Документ = РеквизитФормыВЗначение("Объект");
// Выполняет пересчет методом, определенным в модуле документа. Документ.Пересчитать();
// Преобразует прикладной объект обратно в реквизит. ЗначениеВРеквизитФормы(Документ, "Объект");
КонецПроцедуры

gvk2009 подробно и доходчиво описал разницу методов, за что ему огромное спасибо:

В Синтаксис-Помощнике очень скупо написано о процедуре ДанныеФормыВЗначение(), чуть побольше — о РеквизитФормыВЗначение(). И совсем нет примеров использования. Попробуем с этим разобраться.

РеквизитФормыВЗначение() 

Является методом управляемой формы, компилируется только &НаСервере, контекст формы является для него необходимым, поэтому компиляция &НаСервереБезКонтекста недоступна. На клиенте не работает, поскольку в результате получаем прикладной объект.

Где и когда его нужно использовать?

Метод РеквизитФормыВЗначение() необходим, если требуется из модуля формы вызвать стандартный метод объекта или метод (процедуру, функцию) из модуля объекта, из общего модуля.

Этот метод будет отрабатывать с данными, взятыми из формы, т.е. еще не записанными в базу.

Для того, чтобы измененные данные вернуть на форму, используется метод ЗначениеВРеквизитФормы().

Вторым параметром метода РеквизитФормыВЗначение является тип значения. Это необязательный параметр. Если обрабатываемый реквизит не является составным типом, то тип будет автоматически получен из реквизита формы. Иначе генерируется исключение времени выполнения.

Примеры:

Код 1C v 8.2 УП

 // 1)
&НаСервере
Процедура ЗаполнитьТЧПоДаннымПоследнегоДокумента(Контрагент)
            ДокОбъект = РеквизитФормыВЗначение("Объект");
            ДокОбъект.ЗаполнитьТЧПоДаннымПоследнегоДокумента(Контрагент);
            ЗначениеВРеквизитФормы(ДокОбъект, "Объект");
КонецПроцедуры

// 2)
&НаСервере
Процедура ОчиститьСтрокиСПустойЦенойНаСервере()
ДокОбъект = РеквизитФормыВЗначение("Объект");
ДокОбъект.ОчиститьСтрокиСПустойЦеной();
ЗначениеВРеквизитФормы(ДокОбъект, "Объект");
КонецПроцедуры

//3)
&НаСервере
Функция ОбъектЗаполнен()
Возврат РеквизитФормыВЗначение("Объект").ПроверитьЗаполнение();
КонецФункции

В указанных выше случаях метод РеквизитФормыВЗначение() похож на метод ПолучитьОбъект(). Разница в том, что первый получает объект, заполненный данными формы, а второй — объект с данными из базы.

ДанныеФормыВзначение()

В отличие от метода управляемой формы РеквизитФормыВЗначение(), процедура глобального контекста ДанныеФормыВЗначение() может работать без контекста формы, но именно поэтому, в частности, ей необходимо указывать тип конвертируемых данных.

Обратной процедурой является ЗначениеВДанныеФормы().

Примеры:

Код 1C v 8.2 УП

 // 1)
   &НаСервере
       // Инициализация набора констант
       НаборКонстантОбъект = ДанныеФормыВЗначение(НаборКонстант, Тип("КонстантыНабор"));
       НаборКонстантОбъект.Прочитать();
       ЗначениеВДанныеФормы(НаборКонстантОбъект, НаборКонстант);

// 2)
  &НаСервере  
       НаборФорма = Объект.Движения.РегистрУправленческий;
       Набор = ДанныеФормыВЗначение(НаборФорма, Тип("РегистрБухгалтерииНаборЗаписей.РегистрУправленческий"));
       Если Набор.Количество()=0 Тогда
              Возврат;
       КонецЕсли; 
       Набор.УстановитьАктивность(НЕ Набор[0].Активность);
       ЗначениеВДанныеФормы(Набор, НаборФорма);

В этом примере на форме отображен набор записей регистра бухгалтерии. При отработке процедуры, активность набора меняется только на форме, в базе при этом ничего не происходит. Активность у набора записей регистра в базе поменяется только после выполнения операции Записать.

Код 1C v 8.2 УП

 // 3)
&НаКлиенте
Процедура Заполнить(Команда)
       ОснРеквизит = Объект;
       ВыполнитьНаСервереБезКонтекста(ОснРеквизит);
       КопироватьДанныеФормы(ОснРеквизит,Объект)
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ВыполнитьНаСервереБезКонтекста(ОснРеквизит)
       ОбъектЗначение = ДанныеФормыВЗначение(ОснРеквизит, Тип("ДокументОбъект.АктСверкиВзаиморасчетов"));
       //...Выполнение операций с Объектом "ОбъектЗначение"
       ЗначениеВДанныеФормы(ОбъектЗначение, ОснРеквизит);
КонецПроцедуры

В этом примере на клиент возвращается ОснРеквизит, содержащий измененные данные. Но его еще нужно «запихать» в отображаемую форму. Для этого используем процедуру глобального контекста КопироватьДанныеФормы().

В большинстве случаев процедуры ДанныеФормыВзначение() и РеквизитФормыВЗначение() взаимозаменяемы. При этом РеквизитФормыВЗначение проще в использовании. Но если требуется использование &НаСервереБезКонтекста — тогда только ДанныеФормыВЗначение.

В качестве иллюстрации взаимозаменяемости Пример 2 еще в двух вариантах:

Код 1C v 8.2 УП

 // ВАРИАНТ 1
&НаКлиенте
Процедура Активность(Команда)

       ОснРеквизитДвижения = Объект.Движения.РегистрУправленческий;
       АктивностьНаСервереБезКонтекста(ОснРеквизитДвижения);
       КопироватьДанныеФормы(ОснРеквизитДвижения,Объект.Движения.РегистрУправленческий);

КонецПроцедуры // Активность()

&НаСервереБезКонтекста
Процедура АктивностьНаСервереБезКонтекста(ОснРеквизитДвижения)

       Набор = ДанныеФормыВЗначение(ОснРеквизитДвижения, Тип("РегистрБухгалтерииНаборЗаписей.РегистрУправленческий"));
       Если Набор.Количество()=0 Тогда
              Возврат;
       КонецЕсли; 
       Набор.УстановитьАктивность(НЕ Набор[0].Активность);
       ЗначениеВДанныеФормы(Набор, ОснРеквизитДвижения);

КонецПроцедуры // АктивностьНаСервереБезКонтекста()

// ВАРИАНТ 2
&НаСервере
Процедура АктивностьНаСервере()

       НаборФорма = РеквизитФормыВЗначение("Объект");
       Набор = НаборФорма.Движения.РегистрУправленческий;

       Если Набор.Количество()=0 Тогда
              Возврат;
       КонецЕсли; 

       Набор.УстановитьАктивность(НЕ Набор[0].Активность);
       ЗначениеВРеквизитФормы(НаборФорма, "Объект");

КонецПроцедуры // АктивностьНаСервере()

Содержание

  • 1 Реквизиты формы
    • 1.1 Типы данных, доступные в управляемой форме
    • 1.2 Преобразование прикладных объектов в данные формы
    • 1.3 Передача данных между клиентской и серверной частями управляемой формы
    • 1.4 Методы для преобразования данных прикладных объектов в данные формы
  • 2 Программный интерфейс
    • 2.1 ДанныеФормыДерево (FormDataTree)
      • 2.1.1 ПолучитьЭлементы (GetItems)
      • 2.1.2 НайтиПоИдентификатору (FindById)
    • 2.2 ДанныеФормыЭлементДерева (FormDataTreeItem)
    • 2.3 ДанныеФормыКоллекцияЭлементовДерева (FormDataTreeItemCollection)
  • 3 Особенности работы с деревом значений
    • 3.1 Обновление дерева

Реквизиты формы

Набор реквизитов формы описывает состав данных, которые отображаются, редактируются или хранятся в форме. При этом реквизиты формы сами по себе не обеспечивают возможности отображения и редактирования данных. Для отображения и редактирования служат элементы формы (смотрите раздел «Элементы формы» данной главы), связанные с реквизитами формы. Совокупность всех реквизитов формы будем называть данными формы.

Важно! Необходимо помнить, что, в отличие от обычных форм, все данные управляемой формы должны быть описаны в виде реквизитов. Не допускается использование переменных модуля формы в качестве источников данных для элементов формы.

Имеется возможность назначить Основной реквизит формы, т. е. реквизит, который будет определять стандартную функциональность формы (расширение формы). Следует помнить, что основной реквизит у формы может быть только один.

Расширение формы – это дополнительные свойства, методы и параметры формы объекта УправляемаяФорма, характерные для объекта, являющегося основным элементом формы.

В процессе разработки формы можно явно задать возможность просмотра и редактирования конкретных реквизитов формы, в разрезе ролей, с помощью свойств Просмотр и Редактирование (подробнее смотрите раздел «Ролевая настройка формы» главы «Редакторы»). Кроме того, доступность того или иного реквизита в самой форме можно настраивать с помощью функциональных опций (подробнее о функциональных опциях можно посмотреть в главе «Управление интерфейсом конфигурации»).

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

Типы данных, доступные в управляемой форме

Управляемая форма отличается от обычной формы также и типами данных, с которыми она работает. Если обычная форма работает с большинством типов, которые предоставляет 1С:Предприятие (в том числе и вида СправочникОбъект, ДокументОбъект и т. д.), то в управляемой форме можно выделить следующие категории типов:

  • типы, которые непосредственно используются в форме – это те типы, которые существуют на стороне тонкого и Веб-клиента (например, Число, СправочникСсылка.Товары, ГрафическаяСхема, ТабличныйДокумент);
  • типы, которые будут преобразованы в специальные типы данных – типы данных управляемой формы. Такие типы отображаются в списке реквизитов формы в круглых скобках, например (СправочникОбъект.Товары);
  • динамический список (подробнее см. раздел «Динамический список» данной главы).

Преобразование прикладных объектов в данные формы

Некоторые прикладные типы (такие как СправочникОбъект и т. д.) не существуют на стороне тонкого и Веб-клиентов (подробнее см. главу «Концепция управляемого приложения»). Поэтому для представления в форме таких прикладных типов в платформе введены специальные типы данных, предназначенные для работы в управляемых формах. Эта особенность управляемого приложения обуславливает необходимость выполнять преобразование прикладных объектов в данные формы (и обратно).

Используются следующие типы данных:

  • ДанныеФормыСтруктура – содержит набор свойств произвольного типа. Свойствами могут быть другие структуры, коллекции или структуры с коллекциями. Таким типом представляется, например, в форме СправочникОбъект.
  • ДанныеФормыКоллекция – это список типизированных значений, похожий на массив. Доступ к элементу коллекции осуществляется по индексу или по идентификатору. Доступ по идентификатору может отсутствовать в некоторых случаях. Это обусловлено типом прикладного объекта, который представлен этой коллекцией. Идентификатором может быть любое целое число. Таким типом представляется, например, в форме табличная часть.
  • ДанныеФормыСтруктураСКоллекцией – это объект, который представлен в виде структуры и коллекции одновременно. С ним можно обращаться как с любой из этих сущностей. Таким типом представляется, например, в форме набор записей.
  • ДанныеФормыДерево – объект предназначен для хранения иерархических данных.

Прикладной объект представлен либо одним, либо несколькими элементами данных формы. В общем виде иерархия и состав данных формы зависят от сложности и взаимосвязи прикладных объектов управляемой формы.

Например, документ, содержащий табличную часть, будет представлен объектом типа ДанныеФормыСтруктура (собственно документ), которому подчинен объект типа ДанныеФормыКоллекция (табличная часть документа).

Важно! Во время разработки конфигурации важно помнить, что прикладные объекты доступны только на сервере, в то время как объектами данных форм можно пользоваться и на сервере, и на клиенте.

Передача данных между клиентской и серверной частями управляемой формы

Фактически можно сказать, что данные формы – это унифицированное представление данных различных прикладных объектов, с которыми форма работает единообразно и которые присутствуют и на сервере, и на клиенте. То есть форма содержит некоторую «проекцию» данных прикладных объектов в виде своих собственных типов данных и выполняет преобразование между ними при необходимости. Однако в случае если разработчик конфигурации реализует свой алгоритм обработки данных, то преобразование данных (из специализированных типов в прикладные и обратно) он должен выполнять самостоятельно.

При редактировании реквизитов формы в специализированном редакторе (подробнее см. раздел «Реквизиты формы» главы «Редакторы») имеется возможность влиять на передачу данных между клиентом и сервером во время работы формы. Для этого служит колонка редактора реквизитов Использовать всегда. Действие этого свойства различается для трех типов реквизитов:

  • Для реквизита, подчиненного динамическому списку (колонке динамического списка):
    • свойство включено – реквизит всегда считывается из базы данных и включается в данные формы;
    • свойство выключено – реквизит считывается из базы данных и включается в данные формы только тогда, когда есть видимый в данный момент элемент формы, связанный с реквизитом или его подчиненным реквизитом.
  • Для реквизита, подчиненного коллекции движений:
    • свойство включено – движения документа считываются из базы данных и будут присутствовать в данных формы;
    • свойство выключено – движения документа не будут считываться из базы данных и не попадут в данные формы (если нет элемента формы, ссылающегося на движения документа).
  • Остальные реквизиты формы:
    • свойство включено – реквизит будет присутствовать в данных формы вне зависимости от того, есть или нет хоть один элемент формы, который связан с реквизитом или его подчиненным реквизитом;
    • свойство выключено – реквизит будет присутствовать в данных формы только в том случае, если есть элемент формы, связанный с реквизитом или его подчиненным реквизитом. В отличие от реквизитов динамического списка, здесь не играет роли видимость элемента, связанного с реквизитом.

Примечание. Следует помнить, что свойство, установленное у родительского реквизита, действует на все подчиненные реквизиты. Например, если свойство Использовать всегда снято у табличной части документа, то система считает, что это свойство снято и у всех подчиненных реквизитов (несмотря на фактическое состояние свойства).

Методы для преобразования данных прикладных объектов в данные формы

Для конвертирования прикладных объектов в данные формы и обратно существует набор глобальных методов:

  • ЗначениеВДанныеФормы(),
  • ДанныеФормыВЗначение(),
  • КопироватьДанныеФормы().

Важно! Методы, работающие с прикладными объектами, доступны только в серверных процедурах. Метод для копирования значений между данными формы доступен на сервере и на клиенте, так как не требует прикладных объектов в качестве параметров.

Во время конвертирования данных формы в прикладной объект нужно учитывать их совместимость.

  • ЗначениеВДанныеФормы() – преобразует объект прикладного типа в данные формы;
  • ДанныеФормыВЗначение() – преобразует данные формы в объект прикладного типа;
  • КопироватьДанныеФормы() – производит копирование данных формы, обладающих совместимой структурой. Возвращает значение Истина, если копирование произведено, или Ложь, если структура объектов несовместима.

Примечание. При выполнении стандартных действий (открытие формы, выполнение стандартной команды Записать и т. д.) формы с основным реквизитом, преобразование выполняется автоматически.

Приведем пример, как использовать преобразование данных в собственных алгоритмах.

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
  ОбъектТовар = Справочники.Товары.НайтиПоНаименованию(«Кофейник»).ПолучитьОбъект();
  ЗначениеВДанныеФормы(ОбъектТовар, Объект);
КонецПроцедуры
 
&НаКлиенте
Процедура Записать()
  ЗаписатьНаСервере();
КонецПроцедуры
 
&НаСервере
Процедура ЗаписатьНаСервере()
  ОбъектТовар = ДанныеФормыВЗначение(Объект, Тип(«СправочникОбъект.Товары»));
  ОбъектТовар.Записать();
КонецПроцедуры

Также у объекта УправляемаяФорма существуют методы, доступные на сервере:

  • ЗначениеВРеквизитФормы() – выполняет преобразование объекта прикладного типа в заданный реквизит формы.
  • РеквизитФормыВЗначение() – преобразует реквизит данных формы в объект прикладного типа.

Использование данных методов обычно удобнее, так как они, имеют, например, информацию о типе реквизита формы. Кроме того, метод РеквизитФормыВЗначение() выполняет установку соответствия данных формы и объекта, которая используется при формировании сообщений. Подробнее об этом можно прочитать в главе «Сервисные возможности навигации».

Приведем пример использования этих методов.

&НаСервере
Процедура ПересчитатьНаСервере()
 
  // Преобразует реквизит Объект в прикладной объект.
  Документ = РеквизитФормыВЗначение(«Объект»);
 
  // Выполняет пересчет методом, определенным в модуле документа.
  Документ.Пересчитать();
 
  // Преобразует прикладной объект обратно в реквизит.
  ЗначениеВРеквизитФормы(Документ, «Объект»);
КонецПроцедуры

Программный интерфейс

ДанныеФормыДерево (FormDataTree)

Методы:

  • НайтиПоИдентификатору (FindById)
  • ПолучитьЭлементы (GetItems)

Описание:

Предназначен для моделирования дерева в данных управляемой формы.

Доступность: клиент, сервер, тонкий клиент, веб-клиент. Данный объект может быть сериализован в/из XDTO. Тип XDTO, соответствующий данному объекту определяется в пространстве имен . Имя типа XDTO:

ПолучитьЭлементы (GetItems)

Синтаксис:

ПолучитьЭлементы()

Возвращаемое значение:

Тип: ДанныеФормыКоллекцияЭлементовДерева.

Описание:

Получает коллекцию элементов дерева верхнего уровня.

Доступность: клиент, сервер, тонкий клиент, веб-клиент.

НайтиПоИдентификатору (FindById)

Синтаксис:

НайтиПоИдентификатору(<Идентификатор>)

Параметры:

<Идентификатор> (обязательный)

Тип: Число. Идентификатор элемента дерева.

Возвращаемое значение:

Тип: ДанныеФормыЭлементДерева.

Описание:

Получает элемент коллекции по идентификатору.

Доступность: клиент, сервер, тонкий клиент, веб-клиент.

ДанныеФормыЭлементДерева (FormDataTreeItem)

Свойства:

<Имя свойства> (<Имя свойства>)

Методы:

  • ПолучитьИдентификатор (GetId)
  • ПолучитьРодителя (GetParent)
  • ПолучитьЭлементы (GetItems)
  • Свойство (Property)

Описание:

Элемент дерева данных формы.

Доступность: клиент, сервер, тонкий клиент, веб-клиент. Данный объект может быть сериализован в/из XDTO. Тип XDTO, соответствующий данному объекту определяется в пространстве имен . Имя типа XDTO:

ДанныеФормыКоллекцияЭлементовДерева (FormDataTreeItemCollection)

Элементы коллекции:
ДанныеФормыЭлементДерева

Для объекта доступен обход коллекции посредством оператора Для каждого … Из … Цикл. При обходе выбираются элементы коллекции.
Возможно обращение к элементу коллекции посредством оператора […]. В качестве аргумента передается индекс элемента.

Методы:

  • Вставить (Insert)
  • Добавить (Add)
  • Индекс (IndexOf)
  • Количество (Count)
  • Очистить (Clear)
  • Получить (Get)
  • Сдвинуть (Move)
  • Удалить (Delete)

Описание:

Коллекция элементов дерева.

Доступность: клиент, сервер, тонкий клиент, веб-клиент.

См. также:

  • ДанныеФормыЭлементДерева, метод ПолучитьЭлементы
  • ДанныеФормыДерево, метод ПолучитьЭлементы

Особенности работы с деревом значений

Обновление дерева

Существует проблема падения платформы при обновлении дерева.

Если в дереве был развернут какой-либо узел и выбран подчиненный узел, то при обновлении дерева функцией ЗначениеВДанныеФормы
происходит падение платформы.

Решение: перед обновлением нужно очищать дерево.

Например:

&НаСервере
Процедура ОчиститьДерево(элементы)
	Для каждого элемент из элементы Цикл
		ОчиститьДерево(элемент.ПолучитьЭлементы());
	КонецЦикла;
	элементы.Очистить();
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьДеревоПонятий()
	дзПонятия = срСвойства.ПостроитьДеревоПонятий(НаДату, Мета.ТекущаяИБ());
	ОчиститьДерево(ДеревоПонятий.ПолучитьЭлементы());
	ЗначениеВДанныеФормы(дзПонятия, ДеревоПонятий);
КонецПроцедуры

&НаКлиенте
Процедура НаДатуПриИзменении(Элемент)
	ЗаполнитьДеревоПонятий();
КонецПроцедуры

Содержание:

1.    Реквизиты объекта и реквизиты формы в 1С

2.    Как получить значения из элементов формы 1С  

1.    Реквизиты объекта и реквизиты формы в 1С

В обычном приложении у элемента формы 1С 8.3 было свойство «Значение», доступное как для чтения, так и для записи. Какой аналог в управляемом приложении?

Элементы формы 1С 8.3 могут содержать реквизиты двух видов: реквизиты объекта 1С и реквизиты формы.

Красным помечен реквизит объекта 1С Контрагент, а зеленым – реквизит формы в 1С.

Интерактивно выберем эти элементы в пользовательском режиме 1С и попробуем прочитать их «программно» кнопкой «Прочитать».

Если читать значения реквизитов в клиентской процедуре, то код для 1С Предприятия будет следующий:


Все бы хорошо: мы получили на клиенте значения реквизитов объекта 1С и формы, но – не значения элементов формы 1С. На клиенте значение элементов формы 1С получить нельзя. 

2.    Как получить значения из элементов формы 1С

Чтобы получить значения из элементов формы 1С, нам потребуется серверный вызов:

Именно на сервере у элемента формы 1С 8.3 становится доступно свойство ПутьКДанным, по которому его можно извлечь либо из Объекта, который имеет тип ДанныеФормыСтруктура:

…либо из Формы, которая имеет тип ФормаКлиентскогоПриложения:


Форма и ее элементы не видны на сервере без контекста. То есть код для 1С:Предприятия выдаст множество ошибок.

Также Форму нельзя передать как параметр в процедуру и функцию на сервер или в общий модуль.


            Еще хочется разобрать момент, когда нам возможно увидеть состояние различающихся значений в элементе форме 1С и в объекте. Это возможно в событии элемента ОбработкаВыбора.
Например, при значении поля Контрагент — Ассоль, мы выбрали контрагента Бакалея:


Новое значение доступно как параметр процедуры ВыбранноеЗначение.


Система дает шанс что-то сделать в этой ситуации.

Специалист компании ООО «Кодерлайн»

Добрыгин Михаил

Назначение: в управляемой форме в качестве реквизитов могут быть следующие типы: примитивные (дата, число, строка, булево) и ссылки (СправочникСсылка.Контрагенты, ДокументСсылка.ЗаказПокупателя и т.д.).
Прикладные объекты (СправочникОбъект, ДокументОбъект и т.д.) храниться в управляемой форме не могут. Поэтому для управляемых форм созданы аналогичные специальные типы значений (ДанныеФормыСтруктура, ДанныеФормыКоллекция и т.д). На форме эти типы обозначаются в скобках, причем в скобках указываются не сами типы, а соответствующие им прикладные объекты:

В работе часто требуется преобразовать такие типы значений управляемой формы в прикладной объект и наоборот. Для этого созданы специальные операторы (показаны ниже в коде). Важно, что:

— с их помощью можно преобразовывать только «специальные» типы значений (ДанныеФормыСтруктура, ДанныеФормыКоллекция и т.д). Для ссылок и примитивных типов преобразование не требуется;

— по синтакс-помощнику нужно смотреть, где эти операторы доступны (какие на клиенте, какие на сервере).

Источник: 

Номенклатура объектов: модуль формы объекта (справочника, документа и т.д).

&НаСервере
Процедура ПрочитатьЗаполнитьСвойстваИЗначения()
   // преобразование реквизита управляемой формы в прикладной объект
   // пример:
   // ДокументОбъект = РеквизитФормыВЗначение("Объект");
   ДокументОбъект = РеквизитФормыВЗначение("[Реквизит формы]");
   //-------------------------------------------------------------
   // преобразование прикладного объекта в реквизит управляемой формы
   // пример:
   // ЗначениеВРеквизитФормы(ДокументОбъект, "Объект");
   ЗначениеВРеквизитФормы([Прикладной объект], "[Реквизит формы]");
   //-------------------------------------------------------------
   // преобразование реквизита управляемой формы в прикладной объект
   // пример:
   // ОбъектБД = ДанныеФормыВЗначение(Объект, Тип("СправочникОбъект.Фонды"));
   ОбъектБД = ДанныеФормыВЗначение([Реквизит формы], Тип("[имя типа]"));
   //-------------------------------------------------------------
   // преобразование прикладного объекта в реквизит управляемой формы
   // пример:
   // ЗначениеВДанныеФормы(ОбъектБД, Объект);
   ЗначениеВДанныеФормы([Прикладной объект], [Реквизит формы]);
КонецПроцедуры

Реквизиты объекта в дополнительной форме

Я
   Ookami

27.03.14 — 10:05

Доброго времени суток!

8.2, управляемые формы. Есть внешняя обработка с реквизитом. У обработки есть несколько форм, у всех в качестве основного реквизита по-умолчанию указан Объект. В основной форме устанавливаю значение реквизита объекта:

&НаСервере

Процедура УстановитьЗначениеРеквизита(Реквизит, ЗначениеРеквизита)

    ОбработкаОбъект = РеквизитФормыВЗначение(«Объект»);

    ОбработкаОбъект[Реквизит] = ЗначениеРеквизита;

    ЗначениеВРеквизитФормы(ОбработкаОбъект, «Объект»);

КонецПроцедуры

После этого по нажатию кнопки открывается дополнительная форма, в которой, помимо прочего, происходит обращение к реквизиту объекта, но его значение Неопределено. Обращаться к реквизиту пробовал и напрямую через Объект.Риквизит, и через РеквизитФормыВЗначение(«Объект»).Реквизит, результат один и тот же.

Что я делаю не так? Пните в нужном направлении, пожалуйста.

  

Партнерская программа EFSOL Oblako

   Ookami

1 — 27.03.14 — 10:06

(0) при обращении к реквизитам объекта из основной формы — все заполнено теми значениями, которыми и должно. Проблема только при открытии дополнительной формы

   Fedor-1971

2 — 27.03.14 — 10:16

Точно заполняешь реквизит Объекта, а не формы объекта?

Попробуй заполнять так: Объект.Реквизит=нужное значение

   Defender aka LINN

3 — 27.03.14 — 10:17

(0) А для нафига объект туда-сюда преобразовывать, чтобы серверу было чем заняться?

   Ookami

4 — 27.03.14 — 10:32

(2) Попробовал, без изменений

(3) Вероятно, не до конца понимаю сакральный смысл РеквизитФормыВЗначение

   Fedor-1971

5 — 27.03.14 — 10:38

а как форму открываешь?

   Ookami

6 — 27.03.14 — 11:00

(5)

ФормаКарточкаДокумента = ПолучитьФорму(«ВнешняяОбработка.МояОбработка.Форма.НужнаяФорма», , , Идентификатор);

ФормаКарточкаДокумента.Открыть();

   Ookami

7 — 27.03.14 — 11:01

(5) И вот на этом месте я задумался о том что открываю неправильно =)

   alexei366

8 — 27.03.14 — 11:05

(0) Тебе не кажется что Объект-Обработка не имеет «отображение в базе данных» и соответственно данные при открытии других форм не считываются с базы.

Это же религия)))

   alexei366

9 — 27.03.14 — 11:06

(8) Ты его не записываешь, у обрабоки нет понятия Ссылки и т.д

   Ookami

10 — 27.03.14 — 11:14

(8) я видимо что-то упустил в этой жизни. Есть объект (обработка) исполняющаяся в среде, и пока она исполняется — все данные, касающиеся ее работы, висят в памяти. Закрыли обработку — потеряли данные, это логично. Но пока она работает — доступ к ним должен быть.

   Defender aka LINN

11 — 27.03.14 — 11:17

(10) Он и есть. Что тебя смущает?

   alexei366

12 — 27.03.14 — 11:19

(10) Ну вот ты открываешь доп форму, что ты туда передаешь чтоб 1С поняла что это тотже объект что и в основной?

Я так думаю ничего

   Ookami

13 — 27.03.14 — 11:19

(11) смущает написанное в (8) и (9)

Если обработка при открытии своей второй формы не в состоянии передать ей свои реквизиты — смысл вообще тогда в этих реквизитах?

   Ookami

14 — 27.03.14 — 11:20

(12) я к этому и пришел в (7), вопрос в том как при открытии формы сказать что это форма того же объекта

   alexei366

15 — 27.03.14 — 11:28

(14) Передавай Объект в доп форму и там заполняй реквизиты «местного объета», можеш используя метаданные объекта с обходом реквизитов)

наверно так.

Я реквизиты обработки использую в серверных процедурах и функциях.

   alexei366

16 — 27.03.14 — 11:29

(14) Или попробуй вдруг сработает.

Получаешь доп форму и в её экспортную процедуру передаешь объект основной формы, там переходишь на серверную процедуру и там попробывать ЗначениеВРеквизитФормы(ОбработкаОсновнойОбъект, «Объект»);

   Defender aka LINN

17 — 27.03.14 — 11:54

(13) Напиши код и передавай что угодно. А у другой формы объект тоже другой.

   Ookami

18 — 27.03.14 — 12:13

(15) гонять весь объект между формами кажется мне плохой идеей. Но нашел такой вариант решения:

Форма = ПолучитьФорму(«ВнешняяОбработка.Обработка.Форма.ИмяФормы», , ЭтаФорма, Идентификатор);

Тогда реквизиты объекта доступны через владельца: ВладелецФормы.Объект

   alexei366

19 — 27.03.14 — 12:29

(18) Ну удачи тебе с поиском хорошей идеи)))

   anton_mgn

20 — 27.03.14 — 12:42

(0) Возможно прощк вместо открытия разных форм менять страницы на панели одной формы.

  

Ookami

21 — 27.03.14 — 18:04

(19) задача решена использованием владельца формы, спасибо (20) на основной форме уже итак много страниц, тем более открываемое окно может существовать одновременно в нескольких экземплярах

Всем спасибо, проблема решена

Понравилась статья? Поделить с друзьями:
  • Игарский проезд 8 паспортный стол часы работы
  • Золотая корона денежные переводы чья компания
  • Игровой реквизит для аниматоров своими руками
  • Золото в россии добывают иностранные компании
  • Золотодобывающие компании кемеровской области