Для представления в форме объектов конфигурации (справочники, документы и т.п.) существуют специальные типы данных:

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

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

В редакторе формы вместо имен этих типов обычно отображаются те типы, данные которых содержит реквизит. Например, если реквизит Объект содержит данные элемента справочника Клиенты , то в колонке «Тип» отображается ненастоящий тип этого реквизита формы — ДанныеФормыСтруктура , а тип прикладного объекта, данные которого содержатся в этом реквизите — СправочникОбъект.Клиенты . Чтобы было понятно, что это «ненастоящий тип» реквизита, тип прикладного объекта показывается в круглых скобках.

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

  • ЗначениеВДанныеФормы() — преобразует объект прикладного типа в данные формы;
  • ДанныеФормыВЗначение() — преобразует данные формы в объект прикладного типа.

Аналогичные методы, предназначенные для конвертирования значений реквизитов формы в прикладные объекты и обратно, существуют и у самой управляемой формы:

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

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

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

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

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

Наряду с этим, могут существовать общие формы, не принадлежащие конкретным объектам конфигурации — общие формы.

Основные формы

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

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

А у документа Поступление товаров и услуг состав основных форм будет уже другим:

Таким образом, если пользователь захочет посмотреть список справочника Номенклатура или список документов Поступление товаров и услуг, система откроет соответствующую форму, назначенную в качестве формы списка для этих объектов.

Автогенерируемые формы

Важной особенностью системы 1С:Предприятие 8 является механизм автогенерируемых форм. Этот механизм освобождает разработчика от необходимости создания всех возможных форм для каждого из объектов конфигурации. Разработчику достаточно добавить новый объект конфигурации, а система сама сгенерирует в нужные моменты работы пользователя необходимые формы для отображения информации, содержащейся в этом объекте.

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

Связь формы с данными

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

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

Например, если в качестве основного реквизита формы будет назначен документ Поступление товаров и услуг, то при закрытии формы система будет запрашивать подтверждение записи и проведения этого документа. Если же основным реквизитом формы назначить, скажем, справочник Номенклатура, то подобного запроса подтверждения при закрытии формы возникать не будет.

Структура формы

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

Отображаемая часть формы (видимая пользователю) описывается как дерево, включающее элементы формы.

Элементы могут представлять собой поля ввода, флажки, переключатели, кнопки и т. д. Кроме того, элемент может быть группой, включающей другие элементы. Группа может представляться как панель с рамкой, панель со страницами (закладками), собственно страница, командная панель. Помимо этого элемент может представлять собой таблицу, которая тоже включает элементы (колонки). Структура элементов описывает то, как будет выглядеть форма.

Вся функциональность формы описывается в виде реквизитов и команд. Реквизиты – это данные, с которыми работает форма, а команды – выполняемые действия. Таким образом, разработчик в редакторе формы должен включить в форму необходимые реквизиты и команды, создать отображающие их элементы формы и, если необходимо, скомпоновать элементы в группы.

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

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

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

Механика работы форм

Функционирование управляемых форм имеет следующие отличительные особенности:

  • Форма существует и на клиенте и на сервере
    Она осуществляет клиент-серверное взаимодействие (передачу данных и оформительских свойств элементов)
  • Форма не работает с прикладными объектами
    В форме используются специальные универсальные объекты ДанныеФормы… Прикладные объекты работают только на сервере и только во время выполнения некоторых операций

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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