Тип: ДанныеПереходаПоНавигационнойСсылке, Неопределено. Используется для доступа к ссылке, по которой был произведен запуск приложения. Свойство доступно во всех клиентских обработчиках событий, начиная с обработчика события ПередНачаломРаботыСистемы. В мобильной платформе помимо внешней ссылки запуск может быть осуществлен с помощью ассоциативной ссылки со специальной схемой (maps://, mailto://, tel:, и т.д.).
Полное описание, параметры и ограничения
Глобальный контекст.ДанныеПереходаПоНавигационнойСсылкеЗапуска (Global context.LaunchURLNavigationData)
Глобальный контекст (Global context)
ДанныеПереходаПоНавигационнойСсылкеЗапуска (LaunchURLNavigationData)
Доступен, начиная с версии 8.3.18.
Использование:
Только чтение.
Описание:
Тип: ДанныеПереходаПоНавигационнойСсылке, Неопределено.
Используется для доступа к ссылке, по которой был произведен запуск приложения.
Свойство доступно во всех клиентских обработчиках событий, начиная с обработчика события ПередНачаломРаботыСистемы.
В мобильной платформе помимо внешней ссылки запуск может быть осуществлен с помощью ассоциативной ссылки со специальной схемой (maps://, mailto://, tel:, и т.д.).
Доступность:
Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер, интеграция.
Использование в версии:
Доступен, начиная с версии 8.3.18.
Методическая информация
Практические примеры
Собственная навигационная ссылка: счет 500 → новая форма 750
Полный самостоятельный опыт на новой собственной учебной базе: реальная ссылка выбирает количество, а региональные методы показывают сумму и дату без записи в базу.
Где и как запускать
Windows, тонкий клиент 8.5.1.1343, управляемое приложение Такси. Клиентское состояние модуля приложения; callback2 и запуск0 только настоящие.
Подготовка
Это код для будущего самостоятельного учебного опыта. Здесь новая база, конфигурация, пользователь, формы, переходы по ссылкам и 1С не создавались и не запускались. Используйте только собственный новый стенд без рабочих данных.
В Windows создайте новую пустую файловую базу в C:\1c-labs\OwnNavigationInvoiceLocale10_3aa9964e-9681-49ce-ba08-7ca7acba84e8\IB. Платформа точно 8.5.1.1343, имя конфигурации УчебнаяСсылкаСчета85, язык Русский, режим совместимости НеИспользовать, основной режим запуска УправляемоеПриложение, интерфейс Такси. Запускать именно тонкий клиент. Не переносите пример в существующую CF.
Создайте роль УчебнаяПолная85 с полными правами только своего стенда, включая Администрирование. Создайте единственного пользователя УченикСсылки85 с этой ролью. Не сохраняйте пароли в коде или ссылке. Никаких других пользователей, сеансов, расширений базы или сеанса, заданий, подписок, сервисов и производственных подключений.
Создайте единственную обработку КалькуляторСсылки85. Реквизиты: Количество85 — Число 3.0; Цена85 и Итог85 — Число 9.0; ДатаСчета85 — Дата с составом Дата и время. Табличных частей нет. Создайте ее управляемую основную форму Форма с основным реквизитом Объект типа ОбработкаОбъект.КалькуляторСсылки85. Добавьте параметр формы КоличествоЦель85 типа Число 3.0; не реквизит произвольного объекта и не конструктор формы.
В форме добавьте реквизиты Готово85 и Остановка85 типа Булево, исходные ИсходноеКоличество85 Число 3.0, ИсходнаяЦена85/ИсходныйИтог85 Число 9.0, ИсходнаяДата85 Дата и время. Добавьте СуммаТекст85/ДатаТекст85/ВремяТекст85/Регион85/СвояСсылка85/Статус85 типа Строка неограниченной длины, ПервыйДень85 Число 1.0. Их создает CF; код не придумывает свойства элементов.
Разместите 11 полей формы с именами Количество85, Цена85, Итог85, ДатаСчета85, СуммаТекст85, ДатаТекст85, ВремяТекст85, Регион85, ПервыйДень85, СвояСсылка85, Статус85. Первые четыре связаны с Объект.Количество85/Объект.Цена85/Объект.Итог85/Объект.ДатаСчета85; остальные — с одноименными реквизитами формы. У всех ТолькоПросмотр=Истина. Поле СвояСсылка85 многострочное, чтобы можно было скопировать собственную ссылку. Служебные исходные реквизиты и два флага на форму не выводите.
Создайте две команды формы СсылкаНаТри85 и ПерейтиКТрем85, назначьте им одноименные процедуры из полного модуля формы; разместите две кнопки, связанные с этими командами. Обработчики команды с параметром Команда создаются штатным редактором. Действие команды хранит имя обработчика; страницу Action8738 нельзя считать отдельным доказательством числа формальных параметров. Событие формы ПриСозданииНаСервере свяжите с одноименной процедурой с двумя параметрами. Обработчики вручную не вызывайте.
В Общие → Общие модули создайте УчебнаяСсылкаСчетаСервер85: Сервер=Да, Вызов сервера=Да; Клиент (управляемое приложение), Клиент (обычное приложение), Внешнее соединение, Глобальный и Привилегированный=Нет, Повторное использование возвращаемых значений=НеИспользовать. Вставьте полный COMMON. Других общих модулей нет. Региональный объект и метаданные читаются только серверным кодом; клиент получает фиксированные структуры из строк, чисел, булевых и дат, не региональные или навигационные объекты.
В модуль управляемого приложения вставьте полный APPLICATION. В модуль Обработки → КалькуляторСсылки85 → Формы → Форма вставьте полный FORM. Все процедуры стоят на уровне своего модуля. Обновите конфигурацию базы и запустите собственную базу тонким клиентом под УченикСсылки85. Настоящий ПриНачалеРаботыСистемы откроет свежую форму 2×250=500 без записей в базу.
Ссылка на количество 3 создается только нативными фабриками из фактических метаданных своей обработки, адреса своей базы и двух строковых параметров qty/stamp. Фиксированная метка 3aa9964e-9681-49ce-ba08-7ca7acba84e8 записана в подготовленной CF; это несекретная метка маршрута, не пароль и не доказательство владения. Новый случайный UUID в памяти не проверяет ссылку прошлого сеанса.
Внутренний опыт: оставьте свою форму 500 открытой, нажмите СсылкаНаТри85 для проверки показанной ссылки, затем ПерейтиКТрем85. Настоящий обработчик перехода должен получить нативный объект и открыть отдельную новую форму 750. Старая форма и все ее значения должны остаться прежними. Повторное одинаковое уведомление не создает еще одну форму. Обратный переход после принятого 750 к 500 этим маршрутом урока запрещен.
Опыт запуска: скопируйте фактическую собственную ссылку из СвояСсылка85, закройте только свою учебную сессию и вручную откройте эту ссылку через уже установленную штатную ассоциацию 1С. Не настраивайте протоколы программно. Память закрытого сеанса не сохраняется: новая форма сначала получает собственный исходный буфер 500, затем принимает количество 3 и показывает 750. Если ассоциация или доставка не работают, это ручная диагностика, не повод создавать поддельный объект или вызывать callback.
Не предполагается порядок событий запуска и перехода. До настоящего ПриНачалеРаботыСистемы callback сохраняет только проверенные скаляры. Открытие формы начинается после него; одинаковые данные глобального запуска и события сопоставляются, а повторная ошибка не сбрасывает STOP. Отдельно вручную проверьте оба реально наблюдаемых порядка, если платформа их доставляет; статические тесты не воспроизводят механизм запуска 1С.
Сравниваются все 15 полей клиентского и серверного снимка формы, восемь числовых/датовых полей счета и исходного буфера, все 11 свойств регионального источника до/после и повторного получения. ПутьКДанным доступен только на сервере формы; клиент читает связанные реквизиты, не Element.Value. Это проверка данных и политик, не доказательство отображенных пикселей.
Представления суммы, даты и времени берутся из фактических региональных настроек. При ИспользоватьНастройкиТекущегоСеанса=Истина методы используют настройки сеанса; это явно написано в Регион85. Номер первого дня 0 означает автоматический выбор, не понедельник. Формат русского текста, даты или разделителя заранее не обещается; числовые 500/750 остаются числами.
После исключения приложение или форма сохраняют STOP и не принимают старый результат за успех. Открытие формы — процедура без булевого результата; событие, ассоциация, диалоги и рендеринг здесь не проверены. При частичном открытии нет автоматического закрытия, отката или повторного запуска. Осмотрите только собственный стенд и начните новый сеанс вручную.
&НаКлиенте
Перем Остановка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 = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедурыВторой полный модуль того же самостоятельного опыта
Своя CF → Общие → ОбщиеМодули → УчебнаяСсылкаСчетаСервер85 → Модуль целиком
СерверДа/ВызовСервераДа, все клиентские флагиНет; без привилегий и повторного использования.
Процедура ПроверитьСтенд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 Тогда
РегионТекст = РегионТекст + "; первый день определяется автоматически";
Иначе
РегионТекст = РегионТекст + "; номер первого дня: " + Строка(ПервыйДень);
КонецЕсли;
Возврат Новый ФиксированнаяСтруктура("СуммаТекст,ДатаТекст,ВремяТекст,Регион,ПервыйДень", СуммаТекст, ДатаТекст, ВремяТекст, РегионТекст, ПервыйДень);
КонецФункцииПолная собственная форма: исходный буфер, 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 = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедурыРазбор по шагам
Подготовьте собственную обработку, типизированную форму и три полных модуля по дереву CF. Первый обычный запуск без ссылки создает исходные 2×250=500.
Сервер получает реальный относительный адрес обработки и базовый адрес своей базы. Нативная фабрика создает полную ссылку с двумя строковыми параметрами, не ручной конкатенацией.
Глобальный источник запуска может быть Неопределено. Настоящее событие перехода поставляет readonly объект; проверяются тип, оба адреса, Запуск и ровно qty/stamp без массивов и чужих ключей.
Данные запуска до открытия основного окна сохраняются только скалярами. После настоящего запуска новая уникальная форма создается фабрикой, проверяется до открытия и перечитывается после.
В каждой свежей форме сначала создан полный собственный буфер 500. Принятое количество 3 дает 750; внутренний переход отдельно перечитывает неизмененную старую форму 500.
Сервер получает настоящий региональный объект, делает три представления и читает первый день. Все региональные свойства и числовой счет сравниваются до/после; клиент получает только скаляры.
Проверьте настоящий повтор одинакового перехода, неизвестные параметры и ручной перезапуск. Ошибка сохраняет STOP, а отсутствие доставки не имитируется вызовом события.
Как проверить результат
Числовые контрольные результаты: свежий буфер 500, принятое количество 3 — 750; при внутреннем переходе старая форма остается 500. Все цены равны 250, дата — 10.10.2026 12:30:00.
Каждое из 15 фактических полей собственного снимка совпадает до/после открытия и на клиенте/сервере; реальные поля связаны и readonly. Региональные 11 свойств не меняются.
Параметры-массивы, неизвестные/дублированные ключи, другая база/обработка/метка, изменение исходного счета или формы — отказ до принятия результата. Проверять только на собственном стенде.
Настоящие события, открытие формы, доставка внешнего запуска, системная ассоциация, компиляция CF и UI здесь не проверялись.
Ожидаемый результат
Новичок получает новую форму 750 из собственной ссылки и видит фактические региональные представления; числовой источник 500 не подменяется строкой и не записывается в базу.
На что обратить внимание
Здесь авторство кода и статические проверки, не исполнение 1С и не проверка рендеринга.
Тип ДанныеПереходаПоНавигационнойСсылке не конструируется. Его параметры могут иметь массив значений; этот узкий маршрут допускает только две строки.
Фиксированная метка маршрута сохраняется в CF, а не в памяти старого процесса. Она не подтверждает авторизацию, секретность или юридическое владение.
После закрытия сеанса старая форма не существует для этого опыта. Новый исходный буфер 500 и сохраненная старая форма внутреннего перехода — разные случаи.
ПутьКДанным читается на сервере формы. Клиент не имеет придуманного свойства Element.Value и не делает вывод о пикселях из связанных данных.
Нативное Действие команды доказывает связь с именем процедуры, а не отдельный контракт формального параметра Команда; используйте штатный шаблон редактора управляемой команды.
ИспользоватьНастройкиТекущегоСеанса не меняется; True допускает настройки сеанса. Первый день 0 — автоматический, и русский формат не гарантируется.
Снимки не обеспечивают атомарность, транзакционный откат или синхронизацию чужих сеансов. Один собственный пользователь/сеанс, без автоматического повтора после ошибки.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.