Получить реальные три точки собственной подготовленной карты, проверить их имена/виды и положение в коллекции. По введенному числу найти именно удержанную точку того же индекса и показать строковый результат без запуска процесса.
Где и как запускать
Собственная новая File ИБ 8.5.1.1343: тонкий управляемый клиент и сервер своей формы; работа с точками и readonly именем/видом только на сервере.
Подготовка
Только будущая новая одноразовая Windows VM и новая пустая File ИБ C:\1c-labs\OwnRoutePoints4_0a67119e-d9f5-47c9-9a8e-8b63383956ea\IB. Не используйте рабочую УТ, старые процессы, задачи или произвольную переданную коллекцию. Пока стенд не создавался, запуск 1С не выполнялся.
Новая CF: Имя = УчебныеТочкиМаршрута85; Версия = OwnRoutePoints4_aed0f36c-9f30-4d9d-a115-c924c65c67bf; платформа 8.5.1.1343; основной режим — управляемое приложение; русский встроенный язык; режим совместимости — НеИспользовать. Создайте одну роль УчебныеТочкиМаршрута85Администратор с доступом к собственной форме. Единственный собственный пользователь и одно подключение; без расширений, общих реквизитов, заданий, подписок и внешних подключений. Маркеры имени, версии и пути не доказывают владение CF.
В дереве конфигурации добавьте Задачи → УчебнаяЗадача85 и Бизнес-процессы → УчебныйКонтроль85. В свойствах бизнес-процесса назначьте Задача = УчебнаяЗадача85. Не создавайте экземпляры процесса и записи задач. Урок читает определения карты, а не данные выполненных процессов.
УчебныйКонтроль85 → Карта маршрута: оставьте три настоящие точки Начало85 / Старт, Обработка85 / Обработка, Завершение85 / Завершение; соедините Начало85 → Обработка85 → Завершение85. Нет точек действия, адресации, ветвлений, вложенных процессов или обработчиков карты. Обработка не имеет адресации; ее выполнение в этом уроке не запускается.
После будущей ручной проверки конфигурации и обновления своей базы коллекция появится у БизнесПроцессы.УчебныйКонтроль85.ТочкиМаршрута. Новый ТочкиМаршрута не существует. Метаданные.БизнесПроцессы.УчебныйКонтроль85.КартаМаршрута всегда Неопределено — через это свойство карту не получают.
Общие → Общие формы → УчебныйМаршрут85: одна собственная управляемая форма. Реквизиты: Индекс85 / Число, длина 9, точность 0, исходно 0; Протокол85 / неограниченная Строка; Остановка85 / Булево, исходно Ложь. Только эти три корневых реквизита, без вложенных. Индекс85 — обычное поле ввода; Протокол85 — многострочное поле только просмотра; Остановка85 скрыт. В свойствах формы вручную задайте СохранениеДанныхВНастройках = НеИспользовать и АвтоматическоеСохранениеДанныхВНастройках = НеИспользовать. Это значения перечислений, не Булево; код их не записывает.
Добавьте единственную команду ПроверитьМаршрут85 с Действие = ПроверитьМаршрут85 и настоящую кнопку. Создайте штатный обработчик, сохранив параметр Команда. Вставьте основной код этой карточки целиком в модуль формы; событие ПриСозданииНаСервере свяжите с одноименной процедурой, сохранив оба штатных параметра.
Конфигурация → Открыть модуль управляемого приложения: вставьте полностью отдельный блок «УправляемоеПриложение» ниже. Запустите свою новую базу в тонком управляемом клиенте. Штатное событие открывает свою форму; никакие события или обработчики вручную из кода не вызываются.
Первое открытие получает фактическую непустую коллекцию своей карты и показывает ведомость ее трех точек и выбранный индекс 0. Чтение менеджера, коллекции и имен/видов происходит на сервере формы; клиент получает только строку. На клиент не передаются менеджеры или удержанные ссылки.
Введите по очереди 0, 1, 2 и нажимайте ПроверитьМаршрут85 в отдельных настоящих пользовательских событиях. В конце протокола должно меняться имя выбранной точки, совпадающее со строкой этого индекса в ведомости. Индекс 0 не обязан быть точкой старта: индекс коллекции не означает порядок выполнения графа.
Количество 3 и имена/виды — требования собственной конкретной подготовки, не универсальный результат API. После положительных проверок 0, 1, 2 отдельно проверьте неверные индексы 3 и -1, каждый на отдельном свежем собственном экземпляре формы в заранее подготовленном новом запуске своей лаборатории. Исключение должно возникнуть до Получить; текущая форма после него остановлена. Через поле с точностью 0 не обещается передача дробного значения 0.5 серверной проверке. Не обходите остановку повторами, закрытием/переоткрытием; нет автоматического восстановления или записи объектов.
&НаСервере
Процедура ПроверитьСтенд85()
Система = Новый СистемнаяИнформация;
Если ТипЗнч(Система) <> Тип("СистемнаяИнформация") Или СтрокаСоединенияИнформационнойБазы() <> "File=""C:\1c-labs\OwnRoutePoints4_0a67119e-d9f5-47c9-9a8e-8b63383956ea\IB"";" Или ИмяФормы <> "ОбщаяФорма.УчебныйМаршрут85" Тогда ВызватьИсключение "Не своя новая учебная File ИБ и форма"; КонецЕсли;
Если Метаданные.БизнесПроцессы.Количество() <> 1 Или Метаданные.БизнесПроцессы.Найти("УчебныйКонтроль85") = Неопределено
Или Метаданные.Задачи.Количество() <> 1 Или Метаданные.Задачи.Найти("УчебнаяЗадача85") = Неопределено
Или Метаданные.ОбщиеФормы.Количество() <> 1 Или Метаданные.ОбщиеФормы.Найти("УчебныйМаршрут85") = Неопределено
Или Метаданные.Роли.Количество() <> 1 Или Метаданные.Роли.Найти("УчебныеТочкиМаршрута85Администратор") = Неопределено
Или Метаданные.ОбщиеМодули.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0
Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Тогда ВызватьИсключение "Не точная подготовка своего стенда"; КонецЕсли;
Если Метаданные.БизнесПроцессы.Найти("УчебныйКонтроль85").Задача <> Метаданные.Задачи.Найти("УчебнаяЗадача85") Тогда ВызватьИсключение "Не своя задача назначена процессу"; КонецЕсли;
Если ПолучитьДействие("ПриСозданииНаСервере") <> "ПриСозданииНаСервере" Или Команды.Количество() <> 1 Тогда ВызватьИсключение "Не подготовлены событие и команда"; КонецЕсли;
Команда = Команды.Найти("ПроверитьМаршрут85");
Если ТипЗнч(Команда) <> Тип("КомандаФормы") Или Команда.Имя <> "ПроверитьМаршрут85" Или Команда.Действие <> "ПроверитьМаршрут85" Тогда ВызватьИсключение "Нет своей настоящей команды"; КонецЕсли;
Схема = Новый Структура("Индекс85,Протокол85,Остановка85", Тип("Число"), Тип("Строка"), Тип("Булево"));
Реквизиты = ПолучитьРеквизиты("");
Если ТипЗнч(Реквизиты) <> Тип("Массив") Или Реквизиты.Количество() <> 3 Тогда ВызватьИсключение "Не три собственных реквизита"; КонецЕсли;
Для Каждого Реквизит Из Реквизиты Цикл
Если ТипЗнч(Реквизит) <> Тип("РеквизитФормы") Тогда ВызватьИсключение "Не описание реквизита"; КонецЕсли;
Если ТипЗнч(Реквизит.Имя) <> Тип("Строка") Или Реквизит.Путь <> "" Или Не Схема.Свойство(Реквизит.Имя, ОжидаемыйТип) Тогда ВызватьИсключение "Не своя корневая схема"; КонецЕсли;
Если ТипЗнч(Реквизит.ТипЗначения) <> Тип("ОписаниеТипов") Тогда ВызватьИсключение "Не описание простого типа"; КонецЕсли;
Типы = Реквизит.ТипЗначения.Типы();
Если ТипЗнч(Типы) <> Тип("Массив") Или Типы.Количество() <> 1 Или Типы[0] <> ОжидаемыйТип Тогда ВызватьИсключение "Не свой простой тип"; КонецЕсли;
Схема.Удалить(Реквизит.Имя);
КонецЦикла;
Если Схема.Количество() <> 0 Или ТипЗнч(Остановка85) <> Тип("Булево") Или Остановка85
Или ТипЗнч(Индекс85) <> Тип("Число") Или ТипЗнч(Протокол85) <> Тип("Строка") Тогда ВызватьИсключение "Текущая форма остановлена или ее схема изменена"; КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ПроверитьМаршрутНаСервере85(Индекс)
ПроверитьСтенд85();
Если ТипЗнч(Индекс) <> Тип("Число") Или Индекс <> Цел(Индекс) Тогда ВызватьИсключение "Индекс должен быть целым числом"; КонецЕсли;
Менеджер = БизнесПроцессы.УчебныйКонтроль85;
Если ТипЗнч(Менеджер) <> Тип("БизнесПроцессМенеджер.УчебныйКонтроль85") Тогда ВызватьИсключение "Нет собственного менеджера процесса"; КонецЕсли;
Точки = Менеджер.ТочкиМаршрута;
Если ТипЗнч(Точки) <> Тип("ТочкиМаршрута") Тогда ВызватьИсключение "Нет настоящей коллекции своей карты"; КонецЕсли;
Количество = Точки.Количество();
Если ТипЗнч(Количество) <> Тип("Число") Или Количество <> 3 Тогда ВызватьИсключение "Нужны три реальные точки своей карты"; КонецЕсли;
Если Индекс < 0 Или Индекс >= Количество Тогда ВызватьИсключение "Индекс вне своей карты"; КонецЕсли;
Ожидаемые = Новый Структура("Начало85,Обработка85,Завершение85", ВидТочкиМаршрутаБизнесПроцесса.Старт, ВидТочкиМаршрутаБизнесПроцесса.Обработка, ВидТочкиМаршрутаБизнесПроцесса.Завершение);
Удержанные = Новый Массив(3);
Протокол = "Количество точек: " + Строка(Количество);
Для Каждого Точка Из Точки Цикл
Если ТипЗнч(Точка) <> Тип("ТочкаМаршрутаБизнесПроцессаСсылка.УчебныйКонтроль85") Тогда ВызватьИсключение "Не своя настоящая точка"; КонецЕсли;
Если ТипЗнч(Точка.Имя) <> Тип("Строка") Или ТипЗнч(Точка.Вид) <> Тип("ВидТочкиМаршрутаБизнесПроцесса") Тогда ВызватьИсключение "Не подтверждены имя и вид точки"; КонецЕсли;
Если Не Ожидаемые.Свойство(Точка.Имя, ОжидаемыйВид) Или Точка.Вид <> ОжидаемыйВид Тогда ВызватьИсключение "Не ожидаемая точка своей карты"; КонецЕсли;
Позиция = Точки.Индекс(Точка);
Если ТипЗнч(Позиция) <> Тип("Число") Или Позиция <> Цел(Позиция) Или Позиция < 0 Или Позиция >= Количество Тогда ВызватьИсключение "Не собственный индекс точки"; КонецЕсли;
Если Удержанные[Позиция] <> Неопределено Тогда ВызватьИсключение "Повтор индекса своей точки"; КонецЕсли;
Удержанные[Позиция] = Точка;
Ожидаемые.Удалить(Точка.Имя);
Протокол = Протокол + Символы.ПС + Строка(Позиция) + ": " + Точка.Имя + " / " + Строка(Точка.Вид);
КонецЦикла;
Если Ожидаемые.Количество() <> 0 Или Удержанные.Количество() <> Количество Тогда ВызватьИсключение "Не полная ведомость своей карты"; КонецЕсли;
Для Каждого Ссылка Из Удержанные Цикл
Если ТипЗнч(Ссылка) <> Тип("ТочкаМаршрутаБизнесПроцессаСсылка.УчебныйКонтроль85") Тогда ВызватьИсключение "Не все индексы заполнены своими точками"; КонецЕсли;
КонецЦикла;
Выбранная = Точки.Получить(Индекс);
Если ТипЗнч(Выбранная) <> Тип("ТочкаМаршрутаБизнесПроцессаСсылка.УчебныйКонтроль85") Тогда ВызватьИсключение "Не получена своя точка"; КонецЕсли;
Если Выбранная <> Удержанные[Индекс] Или Точки.Индекс(Выбранная) <> Индекс Тогда ВызватьИсключение "Не совпали фактическая ссылка и обратный индекс"; КонецЕсли;
Если ТипЗнч(Выбранная.Имя) <> Тип("Строка") Или ТипЗнч(Выбранная.Вид) <> Тип("ВидТочкиМаршрутаБизнесПроцесса")
Или Выбранная.Имя <> Удержанные[Индекс].Имя Или Выбранная.Вид <> Удержанные[Индекс].Вид Тогда ВызватьИсключение "Не совпали имя и вид выбранной точки"; КонецЕсли;
Возврат Протокол + Символы.ПС + "Выбрано: " + Строка(Индекс) + " → " + Выбранная.Имя + " / " + Строка(Выбранная.Вид);
КонецФункции
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Попытка
Если ТипЗнч(Отказ) <> Тип("Булево") Или ТипЗнч(СтандартнаяОбработка) <> Тип("Булево") Тогда ВызватьИсключение "Не штатное создание своей формы"; КонецЕсли;
ПроверитьСтенд85();
Протокол85 = ПроверитьМаршрутНаСервере85(Индекс85);
Исключение
Остановка85 = Истина;
Отказ = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьМаршрут85(Команда)
Если Остановка85 Тогда ВызватьИсключение "Текущая форма остановлена"; КонецЕсли;
Попытка
Если ТипЗнч(Команда) <> Тип("КомандаФормы") Тогда ВызватьИсключение "Не настоящая команда формы"; КонецЕсли;
Если Команды.Найти("ПроверитьМаршрут85") <> Команда Или Команда.Имя <> "ПроверитьМаршрут85"
Или Команда.Действие <> "ПроверитьМаршрут85" Тогда ВызватьИсключение "Не собственная команда этой формы"; КонецЕсли;
Результат = ПроверитьМаршрутНаСервере85(Индекс85);
Если ТипЗнч(Результат) <> Тип("Строка") Тогда ВызватьИсключение "Не строковый результат своей проверки"; КонецЕсли;
Протокол85 = Результат;
Исключение
Остановка85 = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
УправляемоеПриложение: проверка версии и штатное открытие своей формы
Конфигурация → Открыть модуль управляемого приложения
Тонкий управляемый клиент
Процедура ПриНачалеРаботыСистемы()
Система = Новый СистемнаяИнформация;
Если ТипЗнч(Система) <> Тип("СистемнаяИнформация") Тогда ВызватьИсключение "Нужна учебная платформа 8.5.1.1343"; КонецЕсли;
#Если ТонкийКлиент Тогда
ОткрытьФорму("ОбщаяФорма.УчебныйМаршрут85");
#Иначе
ВызватьИсключение "Урок подготовлен только для своего тонкого управляемого клиента";
#КонецЕсли
КонецПроцедуры
Разбор по шагам
Подготовить только свою новую лабораторию, CF, задачу, бизнес-процесс и настоящую карту из трех именованных точек. Не создавать записи процессов или задач.
Подготовить собственную форму с числовым индексом, строковым протоколом и одной командой; вставить оба полных модуля и связать штатные события.
При открытии пройти проверки стенда/схемы и непустой коллекции. Количество ограничивает выбор; фактический Индекс каждой точки заполняет собственный массив ссылок и видимую ведомость.
Ввести 0, 1, 2 и выполнить команду по очереди. Получить выбирает настоящую точку после проверки границ; равенство удержанной ссылке, обратный индекс, имя и вид проверяются до показа результата.
Как проверить результат
В ведомости ровно три разные точки своей карты: Начало85 / Старт, Обработка85 / Обработка, Завершение85 / Завершение; заняты все фактические индексы 0, 1, 2. Это определения карты, не три записанных бизнес-процесса.
После выбора каждого допустимого индекса последняя строка протокола совпадает с именем/видом точки этого индекса в ведомости. Не приписывайте индексам очередность выполнения маршрута.
После положительных 0, 1, 2 на отдельных свежих своих экземплярах проверьте 3 и -1: отказ должен возникнуть до Получить, текущая форма остановлена. Ошибка не объявляется успешным примером; точность 0 не гарантирует передачу дробного 0.5. Принадлежность и фактическая ссылка проверяются, а не угадываются по строковому имени.
Процесс не стартовал, задачи и записи базы не создавались. Изменяется только собственный строковый протокол формы. Здесь выполнена статическая сверка; будущая ручная проверка в 1С не выполнялась.
Ожидаемый результат
Ожидаемый будущий результат: видимая ведомость трех реальных точек своей карты и фактический выбор каждой из них по ее индексу, без выполнения процесса или записи задач.
На что обратить внимание
Коллекция создается платформой для подготовленной карты через менеджер своего процесса; пустой массив, выдуманная ссылка или чужая конфигурация не заменяют этот источник.
Индекс начинается с 0. Для чужой точки Индекс возвращает -1; урок не передает чужие точки. Поведение Получить на неверном индексе не обещается: собственная проверка запрещает такой вызов.
Тип ссылки допускает обмен с клиентом, но Имя/Вид и методы коллекции не доступны в тонком клиенте. Они читаются на сервере; свойства, зависящие от вида точки, не используются.
Имена, версия, путь и схема — проверки своей подготовки, не доказательство владения или правильности исполнения графа. Карта, соединения и отключенное сохранение настроек проверяются отдельно вручную.
Нельзя стартовать процесс, создавать задачи, получать данные запросом, изменять точки или пользоваться свойством метаданных КартаМаршрута ради этого урока. После ошибки текущую форму не повторять и не переоткрывать.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.