ФормаКлиентскогоПриложения.ЭтотОбъект

Свойства · ThisObject

Тип: ФормаКлиентскогоПриложения. Содержит данную форму. Может быть использовано в модуле формы для получения данной формы и передачи ее в качестве параметра в другие формы, глобальные процедуры и функции и т.д.

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

ФормаКлиентскогоПриложения.ЭтотОбъект (ClientApplicationForm.ThisObject)

ФормаКлиентскогоПриложения (ClientApplicationForm)

ЭтотОбъект (ThisObject)

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

Использование:
Только чтение.
Описание:
Тип: ФормаКлиентскогоПриложения.
Содержит данную форму. Может быть использовано в модуле формы для получения данной формы и передачи ее в качестве параметра в другие формы, глобальные процедуры и функции и т.д.
Доступность:

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

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

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

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

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

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

На сервере получаем описание только своего реквизита, возвращаем простой снимок и на клиенте сравниваем его с настоящим числовым значением и состоянием собственной формы.

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

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

Подготовка

  1. В отдельной учебной базе платформы 8.5.1.1343 создайте внешнюю обработку УчебнаяФорма85 с пустой управляемой основной формой. Используйте тонкий клиент Windows.

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

  3. Не создавайте вручную ЗначениеПримера, ПолеПримера и кнопку: код создаёт их полностью. Каждый урок запускайте в отдельной копии своей формы.

  4. Сохраните свою EPF и откройте её в учебной базе. Собственное количество начинается с 3, цена книги задана в коде как 250; исходный расчёт равен 750.

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

  6. Команда расчёта имеет ИзменяетСохраняемыеДанные = Ложь. Уроки изменяют только свой интерфейс и значения собственной формы, не конфигурацию и не рабочие данные.

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

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


    КомандаДействия = ЭтаФорма.Команды.Добавить("УчебноеДействие");
    КомандаДействия.Действие = "УчебноеДействие";
    КомандаДействия.Заголовок = "Выполнить собственный учебный шаг";
    КомандаДействия.Подсказка = "Действие только над данными учебной формы";
    КомандаДействия.ИзменяетСохраняемыеДанные = Ложь;
    Кнопка = Элементы.Добавить("КнопкаУчебноеДействие", Тип("КнопкаФормы"));
    Кнопка.ИмяКоманды = КомандаДействия.Имя;
    Кнопка.Заголовок = КомандаДействия.Заголовок;
КонецПроцедуры

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

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

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

  1. ПолучитьРеквизиты доступен на сервере и возвращает массив описаний, а не массив текущих числовых значений.

  2. В серверном помощнике ищем своё точное имя с пустым родительским путём. Объект внешней обработки и прочие стандартные реквизиты не считаем отсутствующими.

  3. Из описания собираем простую структуру: имя, заголовок, путь, признак сохраняемости и факт включения числового типа.

  4. На клиенте проверяем собственную открытую форму, её ЭтотОбъект, модальный признак и тип окна. Readonly-свойства не присваиваем.

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

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

  1. При исходных 3 ожидаются восемь Истина, сумма 750 и фактические сведения своей формы. Измените количество на 5: описание не меняется, расчёт становится 1250.

  2. В своём открытии через Файл → Открыть сопоставьте модальный признак и окно. Не путайте модальность окна с монопольным режимом всей базы.

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

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

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

  1. ПолучитьРеквизиты не вызывается в тонком клиенте напрямую: используется серверная функция.

  2. ТипЗначения описания — ОписаниеТипов, а не число 3. Проверка СодержитТип не вычисляет количество.

  3. ИмяФормы, Окно, ИспользуемыйСерверФормы, ЭтотОбъект и МодальныйРежим — readonly; их нельзя менять для имитации другого состояния.

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

Функциональная опция по организации: СКД, форма и интерфейс без смешения контекстов

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

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

Полный модуль управляемой формы собственной внешней обработки УчебныеОпции85: UI-опыт на клиенте, подготовка метаданных и модель СКД на сервере. Здесь не запускался.

Подготовка

  1. НОВАЯ отдельная база, не копия рабочей: платформа точно8.5.1.1343, конфигурация УчебныеОпции85, совместимость Не использовать. Только свой неиерархический справочник УчебныеОрганизации85, без бизнес-объектов, расширений, подписок и заданий. Модули конфигурации вручную пустые. Ничего из КА2 не переносить в рабочую базу.

  2. Конфигуратор → Справочники → УчебныеОрганизации85 → Реквизиты: единственный реквизит ПоказыватьЦены85, тип только Булево. Предопределённые данные: элементы ЦеныВключены и ЦеныОтключены, не группы, с разными кодами и понятными наименованиями. Разрешить редактирование собственного реквизита в стандартной форме элемента.

  3. Общие → Функциональные опции → ПоказыватьЦены85: Хранение = Справочник.УчебныеОрганизации85.Реквизит.ПоказыватьЦены85. Общие → Параметры функциональных опций → Организация85: Использование = Справочник.УчебныеОрганизации85. Параметр должен быть реально объявлен; это не булев флаг и не название организации. Состав опции в этом опыте не используется для обещаний видимости UI.

  4. Будущая ручная подготовка ТОЛЬКО своего стенда: сохранить, Обновить конфигурацию базы данных (F7), начать свежий сеанс; открыть два своих предопределённых элемента. У ЦеныВключены вручную установить ПоказыватьЦены85=Истина, у ЦеныОтключены вручную установить ПоказыватьЦены85=Ложь и сохранить. Это подготовка данных до опыта, не автоматический запуск или запись данным кодом. В этой работе ни F7, ни записи, ни 1С не выполнялись.

  5. Создать свою внешнюю обработку УчебныеОпции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 Тогда
            ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
        КонецЕсли;
    КонецЦикла;
    Если ТранзакцияАктивна() Тогда
        ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
    КонецЕсли;
КонецПроцедуры

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

  1. На сервере проверяем точную платформу, свой состав конфигурации, отсутствие расширений/транзакции/привилегированного режима. До любого изменения UI подтверждаем реальное объявление параметра, Использование=свой справочник, Хранение=его булев реквизит, настоящие различные непустые предопределённые ссылки и разные булевы значения.

  2. Имя ОрганизацияСКД85 — параметр запроса и схемы. Имя Организация85 — отдельный параметр функциональных опций. Свойство ПараметрФункциональныхОпций содержит второе имя БЕЗ амперсанда; Значение содержит настоящую ссылку. В собственном запросе &ОрганизацияСКД85 используется для отбора по ссылке.

  3. Две независимые схемы создают свои источник, набор, два явно типизированных поля и параметр. Меняем default оригинала на вторую свою ссылку, полностью проверяем модель и сохранность копии, возвращаем первую ссылку. СКД здесь НЕ исполняется и ничего не устанавливает в форме сама по себе.

  4. На клиенте снимаем независимые копии исходных структур формы и интерфейса. Проверяем весь состав: только отсутствие параметров либо один ключ Организация85 с собственным ссылочным типом. Недопустимый снимок останавливает опыт до сеттеров.

  5. Установить параметры ФОРМЫ на организацию с ценами: getter структуры должен вернуть её точную ссылку, getter опции — Булево Истина. Установить параметры ИНТЕРФЕЙСА на организацию без цен: getter интерфейса должен вернуть Булево Ложь, а значение формы остаться Истина. Это разные области действия.

  6. Поменять форму на организацию без цен, интерфейс — на организацию с ценами. Сверить полные структуры и булевы результаты: форма Ложь, интерфейс Истина; повторное чтение формы проверяет независимость после изменения интерфейса. Каждый getter опции обращается к серверу, результат не кэшируется по контракту.

  7. Восстановление есть после успеха и в Исключение. Если исходный ключ присутствовал — установить его прежнюю ссылку. Если ключ отсутствовал — передать пустую структуру И массив сброса [Организация85]. Одна пустая структура не сбрасывает ранее установленный ключ. Затем сверить весь восстановленный состав.

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

  1. Будущий ожидаемый переход: форма Истина / интерфейс Ложь → форма Ложь / интерфейс Истина → исходные две структуры, включая отсутствие ключа. Булев тип проверяется отдельно: Null, строка и число не принимаются за успешное чтение опции.

  2. Будущая модель СКД: параметр ОрганизацияСКД85 имеет единственный тип СправочникСсылка.УчебныеОрганизации85, default=первая своя ссылка, привязка Организация85; оба описания полей и весь запрос сверены. Это проверка объявления, не доказательство выполненного отбора или передачи значения движком СКД.

  3. Будущий отрицательный контроль: у второй собственной строки тоже вручную включить ПоказыватьЦены85. ПодготовитьНаСервере должно отказать до снимков/изменений формы и интерфейса. Другой контроль: опечатка в имени параметра привязки должна нарушить полный контроль схемы. Здесь эти проверки не запускались.

  4. runtimeVerifiedScenarios=0. Статически сверены контракты установленной справки и сборка/поиск HTML. Настоящих изменений UI, чтения записей через 1С, запросов, сети, записи/печати и рабочих баз в этой работе не было.

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

Одна реальная параметризованная опция связана со ссылочным параметром СКД; форма и интерфейс исследуются независимо с точным восстановлением состояния.

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

  1. Параметр опции — имя метаданных, значение параметра — настоящая ссылка. Не передавать Строка или Булево вместо ссылки и не использовать Неопределено как фиктивную организацию.

  2. Хранение и Использование читаются на сервере, а глобальные методы параметров ИНТЕРФЕЙСА доступны только в клиентском контексте. Весь код — модуль управляемой формы, не серверный общий модуль.

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

  4. Неиерархический справочник выбран намеренно: при ссылке на группу и неприменимом к группе реквизите getter может вернуть Null. Значения двух строк готовятся вручную заранее и этим примером не изменяются.

  5. Снимки не обнуляют произвольные параметры. В новом стенде разрешён только Организация85; чужие ключи вызывают исключение до изменений. При восстановлении нельзя одновременно сбрасывать и устанавливать тот же ключ.

  6. После аварии сеанса или ошибки самого восстановления возврат UI не гарантирован: закрыть свой учебный клиент и открыть свежий. Код не скрывает исключение и не утверждает транзакционность интерфейса.

  7. В реальной КА2 объявлен параметр функциональных опций Организация с Использованием справочника Организации; схема отчёта ДанныеДляОтраженияРасчетовРезервовПоОплатеТрудаВБухучете связывает с ним ссылочный параметр Организация. Здесь повторён принцип в собственных метаданных, не вызывается рабочий отчёт.

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

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

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

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

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