Глобальный контекст.ПолучитьРегиональныеНастройкиИнформационнойБазы

Методы · GetInfoBaseRegionalSettings

Получает региональные настройки информационной базы.

Синтаксис

ПолучитьРегиональныеНастройкиИнформационнойБазы()
Полное описание, параметры и ограничения

Глобальный контекст.ПолучитьРегиональныеНастройкиИнформационнойБазы (Global context.GetInfoBaseRegionalSettings)

Глобальный контекст (Global context)

ПолучитьРегиональныеНастройкиИнформационнойБазы (GetInfoBaseRegionalSettings)

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

Синтаксис:
ПолучитьРегиональныеНастройкиИнформационнойБазы()
Возвращаемое значение:
Тип: РегиональныеНастройкиИнформационнойБазы.

Описание:

Получает региональные настройки информационной базы.

Доступность:

Сервер, толстый клиент, внешнее соединение.

См. также:
Глобальный контекст, метод УстановитьРегиональныеНастройкиИнформационнойБазы
Глобальный контекст, метод ПолучитьРегиональныеНастройкиСеанса

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

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

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

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

Региональные установки: понятные статусы оплаты и проверяемое восстановление

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

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

Тонкий управляемый клиент своей новой File ИБ 8.5.1.1343; все региональные и монопольные API выполняются в одном серверном вызове собственной формы.

Подготовка

  1. Создайте вручную в отдельной новой одноразовой Windows VM пустую файловую базу C:\1c-labs\OwnRegionalSettings85_587cd6c6-8790-46df-838a-a55058f8a1d\IB на платформе 8.5.1.1343. Не используйте рабочую базу или копию чужой конфигурации. Сейчас база не создавалась, 1С не запускалась.

  2. В свойствах новой конфигурации задайте Имя = УчебныйРегион85, Версия = 587cd6c6-8790-46df-838a-a55058f8a1d, ОсновнойРежимЗапуска = УправляемоеПриложение, РежимСовместимости = НеИспользовать; встроенный язык русский. Создайте только одну общую управляемую форму УчебныйРегион85 и одну роль УчебнаяПолная85. Не добавляйте справочники, документы, регистры, общие реквизиты, фоновые задания, подписки, расширения, HTTP/Web-сервисы или другие обработчики.

  3. В своей единственной роли вручную задайте полные права только для этой пустой лаборатории, включая Администрирование, АктивныеПользователи и установку монопольного режима. Через Администрирование → Пользователи создайте своего единственного пользователя УченикРегиона85 с этой ролью. Это консервативная учебная подготовка, а не доказанный минимальный набор прав для рабочего решения.

  4. Общие → Общие формы → УчебныйРегион85: реквизиты Согласие85 и Остановка85 типа Булево; Протокол85 типа Строка неограниченной длины. Согласие85 выведите флажком «Разрешаю изменить региональные установки своей новой базы». Остановка85 скройте от редактирования; Протокол85 выведите многострочным полем только просмотра. Не требуйте начальных значений редактора: на фактически новой форме Остановка85 = Ложь проверяется кодом, согласие задается пользователем. Сброса остановки программно нет.

  5. В свойствах своей формы вручную установите СохранениеДанныхВНастройках = НеИспользовать и АвтоматическоеСохранениеДанныхВНастройках = НеИспользовать как значения соответствующих перечислений, не Булево. Создайте команду ПроверитьРегион85 с действием ПроверитьРегион85 и настоящую кнопку этой команды. В модуль формы вставьте основной код целиком; параметр Команда не удаляйте. Других событий формы связывать не нужно.

  6. Конфигурация → Открыть модуль управляемого приложения: вставьте отдельный полный блок «УправляемоеПриложение» ниже. После проверки конфигурации обновите только свою новую базу. Закройте ее Конфигуратор и все остальные сеансы, затем запустите тонкий клиент под УченикРегиона85. Штатный ПриНачалеРаботыСистемы только открывает свою форму; региональные установки не читает и не меняет.

  7. Подготовьте запись запуска своей базы ровно File="C:\1c-labs\OwnRegionalSettings85_587cd6c6-8790-46df-838a-a55058f8a1d\IB";. Другой вид строки даст отказ, а не автоматическое исправление. Путь, имя и версия не доказывают владение: одноразовый стенд действительно должен быть создан вами. В native справке setter нет явного запрета File ИБ, но работоспособность этой подготовки запуском не подтверждена.

  8. До согласия прочитайте это предупреждение: меняются сохраненные установки всей собственной базы, setter может попытаться включить монопольный доступ. Нужен единственный сеанс без исходного монопольного режима. После ошибки установки или режим могут остаться измененными; автоматического восстановления и повторной попытки нет. Не выполняйте опыт в базе с реальными данными.

  9. Включите Согласие85 и один раз нажмите ПроверитьРегион85. Клиент удерживает фактическое исходное Булево согласие, снимает флажок и устанавливает остановку до обращения к серверу. Сервер проверяет этот исходный параметр вместе с уже остановленной собственной формой. Непроверенное значение или неверное состояние не допускается к региональным операциям. Это протокол одной своей кнопки, не средство защиты от поддельных RPC.

  10. В этой форме повтор запрещен и после успеха, и после ошибки. При исключении серверного вызова клиент сохраняет остановку и пишет «Результат неизвестен», не полагаясь на обратную синхронизацию формы. После ошибки не выполняйте новые чтения/изменения для проверки или восстановления. Для нового опыта нужна отдельно подготовленная новая лаборатория.

&НаСервере
Процедура ПроверитьСтенд85(Знач ИсходноеСогласие)
    Если ТипЗнч(ИсходноеСогласие) <> Тип("Булево") Или Не ИсходноеСогласие
        Или ТипЗнч(Согласие85) <> Тип("Булево") Или Согласие85
        Или ТипЗнч(Остановка85) <> Тип("Булево") Или Не Остановка85
        Или ТипЗнч(Протокол85) <> Тип("Строка") Тогда
        ВызватьИсключение "Нужно настоящее согласие, уже потребленное клиентской командой";
    КонецЕсли;
    Если СтрокаСоединенияИнформационнойБазы() <> "File=""C:\1c-labs\OwnRegionalSettings85_587cd6c6-8790-46df-838a-a55058f8a1d\IB"";" Или Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Или Метаданные.ОсновнойРежимЗапуска <> РежимЗапускаКлиентскогоПриложения.УправляемоеПриложение Или ИмяФормы <> "ОбщаяФорма.УчебныйРегион85" Тогда
        ВызватьИсключение "Откройте только свою новую одноразовую лабораторию и ее форму";
    КонецЕсли;
    Если Метаданные.ОбщиеФормы.Количество() <> 1 Или Метаданные.ОбщиеФормы.Найти("УчебныйРегион85") = Неопределено
        Или Метаданные.Роли.Количество() <> 1 Или Метаданные.Роли.Найти("УчебнаяПолная85") = Неопределено
        Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0
        Или Метаданные.ПодпискиНаСобытия.Количество() <> 0
        Или РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.БазаДанных).Количество() <> 0 Тогда
        ВызватьИсключение "Нужна одна своя форма и роль, без разделителей, заданий, подписок и расширений";
    КонецЕсли;
    Пользователь = ПользователиИнформационнойБазы.ТекущийПользователь();
    Пользователи = ПользователиИнформационнойБазы.ПолучитьПользователей();
    Если ТипЗнч(Пользователь) <> Тип("ПользовательИнформационнойБазы")
        Или ТипЗнч(Пользователи) <> Тип("Массив") Или Пользователи.Количество() <> 1
        Или Пользователь.Имя <> "УченикРегиона85" Тогда
        ВызватьИсключение "Нужен единственный собственный пользователь учебной базы";
    КонецЕсли;
КонецПроцедуры

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

&НаСервере
Процедура Сравнить85(Ожидаемый, Фактический)
    Если ТипЗнч(Ожидаемый) <> Тип("ФиксированнаяСтруктура") Или ТипЗнч(Фактический) <> Тип("ФиксированнаяСтруктура")
        Или Ожидаемый.Количество() <> 11 Или Фактический.Количество() <> 11 Тогда
        ВызватьИсключение "Нужны два полных снимка из 11 полей";
    КонецЕсли;
    Для Каждого Поле Из Ожидаемый Цикл
        Если Не Фактический.Свойство(Поле.Ключ, Значение)
            Или ТипЗнч(Поле.Значение) <> ТипЗнч(Значение) Или Поле.Значение <> Значение Тогда
            ВызватьИсключение "Не совпало поле полного снимка: " + Поле.Ключ;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

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

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

Конфигурация → Открыть модуль управляемого приложения

Тонкий управляемый клиент

Процедура ПриНачалеРаботыСистемы()
    #Если ТонкийКлиент Тогда
        ОткрытьФорму("ОбщаяФорма.УчебныйРегион85");
    #Иначе
        ВызватьИсключение "Запускайте только тонкий управляемый клиент своего стенда";
    #КонецЕсли
КонецПроцедуры

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

  1. Кнопка сначала проверяет фактическое согласие и собственную команду. Еще до серверного вызова расходует согласие и останавливает форму; передается удержанное исходное согласие, не константа.

  2. Сервер проверяет полученное согласие, остановленную форму, свои маркеры, отсутствие разделителей/заданий/подписок/расширений, единственного пользователя и сеанс. Исходная монополия запрещена: ее не снимают ради продолжения.

  3. Настоящий getter дает объект установок. Неизменяемый снимок сохраняет все 11 имен, типов и значений до любого изменения. Суммы двух счетов вычисляются в памяти: 2 × 250 = 500 и 3 × 250 = 750; сравнение оплаты с суммой дает Ложь и Истина.

  4. План копируется из полного снимка; изменяются только флаг использования настроек сеанса и две подписи Булево. Обычно это «Ожидает оплаты» и «Оплачено». Если исходная тройка уже такая, берутся «Платеж еще не получен» и «Платеж получен», чтобы изменение было настоящим.

  5. Setter вызывается как процедура. Новый getter подтверждает весь сохраненный профиль, а Представление на этом свежем объекте форматирует именно вычисленные статусы двух счетов. Видимый вывод использует эти полученные строки, не заранее напечатанные подписи.

  6. На нормальном пути три измененных поля возвращаются из неизменяемого снимка. Setter и новый getter подтверждают полное восстановление 11 установок, затем Представление возвращает исходные строки статусов. Остальные восемь полей не меняются.

  7. После нормального восстановления читается фактическая монополия. Если она осталась включена, снимается только в собственной базе без разделителей; если выключена, setter режима не вызывается. Повторное чтение подтверждает Ложь, отсутствие параметров монополии и один сеанс.

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

  1. До кнопки нет вызовов региональных/монопольных API. Без фактического согласия, с Остановка85 = Истина или с чужой командой отказ наступает до серверного вызова.

  2. В будущем нормальном протоколе счет А имеет количество 2, цену 250, сумму 500, оплату 0 и фактическую подпись Ложь; счет Б — 3, 250, 750, оплату 750 и фактическую подпись Истина. Учебные подписи соответствуют выбранному отличающемуся профилю.

  3. Для каждого счета рядом показаны исходная строка, учебный статус и восстановленная строка. Последняя должна точно совпасть с первой. Исходные значения не предполагаются: они могли зависеть от настроек сеанса.

  4. Успешный вывод появляется только после полного совпадения всех 11 исходных полей по имени, типу и значению, восстановленных строк статусов и фактического отсутствия монополии. Ошибка или отказ не являются успешным результатом.

  5. В той же форме нажмите кнопку повторно: должен быть отказ до нового серверного вызова. Не обходите остановку. При ошибке результат неизвестен, автоматического чтения/восстановления/снятия режима нет. Сейчас сценарий в 1С не выполнялся.

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

Ожидаемый будущий результат: протокол двух вычисленных счетов показывает настоящие исходные, учебные и восстановленные строки оплаты; все 11 установок совпадают с исходным снимком и фактически монопольный режим выключен. Это не результат уже выполненного запуска.

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

  1. УстановитьРегиональныеНастройкиИнформационнойБазы сохраняет установки базы, требует Администрирование и монопольный доступ; при его отсутствии пытается установить его. Возвращаемое значение не документировано. Любая ошибка вызывает исключение.

  2. РегиональныеНастройкиИнформационнойБазы не имеет конструктора. Объект берется только настоящим getter. Независимость объектов разных getter не обещана, поэтому сохранение исходного объекта не заменяет неизменяемый снимок примитивов.

  3. ПредставлениеБулевоЛожь, КодЛокализации и ФорматПредставленияВремени в установленной справке доступны серверу и внешнему соединению, но не толстому клиенту. Все 11 полей читаются на сервере, объект установок клиенту не передается.

  4. Native setter не обещает, что монопольный режим обязательно останется включенным или сам выключится. Код читает фактическое состояние. Для освобождения своего неподеленного контекста УстановитьМонопольныйРежим(Ложь) вызывается лишь на нормальном пути и лишь при фактическом Истина.

  5. Не меняются локализация, правила сортировки, числа, даты, время, первый день недели, язык интерфейса или установки сеанса. Остальные восемь свойств сохраняются даже с пустыми строками или специальными значениями: свои новые значения им не назначают.

  6. ПолучитьСоединенияИнформационнойБазы требует АктивныеПользователи. Полные учебные права не означают минимальные права рабочего решения. Нет гарантии успеха в File ИБ, автоматического отката, конкурентной защиты или восстановления после ошибки.

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

Региональные настройки: представить реальные 500 и 750 без изменения счета

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

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

Только серверный общий модуль собственной File CF. Тонкий клиент передает только числовые и датовые скаляры.

Подготовка

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

  2. В Windows создайте новую пустую файловую базу в C:\1c-labs\OwnNavigationInvoiceLocale10_3aa9964e-9681-49ce-ba08-7ca7acba84e8\IB. Платформа точно 8.5.1.1343, имя конфигурации УчебнаяСсылкаСчета85, язык Русский, режим совместимости НеИспользовать, основной режим запуска УправляемоеПриложение, интерфейс Такси. Запускать именно тонкий клиент. Не переносите пример в существующую CF.

  3. Создайте роль УчебнаяПолная85 с полными правами только своего стенда, включая Администрирование. Создайте единственного пользователя УченикСсылки85 с этой ролью. Не сохраняйте пароли в коде или ссылке. Никаких других пользователей, сеансов, расширений базы или сеанса, заданий, подписок, сервисов и производственных подключений.

  4. Создайте единственную обработку КалькуляторСсылки85. Реквизиты: Количество85 — Число 3.0; Цена85 и Итог85 — Число 9.0; ДатаСчета85 — Дата с составом Дата и время. Табличных частей нет. Создайте ее управляемую основную форму Форма с основным реквизитом Объект типа ОбработкаОбъект.КалькуляторСсылки85. Добавьте параметр формы КоличествоЦель85 типа Число 3.0; не реквизит произвольного объекта и не конструктор формы.

  5. В форме добавьте реквизиты Готово85 и Остановка85 типа Булево, исходные ИсходноеКоличество85 Число 3.0, ИсходнаяЦена85/ИсходныйИтог85 Число 9.0, ИсходнаяДата85 Дата и время. Добавьте СуммаТекст85/ДатаТекст85/ВремяТекст85/Регион85/СвояСсылка85/Статус85 типа Строка неограниченной длины, ПервыйДень85 Число 1.0. Их создает CF; код не придумывает свойства элементов.

  6. Разместите 11 полей формы с именами Количество85, Цена85, Итог85, ДатаСчета85, СуммаТекст85, ДатаТекст85, ВремяТекст85, Регион85, ПервыйДень85, СвояСсылка85, Статус85. Первые четыре связаны с Объект.Количество85/Объект.Цена85/Объект.Итог85/Объект.ДатаСчета85; остальные — с одноименными реквизитами формы. У всех ТолькоПросмотр=Истина. Поле СвояСсылка85 многострочное, чтобы можно было скопировать собственную ссылку. Служебные исходные реквизиты и два флага на форму не выводите.

  7. Создайте две команды формы СсылкаНаТри85 и ПерейтиКТрем85, назначьте им одноименные процедуры из полного модуля формы; разместите две кнопки, связанные с этими командами. Обработчики команды с параметром Команда создаются штатным редактором. Действие команды хранит имя обработчика; страницу Action8738 нельзя считать отдельным доказательством числа формальных параметров. Событие формы ПриСозданииНаСервере свяжите с одноименной процедурой с двумя параметрами. Обработчики вручную не вызывайте.

  8. В Общие → Общие модули создайте УчебнаяСсылкаСчетаСервер85: Сервер=Да, Вызов сервера=Да; Клиент (управляемое приложение), Клиент (обычное приложение), Внешнее соединение, Глобальный и Привилегированный=Нет, Повторное использование возвращаемых значений=НеИспользовать. Вставьте полный COMMON. Других общих модулей нет. Региональный объект и метаданные читаются только серверным кодом; клиент получает фиксированные структуры из строк, чисел, булевых и дат, не региональные или навигационные объекты.

  9. В модуль управляемого приложения вставьте полный APPLICATION. В модуль Обработки → КалькуляторСсылки85 → Формы → Форма вставьте полный FORM. Все процедуры стоят на уровне своего модуля. Обновите конфигурацию базы и запустите собственную базу тонким клиентом под УченикСсылки85. Настоящий ПриНачалеРаботыСистемы откроет свежую форму 2×250=500 без записей в базу.

  10. Ссылка на количество 3 создается только нативными фабриками из фактических метаданных своей обработки, адреса своей базы и двух строковых параметров qty/stamp. Фиксированная метка 3aa9964e-9681-49ce-ba08-7ca7acba84e8 записана в подготовленной CF; это несекретная метка маршрута, не пароль и не доказательство владения. Новый случайный UUID в памяти не проверяет ссылку прошлого сеанса.

  11. Внутренний опыт: оставьте свою форму 500 открытой, нажмите СсылкаНаТри85 для проверки показанной ссылки, затем ПерейтиКТрем85. Настоящий обработчик перехода должен получить нативный объект и открыть отдельную новую форму 750. Старая форма и все ее значения должны остаться прежними. Повторное одинаковое уведомление не создает еще одну форму. Обратный переход после принятого 750 к 500 этим маршрутом урока запрещен.

  12. Опыт запуска: скопируйте фактическую собственную ссылку из СвояСсылка85, закройте только свою учебную сессию и вручную откройте эту ссылку через уже установленную штатную ассоциацию 1С. Не настраивайте протоколы программно. Память закрытого сеанса не сохраняется: новая форма сначала получает собственный исходный буфер 500, затем принимает количество 3 и показывает 750. Если ассоциация или доставка не работают, это ручная диагностика, не повод создавать поддельный объект или вызывать callback.

  13. Не предполагается порядок событий запуска и перехода. До настоящего ПриНачалеРаботыСистемы callback сохраняет только проверенные скаляры. Открытие формы начинается после него; одинаковые данные глобального запуска и события сопоставляются, а повторная ошибка не сбрасывает STOP. Отдельно вручную проверьте оба реально наблюдаемых порядка, если платформа их доставляет; статические тесты не воспроизводят механизм запуска 1С.

  14. Сравниваются все 15 полей клиентского и серверного снимка формы, восемь числовых/датовых полей счета и исходного буфера, все 11 свойств регионального источника до/после и повторного получения. ПутьКДанным доступен только на сервере формы; клиент читает связанные реквизиты, не Element.Value. Это проверка данных и политик, не доказательство отображенных пикселей.

  15. Представления суммы, даты и времени берутся из фактических региональных настроек. При ИспользоватьНастройкиТекущегоСеанса=Истина методы используют настройки сеанса; это явно написано в Регион85. Номер первого дня 0 означает автоматический выбор, не понедельник. Формат русского текста, даты или разделителя заранее не обещается; числовые 500/750 остаются числами.

  16. После исключения приложение или форма сохраняют STOP и не принимают старый результат за успех. Открытие формы — процедура без булевого результата; событие, ассоциация, диалоги и рендеринг здесь не проверены. При частичном открытии нет автоматического закрытия, отката или повторного запуска. Осмотрите только собственный стенд и начните новый сеанс вручную.

Процедура ПроверитьСтенд85() Экспорт
    Если СтрокаСоединенияИнформационнойБазы() <> "File=""C:\1c-labs\OwnNavigationInvoiceLocale10_3aa9964e-9681-49ce-ba08-7ca7acba84e8\IB"";" Или Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Или Метаданные.ОсновнойРежимЗапуска <> РежимЗапускаКлиентскогоПриложения.УправляемоеПриложение Тогда
        ВызватьИсключение "Откройте только подготовленную собственную файловую базу 8.5.1.1343";
    КонецЕсли;
    Если Метаданные.Обработки.Количество() <> 1 Или Метаданные.ОбщиеМодули.Количество() <> 1
        Или Метаданные.Роли.Количество() <> 1 Или Метаданные.ОбщиеФормы.Количество() <> 0
        Или Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0
        Или Метаданные.Константы.Количество() <> 0 Или Метаданные.Отчеты.Количество() <> 0
        Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0
        Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0
        Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0
        Или Метаданные.HTTPСервисы.Количество() <> 0 Или Метаданные.WebСервисы.Количество() <> 0 Тогда
        ВызватьИсключение "В стенде нужны только одна собственная обработка, один общий модуль и одна роль";
    КонецЕсли;
    Если РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.БазаДанных).Количество() <> 0 Тогда
        ВызватьИсключение "Расширения базы в этом опыте запрещены";
    КонецЕсли;
    Пользователь = ПользователиИнформационнойБазы.ТекущийПользователь();
    Если Пользователь = Неопределено Или ПользователиИнформационнойБазы.ПолучитьПользователей().Количество() <> 1 Тогда
        ВызватьИсключение "Нужен единственный собственный пользователь учебной базы";
    КонецЕсли;
    Если Пользователь.Имя <> "УченикСсылки85" Тогда
        ВызватьИсключение "Другой пользователь не относится к этому стенду";
    КонецЕсли;
    ОписаниеОбработки = Метаданные.Обработки.Найти("КалькуляторСсылки85");
    Если ОписаниеОбработки = Неопределено Или ОписаниеОбработки.Реквизиты.Количество() <> 4
        Или ОписаниеОбработки.Формы.Количество() <> 1 Или ОписаниеОбработки.Формы.Найти("Форма") = Неопределено
        Или ОписаниеОбработки.ТабличныеЧасти.Количество() <> 0
        Или Метаданные.ОбщиеМодули.Найти("УчебнаяСсылкаСчетаСервер85") = Неопределено
        Или Метаданные.Роли.Найти("УчебнаяПолная85") = Неопределено Тогда
        ВызватьИсключение "Не совпадает собственная обработка, форма или модуль";
    КонецЕсли;
    Для Каждого ОписаниеРеквизита Из ОписаниеОбработки.Реквизиты Цикл
        Если ОписаниеРеквизита.Имя = "ДатаСчета85" Тогда
            НужныйТип = Тип("Дата");
        ИначеЕсли ОписаниеРеквизита.Имя = "Количество85" Или ОписаниеРеквизита.Имя = "Цена85" Или ОписаниеРеквизита.Имя = "Итог85" Тогда
            НужныйТип = Тип("Число");
        Иначе
            ВызватьИсключение "Неизвестный реквизит обработки";
        КонецЕсли;
        Если ОписаниеРеквизита.Тип.Типы().Количество() <> 1 Или Не ОписаниеРеквизита.Тип.СодержитТип(НужныйТип) Тогда
            ВызватьИсключение "Реквизит должен иметь единственный объявленный тип";
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Функция СобственныеПути85() Экспорт
    ПроверитьСтенд85();
    База = ПолучитьНавигационнуюСсылкуИнформационнойБазы();
    Относительная = ПолучитьНавигационнуюСсылку(Метаданные.Обработки.КалькуляторСсылки85);
    Если ТипЗнч(База) <> Тип("Строка") Или ПустаяСтрока(База)
        Или ТипЗнч(Относительная) <> Тип("Строка") Или ПустаяСтрока(Относительная) Тогда
        ВызватьИсключение "Нативная фабрика не дала обе части собственной ссылки";
    КонецЕсли;
    ПараметрыСсылки = Новый Соответствие;
    ПараметрыСсылки.Вставить("qty", "3");
    ПараметрыСсылки.Вставить("stamp", "3aa9964e-9681-49ce-ba08-7ca7acba84e8");
    Ссылка = ПолучитьВнешнююНавигационнуюСсылку(База, Относительная, ПараметрыСсылки);
    Если ТипЗнч(Ссылка) <> Тип("Строка") Или ПустаяСтрока(Ссылка) Тогда
        ВызватьИсключение "Внешняя навигационная ссылка не создана";
    КонецЕсли;
    Возврат Новый ФиксированнаяСтруктура("База,Относительная,Метка,Ссылка", База, Относительная, "3aa9964e-9681-49ce-ba08-7ca7acba84e8", Ссылка);
КонецФункции

Процедура СравнитьСнимки85(Первый, Второй) Экспорт
    Если ТипЗнч(Первый) <> Тип("ФиксированнаяСтруктура") Или ТипЗнч(Второй) <> Тип("ФиксированнаяСтруктура")
        Или Первый.Количество() <> Второй.Количество() Тогда
        ВызватьИсключение "Снимки имеют разные типы или число полей";
    КонецЕсли;
    Для Каждого ПолеСнимка Из Первый Цикл
        Если Не Второй.Свойство(ПолеСнимка.Ключ, ЗначениеПоля)
            Или ТипЗнч(ПолеСнимка.Значение) <> ТипЗнч(ЗначениеПоля) Или ПолеСнимка.Значение <> ЗначениеПоля Тогда
            ВызватьИсключение "Изменено поле полного снимка: " + ПолеСнимка.Ключ;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

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

Функция ПредставитьСчет85(Количество, Цена, Итог, ДатаСчета) Экспорт
    ПроверитьСтенд85();
    Если ТипЗнч(Количество) <> Тип("Число") Или (Количество <> 2 И Количество <> 3)
        Или ТипЗнч(Цена) <> Тип("Число") Или Цена <> 250
        Или ТипЗнч(Итог) <> Тип("Число") Или Итог <> Количество * Цена
        Или ТипЗнч(ДатаСчета) <> Тип("Дата") Или ДатаСчета <> Дата(2026, 10, 10, 12, 30, 0) Тогда
        ВызватьИсключение "Передайте только собственные скаляры счета 2×250 или 3×250";
    КонецЕсли;
    СчетДо = Новый ФиксированнаяСтруктура("Количество,Цена,Итог,Дата", Количество, Цена, Итог, ДатаСчета);
    Настройки = ПолучитьРегиональныеНастройкиИнформационнойБазы();
    РегионДо = СнимокРегиона85(Настройки);
    СуммаТекст = Настройки.Представление(Итог);
    ДатаТекст = Настройки.ПредставлениеДаты(ДатаСчета);
    ВремяТекст = Настройки.ПредставлениеВремени(ДатаСчета);
    ПервыйДень = Настройки.ПолучитьПервыйДеньНедели();
    Если ТипЗнч(СуммаТекст) <> Тип("Строка") Или ПустаяСтрока(СуммаТекст)
        Или ТипЗнч(ДатаТекст) <> Тип("Строка") Или ПустаяСтрока(ДатаТекст)
        Или ТипЗнч(ВремяТекст) <> Тип("Строка") Или ПустаяСтрока(ВремяТекст)
        Или ТипЗнч(ПервыйДень) <> Тип("Число") Или ПервыйДень <> Цел(ПервыйДень) Или ПервыйДень < 0 Или ПервыйДень > 7 Тогда
        ВызватьИсключение "Нативное представление или первый день не прошли проверку";
    КонецЕсли;
    СравнитьСнимки85(РегионДо, СнимокРегиона85(Настройки));
    СвежиеНастройки = ПолучитьРегиональныеНастройкиИнформационнойБазы();
    СравнитьСнимки85(РегионДо, СнимокРегиона85(СвежиеНастройки));
    СравнитьСнимки85(СчетДо, Новый ФиксированнаяСтруктура("Количество,Цена,Итог,Дата", Количество, Цена, Итог, ДатаСчета));
    РегионТекст = "Код локализации объекта: " + РегионДо.КодЛокализации;
    Если РегионДо.ИспользоватьНастройкиТекущегоСеанса Тогда
        РегионТекст = РегионТекст + "; представления используют настройки текущего сеанса";
    Иначе
        РегионТекст = РегионТекст + "; представления используют свойства полученного объекта";
    КонецЕсли;
    Если ПервыйДень = 0 Тогда
        РегионТекст = РегионТекст + "; первый день определяется автоматически";
    Иначе
        РегионТекст = РегионТекст + "; номер первого дня: " + Строка(ПервыйДень);
    КонецЕсли;
    Возврат Новый ФиксированнаяСтруктура("СуммаТекст,ДатаТекст,ВремяТекст,Регион,ПервыйДень", СуммаТекст, ДатаТекст, ВремяТекст, РегионТекст, ПервыйДень);
КонецФункции
Второй полный модуль того же самостоятельного опыта

Своя CF → Модуль управляемого приложения целиком

Только тонкий клиент Windows; настоящее событие запуска0 и перехода2.

&НаКлиенте
Перем Остановка85, Запущено85, ОжидающийСнимок85, СнимокЗапуска85, ПринятоКоличество85, ПринятыйСнимок85, ТекущаяФорма85, ИсходнаяФорма85, ИсходныйСнимок85;

&НаКлиенте
Процедура ПроверитьКонтекст85()
    #Если ТонкийКлиент Тогда
        Если Остановка85 = Истина Тогда
            ВызватьИсключение "СТОП: предыдущий исход неизвестен; начните новый собственный учебный сеанс";
        КонецЕсли;
        УчебнаяСсылкаСчетаСервер85.ПроверитьСтенд85();
        Если Остановка85 = Неопределено Тогда
            Остановка85 = Ложь;
            Запущено85 = Ложь;
        КонецЕсли;
    #Иначе
        ВызватьИсключение "Этот опыт запускается только тонким клиентом Windows 8.5.1.1343";
    #КонецЕсли
КонецПроцедуры

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

&НаКлиенте
Функция ПроверитьПереход85(ДанныеПерехода)
    Если ТипЗнч(ДанныеПерехода) <> Тип("ДанныеПереходаПоНавигационнойСсылке") Тогда
        ВызватьИсключение "Нужны реальные данные нативного перехода, не структура или самодельный объект";
    КонецЕсли;
    База = ДанныеПерехода.БазоваяНавигационнаяСсылка;
    Относительная = ДанныеПерехода.ОтносительнаяНавигационнаяСсылка;
    Запуск = ДанныеПерехода.Запуск;
    ПараметрыСсылки = ДанныеПерехода.ПараметрыНавигационнойСсылки;
    СвоиПути = УчебнаяСсылкаСчетаСервер85.СобственныеПути85();
    Если ТипЗнч(База) <> Тип("Строка") Или База <> СвоиПути.База
        Или ТипЗнч(Относительная) <> Тип("Строка") Или Относительная <> СвоиПути.Относительная
        Или ТипЗнч(Запуск) <> Тип("Булево") Или ТипЗнч(ПараметрыСсылки) <> Тип("Соответствие")
        Или ПараметрыСсылки.Количество() <> 2 Тогда
        ВызватьИсключение "Переход разрешен только по полной собственной ссылке с двумя параметрами";
    КонецЕсли;
    Для Каждого ПараметрСсылки Из ПараметрыСсылки Цикл
        Если ТипЗнч(ПараметрСсылки.Ключ) <> Тип("Строка") Или ТипЗнч(ПараметрСсылки.Значение) <> Тип("Строка")
            Или (ПараметрСсылки.Ключ <> "qty" И ПараметрСсылки.Ключ <> "stamp") Тогда
            ВызватьИсключение "Неизвестный параметр, массив повторных значений или неверный тип";
        КонецЕсли;
    КонецЦикла;
    КоличествоТекст = ПараметрыСсылки.Получить("qty");
    Метка = ПараметрыСсылки.Получить("stamp");
    Если Метка <> СвоиПути.Метка Или (КоличествоТекст <> "2" И КоличествоТекст <> "3") Тогда
        ВызватьИсключение "Метка своей CF или разрешенное количество не совпали";
    КонецЕсли;
    Возврат Новый ФиксированнаяСтруктура("База,Относительная,Запуск,Метка,Количество", База, Относительная, Запуск, Метка, Число(КоличествоТекст));
КонецФункции

&НаКлиенте
Процедура ПринятьКоличество85(Количество)
    Если Запущено85 <> Истина Или Остановка85 <> Ложь Тогда
        ВызватьИсключение "Открытие своей формы разрешено только после настоящего ПриНачалеРаботы";
    КонецЕсли;
    Если ПринятоКоличество85 = Количество Тогда
        ТекущаяФорма85.ПроверитьГотовность85(Количество);
        Сравнить85(ПринятыйСнимок85, ТекущаяФорма85.СнятьСнимок85());
        Если ИсходнаяФорма85 <> Неопределено Тогда
            Сравнить85(ИсходныйСнимок85, ИсходнаяФорма85.СнятьСнимок85());
        КонецЕсли;
        Возврат;
    КонецЕсли;
    Если ПринятоКоличество85 = 3 Тогда
        ВызватьИсключение "В этом опыте после принятого 750 обратный переход к 500 не выполняется";
    КонецЕсли;
    Если ТекущаяФорма85 <> Неопределено Тогда
        Если Не ТекущаяФорма85.Открыта() Тогда
            ВызватьИсключение "Для внутреннего опыта оставьте свою исходную форму открытой";
        КонецЕсли;
        Сравнить85(ПринятыйСнимок85, ТекущаяФорма85.СнятьСнимок85());
        ИсходнаяФорма85 = ТекущаяФорма85;
        ИсходныйСнимок85 = ИсходнаяФорма85.СнятьСнимок85();
        Если ИсходныйСнимок85.Количество <> 2 Или ИсходныйСнимок85.Итог <> 500 Тогда
            ВызватьИсключение "Исходная форма внутреннего опыта должна показывать 500";
        КонецЕсли;
    КонецЕсли;
    ПараметрыФормы = Новый Структура("КоличествоЦель85", Количество);
    Кандидат = ПолучитьФорму("Обработка.КалькуляторСсылки85.Форма.Форма", ПараметрыФормы, , Истина);
    Если Кандидат = Неопределено Или ТипЗнч(Кандидат) <> Тип("ФормаКлиентскогоПриложения") Тогда
        ВызватьИсключение "Нативная фабрика не создала новую собственную форму";
    КонецЕсли;
    Если Кандидат.ВладелецФормы <> Неопределено Тогда
        ВызватьИсключение "У свежей формы этого опыта не должно быть владельца";
    КонецЕсли;
    Кандидат.ПроверитьГотовность85(Количество);
    СнимокКандидата = Кандидат.СнятьСнимок85();
    Если СнимокКандидата.Итог <> Количество * 250 Тогда
        ВызватьИсключение "Новая форма не подтвердила собственный расчет";
    КонецЕсли;
    Кандидат.Открыть();
    Сравнить85(СнимокКандидата, Кандидат.СнятьСнимок85());
    Если ИсходнаяФорма85 <> Неопределено Тогда
        Сравнить85(ИсходныйСнимок85, ИсходнаяФорма85.СнятьСнимок85());
    КонецЕсли;
    ТекущаяФорма85 = Кандидат;
    ПринятоКоличество85 = Количество;
    ПринятыйСнимок85 = СнимокКандидата;
КонецПроцедуры

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

&НаКлиенте
Процедура ОбработкаПереходаПоНавигационнойСсылке(ДанныеПереходаПоНавигационнойСсылке, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    Попытка
        ПроверитьКонтекст85();
        Снимок = ПроверитьПереход85(ДанныеПереходаПоНавигационнойСсылке);
        Если Снимок.Запуск Тогда
            Если СнимокЗапуска85 <> Неопределено Тогда
                Сравнить85(СнимокЗапуска85, Снимок);
            КонецЕсли;
            СнимокЗапуска85 = Снимок;
        КонецЕсли;
        Если Запущено85 <> Истина Тогда
            Если ОжидающийСнимок85 <> Неопределено Тогда
                Сравнить85(ОжидающийСнимок85, Снимок);
            КонецЕсли;
            ОжидающийСнимок85 = Снимок;
            Возврат;
        КонецЕсли;
        ПринятьКоличество85(Снимок.Количество);
    Исключение
        Остановка85 = Истина;
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры
Полная собственная форма: исходный буфер, readonly вывод и две настоящие команды

Своя CF → Обработки → КалькуляторСсылки85 → Формы → Форма → Модуль целиком

Серверное создание2, серверный readback связей, клиентские команды из штатного шаблона и только примитивные поля через RPC.

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

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

&НаКлиентеНаСервереБезКонтекста
Процедура ПроверитьЗначения85(Количество, Цена, Итог, ДатаСчета, ИсходноеКоличество, ИсходнаяЦена, ИсходныйИтог, ИсходнаяДата)
    Если ТипЗнч(Количество) <> Тип("Число") Или (Количество <> 2 И Количество <> 3)
        Или ТипЗнч(Цена) <> Тип("Число") Или Цена <> 250 Или ТипЗнч(Итог) <> Тип("Число") Или Итог <> Количество * Цена
        Или ТипЗнч(ДатаСчета) <> Тип("Дата") Или ДатаСчета <> Дата(2026, 10, 10, 12, 30, 0)
        Или ТипЗнч(ИсходноеКоличество) <> Тип("Число") Или ИсходноеКоличество <> 2
        Или ТипЗнч(ИсходнаяЦена) <> Тип("Число") Или ИсходнаяЦена <> 250
        Или ТипЗнч(ИсходныйИтог) <> Тип("Число") Или ИсходныйИтог <> 500
        Или ТипЗнч(ИсходнаяДата) <> Тип("Дата") Или ИсходнаяДата <> Дата(2026, 10, 10, 12, 30, 0) Тогда
        ВызватьИсключение "Не совпали все восемь числовых/датовых полей своего счета и свежего исходного буфера";
    КонецЕсли;
КонецПроцедуры

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

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

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

&НаКлиенте
Процедура ПроверитьГотовность85(Количество) Экспорт
    Снимок = СнятьСнимок85();
    Если Снимок.Количество <> Количество Или Снимок.Итог <> Количество * 250 Тогда
        Остановка85 = Истина;
        ВызватьИсключение "Своя форма не соответствует принятому количеству";
    КонецЕсли;
КонецПроцедуры

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

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

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

  1. Подготовьте собственную обработку, типизированную форму и три полных модуля по дереву CF. Первый обычный запуск без ссылки создает исходные 2×250=500.

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

  3. Глобальный источник запуска может быть Неопределено. Настоящее событие перехода поставляет readonly объект; проверяются тип, оба адреса, Запуск и ровно qty/stamp без массивов и чужих ключей.

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

  5. В каждой свежей форме сначала создан полный собственный буфер 500. Принятое количество 3 дает 750; внутренний переход отдельно перечитывает неизмененную старую форму 500.

  6. Сервер получает настоящий региональный объект, делает три представления и читает первый день. Все региональные свойства и числовой счет сравниваются до/после; клиент получает только скаляры.

  7. Проверьте настоящий повтор одинакового перехода, неизвестные параметры и ручной перезапуск. Ошибка сохраняет STOP, а отсутствие доставки не имитируется вызовом события.

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

  1. Числовые контрольные результаты: свежий буфер 500, принятое количество 3 — 750; при внутреннем переходе старая форма остается 500. Все цены равны 250, дата — 10.10.2026 12:30:00.

  2. Каждое из 15 фактических полей собственного снимка совпадает до/после открытия и на клиенте/сервере; реальные поля связаны и readonly. Региональные 11 свойств не меняются.

  3. Параметры-массивы, неизвестные/дублированные ключи, другая база/обработка/метка, изменение исходного счета или формы — отказ до принятия результата. Проверять только на собственном стенде.

  4. Настоящие события, открытие формы, доставка внешнего запуска, системная ассоциация, компиляция CF и UI здесь не проверялись.

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

Новичок получает новую форму 750 из собственной ссылки и видит фактические региональные представления; числовой источник 500 не подменяется строкой и не записывается в базу.

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

  1. Здесь авторство кода и статические проверки, не исполнение 1С и не проверка рендеринга.

  2. Тип ДанныеПереходаПоНавигационнойСсылке не конструируется. Его параметры могут иметь массив значений; этот узкий маршрут допускает только две строки.

  3. Фиксированная метка маршрута сохраняется в CF, а не в памяти старого процесса. Она не подтверждает авторизацию, секретность или юридическое владение.

  4. После закрытия сеанса старая форма не существует для этого опыта. Новый исходный буфер 500 и сохраненная старая форма внутреннего перехода — разные случаи.

  5. ПутьКДанным читается на сервере формы. Клиент не имеет придуманного свойства Element.Value и не делает вывод о пикселях из связанных данных.

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

  7. ИспользоватьНастройкиТекущегоСеанса не меняется; True допускает настройки сеанса. Первый день 0 — автоматический, и русский формат не гарантируется.

  8. Снимки не обеспечивают атомарность, транзакционный откат или синхронизацию чужих сеансов. Один собственный пользователь/сеанс, без автоматического повтора после ошибки.

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

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

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

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

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