Не desktop имитация: нужен собственный автономный мобильный клиент и два действительно разных сервера исполнения одной формы. Источник и ПараметрыЗаполнения предоставляет настоящий lifecycle события.
Где и как запускать
Полный модуль ОбщаяФорма.Черновик85 своего мобильного клиента С АВТОНОМНЫМ РЕЖИМОМ; server создания и mobile client native lifecycle.
Подготовка
Создайте отдельную пустую CF УчебноеПереоткрытие85 на собственной платформе 8.5.1.1343 без бизнес-объектов и расширений. Используйте только собственную новую тестовую базу, не копию рабочей с настоящими данными.
В Конфигураторе Назначения использования включите Мобильный клиент с возможностью автономной работы. В Состав автономной конфигурации включите собственную общую форму Черновик85 и учебную команду ее открытия; основная и автономная конфигурации должны содержать одну и ту же форму и реквизиты.
Создайте ОбщаяФорма.Черновик85. Реквизиты: Черновик85 Строка 100, СчетчикПереходов85 Число 9,0, Состояние85 Строка 500. Поле черновика доступно для ввода; счетчик и статус только для просмотра. Не добавляйте файловые данные, объекты БД или другие реквизиты для переноса.
Свяжите события ПриСозданииНаСервере, ПередПереоткрытиемСДругогоСервера, ПриПереоткрытииСДругогоСервера с одноименными процедурами. Создайте команду ПерейтиНаДругойСвойСервер85 и кнопку; вставьте полный модуль.
Ручной prerequisite: опубликуйте только эту собственную новую базу на собственном изолированном тестовом HTTP-сервере, например порт 8851 и путь uch-reopen85; используйте отдельную свою учетную запись без производственных прав. Не публикуйте рабочую базу и не вставляйте секреты в модуль.
Установите совместимый автономный мобильный клиент в собственном тестовом устройстве или эмуляторе. Подключите только свою публикацию, загрузите собственную автономную конфигурацию и проверьте, что ОбщаяФорма.Черновик85 открывается и с основного, и с автономного сервера. Без этих реальных двух режимов код не исполняется.
Сначала откройте новую форму с основного сервера. Начальный черновик Мой учебный черновик85; для теста измените его только на Мой учебный черновик85-изменен. Серверы содержат только свои пустые метаданные; никаких рабочих календарей или данных.
Публикация, установка мобильного клиента, сеть и переключение режимов — точные ручные prerequisites для отдельного стенда, не выполненные инструментами действия. Известная native доступность не доказывает, что на текущем ПК или устройстве такой клиент уже установлен.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ПроверитьСвойПустойСтенд();
Черновик85 = "Мой учебный черновик85";
СчетчикПереходов85 = 0;
Состояние85 = "Новая собственная форма; два реквизита могут переноситься между своими серверами";
КонецПроцедуры
&НаКлиенте
Процедура ПерейтиНаДругойСвойСервер85(Команда)
#Если МобильныйКлиент Тогда
ДоступностьОсновного = ОсновнойСерверДоступен();
Если ДоступностьОсновного = Неопределено Тогда
ВызватьИсключение "Этот урок требует настоящего мобильного клиента с автономным режимом";
КонецЕсли;
Если ИспользуемыйСерверФормы = ИспользуемыйСервер.Автономный Тогда
Если ДоступностьОсновного <> Истина Тогда
Состояние85 = "Свой основной сервер недоступен: переход не начинался, черновик сохранен";
Возврат;
КонецЕсли;
Цель = ИспользуемыйСервер.Основной;
ИначеЕсли ИспользуемыйСерверФормы = ИспользуемыйСервер.Основной Тогда
Цель = ИспользуемыйСервер.Автономный;
Иначе
ВызватьИсключение "Неизвестный сервер собственной формы";
КонецЕсли;
УстановитьИспользуемыйСервер(Цель);
Если ПолучитьИспользуемыйСервер() <> Цель Тогда
ВызватьИсключение "Временный выбор собственного сервера не подтвердился";
КонецЕсли;
ЭтотОбъект.ПереоткрытьСДругогоСервера();
#Иначе
ВызватьИсключение "Переоткрытие нельзя вызывать из desktop или обычного мобильного клиента без автономности";
#КонецЕсли
КонецПроцедуры
&НаКлиенте
Процедура ПередПереоткрытиемСДругогоСервера(Параметры, Отказ)
Если Черновик85 <> "Мой учебный черновик85" И Черновик85 <> "Мой учебный черновик85-изменен" Тогда
Отказ = Истина;
Состояние85 = "Своя форма отказала: разрешены только два учебных значения черновика";
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПриПереоткрытииСДругогоСервера(Источник, ПараметрыЗаполнения, СтандартнаяОбработка)
Если Источник.ИмяФормы <> ИмяФормы Тогда
ВызватьИсключение "Источник должен быть предыдущим экземпляром той же собственной формы";
КонецЕсли;
Если Источник.ИспользуемыйСерверФормы = ИспользуемыйСерверФормы Тогда
ВызватьИсключение "Ожидается действительно другой собственный сервер, не новый экземпляр на прежнем";
КонецЕсли;
ПараметрыЗаполнения.ВключитьРеквизиты.Очистить();
ПараметрыЗаполнения.ИсключитьРеквизиты.Очистить();
ПараметрыЗаполнения.ВключитьРеквизиты.Добавить("Черновик85");
ПараметрыЗаполнения.ВключитьРеквизиты.Добавить("СчетчикПереходов85");
ПараметрыЗаполнения.ИсключитьРеквизиты.Добавить("Состояние85");
ЭтотОбъект.ЗаполнитьПриПереоткрытииСДругогоСервера(Источник, ПараметрыЗаполнения);
СтандартнаяОбработка = Ложь;
Если Черновик85 <> Источник.Черновик85 Или СчетчикПереходов85 <> Источник.СчетчикПереходов85 Тогда
ВызватьИсключение "Собственный черновик и счетчик не перенесены";
КонецЕсли;
СчетчикПереходов85 = СчетчикПереходов85 + 1;
Состояние85 = "Реальный переход между своими серверами: " + Строка(Источник.ИспользуемыйСерверФормы)
+ " → " + Строка(ИспользуемыйСерверФормы) + "; переходов: " + Строка(СчетчикПереходов85);
КонецПроцедуры
&НаСервере
Процедура ПроверитьСвойПустойСтенд()
Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
КонецЕсли;
Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
КонецЕсли;
Источники = Новый Массив;
Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
Для Каждого Источник Из Источники Цикл
Расширения = РасширенияКонфигурации.Получить(, Источник);
Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
ВызватьИсключение "Native список расширений должен иметь тип Массив";
КонецЕсли;
Если Расширения.Количество() <> 0 Тогда
ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
КонецЕсли;
КонецЦикла;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
КонецЕсли;
КонецПроцедурыРазбор по шагам
ОсновнойСерверДоступен() = Неопределено доказывает отсутствие автономного режима: сразу отказываем, не превращаем обычный мобильный клиент в автономный.
ИспользуемыйСерверФормы — readonly фактический сервер текущего экземпляра. Выбираем противоположный; перед возвратом на основной проверяем его действительную доступность.
УстановитьИспользуемыйСервер временно выбирает свой следующий сервер до выхода из области локальных переменных. В том же вызове native ПереоткрытьСДругогоСервера действительно создает новый экземпляр с другого сервера.
ПередПереоткрытиемСДругогоСервера проверяет текущий собственный черновик и может отказать через настоящий Отказ. Недопустимый черновик не переносится.
ПриПереоткрытииСДругогоСервера получает действительные Источник и ПараметрыЗаполнения от платформы. Сверяем имя формы и фактическую смену сервера, не создаем фиктивный Источник вручную.
Readonly ВключитьРеквизиты и ИсключитьРеквизиты возвращают модифицируемые массивы; очищаем и заполняем их точными собственными путями Черновик85/СчетчикПереходов85, исключаем только статус.
ЗаполнитьПриПереоткрытииСДругогоСервера вызывается на новой форме с реальным старым экземпляром и native параметрами. СтандартнаяОбработка = Ложь исключает повторное стандартное заполнение; немедленный readback проверяет два перенесенных значения.
Счетчик повышаем уже в новом экземпляре после успешного readback. Статус строится из двух реально разных ИспользуемыйСерверФормы; никакого fake перехода getter-оберткой нет.
Как проверить результат
Основной → Автономный: новый экземпляр действительно показывает другой сервер, собственный черновик сохранен, счетчик 1.
Автономный → Основной при доступной своей публикации: тот же измененный черновик, счетчик 2. Повторите один roundtrip: счетчик 4, нет записи в БД.
На автономном устройстве отключите только доступ к своей публикации: переход на основной отказывает до native reopen, текущий черновик не теряется.
Введите любой третий черновик: ПередПереоткрытием отказывает, сервер и счетчик не меняются. Верните точное учебное значение.
Обычный mobile без автономности дает Неопределено и отказ. Desktop вообще не компилирует ветку native перехода для исполнения.
Через отладчик сопоставьте реальное событие с двумя экземплярами одной формы; серверы должны отличаться. Если readback не подтвердился, фиксируйте native ошибку и не сообщайте успешный перенос.
Статус не входит в переносимые реквизиты: в новом экземпляре он сформирован заново из реальных серверов, не скопирован с прежнего.
После закрытия формы черновик теряется: это данные формы, не автоматическая синхронизация информационных баз.
Ожидаемый результат
Два специальных API представлены настоящим автономным lifecycle с двумя собственными серверами, переносом двух точных реквизитов и отрицательными проверками.
На что обратить внимание
Статические тесты не устанавливают клиент, не создают публикацию, не подтверждают сетевой доступ и не доказывают runtime-перенос.
Мобильное приложение без автономного клиента и обычный desktop не удовлетворяют prerequisites.
Нельзя вручную конструировать Источник или readonly объект ПараметрыЗаполнения: они приходят из реального события.
Смена сервера формы не является копированием базы данных или синхронизацией произвольных объектов.
Не сохраняйте пароль публикации, ID устройства или настоящие учетные данные в примере.
При исчезновении сети в процессе перехода возможна ошибка native API: не повторяйте переход автоматически и не считайте счетчик признаком успеха без readback.
Временная установка используемого сервера ограничена текущим вызовом, не меняет постоянные настройки клиента.
Рабочие публикации, действительные календари и пользовательские данные не задействованы.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.