Тип: ФормаКлиентскогоПриложения. Содержит данную форму. Может быть использовано в модуле формы для получения данной формы и передачи ее в качестве параметра в другие формы, глобальные процедуры и функции и т.д.
Полное описание, параметры и ограничения
ФормаКлиентскогоПриложения.ЭтотОбъект (ClientApplicationForm.ThisObject)
ФормаКлиентскогоПриложения (ClientApplicationForm)
ЭтотОбъект (ThisObject)
Доступен, начиная с версии 8.3.3.
Использование:
Только чтение.
Описание:
Тип: ФормаКлиентскогоПриложения.
Содержит данную форму. Может быть использовано в модуле формы для получения данной формы и передачи ее в качестве параметра в другие формы, глобальные процедуры и функции и т.д.
Доступность:
Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, мобильное приложение (клиент).
Использование в версии:
Доступен, начиная с версии 8.3.3.
Методическая информация
Практические примеры
Отличить описание реквизита от его значения и открытого окна
На сервере получаем описание только своего реквизита, возвращаем простой снимок и на клиенте сравниваем его с настоящим числовым значением и состоянием собственной формы.
Где и как запускать
Модуль новой управляемой формы учебной внешней обработки. Код содержит готовые процедуры с директивами; вставляйте на уровне модуля, не внутрь другого обработчика. Каждую задачу запускайте в отдельной копии формы.
Подготовка
В отдельной учебной базе платформы 8.5.1.1343 создайте внешнюю обработку УчебнаяФорма85 с пустой управляемой основной формой. Используйте тонкий клиент Windows.
В свойствах формы → События назначьте ПриСозданииНаСервере. Вставьте полный модуль урока, включая клиентские и серверные помощники, на уровне модуля.
Не создавайте вручную ЗначениеПримера, ПолеПримера и кнопку: код создаёт их полностью. Каждый урок запускайте в отдельной копии своей формы.
Сохраните свою EPF и откройте её в учебной базе. Собственное количество начинается с 3, цена книги задана в коде как 250; исходный расчёт равен 750.
Связанный реквизит помечен как СохраняемыеДанные для изучения поведения формы. Это признак реквизита формы, а не автоматическая запись книги, файла или документа в базу.
Команда расчёта имеет ИзменяетСохраняемыеДанные = Ложь. Уроки изменяют только свой интерфейс и значения собственной формы, не конфигурацию и не рабочие данные.
Запуск и вид в 1С не проверены. Компоновку, сочетания клавиш и расположение команд осмотрите вручную в указанном клиенте; не переносите настройки на рабочие формы без отдельной проверки.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Новые = Новый Массив;
ТипРеквизита = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(2, 0, ДопустимыйЗнак.Неотрицательный));
Новые.Добавить(Новый РеквизитФормы("ЗначениеПримера", ТипРеквизита, "", "Количество книг", Истина));
ЭтаФорма.ИзменитьРеквизиты(Новые);
ЭтаФорма.ЗначениеПримера = 3;
Поле = Элементы.Добавить("ПолеПримера", Тип("ПолеФормы"));
Поле.Вид = ВидПоляФормы.ПолеВвода;
Поле.ПутьКДанным = "ЗначениеПримера";
Поле.Заголовок = "Количество собственных книг";
КомандаДействия = ЭтаФорма.Команды.Добавить("УчебноеДействие");
КомандаДействия.Действие = "УчебноеДействие";
КомандаДействия.Заголовок = "Выполнить собственный учебный шаг";
КомандаДействия.Подсказка = "Действие только над данными учебной формы";
КомандаДействия.ИзменяетСохраняемыеДанные = Ложь;
Кнопка = Элементы.Добавить("КнопкаУчебноеДействие", Тип("КнопкаФормы"));
Кнопка.ИмяКоманды = КомандаДействия.Имя;
Кнопка.Заголовок = КомандаДействия.Заголовок;
КонецПроцедуры
&НаКлиенте
Процедура УчебноеДействие(Команда)
Если ТипЗнч(ЗначениеПримера) <> Тип("Число") Тогда
ВызватьИсключение "Собственное количество должно быть числом";
КонецЕсли;
Если ЗначениеПримера < 1 ИЛИ ЗначениеПримера > 10 ИЛИ ЗначениеПримера <> Цел(ЗначениеПримера) Тогда
ВызватьИсключение "Для учебного расчёта выберите целое количество от 1 до 10";
КонецЕсли;
Цена = 250;
Сумма = ЗначениеПримера * Цена;
Сообщить(Сумма >= 250 И Сумма <= 2500);
Сообщить(Сумма / Цена = ЗначениеПримера);
Сообщить(СтрШаблон("Собственные книги: %1 × %2 = %3", ЗначениеПримера, Цена, Сумма));
Снимок = ОписатьСобственныйРеквизит();
Сообщить(Снимок.Имя = "ЗначениеПримера" И Снимок.Путь = "");
Сообщить(Снимок.СохраняемыеДанные И Снимок.Числовой);
Сообщить(ЭтаФорма.ЭтотОбъект = ЭтаФорма);
Сообщить(ЭтаФорма.Открыта());
Сообщить(ТипЗнч(ЭтаФорма.МодальныйРежим) = Тип("Булево"));
Сообщить(ТипЗнч(ЭтаФорма.Окно) = Тип("ОкноКлиентскогоПриложения"));
Сообщить("Имя собственной формы: " + ЭтаФорма.ИмяФормы);
Сообщить("Сервер собственной формы: " + Строка(ЭтаФорма.ИспользуемыйСерверФормы));
Сообщить("Модальный режим собственного окна: " + Строка(ЭтаФорма.МодальныйРежим));
КонецПроцедуры
&НаСервере
Функция ОписатьСобственныйРеквизит()
Описания = ЭтаФорма.ПолучитьРеквизиты();
Для Каждого Описание Из Описания Цикл
Если Описание.Имя = "ЗначениеПримера" И Описание.Путь = "" Тогда
Возврат Новый Структура("Имя,Заголовок,Путь,СохраняемыеДанные,Числовой",
Описание.Имя, Описание.Заголовок, Описание.Путь, Описание.СохраняемыеДанные,
Описание.ТипЗначения.СодержитТип(Тип("Число")));
КонецЕсли;
КонецЦикла;
ВызватьИсключение "Не найден собственный числовой реквизит формы";
КонецФункции
Разбор по шагам
ПолучитьРеквизиты доступен на сервере и возвращает массив описаний, а не массив текущих числовых значений.
В серверном помощнике ищем своё точное имя с пустым родительским путём. Объект внешней обработки и прочие стандартные реквизиты не считаем отсутствующими.
Из описания собираем простую структуру: имя, заголовок, путь, признак сохраняемости и факт включения числового типа.
На клиенте проверяем собственную открытую форму, её ЭтотОбъект, модальный признак и тип окна. Readonly-свойства не присваиваем.
Имена формы и используемый сервер выводим как фактические наблюдения, а не фиксированные значения всех конфигураций. Расчёт берёт числовой реквизит, а не описание.
Как проверить результат
При исходных 3 ожидаются восемь Истина, сумма 750 и фактические сведения своей формы. Измените количество на 5: описание не меняется, расчёт становится 1250.
В своём открытии через Файл → Открыть сопоставьте модальный признак и окно. Не путайте модальность окна с монопольным режимом всей базы.
Ожидаемый результат
Новичок различает метаописание своего реквизита, значение данных, объект формы и окно клиентского приложения.
На что обратить внимание
ПолучитьРеквизиты не вызывается в тонком клиенте напрямую: используется серверная функция.
ТипЗначения описания — ОписаниеТипов, а не число 3. Проверка СодержитТип не вычисляет количество.
ИмяФормы, Окно, ИспользуемыйСерверФормы, ЭтотОбъект и МодальныйРежим — readonly; их нельзя менять для имитации другого состояния.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Функциональная опция по организации: СКД, форма и интерфейс без смешения контекстов
Две собственные организации хранят противоположные булевы значения опции. Объявляем действительный параметр опций, связываем с ним ссылочный параметр СКД и отдельно сравниваем параметры формы/интерфейса. После переключений возвращаем исходные значения, включая отсутствие ключа.
Где и как запускать
Полный модуль управляемой формы собственной внешней обработки УчебныеОпции85: UI-опыт на клиенте, подготовка метаданных и модель СКД на сервере. Здесь не запускался.
Подготовка
НОВАЯ отдельная база, не копия рабочей: платформа точно8.5.1.1343, конфигурация УчебныеОпции85, совместимость Не использовать. Только свой неиерархический справочник УчебныеОрганизации85, без бизнес-объектов, расширений, подписок и заданий. Модули конфигурации вручную пустые. Ничего из КА2 не переносить в рабочую базу.
Конфигуратор → Справочники → УчебныеОрганизации85 → Реквизиты: единственный реквизит ПоказыватьЦены85, тип только Булево. Предопределённые данные: элементы ЦеныВключены и ЦеныОтключены, не группы, с разными кодами и понятными наименованиями. Разрешить редактирование собственного реквизита в стандартной форме элемента.
Общие → Функциональные опции → ПоказыватьЦены85: Хранение = Справочник.УчебныеОрганизации85.Реквизит.ПоказыватьЦены85. Общие → Параметры функциональных опций → Организация85: Использование = Справочник.УчебныеОрганизации85. Параметр должен быть реально объявлен; это не булев флаг и не название организации. Состав опции в этом опыте не используется для обещаний видимости UI.
Будущая ручная подготовка ТОЛЬКО своего стенда: сохранить, Обновить конфигурацию базы данных (F7), начать свежий сеанс; открыть два своих предопределённых элемента. У ЦеныВключены вручную установить ПоказыватьЦены85=Истина, у ЦеныОтключены вручную установить ПоказыватьЦены85=Ложь и сохранить. Это подготовка данных до опыта, не автоматический запуск или запись данным кодом. В этой работе ни F7, ни записи, ни 1С не выполнялись.
Создать свою внешнюю обработку УчебныеОпции85 → управляемая Форма: команда/кнопка Выполнить, действие Выполнить. В Модуль формы вставить ВЕСЬ пример, с директивами клиент/сервер. Реквизиты формы и общий модуль не нужны. Открыть обработку только в свежем своём клиенте; рабочий интерфейс не использовать.
&НаКлиенте
Процедура Выполнить(Команда)
Стенд = ПодготовитьНаСервере();
ИсходныеФормы = КопироватьСвоиПараметры(ЭтотОбъект.ПолучитьПараметрыФункциональныхОпцийФормы());
ИсходныеИнтерфейса = КопироватьСвоиПараметры(ПолучитьПараметрыФункциональныхОпцийИнтерфейса());
Попытка
ПараметрыФормы = СвойПараметрОрганизации(Стенд.СЦенами);
ЭтотОбъект.УстановитьПараметрыФункциональныхОпцийФормы(ПараметрыФормы);
ПроверитьСвоиПараметры(ЭтотОбъект.ПолучитьПараметрыФункциональныхОпцийФормы(), ПараметрыФормы);
ПроверитьСвоюОпцию(ЭтотОбъект.ПолучитьФункциональнуюОпциюФормы("ПоказыватьЦены85"), Истина);
ПараметрыИнтерфейса = СвойПараметрОрганизации(Стенд.БезЦен);
УстановитьПараметрыФункциональныхОпцийИнтерфейса(ПараметрыИнтерфейса);
ПроверитьСвоиПараметры(ПолучитьПараметрыФункциональныхОпцийИнтерфейса(), ПараметрыИнтерфейса);
ПроверитьСвоюОпцию(ПолучитьФункциональнуюОпциюИнтерфейса("ПоказыватьЦены85"), Ложь);
ПроверитьСвоюОпцию(ЭтотОбъект.ПолучитьФункциональнуюОпциюФормы("ПоказыватьЦены85"), Истина);
ПараметрыФормы = СвойПараметрОрганизации(Стенд.БезЦен);
ЭтотОбъект.УстановитьПараметрыФункциональныхОпцийФормы(ПараметрыФормы);
ПроверитьСвоиПараметры(ЭтотОбъект.ПолучитьПараметрыФункциональныхОпцийФормы(), ПараметрыФормы);
ПроверитьСвоюОпцию(ЭтотОбъект.ПолучитьФункциональнуюОпциюФормы("ПоказыватьЦены85"), Ложь);
ПараметрыИнтерфейса = СвойПараметрОрганизации(Стенд.СЦенами);
УстановитьПараметрыФункциональныхОпцийИнтерфейса(ПараметрыИнтерфейса);
ПроверитьСвоиПараметры(ПолучитьПараметрыФункциональныхОпцийИнтерфейса(), ПараметрыИнтерфейса);
ПроверитьСвоюОпцию(ПолучитьФункциональнуюОпциюИнтерфейса("ПоказыватьЦены85"), Истина);
ПроверитьСвоюОпцию(ЭтотОбъект.ПолучитьФункциональнуюОпциюФормы("ПоказыватьЦены85"), Ложь);
Исключение
ВосстановитьСвоиПараметры(ИсходныеФормы, ИсходныеИнтерфейса);
ВызватьИсключение;
КонецПопытки;
ВосстановитьСвоиПараметры(ИсходныеФормы, ИсходныеИнтерфейса);
Сообщить("Связь СКД, два контекста опции и восстановление параметров проверены");
КонецПроцедуры
&НаКлиенте
Функция КопироватьСвоиПараметры(Исходные)
Если ТипЗнч(Исходные) <> Тип("Структура") Или Исходные.Количество() > 1 Тогда
ВызватьИсключение "Нужны только собственные параметры нового стенда";
КонецЕсли;
Копия = Новый Структура;
Для Каждого Элемент Из Исходные Цикл
Если Элемент.Ключ <> "Организация85" Или ТипЗнч(Элемент.Значение) <> Тип("СправочникСсылка.УчебныеОрганизации85") Тогда
ВызватьИсключение "В снимке допускается только собственная типизированная организация";
КонецЕсли;
Копия.Вставить(Элемент.Ключ, Элемент.Значение);
КонецЦикла;
Возврат Копия;
КонецФункции
&НаКлиенте
Функция СвойПараметрОрганизации(Организация)
Если ТипЗнч(Организация) <> Тип("СправочникСсылка.УчебныеОрганизации85") Или Организация.Пустая() Тогда
ВызватьИсключение "Нужна настоящая своя непустая ссылка, не имя метаданных";
КонецЕсли;
Параметры = Новый Структура;
Параметры.Вставить("Организация85", Организация);
Возврат Параметры;
КонецФункции
&НаКлиенте
Процедура ПроверитьСвоиПараметры(Текущие, Ожидаемые)
СвоиТекущие = КопироватьСвоиПараметры(Текущие);
СвоиОжидаемые = КопироватьСвоиПараметры(Ожидаемые);
Если СвоиТекущие.Количество() <> СвоиОжидаемые.Количество() Тогда
ВызватьИсключение "Не совпал полный состав собственных параметров";
КонецЕсли;
Для Каждого Элемент Из СвоиОжидаемые Цикл
Значение = Неопределено;
Если Не СвоиТекущие.Свойство(Элемент.Ключ, Значение) Или Значение <> Элемент.Значение Тогда
ВызватьИсключение "Не совпали наличие и точная ссылка собственного параметра";
КонецЕсли;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьСвоюОпцию(Значение, Ожидаемое)
Если ТипЗнч(Значение) <> Тип("Булево") Или Значение <> Ожидаемое Тогда
ВызватьИсключение "Нужен ожидаемый булев результат собственной опции, не Null";
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Функция СвойСписокСброса(Исходные)
Сброс = Новый Массив;
Если Исходные.Количество() = 0 Тогда
Сброс.Добавить("Организация85");
КонецЕсли;
Возврат Сброс;
КонецФункции
&НаКлиенте
Процедура ВосстановитьСвоиПараметры(ИсходныеФормы, ИсходныеИнтерфейса)
ЭтотОбъект.УстановитьПараметрыФункциональныхОпцийФормы(ИсходныеФормы, СвойСписокСброса(ИсходныеФормы));
УстановитьПараметрыФункциональныхОпцийИнтерфейса(ИсходныеИнтерфейса, СвойСписокСброса(ИсходныеИнтерфейса));
ПроверитьСвоиПараметры(ЭтотОбъект.ПолучитьПараметрыФункциональныхОпцийФормы(), ИсходныеФормы);
ПроверитьСвоиПараметры(ПолучитьПараметрыФункциональныхОпцийИнтерфейса(), ИсходныеИнтерфейса);
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПодготовитьНаСервере()
ПроверитьСвойСтендОпций();
Если ПривилегированныйРежим() Тогда
ВызватьИсключение "Привилегированный режим в собственном опыте не нужен";
КонецЕсли;
Если Метаданные.ПараметрыФункциональныхОпций.Количество() <> 1 Или Метаданные.ФункциональныеОпции.Количество() <> 1 Тогда
ВызватьИсключение "Нужны только одна своя опция и один её параметр";
КонецЕсли;
Справочник = Метаданные.Справочники.Найти("УчебныеОрганизации85");
Если Справочник = Неопределено Или Справочник.Реквизиты.Количество() <> 1 Или Справочник.Иерархический Тогда
ВызватьИсключение "Нужен свой справочник с единственным булевым реквизитом";
КонецЕсли;
Реквизит = Справочник.Реквизиты.Найти("ПоказыватьЦены85");
Если Реквизит = Неопределено Тогда
ВызватьИсключение "Не объявлено своё хранилище опции";
КонецЕсли;
ПолныеТипы = Реквизит.Тип.Типы();
Если ПолныеТипы.Количество() <> 1 Или ПолныеТипы[0] <> Тип("Булево") Тогда
ВызватьИсключение "Собственное хранилище имеет только тип Булево";
КонецЕсли;
ПараметрОпций = Метаданные.ПараметрыФункциональныхОпций.Найти("Организация85");
Опция = Метаданные.ФункциональныеОпции.Найти("ПоказыватьЦены85");
Если ПараметрОпций = Неопределено Или Опция = Неопределено Тогда
ВызватьИсключение "Не объявлены действительные собственные опция и параметр";
КонецЕсли;
Если ПараметрОпций.Использование <> Справочник Или Опция.Хранение <> Реквизит Тогда
ВызватьИсключение "Параметр должен выбирать организацию, опция хранится в её реквизите";
КонецЕсли;
СЦенами = ПредопределенноеЗначение("Справочник.УчебныеОрганизации85.ЦеныВключены");
БезЦен = ПредопределенноеЗначение("Справочник.УчебныеОрганизации85.ЦеныОтключены");
ПроверитьСвоюОрганизацию(СЦенами);
ПроверитьСвоюОрганизацию(БезЦен);
Если СЦенами = БезЦен Или ТипЗнч(СЦенами.ПоказыватьЦены85) <> Тип("Булево")
Или ТипЗнч(БезЦен.ПоказыватьЦены85) <> Тип("Булево")
Или Не СЦенами.ПоказыватьЦены85 Или БезЦен.ПоказыватьЦены85 Тогда
ВызватьИсключение "Вручную подготовьте собственные две строки: Истина и Ложь";
КонецЕсли;
Схема = СоздатьСвоюСхемуОпций(СЦенами);
Копия = СоздатьСвоюСхемуОпций(СЦенами);
Схема.Параметры.Получить(0).Значение = БезЦен;
ПроверитьСвоюСхемуОпций(Схема, БезЦен);
ПроверитьСвоюСхемуОпций(Копия, СЦенами);
Схема.Параметры.Получить(0).Значение = СЦенами;
ПроверитьСвоюСхемуОпций(Схема, СЦенами);
ПроверитьСвоюСхемуОпций(Копия, СЦенами);
Стенд = Новый Структура;
Стенд.Вставить("СЦенами", СЦенами);
Стенд.Вставить("БезЦен", БезЦен);
Возврат Стенд;
КонецФункции
&НаСервереБезКонтекста
Процедура ПроверитьСвоюОрганизацию(Организация)
Если ТипЗнч(Организация) <> Тип("СправочникСсылка.УчебныеОрганизации85") Или Организация.Пустая() Тогда
ВызватьИсключение "Нужна своя настоящая непустая ссылка";
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция СоздатьСвоюСхемуОпций(Организация)
ПроверитьСвоюОрганизацию(Организация);
Схема = Новый СхемаКомпоновкиДанных;
Источник = Схема.ИсточникиДанных.Добавить();
Источник.Имя = "СвоиОпции85";
Источник.ТипИсточникаДанных = "Local";
Параметр = Схема.Параметры.Добавить();
Параметр.Имя = "ОрганизацияСКД85";
Параметр.ТипЗначения = Новый ОписаниеТипов("СправочникСсылка.УчебныеОрганизации85");
Параметр.Значение = Организация;
Параметр.Использование = ИспользованиеПараметраКомпоновкиДанных.Авто;
Параметр.ПараметрФункциональныхОпций = "Организация85";
Набор = Схема.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
Набор.Имя = "ОрганизацияИЦены85";
Набор.ИсточникДанных = "СвоиОпции85";
Набор.АвтоЗаполнениеДоступныхПолей = Ложь;
Набор.Запрос = "ВЫБРАТЬ Организации.Ссылка КАК Организация, Организации.ПоказыватьЦены85 КАК ЦеныВключены ИЗ Справочник.УчебныеОрганизации85 КАК Организации ГДЕ Организации.Ссылка = &ОрганизацияСКД85";
Имена = СтрРазделить("Организация,ЦеныВключены", ",");
Типы = СтрРазделить("СправочникСсылка.УчебныеОрганизации85,Булево", ",");
Для Индекс = 0 По 1 Цикл
Поле = Набор.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
Поле.Поле = Имена[Индекс];
Поле.ПутьКДанным = Имена[Индекс];
Поле.ТипЗначения = Новый ОписаниеТипов(Типы[Индекс]);
КонецЦикла;
ПроверитьСвоюСхемуОпций(Схема, Организация);
Возврат Схема;
КонецФункции
&НаСервереБезКонтекста
Процедура ПроверитьСвоюСхемуОпций(Схема, Организация)
ПроверитьСвоюОрганизацию(Организация);
Если ТипЗнч(Схема) <> Тип("СхемаКомпоновкиДанных") Или Схема.ИсточникиДанных.Количество() <> 1
Или Схема.НаборыДанных.Количество() <> 1 Или Схема.Параметры.Количество() <> 1 Тогда
ВызватьИсключение "Не совпал весь собственный состав схемы";
КонецЕсли;
Источник = Схема.ИсточникиДанных.Получить(0);
Если ТипЗнч(Источник) <> Тип("ИсточникДанныхСхемыКомпоновкиДанных")
Или Источник.Имя <> "СвоиОпции85" Или Источник.ТипИсточникаДанных <> "Local" Тогда
ВызватьИсключение "Не совпал свой источник";
КонецЕсли;
Параметр = Схема.Параметры.Получить(0);
ПараметрОпций = Метаданные.ПараметрыФункциональныхОпций.Найти("Организация85");
Если ТипЗнч(Параметр) <> Тип("ПараметрСхемыКомпоновкиДанных") Или ПараметрОпций = Неопределено
Или Параметр.Имя <> "ОрганизацияСКД85" Или Параметр.Значение <> Организация
Или ТипЗнч(Параметр.Значение) <> Тип("СправочникСсылка.УчебныеОрганизации85")
Или Параметр.ПараметрФункциональныхОпций <> ПараметрОпций.Имя
Или Параметр.Использование <> ИспользованиеПараметраКомпоновкиДанных.Авто
Или Схема.Параметры.Найти("ОрганизацияСКД85") <> Параметр
Или Схема.Параметры.Найти("НетТакогоПараметра85") <> Неопределено Тогда
ВызватьИсключение "Не совпали своя ссылка, объявленное имя привязки и поиск параметра";
КонецЕсли;
ПолныеТипы = Параметр.ТипЗначения.Типы();
Если ПолныеТипы.Количество() <> 1 Или ПолныеТипы[0] <> Тип("СправочникСсылка.УчебныеОрганизации85") Тогда
ВызватьИсключение "Не совпал полный собственный тип параметра";
КонецЕсли;
Набор = Схема.НаборыДанных.Получить(0);
Если ТипЗнч(Набор) <> Тип("НаборДанныхЗапросСхемыКомпоновкиДанных") Или Набор.Имя <> "ОрганизацияИЦены85"
Или Набор.ИсточникДанных <> "СвоиОпции85" Или Набор.АвтоЗаполнениеДоступныхПолей
Или Набор.Запрос <> "ВЫБРАТЬ Организации.Ссылка КАК Организация, Организации.ПоказыватьЦены85 КАК ЦеныВключены ИЗ Справочник.УчебныеОрганизации85 КАК Организации ГДЕ Организации.Ссылка = &ОрганизацияСКД85" Или Набор.Поля.Количество() <> 2 Тогда
ВызватьИсключение "Не совпал весь свой запрос и состав полей";
КонецЕсли;
Имена = СтрРазделить("Организация,ЦеныВключены", ",");
Типы = СтрРазделить("СправочникСсылка.УчебныеОрганизации85,Булево", ",");
Для Индекс = 0 По 1 Цикл
Поле = Набор.Поля.Получить(Индекс);
Если ТипЗнч(Поле) <> Тип("ПолеНабораДанныхСхемыКомпоновкиДанных")
Или Поле.Поле <> Имена[Индекс] Или Поле.ПутьКДанным <> Имена[Индекс] Тогда
ВызватьИсключение "Не совпали тип, имя, порядок и полный путь своего поля";
КонецЕсли;
ПолныеТипы = Поле.ТипЗначения.Типы();
Если ПолныеТипы.Количество() <> 1 Или ПолныеТипы[0] <> Тип(Типы[Индекс]) Тогда
ВызватьИсключение "Не совпал полный тип своего поля";
КонецЕсли;
КонецЦикла;
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ПроверитьСвойСтендОпций()
Если Метаданные.Справочники.Количество() <> 1 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
ВызватьИсключение "Нужен свой новый стенд только с одним учебным справочником";
КонецЕсли;
Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
КонецЕсли;
Источники = Новый Массив;
Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
Для Каждого Источник Из Источники Цикл
Расширения = РасширенияКонфигурации.Получить(, Источник);
Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
ВызватьИсключение "Native список расширений должен иметь тип Массив";
КонецЕсли;
Если Расширения.Количество() <> 0 Тогда
ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
КонецЕсли;
КонецЦикла;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
КонецЕсли;
КонецПроцедурыРазбор по шагам
На сервере проверяем точную платформу, свой состав конфигурации, отсутствие расширений/транзакции/привилегированного режима. До любого изменения UI подтверждаем реальное объявление параметра, Использование=свой справочник, Хранение=его булев реквизит, настоящие различные непустые предопределённые ссылки и разные булевы значения.
Имя ОрганизацияСКД85 — параметр запроса и схемы. Имя Организация85 — отдельный параметр функциональных опций. Свойство ПараметрФункциональныхОпций содержит второе имя БЕЗ амперсанда; Значение содержит настоящую ссылку. В собственном запросе &ОрганизацияСКД85 используется для отбора по ссылке.
Две независимые схемы создают свои источник, набор, два явно типизированных поля и параметр. Меняем default оригинала на вторую свою ссылку, полностью проверяем модель и сохранность копии, возвращаем первую ссылку. СКД здесь НЕ исполняется и ничего не устанавливает в форме сама по себе.
На клиенте снимаем независимые копии исходных структур формы и интерфейса. Проверяем весь состав: только отсутствие параметров либо один ключ Организация85 с собственным ссылочным типом. Недопустимый снимок останавливает опыт до сеттеров.
Установить параметры ФОРМЫ на организацию с ценами: getter структуры должен вернуть её точную ссылку, getter опции — Булево Истина. Установить параметры ИНТЕРФЕЙСА на организацию без цен: getter интерфейса должен вернуть Булево Ложь, а значение формы остаться Истина. Это разные области действия.
Поменять форму на организацию без цен, интерфейс — на организацию с ценами. Сверить полные структуры и булевы результаты: форма Ложь, интерфейс Истина; повторное чтение формы проверяет независимость после изменения интерфейса. Каждый getter опции обращается к серверу, результат не кэшируется по контракту.
Восстановление есть после успеха и в Исключение. Если исходный ключ присутствовал — установить его прежнюю ссылку. Если ключ отсутствовал — передать пустую структуру И массив сброса [Организация85]. Одна пустая структура не сбрасывает ранее установленный ключ. Затем сверить весь восстановленный состав.
Как проверить результат
Будущий ожидаемый переход: форма Истина / интерфейс Ложь → форма Ложь / интерфейс Истина → исходные две структуры, включая отсутствие ключа. Булев тип проверяется отдельно: Null, строка и число не принимаются за успешное чтение опции.
Будущая модель СКД: параметр ОрганизацияСКД85 имеет единственный тип СправочникСсылка.УчебныеОрганизации85, default=первая своя ссылка, привязка Организация85; оба описания полей и весь запрос сверены. Это проверка объявления, не доказательство выполненного отбора или передачи значения движком СКД.
Будущий отрицательный контроль: у второй собственной строки тоже вручную включить ПоказыватьЦены85. ПодготовитьНаСервере должно отказать до снимков/изменений формы и интерфейса. Другой контроль: опечатка в имени параметра привязки должна нарушить полный контроль схемы. Здесь эти проверки не запускались.
runtimeVerifiedScenarios=0. Статически сверены контракты установленной справки и сборка/поиск HTML. Настоящих изменений UI, чтения записей через 1С, запросов, сети, записи/печати и рабочих баз в этой работе не было.
Ожидаемый результат
Одна реальная параметризованная опция связана со ссылочным параметром СКД; форма и интерфейс исследуются независимо с точным восстановлением состояния.
На что обратить внимание
Параметр опции — имя метаданных, значение параметра — настоящая ссылка. Не передавать Строка или Булево вместо ссылки и не использовать Неопределено как фиктивную организацию.
Хранение и Использование читаются на сервере, а глобальные методы параметров ИНТЕРФЕЙСА доступны только в клиентском контексте. Весь код — модуль управляемой формы, не серверный общий модуль.
Сеттеры автоматически обновляют форму/интерфейс и обращаются к серверу; это побочные эффекты будущего учебного запуска. Не выполнять в рабочем сеансе. Функциональная опция не заменяет права доступа, и видимость полей/команд здесь не обещается.
Неиерархический справочник выбран намеренно: при ссылке на группу и неприменимом к группе реквизите getter может вернуть Null. Значения двух строк готовятся вручную заранее и этим примером не изменяются.
Снимки не обнуляют произвольные параметры. В новом стенде разрешён только Организация85; чужие ключи вызывают исключение до изменений. При восстановлении нельзя одновременно сбрасывать и устанавливать тот же ключ.
После аварии сеанса или ошибки самого восстановления возврат UI не гарантирован: закрыть свой учебный клиент и открыть свежий. Код не скрывает исключение и не утверждает транзакционность интерфейса.
В реальной КА2 объявлен параметр функциональных опций Организация с Использованием справочника Организации; схема отчёта ДанныеДляОтраженияРасчетовРезервовПоОплатеТрудаВБухучете связывает с ним ссылочный параметр Организация. Здесь повторён принцип в собственных метаданных, не вызывается рабочий отчёт.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.