Точки своей карты маршрута: ведомость и выбор по индексу

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

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

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

Собственная новая File ИБ 8.5.1.1343: тонкий управляемый клиент и сервер своей формы; работа с точками и readonly именем/видом только на сервере.

Подготовка

  1. Только будущая новая одноразовая Windows VM и новая пустая File ИБ C:\1c-labs\OwnRoutePoints4_0a67119e-d9f5-47c9-9a8e-8b63383956ea\IB. Не используйте рабочую УТ, старые процессы, задачи или произвольную переданную коллекцию. Пока стенд не создавался, запуск 1С не выполнялся.

  2. Новая CF: Имя = УчебныеТочкиМаршрута85; Версия = OwnRoutePoints4_aed0f36c-9f30-4d9d-a115-c924c65c67bf; платформа 8.5.1.1343; основной режим — управляемое приложение; русский встроенный язык; режим совместимости — НеИспользовать. Создайте одну роль УчебныеТочкиМаршрута85Администратор с доступом к собственной форме. Единственный собственный пользователь и одно подключение; без расширений, общих реквизитов, заданий, подписок и внешних подключений. Маркеры имени, версии и пути не доказывают владение CF.

  3. В дереве конфигурации добавьте Задачи → УчебнаяЗадача85 и Бизнес-процессы → УчебныйКонтроль85. В свойствах бизнес-процесса назначьте Задача = УчебнаяЗадача85. Не создавайте экземпляры процесса и записи задач. Урок читает определения карты, а не данные выполненных процессов.

  4. УчебныйКонтроль85 → Карта маршрута: оставьте три настоящие точки Начало85 / Старт, Обработка85 / Обработка, Завершение85 / Завершение; соедините Начало85 → Обработка85 → Завершение85. Нет точек действия, адресации, ветвлений, вложенных процессов или обработчиков карты. Обработка не имеет адресации; ее выполнение в этом уроке не запускается.

  5. После будущей ручной проверки конфигурации и обновления своей базы коллекция появится у БизнесПроцессы.УчебныйКонтроль85.ТочкиМаршрута. Новый ТочкиМаршрута не существует. Метаданные.БизнесПроцессы.УчебныйКонтроль85.КартаМаршрута всегда Неопределено — через это свойство карту не получают.

  6. Общие → Общие формы → УчебныйМаршрут85: одна собственная управляемая форма. Реквизиты: Индекс85 / Число, длина 9, точность 0, исходно 0; Протокол85 / неограниченная Строка; Остановка85 / Булево, исходно Ложь. Только эти три корневых реквизита, без вложенных. Индекс85 — обычное поле ввода; Протокол85 — многострочное поле только просмотра; Остановка85 скрыт. В свойствах формы вручную задайте СохранениеДанныхВНастройках = НеИспользовать и АвтоматическоеСохранениеДанныхВНастройках = НеИспользовать. Это значения перечислений, не Булево; код их не записывает.

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

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

  9. Первое открытие получает фактическую непустую коллекцию своей карты и показывает ведомость ее трех точек и выбранный индекс 0. Чтение менеджера, коллекции и имен/видов происходит на сервере формы; клиент получает только строку. На клиент не передаются менеджеры или удержанные ссылки.

  10. Введите по очереди 0, 1, 2 и нажимайте ПроверитьМаршрут85 в отдельных настоящих пользовательских событиях. В конце протокола должно меняться имя выбранной точки, совпадающее со строкой этого индекса в ведомости. Индекс 0 не обязан быть точкой старта: индекс коллекции не означает порядок выполнения графа.

  11. Количество 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");
#Иначе
    ВызватьИсключение "Урок подготовлен только для своего тонкого управляемого клиента";
#КонецЕсли
КонецПроцедуры

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

  1. Подготовить только свою новую лабораторию, CF, задачу, бизнес-процесс и настоящую карту из трех именованных точек. Не создавать записи процессов или задач.

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

  3. При открытии пройти проверки стенда/схемы и непустой коллекции. Количество ограничивает выбор; фактический Индекс каждой точки заполняет собственный массив ссылок и видимую ведомость.

  4. Ввести 0, 1, 2 и выполнить команду по очереди. Получить выбирает настоящую точку после проверки границ; равенство удержанной ссылке, обратный индекс, имя и вид проверяются до показа результата.

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

  1. В ведомости ровно три разные точки своей карты: Начало85 / Старт, Обработка85 / Обработка, Завершение85 / Завершение; заняты все фактические индексы 0, 1, 2. Это определения карты, не три записанных бизнес-процесса.

  2. После выбора каждого допустимого индекса последняя строка протокола совпадает с именем/видом точки этого индекса в ведомости. Не приписывайте индексам очередность выполнения маршрута.

  3. После положительных 0, 1, 2 на отдельных свежих своих экземплярах проверьте 3 и -1: отказ должен возникнуть до Получить, текущая форма остановлена. Ошибка не объявляется успешным примером; точность 0 не гарантирует передачу дробного 0.5. Принадлежность и фактическая ссылка проверяются, а не угадываются по строковому имени.

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

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

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

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

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

  2. Индекс начинается с 0. Для чужой точки Индекс возвращает -1; урок не передает чужие точки. Поведение Получить на неверном индексе не обещается: собственная проверка запрещает такой вызов.

  3. Тип ссылки допускает обмен с клиентом, но Имя/Вид и методы коллекции не доступны в тонком клиенте. Они читаются на сервере; свойства, зависящие от вида точки, не используются.

  4. Имена, версия, путь и схема — проверки своей подготовки, не доказательство владения или правильности исполнения графа. Карта, соединения и отключенное сохранение настроек проверяются отдельно вручную.

  5. Нельзя стартовать процесс, создавать задачи, получать данные запросом, изменять точки или пользоваться свойством метаданных КартаМаршрута ради этого урока. После ошибки текущую форму не повторять и не переоткрывать.

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

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

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

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

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