Перенести собственный черновик между реальными основным и автономным серверами мобильной формы

Учебные задачи

Не desktop имитация: нужен собственный автономный мобильный клиент и два действительно разных сервера исполнения одной формы. Источник и ПараметрыЗаполнения предоставляет настоящий lifecycle события.

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

Полный модуль ОбщаяФорма.Черновик85 своего мобильного клиента С АВТОНОМНЫМ РЕЖИМОМ; server создания и mobile client native lifecycle.

Подготовка

  1. Создайте отдельную пустую CF УчебноеПереоткрытие85 на собственной платформе 8.5.1.1343 без бизнес-объектов и расширений. Используйте только собственную новую тестовую базу, не копию рабочей с настоящими данными.

  2. В Конфигураторе Назначения использования включите Мобильный клиент с возможностью автономной работы. В Состав автономной конфигурации включите собственную общую форму Черновик85 и учебную команду ее открытия; основная и автономная конфигурации должны содержать одну и ту же форму и реквизиты.

  3. Создайте ОбщаяФорма.Черновик85. Реквизиты: Черновик85 Строка 100, СчетчикПереходов85 Число 9,0, Состояние85 Строка 500. Поле черновика доступно для ввода; счетчик и статус только для просмотра. Не добавляйте файловые данные, объекты БД или другие реквизиты для переноса.

  4. Свяжите события ПриСозданииНаСервере, ПередПереоткрытиемСДругогоСервера, ПриПереоткрытииСДругогоСервера с одноименными процедурами. Создайте команду ПерейтиНаДругойСвойСервер85 и кнопку; вставьте полный модуль.

  5. Ручной prerequisite: опубликуйте только эту собственную новую базу на собственном изолированном тестовом HTTP-сервере, например порт 8851 и путь uch-reopen85; используйте отдельную свою учетную запись без производственных прав. Не публикуйте рабочую базу и не вставляйте секреты в модуль.

  6. Установите совместимый автономный мобильный клиент в собственном тестовом устройстве или эмуляторе. Подключите только свою публикацию, загрузите собственную автономную конфигурацию и проверьте, что ОбщаяФорма.Черновик85 открывается и с основного, и с автономного сервера. Без этих реальных двух режимов код не исполняется.

  7. Сначала откройте новую форму с основного сервера. Начальный черновик Мой учебный черновик85; для теста измените его только на Мой учебный черновик85-изменен. Серверы содержат только свои пустые метаданные; никаких рабочих календарей или данных.

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

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

  1. ОсновнойСерверДоступен() = Неопределено доказывает отсутствие автономного режима: сразу отказываем, не превращаем обычный мобильный клиент в автономный.

  2. ИспользуемыйСерверФормы — readonly фактический сервер текущего экземпляра. Выбираем противоположный; перед возвратом на основной проверяем его действительную доступность.

  3. УстановитьИспользуемыйСервер временно выбирает свой следующий сервер до выхода из области локальных переменных. В том же вызове native ПереоткрытьСДругогоСервера действительно создает новый экземпляр с другого сервера.

  4. ПередПереоткрытиемСДругогоСервера проверяет текущий собственный черновик и может отказать через настоящий Отказ. Недопустимый черновик не переносится.

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

  6. Readonly ВключитьРеквизиты и ИсключитьРеквизиты возвращают модифицируемые массивы; очищаем и заполняем их точными собственными путями Черновик85/СчетчикПереходов85, исключаем только статус.

  7. ЗаполнитьПриПереоткрытииСДругогоСервера вызывается на новой форме с реальным старым экземпляром и native параметрами. СтандартнаяОбработка = Ложь исключает повторное стандартное заполнение; немедленный readback проверяет два перенесенных значения.

  8. Счетчик повышаем уже в новом экземпляре после успешного readback. Статус строится из двух реально разных ИспользуемыйСерверФормы; никакого fake перехода getter-оберткой нет.

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

  1. Основной → Автономный: новый экземпляр действительно показывает другой сервер, собственный черновик сохранен, счетчик 1.

  2. Автономный → Основной при доступной своей публикации: тот же измененный черновик, счетчик 2. Повторите один roundtrip: счетчик 4, нет записи в БД.

  3. На автономном устройстве отключите только доступ к своей публикации: переход на основной отказывает до native reopen, текущий черновик не теряется.

  4. Введите любой третий черновик: ПередПереоткрытием отказывает, сервер и счетчик не меняются. Верните точное учебное значение.

  5. Обычный mobile без автономности дает Неопределено и отказ. Desktop вообще не компилирует ветку native перехода для исполнения.

  6. Через отладчик сопоставьте реальное событие с двумя экземплярами одной формы; серверы должны отличаться. Если readback не подтвердился, фиксируйте native ошибку и не сообщайте успешный перенос.

  7. Статус не входит в переносимые реквизиты: в новом экземпляре он сформирован заново из реальных серверов, не скопирован с прежнего.

  8. После закрытия формы черновик теряется: это данные формы, не автоматическая синхронизация информационных баз.

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

Два специальных API представлены настоящим автономным lifecycle с двумя собственными серверами, переносом двух точных реквизитов и отрицательными проверками.

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

  1. Статические тесты не устанавливают клиент, не создают публикацию, не подтверждают сетевой доступ и не доказывают runtime-перенос.

  2. Мобильное приложение без автономного клиента и обычный desktop не удовлетворяют prerequisites.

  3. Нельзя вручную конструировать Источник или readonly объект ПараметрыЗаполнения: они приходят из реального события.

  4. Смена сервера формы не является копированием базы данных или синхронизацией произвольных объектов.

  5. Не сохраняйте пароль публикации, ID устройства или настоящие учетные данные в примере.

  6. При исчезновении сети в процессе перехода возможна ошибка native API: не повторяйте переход автоматически и не считайте счетчик признаком успеха без readback.

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

  8. Рабочие публикации, действительные календари и пользовательские данные не задействованы.

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

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

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

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

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