РежимОтображенияОкна применяется только в интерфейсе Версия 8.5 и варианте ОткрыватьДанныеВДиалоговыхОкнах. Пульт получает два настоящих экземпляра одной подготовленной общей формы с разными ключами уникальности и задаёт ВОсновномОкне/ВДиалоговомОкне до открытия. Чтение метаданных и enum НЕ доказывает действующий вариант окон или визуальный маршрут.
Где и как запускать
Полный основной модуль ОбщаяФорма.УчебныйПультРежимов85. Полный модуль собственной общей формы УчебноеОкноРежима85 и полный запуск общей команды приведены отдельными supportingModules. Desktop 8.5.1.1343, новая база/пользователь, обязательные Версия 8.5 и открытие данных в диалоговых окнах.
Подготовка
Создайте отдельную новую пустую учебную базу и отдельного нового пользователя платформы 8.5.1.1343 без переноса пользовательских настроек. Корневое имя конфигурации УчебнаяМастерскаяФорм85, язык встроенного языка Русский, ОсновнойРежимЗапуска=УправляемоеПриложение, режим совместимости Не использовать. Здесь 1С не запускалась; подготовку далее выполняйте самостоятельно только в своей новой базе.
В свойствах корня конфигурации задайте точно РежимСовместимостиИнтерфейса=Версия8_5 и ВариантОткрытияОконКлиентскогоПриложения=ОткрыватьДанныеВДиалоговыхОкнах. Обновите только свой новый учебный стенд и запускайте тонкий либо толстый управляемый клиент Windows. Не изменяйте интерфейс или профиль рабочего пользователя.
В каждом уроке используйте только перечисленные собственные общие управляемые формы с пустыми модулями. Все три урока независимы: не объединяйте их основные и поддерживающие модули. У всех этих форм АвтоматическоеСохранениеДанныхВНастройках оставьте НеИспользовать; пользовательское сохранение состава формы для опыта не используйте.
В собственной роли разрешите учебную подсистему, общие формы и общие команды выбранного урока. Справочники, документы, регистры, предметные записи, сеть, файлы, печать и профили рабочих пользователей для уроков не нужны.
Событию ПриСозданииНаСервере каждой созданной формы назначьте её собственную одноимённую процедуру полного модуля. Клиентские процедуры команд свяжите с точными действиями своих команд. Код размещайте на уровне нужного модуля, не внутри другого обработчика.
Настройка метаданных и проверка перечисления не доказывают действующий вариант окон или фактический визуальный маршрут. В своём новом клиенте вручную убедитесь, что действует интерфейс Версия 8.5 и открытие данных в диалоговых окнах. Если используются вкладки, визуальный опыт третьего урока не подтверждён, даже когда свойство режима содержит нужный enum.
Создайте собственную подсистему МастерскаяФорм85 и включайте общие команды без параметра в её командный интерфейс. Каждый отдельный блок запуска вставляется в Общие → Общие команды → указанное имя команды → Модуль команды. Не вставляйте его в модуль формы.
Статические проверки сверяют установленное API 8.5.1.1343, но не компилируют и не запускают 1С. Доступность контролов, порядок событий, сохранность завершённого ввода, новая компоновка и размещение окон требуют ручных контрольных действий на подготовленном стенде.
Для этого урока обе настройки корня обязательны: РежимСовместимостиИнтерфейса=Версия8_5 и ВариантОткрытияОконКлиентскогоПриложения=ОткрыватьДанныеВДиалоговыхОкнах. Используйте новый учебный пользовательский профиль без переноса старых настроек. При открытии данных во вкладках РежимОтображенияОкна не используется по native, даже если enum в объекте прочитан успешно.
Создайте общие управляемые формы УчебныйПультРежимов85 и УчебноеОкноРежима85. Полный основной код вставьте в УчебныйПультРежимов85 → Модуль формы. Полный отдельный блок УчебноеОкноРежима85 вставьте в её собственный Модуль формы. Каждой форме назначьте собственное событие ПриСозданииНаСервере.
В пульте создайте два скрытых реквизита КлючОсновногоЭкземпляра и КлючДиалоговогоЭкземпляра типа Строка длиной 64. Они генерируются с разными префиксами и собственными UUID; равенство запрещено явной проверкой. Пользователь не редактирует их, и значения передаются четвёртым аргументом ПолучитьФорму.
В пульте создайте СостояниеУрока типа Строка длиной 300 и поле ПолеСостоянияУрока с ПутьКДанным=СостояниеУрока, ТолькоПросмотр=Истина. Создайте команды ОткрытьДваВарианта и ПроверитьДваЭкземпляра с одноимёнными действиями, ИзменяетСохраняемыеДанные=Ложь, кнопки Открыть два варианта и Проверить два экземпляра.
На вкладке Параметры формы УчебноеОкноРежима85 создайте параметр МеткаЭкземпляра и снимите Ключевой. Он передаётся строкой Основная область либо Диалоговое окно. На вкладке Реквизиты той же формы создайте отдельный реквизит МеткаЭкземпляра типа Строка длиной 50 и Количество с единственным типом Число длиной 3, точность 0, допустимый знак Неотрицательный. Параметр и реквизит не подменяют друг друга: сервер явно переносит проверенную метку.
В УчебноеОкноРежима85 выведите МеткаЭкземпляра полем ПолеМетки с ПутьКДанным=МеткаЭкземпляра, ТолькоПросмотр=Истина; Количество полем ввода ПолеКоличества с одноимённым путём, ТолькоПросмотр=Ложь. Сервер задаёт каждой новой форме собственную тройку, границы 0–99 и назначает полный КоличествоИзменилось через УстановитьДействие("ПриИзменении", ...).
Создайте общую команду ОткрытьПультРежимов85. Её отдельный полный блок запуска вставьте в Общие → Общие команды → ОткрытьПультРежимов85 → Модуль команды. Он открывает только ОбщаяФорма.УчебныйПультРежимов85; два дочерних экземпляра получает сам пульт.
Пульт не использует одинаковый default key или один Истина вместо двух именованных ключей: свой основной и диалоговый ключи реально различны и стабильны в пределах этого пульта. Повторное нажатие получает соответствующий собственный экземпляр, а не случайно один уже открытый объект.
РежимОтображенияОкна задаётся только пока соответствующая форма ещё закрыта. Уже открытому своему экземпляру код не меняет режим, а сверяет его с запрошенным. Обе формы перед открытием получают новое РежимБлокировкиПриОткрытииОкнаФормы.НеБлокировать; размещение и блокировка — отдельные настройки.
Метаданные.ВариантОткрытияОконКлиентскогоПриложения читается на сервере как условие конфигурации, не как доказательство действующего пользовательского варианта. ТекущийВариантИнтерфейсаКлиентскогоПриложения проверяет интерфейс; он не возвращает вариант окон. Если визуально маршрут иной, прекратите опыт и проверьте действующую настройку только своего нового пользователя вручную.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если ТекущийВариантИнтерфейсаКлиентскогоПриложения() <> ВариантИнтерфейсаКлиентскогоПриложения.Версия8_5 Тогда
ВызватьИсключение "В своём учебном стенде нужен интерфейс Версия 8.5";
КонецЕсли;
Если Метаданные.ВариантОткрытияОконКлиентскогоПриложения <> ВариантОткрытияОконКлиентскогоПриложения.ОткрыватьДанныеВДиалоговыхОкнах Тогда
ВызватьИсключение "В конфигурации учебного стенда нужен вариант ОткрыватьДанныеВДиалоговыхОкнах";
КонецЕсли;
ЭтаФорма.КлючОсновногоЭкземпляра = "workshop-main-" + Строка(Новый УникальныйИдентификатор);
ЭтаФорма.КлючДиалоговогоЭкземпляра = "workshop-dialog-" + Строка(Новый УникальныйИдентификатор);
Если ЭтаФорма.КлючОсновногоЭкземпляра = ЭтаФорма.КлючДиалоговогоЭкземпляра Тогда
ВызватьИсключение "Два собственных экземпляра должны иметь разные ключи уникальности";
КонецЕсли;
ЭтаФорма.РежимБлокировкиПриОткрытииОкна = РежимБлокировкиПриОткрытииОкнаФормы.НеБлокировать;
ЭтаФорма.СостояниеУрока = "Настройки конфигурации проверены; действующий вариант окон и отображение ещё надо проверить вручную";
КонецПроцедуры
&НаКлиенте
Функция ПолучитьСвойЭкземпляр(Знач КлючЭкземпляра, Знач МеткаЭкземпляра, Знач ЗапрошенныйРежим)
ПараметрыЭкземпляра = Новый Структура("МеткаЭкземпляра", МеткаЭкземпляра);
СвояФорма = ПолучитьФорму("ОбщаяФорма.УчебноеОкноРежима85", ПараметрыЭкземпляра, ЭтаФорма, КлючЭкземпляра);
Если СвояФорма = Неопределено Тогда
ВызватьИсключение "Собственный экземпляр формы не был получен";
КонецЕсли;
Если ТипЗнч(СвояФорма) <> Тип("ФормаКлиентскогоПриложения") Тогда
ВызватьИсключение "Ожидалась собственная управляемая форма";
КонецЕсли;
Если СвояФорма.МеткаЭкземпляра <> МеткаЭкземпляра Тогда
ВызватьИсключение "Получен экземпляр с другой собственной меткой";
КонецЕсли;
Если СвояФорма.Открыта() Тогда
Если СвояФорма.РежимОтображенияОкна <> ЗапрошенныйРежим Тогда
ВызватьИсключение "Уже открытому своему экземпляру назначен другой режим. Закройте свои окна и начните опыт заново";
КонецЕсли;
Иначе
СвояФорма.РежимОтображенияОкна = ЗапрошенныйРежим;
СвояФорма.РежимБлокировкиПриОткрытииОкна = РежимБлокировкиПриОткрытииОкнаФормы.НеБлокировать;
КонецЕсли;
Возврат СвояФорма;
КонецФункции
&НаКлиенте
Процедура ОткрытьДваВарианта(Команда)
Основная = ПолучитьСвойЭкземпляр(ЭтаФорма.КлючОсновногоЭкземпляра, "Основная область", РежимОтображенияОкнаФормы.ВОсновномОкне);
Диалоговая = ПолучитьСвойЭкземпляр(ЭтаФорма.КлючДиалоговогоЭкземпляра, "Диалоговое окно", РежимОтображенияОкнаФормы.ВДиалоговомОкне);
Если Основная = Диалоговая Тогда
ВызватьИсключение "Вместо двух собственных экземпляров получен один";
КонецЕсли;
ДоОткрытияОсновной = Основная.Количество;
ДоОткрытияДиалоговой = Диалоговая.Количество;
Основная.Открыть();
Диалоговая.Открыть();
Если Основная.Количество <> ДоОткрытияОсновной Или Диалоговая.Количество <> ДоОткрытияДиалоговой Тогда
ВызватьИсключение "Открытие своих форм изменило локальные количества";
КонецЕсли;
ЭтаФорма.СостояниеУрока = "Запрошены ВОсновномОкне и ВДиалоговомОкне для двух своих экземпляров. Фактическое размещение проверьте вручную";
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьДваЭкземпляра(Команда)
Основная = ПолучитьСвойЭкземпляр(ЭтаФорма.КлючОсновногоЭкземпляра, "Основная область", РежимОтображенияОкнаФормы.ВОсновномОкне);
Диалоговая = ПолучитьСвойЭкземпляр(ЭтаФорма.КлючДиалоговогоЭкземпляра, "Диалоговое окно", РежимОтображенияОкнаФормы.ВДиалоговомОкне);
Если Не Основная.Открыта() Или Не Диалоговая.Открыта() Тогда
ЭтаФорма.СостояниеУрока = "Оба своих экземпляра должны быть открыты. Закрытая форма не считается проверенным открытым окном";
Возврат;
КонецЕсли;
Если Основная = Диалоговая Тогда
ВызватьИсключение "Нужны два разных своих экземпляра";
КонецЕсли;
ЭтаФорма.СостояниеУрока = СтрШаблон("Разные экземпляры: %1=%2; %3=%4. Режимы свойств прочитаны, визуальный маршрут ещё проверяется вручную",
Основная.МеткаЭкземпляра, Основная.Количество, Диалоговая.МеткаЭкземпляра, Диалоговая.Количество);
КонецПроцедурыУчебноеОкноРежима85
Конфигуратор → Общие → Общие формы → УчебноеОкноРежима85 → Модуль формы
Полный отдельный модуль собственной общей управляемой формы УчебноеОкноРежима85; не часть основного модуля. Здесь 1С не запускалась.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если ТекущийВариантИнтерфейсаКлиентскогоПриложения() <> ВариантИнтерфейсаКлиентскогоПриложения.Версия8_5 Тогда
ВызватьИсключение "В своём учебном стенде нужен интерфейс Версия 8.5";
КонецЕсли;
Если Метаданные.ВариантОткрытияОконКлиентскогоПриложения <> ВариантОткрытияОконКлиентскогоПриложения.ОткрыватьДанныеВДиалоговыхОкнах Тогда
ВызватьИсключение "В конфигурации учебного стенда нужен вариант ОткрыватьДанныеВДиалоговыхОкнах";
КонецЕсли;
Если Не ЭтаФорма.Параметры.Свойство("МеткаЭкземпляра", ПереданнаяМетка) Тогда
ВызватьИсключение "Нужен собственный параметр МеткаЭкземпляра";
КонецЕсли;
Если ТипЗнч(ПереданнаяМетка) <> Тип("Строка") Тогда
ВызватьИсключение "Собственная метка должна быть строкой";
КонецЕсли;
Если ПереданнаяМетка <> "Основная область" И ПереданнаяМетка <> "Диалоговое окно" Тогда
ВызватьИсключение "Передана неподготовленная собственная метка";
КонецЕсли;
ЭтаФорма.МеткаЭкземпляра = ПереданнаяМетка;
ЭтаФорма.Заголовок = "Свой экземпляр: " + ПереданнаяМетка;
ЭтаФорма.Количество = 3;
ЭтаФорма.Элементы.ПолеКоличества.МинимальноеЗначение = 0;
ЭтаФорма.Элементы.ПолеКоличества.МаксимальноеЗначение = 99;
ЭтаФорма.Элементы.ПолеКоличества.УстановитьДействие("ПриИзменении", "КоличествоИзменилось");
КонецПроцедуры
&НаКлиенте
Процедура КоличествоИзменилось(Элемент)
Если ТипЗнч(ЭтаФорма.Количество) <> Тип("Число") Тогда
ВызватьИсключение "Своё количество должно оставаться числом";
КонецЕсли;
Если ЭтаФорма.Количество < 0 Или ЭтаФорма.Количество > 99 Или ЭтаФорма.Количество <> Цел(ЭтаФорма.Количество) Тогда
ВызватьИсключение "Нужно целое количество от 0 до 99 только в своём экземпляре";
КонецЕсли;
КонецПроцедурыОткрытьПультРежимов85
Конфигуратор → Общие → Общие команды → ОткрытьПультРежимов85 → Модуль команды
Полный отдельный модуль собственной общей команды; открывает только указанную собственную основную форму. Здесь 1С не запускалась.
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
ОткрытьФорму("ОбщаяФорма.УчебныйПультРежимов85");
КонецПроцедурыРазбор по шагам
В собственном учебном разделе откройте пульт. Сервер проверяет платформу, имя стенда, текущий интерфейс и подготовленный вариант окон в метаданных; подпись сразу предупреждает, что runtime маршрут ещё не подтверждён.
Нажмите Открыть два варианта. Два разных собственных ключа передаются в ПолучитьФорму вместе с владельцем-пультом и своей меткой. Код проверяет Неопределено, тип формы, полученную метку и то, что два объекта не совпадают.
Для ещё не открытого экземпляра Основная область задаётся РежимОтображенияОкнаФормы.ВОсновномОкне, для Диалоговое окно — ВДиалоговомОкне. Авто не используется, и свойства устанавливаются до вызовов Открыть.
Вручную проверьте фактическое размещение: первый свой экземпляр должен находиться в рабочей области основного окна, второй — в диалоговом окне, если действует обязательный вариант открытия. Не приписывайте диалогу автоматически модальность: код явно НеБлокировать.
У обоих новых экземпляров количество 3, а заголовки и поле метки различны. В Основная область введите 7 и завершите ввод; в диалоговом экземпляре должно остаться 3. Нажмите Проверить два экземпляра в доступном пульте: подпись показывает реальные 7 и 3.
В Диалоговое окно введите 9 и завершите ввод. Повторная проверка должна показать Основная область=7 и Диалоговое окно=9. Это проверка независимых локальных реквизитов, не сохранения в информационной базе.
Нажмите Открыть два варианта повторно. Ключи не генерируются заново: соответствующие собственные открытые экземпляры переиспользуются, режим сверяется, а код сравнивает количества до/после Открыть. Значения 7 и 9 не должны возвращаться к тройкам.
Закройте только один свой экземпляр и нажмите Проверить два экземпляра. ПолучитьФорму может подготовить новый закрытый объект, но Открыта его отвергнет: сообщение не выдаёт его за открытое проверенное окно. Нажатие Открыть два варианта заново открывает новую собственную форму с начальной тройкой; оставшийся открытый экземпляр сохраняет своё значение.
Завершите опыт закрытием только своих двух экземпляров и пульта. Код не меняет текущий пользовательский вариант окон, не сохраняет профиль, не записывает локальные количества и не обещает пиксельные размеры окон.
Как проверить результат
У пульта два разных ключа и два разных реальных объекта формы; метки и заголовки Основная область/Диалоговое окно совпадают с собственной подготовкой.
Ручной визуальный контроль при действующем ОткрыватьДанныеВДиалоговыхОкнах подтверждает рабочую область для ВОсновномОкне и диалог для ВДиалоговомОкне. При вкладках опыт размещения не считается подтверждённым.
После завершённых правок пульт читает 7/3, затем 7/9 из соответствующих собственных экземпляров. Повторное открытие с теми же ключами сохраняет данные уже открытых форм.
Пульт остаётся доступен, поскольку оба экземпляра открыты с НеБлокировать. Эта настройка не определяет основное/диалоговое размещение и не заменяет РежимОтображенияОкна.
Закрытый экземпляр не считается открытым после одного ПолучитьФорму. Проверить два экземпляра требует оба Открыта; новый закрытый объект не доказывает прежний UI.
Сообщения о присвоенном enum, чтении метаданных и сравнении данных не являются доказательством действующего варианта окон или отрисовки. Зафиксируйте отдельный ручной протокол размещения на активной теме клиента.
Ожидаемый результат
Два разных собственных экземпляра получают точные явные режимы до открытия и сохраняют независимые локальные реквизиты. Визуальное размещение остаётся будущей ручной проверкой при обоих обязательных условиях; нативная/static сверка его не подтверждает.
На что обратить внимание
РежимОтображенияОкна используется только в интерфейсе Версия8_5 и варианте ОткрыватьДанныеВДиалоговыхОкнах; в других случаях не используется. Оба условия обязательны, а не альтернативны.
Чтение метаданных и enum НЕ доказывает действующий вариант окон или визуальный маршрут. Свойство метаданных описывает конфигурацию; отдельный пользовательский вариант и фактическое размещение требуют ручной проверки нового учебного сеанса.
ПолучитьФорму ищет уже открытые формы с учётом имени, ключевых параметров, владельца и четвёртого аргумента Уникальность. Один одинаковый ключ мог бы переиспользовать форму; здесь реальные ключи различаются префиксом/UUID и дополнительно проверяются.
ВДиалоговомОкне не означает обязательную модальность. Блокировка задаётся отдельно НеБлокировать; пульт не должен становиться недоступным вместе с дочерним окном.
Урок не меняет режим уже открытого окна и не обещает применение нового свойства к открытому экземпляру. При несовпадении режима прекратите опыт и закройте только свои формы.
Не используйте настройки рабочего пользователя и не сохраняйте системный профиль ради демонстрации. Все поля локальны; здесь нет файлов, предметных записей, печати или публикации.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.