ДанныеФормыСтруктура

Типы · FormDataStructure

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

Полное описание, параметры и ограничения

ДанныеФормыСтруктура (FormDataStructure)

ДанныеФормыСтруктура (FormDataStructure)

Доступен, начиная с версии 8.2.

Свойства:
<Имя свойства> (<Property name>)
ИсходныйКлючЗаписи (SourceRecordKey)

Методы:
Свойство (Property)

Описание:

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

Доступность:

Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.

См. также:
ФормаКлиентскогоПриложения, свойство Параметры
ФормаКлиентскогоПриложения, метод РеквизитФормыВЗначение
ФормаКлиентскогоПриложения, метод ЗначениеВРеквизитФормы
ТаблицаФормы, свойство ТекущиеДанные
ТаблицаФормы, метод ДанныеСтроки
Глобальный контекст, метод ЗаблокироватьДанныеДляРедактирования
Глобальный контекст, метод ДанныеФормыВЗначение
Глобальный контекст, метод ЗначениеВДанныеФормы
Расширение данных строки для динамического списка, свойство <Имя колонки>ОформлениеЯчейки

Использование в версии:

Доступен, начиная с версии 8.2.

Методическая информация

Практические примеры

Назначить владельца своему окну и закрывать его вместе с владельцем

ВладелецФормы изменяемый на клиенте: назначаем свою главную форму до открытия. Проверяем связь идентификаторами и включаем закрытие только этого дочернего экземпляра.

Где и как запускать

Полный модуль собственной общей управляемой формы УчебныеОкна85. Два экземпляра одной формы, тонкий клиент Windows; создание реквизитов на сервере, открытие/выбор/закрытие на клиенте.

Подготовка

  1. Используйте отдельную пустую учебную конфигурацию 8.5.1.1343 без рабочих данных и тонкий управляемый клиент Windows. Создайте общую управляемую форму УчебныеОкна85; имя в дереве Общие → Общие формы должно совпадать с кодом.

  2. На вкладке Параметры формы создайте Дочерняя, СтартовоеКоличество и КлючЗапроса. Значения передаются как Булево, Число и Строка. У всех трёх снимите Ключевой: пользовательский ключ уникальности задаётся отдельно четвёртым аргументом открытия.

  3. Событию ПриСозданииНаСервере назначьте одноимённую процедуру. Вставьте весь приведённый модуль выбранного урока. Реквизиты, поле количества, команду и кнопку вручную не создавайте: их добавляет код.

  4. Для запуска добавьте в свою учебную обработку пустую управляемую форму и команду ОткрытьУчебноеОкно. Через конструктор обработчика создайте клиентскую процедуру команды и поместите в её тело ровно ОткрытьФорму("ОбщаяФорма.УчебныеОкна85");. Эта внешняя кнопка открывает главное окно, а кнопки внутри урока открывают его дочерний экземпляр.

  5. В каждом уроке используйте отдельную копию своей конфигурации/формы. Все экземпляры создаются из одного полного модуля: главное окно имеет Дочерняя=Ложь, второе получает Дочерняя=Истина и собственные параметры.

  6. Количество главного окна первоначально 3, цена книги 250. В дочернем поле можно выбрать целое количество 1–10; никакой номенклатуры, документов, регистров, файлов, сети и печати не используется.

  7. Запуск в 1С не проверялся. Статические проверки не доказывают появление окна, возврат событий или фактическое поведение темы: выполните контрольные действия только на своём учебном стенде.

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Новые = Новый Массив;
    ЧисловойТип = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(2, 0, ДопустимыйЗнак.Неотрицательный));
    Новые.Добавить(Новый РеквизитФормы("УчебноеКоличество", ЧисловойТип));
    Новые.Добавить(Новый РеквизитФормы("ЭтоДочерняяФорма", Новый ОписаниеТипов("Булево")));
    Новые.Добавить(Новый РеквизитФормы("УчебныйКлючЗапроса", Новый ОписаниеТипов("Строка")));
    ЭтаФорма.ИзменитьРеквизиты(Новые);
    ЭтаФорма.ЭтоДочерняяФорма = Ложь;
    ЭтаФорма.УчебноеКоличество = 3;
    ЭтаФорма.УчебныйКлючЗапроса = "";
    Если ЭтаФорма.Параметры.Свойство("Дочерняя", ПризнакДочерней) Тогда
        Если ТипЗнч(ПризнакДочерней) = Тип("Булево") Тогда
            ЭтаФорма.ЭтоДочерняяФорма = ПризнакДочерней;
        КонецЕсли;
    КонецЕсли;
    Если ЭтоДочерняяФорма Тогда
        Если Не ЭтаФорма.Параметры.Свойство("СтартовоеКоличество", ПереданноеКоличество) Тогда
            ВызватьИсключение "Нет собственного параметра СтартовоеКоличество";
        КонецЕсли;
        Если ТипЗнч(ПереданноеКоличество) <> Тип("Число") Тогда
            ВызватьИсключение "СтартовоеКоличество должно быть числом";
        КонецЕсли;
        Если ПереданноеКоличество < 1 Или ПереданноеКоличество > 10 Или ПереданноеКоличество <> Цел(ПереданноеКоличество) Тогда
            ВызватьИсключение "СтартовоеКоличество должно быть целым от 1 до 10";
        КонецЕсли;
        Если Не ЭтаФорма.Параметры.Свойство("КлючЗапроса", ПереданныйКлюч) Тогда
            ВызватьИсключение "Нет собственного параметра КлючЗапроса";
        КонецЕсли;
        Если ТипЗнч(ПереданныйКлюч) <> Тип("Строка") Тогда
            ВызватьИсключение "КлючЗапроса должен быть собственной строкой";
        КонецЕсли;
        Если ПустаяСтрока(ПереданныйКлюч) Тогда
            ВызватьИсключение "Собственный ключ запроса не задан";
        КонецЕсли;
        ЭтаФорма.УчебноеКоличество = ПереданноеКоличество;
        ЭтаФорма.УчебныйКлючЗапроса = ПереданныйКлюч;
    КонецЕсли;
    Поле = Элементы.Добавить("ПолеУчебногоКоличества", Тип("ПолеФормы"));
    Поле.Вид = ВидПоляФормы.ПолеВвода;
    Поле.ПутьКДанным = "УчебноеКоличество";
    Поле.Заголовок = "Своих книг от 1 до 10";
    Команда = Команды.Добавить("УчебноеДействие");
    Команда.Действие = "ВыполнитьУчебноеДействие";
    Команда.ИзменяетСохраняемыеДанные = Ложь;
    Кнопка = Элементы.Добавить("КнопкаУчебногоДействия", Тип("КнопкаФормы"));
    Кнопка.ИмяКоманды = Команда.Имя;
    Если ЭтоДочерняяФорма Тогда
        ЭтаФорма.Заголовок = "Собственное дочернее окно";
        Команда.Заголовок = "Завершить собственный выбор";
    Иначе
        ЭтаФорма.Заголовок = "Главное учебное окно";
        Команда.Заголовок = "Открыть собственное дочернее окно";
    КонецЕсли;

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

&НаКлиенте
Процедура ВыполнитьУчебноеДействие(Команда)
    ПроверитьСвоёКоличество(УчебноеКоличество);
    Если ЭтоДочерняяФорма Тогда
        ЭтаФорма.Закрыть();
        Возврат;
    КонецЕсли;
    ПараметрыДочерней = Новый Структура("Дочерняя,СтартовоеКоличество,КлючЗапроса", Истина, 3, "own-owner");
    ДочерняяФорма = ПолучитьФорму("ОбщаяФорма.УчебныеОкна85", ПараметрыДочерней, Неопределено, Истина);
    Если ДочерняяФорма = Неопределено Тогда
        ВызватьИсключение "Своя общая форма не была получена";
    КонецЕсли;
    Если ТипЗнч(ДочерняяФорма) <> Тип("ФормаКлиентскогоПриложения") Тогда
        ВызватьИсключение "Ожидалась своя управляемая форма";
    КонецЕсли;
    ДочерняяФорма.ВладелецФормы = ЭтаФорма;
    ДочерняяФорма.ЗакрыватьПриЗакрытииВладельца = Истина;
    ДочерняяФорма.РежимБлокировкиПриОткрытииОкна = РежимБлокировкиПриОткрытииОкнаФормы.НеБлокировать;
    ДочерняяФорма.Открыть();
    Сообщить(ДочерняяФорма.ВладелецФормы.УникальныйИдентификатор = ЭтаФорма.УникальныйИдентификатор);
    Сообщить(ДочерняяФорма.ЗакрыватьПриЗакрытииВладельца);
    Сообщить(ДочерняяФорма.Открыта());
    Сообщить("Закройте своё главное окно крестиком: его собственное дочернее окно должно закрыться вместе с ним");
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьСвоёКоличество(Знач Количество)
    Если ТипЗнч(Количество) <> Тип("Число") Тогда
        ВызватьИсключение "Количество должно быть числом";
    КонецЕсли;
    Если Количество < 1 Или Количество > 10 Или Количество <> Цел(Количество) Тогда
        ВызватьИсключение "Выберите целое количество от 1 до 10";
    КонецЕсли;
КонецПроцедуры

Разбор по шагам

  1. Получить свой дочерний экземпляр без владельца. Проверить результат до настройки свойств.

  2. ВладелецФормы в установленной справке имеет Чтение и запись и клиентскую доступность. Назначить ЭтаФорма до открытия; не объявлять это свойство readonly.

  3. Установить ЗакрыватьПриЗакрытииВладельца=Истина только своему дочернему экземпляру.

  4. Выбрать НеБлокировать, чтобы пользователь мог закрыть главное окно в этом опыте.

  5. После открытия сравнить реальные идентификаторы назначенного владельца и текущей главной формы.

  6. Закрыть главную форму вручную; наблюдать закрытие именно связанного дочернего окна, не всех окон клиента.

Как проверить результат

  1. Три логические проверки Истина. При закрытии главного собственное дочернее окно тоже должно закрыться.

  2. Для отдельного повторения поставьте ЗакрыватьПриЗакрытииВладельца=Ложь: дочернее останется открытым. Закройте его собственной кнопкой; не используйте потерянного владельца после закрытия.

Ожидаемый результат

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

На что обратить внимание

  1. Владелец может быть формой или элементом управления. Код этого урока назначает свою форму, поэтому чтение её УникальныйИдентификатор обосновано.

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

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

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

ОписаниеОповещенияОЗакрытии: принять количество из своего окна

Сначала получаем свой экземпляр, затем назначаем клиентское описание закрытия. Результат Закрыть передаётся в отдельный обработчик, а не возвращается немедленно методом Открыть.

Где и как запускать

Полный модуль собственной общей управляемой формы УчебныеОкна85. Два экземпляра одной формы, тонкий клиент Windows; создание реквизитов на сервере, открытие/выбор/закрытие на клиенте.

Подготовка

  1. Используйте отдельную пустую учебную конфигурацию 8.5.1.1343 без рабочих данных и тонкий управляемый клиент Windows. Создайте общую управляемую форму УчебныеОкна85; имя в дереве Общие → Общие формы должно совпадать с кодом.

  2. На вкладке Параметры формы создайте Дочерняя, СтартовоеКоличество и КлючЗапроса. Значения передаются как Булево, Число и Строка. У всех трёх снимите Ключевой: пользовательский ключ уникальности задаётся отдельно четвёртым аргументом открытия.

  3. Событию ПриСозданииНаСервере назначьте одноимённую процедуру. Вставьте весь приведённый модуль выбранного урока. Реквизиты, поле количества, команду и кнопку вручную не создавайте: их добавляет код.

  4. Для запуска добавьте в свою учебную обработку пустую управляемую форму и команду ОткрытьУчебноеОкно. Через конструктор обработчика создайте клиентскую процедуру команды и поместите в её тело ровно ОткрытьФорму("ОбщаяФорма.УчебныеОкна85");. Эта внешняя кнопка открывает главное окно, а кнопки внутри урока открывают его дочерний экземпляр.

  5. В каждом уроке используйте отдельную копию своей конфигурации/формы. Все экземпляры создаются из одного полного модуля: главное окно имеет Дочерняя=Ложь, второе получает Дочерняя=Истина и собственные параметры.

  6. Количество главного окна первоначально 3, цена книги 250. В дочернем поле можно выбрать целое количество 1–10; никакой номенклатуры, документов, регистров, файлов, сети и печати не используется.

  7. Запуск в 1С не проверялся. Статические проверки не доказывают появление окна, возврат событий или фактическое поведение темы: выполните контрольные действия только на своём учебном стенде.

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Новые = Новый Массив;
    ЧисловойТип = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(2, 0, ДопустимыйЗнак.Неотрицательный));
    Новые.Добавить(Новый РеквизитФормы("УчебноеКоличество", ЧисловойТип));
    Новые.Добавить(Новый РеквизитФормы("ЭтоДочерняяФорма", Новый ОписаниеТипов("Булево")));
    Новые.Добавить(Новый РеквизитФормы("УчебныйКлючЗапроса", Новый ОписаниеТипов("Строка")));
    ЭтаФорма.ИзменитьРеквизиты(Новые);
    ЭтаФорма.ЭтоДочерняяФорма = Ложь;
    ЭтаФорма.УчебноеКоличество = 3;
    ЭтаФорма.УчебныйКлючЗапроса = "";
    Если ЭтаФорма.Параметры.Свойство("Дочерняя", ПризнакДочерней) Тогда
        Если ТипЗнч(ПризнакДочерней) = Тип("Булево") Тогда
            ЭтаФорма.ЭтоДочерняяФорма = ПризнакДочерней;
        КонецЕсли;
    КонецЕсли;
    Если ЭтоДочерняяФорма Тогда
        Если Не ЭтаФорма.Параметры.Свойство("СтартовоеКоличество", ПереданноеКоличество) Тогда
            ВызватьИсключение "Нет собственного параметра СтартовоеКоличество";
        КонецЕсли;
        Если ТипЗнч(ПереданноеКоличество) <> Тип("Число") Тогда
            ВызватьИсключение "СтартовоеКоличество должно быть числом";
        КонецЕсли;
        Если ПереданноеКоличество < 1 Или ПереданноеКоличество > 10 Или ПереданноеКоличество <> Цел(ПереданноеКоличество) Тогда
            ВызватьИсключение "СтартовоеКоличество должно быть целым от 1 до 10";
        КонецЕсли;
        Если Не ЭтаФорма.Параметры.Свойство("КлючЗапроса", ПереданныйКлюч) Тогда
            ВызватьИсключение "Нет собственного параметра КлючЗапроса";
        КонецЕсли;
        Если ТипЗнч(ПереданныйКлюч) <> Тип("Строка") Тогда
            ВызватьИсключение "КлючЗапроса должен быть собственной строкой";
        КонецЕсли;
        Если ПустаяСтрока(ПереданныйКлюч) Тогда
            ВызватьИсключение "Собственный ключ запроса не задан";
        КонецЕсли;
        ЭтаФорма.УчебноеКоличество = ПереданноеКоличество;
        ЭтаФорма.УчебныйКлючЗапроса = ПереданныйКлюч;
    КонецЕсли;
    Поле = Элементы.Добавить("ПолеУчебногоКоличества", Тип("ПолеФормы"));
    Поле.Вид = ВидПоляФормы.ПолеВвода;
    Поле.ПутьКДанным = "УчебноеКоличество";
    Поле.Заголовок = "Своих книг от 1 до 10";
    Команда = Команды.Добавить("УчебноеДействие");
    Команда.Действие = "ВыполнитьУчебноеДействие";
    Команда.ИзменяетСохраняемыеДанные = Ложь;
    Кнопка = Элементы.Добавить("КнопкаУчебногоДействия", Тип("КнопкаФормы"));
    Кнопка.ИмяКоманды = Команда.Имя;
    Если ЭтоДочерняяФорма Тогда
        ЭтаФорма.Заголовок = "Собственное дочернее окно";
        Команда.Заголовок = "Завершить собственный выбор";
    Иначе
        ЭтаФорма.Заголовок = "Главное учебное окно";
        Команда.Заголовок = "Открыть собственное дочернее окно";
    КонецЕсли;

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

&НаКлиенте
Процедура ВыполнитьУчебноеДействие(Команда)
    ПроверитьСвоёКоличество(УчебноеКоличество);
    Если ЭтоДочерняяФорма Тогда
        Результат = Новый Структура("КлючЗапроса,Количество,Сумма",
            УчебныйКлючЗапроса, УчебноеКоличество, УчебноеКоличество * 250);
        ЭтаФорма.Закрыть(Результат);
        Возврат;
    КонецЕсли;
    УчебныйКлючЗапроса = Строка(Новый УникальныйИдентификатор);
    ПараметрыДочерней = Новый Структура("Дочерняя,СтартовоеКоличество,КлючЗапроса", Истина, УчебноеКоличество, УчебныйКлючЗапроса);
    Дополнительные = Новый Структура("КлючЗапроса,ДоОткрытия", УчебныйКлючЗапроса, УчебноеКоличество);
    Оповещение = Новый ОписаниеОповещения("ПослеУчебногоЗакрытия", ЭтаФорма, Дополнительные);
    ДочерняяФорма = ПолучитьФорму("ОбщаяФорма.УчебныеОкна85", ПараметрыДочерней, ЭтаФорма, Истина);
    Если ДочерняяФорма = Неопределено Тогда
        ВызватьИсключение "Своя общая форма не была получена";
    КонецЕсли;
    Если ТипЗнч(ДочерняяФорма) <> Тип("ФормаКлиентскогоПриложения") Тогда
        ВызватьИсключение "Ожидалась своя управляемая форма";
    КонецЕсли;
    ДочерняяФорма.ОписаниеОповещенияОЗакрытии = Оповещение;
    ДочерняяФорма.РежимБлокировкиПриОткрытииОкна = РежимБлокировкиПриОткрытииОкнаФормы.БлокироватьВладельца;
    ДочерняяФорма.Открыть();
    Сообщить("Ждём собственный результат в клиентском обработчике, не после Открыть");
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьСвоёКоличество(Знач Количество)
    Если ТипЗнч(Количество) <> Тип("Число") Тогда
        ВызватьИсключение "Количество должно быть числом";
    КонецЕсли;
    Если Количество < 1 Или Количество > 10 Или Количество <> Цел(Количество) Тогда
        ВызватьИсключение "Выберите целое количество от 1 до 10";
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПослеУчебногоЗакрытия(РезультатЗакрытия, ДополнительныеПараметры) Экспорт
    Если Не ЭтаФорма.Открыта() Тогда
        Возврат;
    КонецЕсли;
    Если УчебныйКлючЗапроса <> ДополнительныеПараметры.КлючЗапроса Тогда
        Сообщить("Ответ старого собственного окна пропущен");
        Возврат;
    КонецЕсли;
    УчебныйКлючЗапроса = "";
    Если РезультатЗакрытия = Неопределено Тогда
        Сообщить("Собственное окно закрыто без результата; количество не изменено");
        Возврат;
    КонецЕсли;
    Если УчебноеКоличество <> ДополнительныеПараметры.ДоОткрытия Тогда
        Сообщить("Своё количество изменилось после открытия; устаревший результат не принят");
        Возврат;
    КонецЕсли;
    ПринятьСвойРезультат(РезультатЗакрытия, ДополнительныеПараметры.КлючЗапроса);
КонецПроцедуры

&НаКлиенте
Процедура ПринятьСвойРезультат(Результат, Знач ОжидаемыйКлюч)
    Если ТипЗнч(Результат) <> Тип("Структура") Тогда
        ВызватьИсключение "Результат собственного окна должен быть структурой";
    КонецЕсли;
    Если Не Результат.Свойство("КлючЗапроса") Или Не Результат.Свойство("Количество") Или Не Результат.Свойство("Сумма") Тогда
        ВызватьИсключение "Неполный собственный результат";
    КонецЕсли;
    Если Результат.КлючЗапроса <> ОжидаемыйКлюч Тогда
        ВызватьИсключение "Результат относится к другому собственному запросу";
    КонецЕсли;
    ПроверитьСвоёКоличество(Результат.Количество);
    Если ТипЗнч(Результат.Сумма) <> Тип("Число") Тогда
        ВызватьИсключение "Сумма собственного результата должна быть числом";
    КонецЕсли;
    Если Результат.Сумма <> Результат.Количество * 250 Тогда
        ВызватьИсключение "Сумма собственного результата не соответствует цене 250";
    КонецЕсли;
    УчебноеКоличество = Результат.Количество;
    Сообщить(УчебноеКоличество = Результат.Количество);
    Сообщить(Результат.Сумма = УчебноеКоличество * 250);
    Сообщить(СтрШаблон("Принято своих книг: %1, сумма: %2", УчебноеКоличество, Результат.Сумма));
КонецПроцедуры

Разбор по шагам

  1. Зафиксировать количество владельца и создать собственный ключ запроса. ДополнительныеПараметры описания оповещения сохраняют оба значения.

  2. Получить свою общую форму с новым экземпляром; проверить Неопределено и точный тип до назначения свойств.

  3. Назначить ОписаниеОповещенияОЗакрытии и БлокироватьВладельца до Открыть. Это немодальное получение результата через клиентский обработчик.

  4. В дочернем поле выбрать 5 и нажать собственную кнопку. Закрыть получает структуру ключа, количества 5 и суммы 1250.

  5. ПослеУчебногоЗакрытия имеет два параметра и Экспорт. Проверить открытость владельца, актуальность ключа, отмену и неизменность начального количества.

  6. ПринятьСвойРезультат проверяет поля/тип/диапазон и пересчитывает сумму по цене 250 перед изменением собственного количества владельца.

Как проверить результат

  1. При подтверждении 5 главное поле становится 5; два сравнения Истина и сообщение Принято своих книг: 5, сумма: 1250.

  2. При закрытии дочернего крестиком результат Неопределено: появляется сообщение об отмене, главное количество остаётся прежним. Не требуйте результата 5 после отмены.

Ожидаемый результат

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

На что обратить внимание

  1. Открыть не ждёт выбора. Код после него не должен читать будущий результат из переменной вызова.

  2. ОписаниеОповещения относится к своему владельцу ЭтаФорма; обработчик объявлен на клиенте с нужными двумя параметрами.

  3. Ключ защищает от устаревшего собственного ответа, но не является системой аутентификации или прав доступа. Здесь нет внешнего API.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.