ПолеГеографическойСхемы: свои пункты, режим области, масштаб и панель координат

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

Один полный ordinary workflow создаёт в своём новом поле3 вымышленных пункта и линию, получает actual viewport без конструктора, меняет режимы отображения и проверяет фактические свойства/координаты повторным чтением. Это не внешняя карта и не получение данных пользователя.

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

Полный ordinary form module собственной обработки, ТолстыйКлиентОбычноеПриложение. Supporting общий модуль — только ordinary client. Все runtime/manual действия только на отдельном own стенде.

Подготовка

  1. ВРУЧНУЮ создайте НОВУЮ отдельную файловую базу8.5.1.1343 в C:\1C85_OwnGeoLab\67bf4ed8-e0d9-4642-a3a2-15d18768ea55\Base. Имя конфигурации=УчебнаяГеографическаяОбласть85, основное приложение=Обычное. Ровно один собственный пользователь География85Ученик с полными правами только в этой пустой базе. Не копируйте рабочую базу. Нет справочников, документов, регистров, планов, внешних источников, расширений, фоновых заданий, подписок. Автор НЕ создавал/запускал базу/1С/GUI/fixture/сеть; actualruntime=0, новых backups/archives нет.

  2. Обработки→Добавить→УчебнаяГеографическаяОбласть85. Создайте ровно одну Обычную форму Основная. Реквизит Состояние85=Строка неограниченной длины. В редакторе этой формы разместите настоящий элемент управления ПолеГеографическойСхемы, имя Карта85. Это actual native factory: экземпляр создаёт платформа по собственной подготовленной форме, код получает его через ЭлементыФормы.Карта85. Конструкторов поля и viewport НЕТ; не пишите Новый ПолеГеографическойСхемы/ПоказываемаяОбластьГеографическойСхемы.

  3. В свойствах собственной обработки назначьте Основная основной формой обработки. Сохраните свою конфигурацию и вручную выполните Конфигурация→Обновить конфигурацию базы данных только этой новой базы. Запустите её в обычном режиме толстого клиента8.5.1.1343 под География85Ученик. Штатный путь обычного приложения, подтверждённый установленной справкой1cv8_ru.hbk/EnterprWorkingWithDataProcessors: Операции→Обработка…→УчебнаяГеографическаяОбласть85→OK. Откроется собственная Основная и платформа вызовет ПриОткрытии(). Не требуется существующее меню рабочей конфигурации, отдельный программный launcher, интерфейс или обработчик приложения. Если штатная команда или собственная обработка не доступна, остановитесь и проверьте режим/права/назначение основной формы в этой пустой базе; не открывайте другую базу. Автор ничего из этого не запускал.

  4. Поле Карта85 изначально пустое, без макета/восстановленных значений/подложки/внешнего файла. Не связывайте его с чужим реквизитом карты, не загружайте GPS/SHP/MXL и сервисы карт. Отключите восстановление значений при открытии своей формы. Состояние85 разместите отдельным многострочным полем только для просмотра. Никаких объектов бизнеса и строк БД для урока не требуется.

  5. Добавьте4 отдельные обычные Кнопка: ВсеДанные85, ОбластьПунктаБ85, УдвоитьМасштаб85, ПанельКоординат85. Свяжите событие Нажатие каждой кнопки с одноимённой процедурой(Кнопка). Базовое Нажатие() имеет0 payload, ordinary extension элемента в форме добавляет первый Элемент — здесь Кнопка. Это НЕ managed команда и НЕ кнопка командной панели. Событие формы ПриОткрытии свяжите с ПриОткрытии(). Ни один event handler не вызывайте вручную.

  6. Основной код целиком вставьте на уровне модуля формы. В нём создание собственной геометрии происходит при открытии впервые, до успешного состояния ГеометрияГотова85. Повторное открытие существующего окна не объявляем повторной инициализацией native события. После ошибки построения кнопки запрещены; возможная частичная собственная in-memory геометрия НЕ выдаётся за атомарное создание или рабочую карту.

  7. ОбщиеМодули→Добавить→СтендГеографии85. Клиент(обычное приложение)=Да; Сервер, Клиент(управляемое приложение), ВнешнееСоединение, Глобальный, Привилегированный=Нет. Вставьте полный supportingModules код. Других общих модулей/обработок нет. Guard проверяет точно File="C:\1C85_OwnGeoLab\67bf4ed8-e0d9-4642-a3a2-15d18768ea55\Base"; и своего пользователя до доступа к полю. Если собственная строка соединения отличается, сначала разберите причину в своём тестовом стенде, не отключайте guard и не подставляйте рабочий путь.

  8. Собственные пункты заданы неизменяемыми literal данными: geo85-A=широта55/долгота37/высота100; geo85-B=55.1/37.2/110; geo85-C=55.15/37.05/120. Широта/долгота — градусы, высота — метры согласно native координатам. Это вымышленные маркеры, не реальные пользователи/заказы. Пункты85 содержит3 actual point objects, Маршруты85 —1 actual polyline с1 сегментом и3 координатами A→B→C. Нет геокодирования, километров или дорожной маршрутизации.

  9. Область вокруг B: юг55.07, север55.13, запад37.17, восток37.23. Она включает B, не включает A/C. Возвращаемую область не присваиваем readonly свойству. После изменения4 RW границ заново получаем её из того же actual поля и сверяем значения. Не делаем предположения live/copy; если повторное чтение не сохранило данные, урок отказывает. Результат API readback не заменяет ручную проверку renderer.

#Если ТолстыйКлиентОбычноеПриложение Тогда

Перем ГеометрияГотова85;

Процедура ПриОткрытии()
    ГеометрияГотова85 = Ложь;
    Поле = ПолучитьСобственноеПоле85();
    Если Поле.Слои.Количество() <> 0 Тогда
        ВызватьИсключение "Создание разрешено только в своём новом пустом поле, без восстановленных слоёв";
    КонецЕсли;
    Поле.Обновление = Ложь;
    Попытка
        Поле.Проекция = ТипПроекцииГеографическойСхемы.ЦилиндрическаяРавноудаленнаяПроекция;
        Поле.СмещениеШироты = 0;
        Поле.СмещениеДолготы = 0;
        Поле.Вывод = ИспользованиеВывода.Запретить;
        Пункты = Поле.Слои.Добавить("Пункты85", Тип("ТочечныйОбъектГеографическойСхемы"));
        Пункты.Текст = "Вымышленные пункты85";
        Пункты.Видимость = Истина;
        Пункты.РазрешитьВыбор = Истина;
        Данные = СобственныеКоординаты85();
        Для Каждого СтрокаПункта Из Данные Цикл
            Пункт = Пункты.Объекты.Добавить();
            Пункт.Значение = СтрокаПункта.Код;
            Пункт.Координаты = Новый ГеографическиеКоординаты(СтрокаПункта.Широта, СтрокаПункта.Долгота, СтрокаПункта.Высота);
            Пункт.Видимость = Истина;
            Пункт.ТипОтрисовки = ТипОтображенияТочечногоОбъектаГеографическойСхемы.Маркер;
            Пункт.Маркер = ТипМаркераГеографическойСхемы.БольшойКруг;
            Пункт.ОтображатьДанные = Ложь;
            Пункт.Подсказка = "Вымышленный собственный пункт " + СтрокаПункта.Код;
        КонецЦикла;
        Маршруты = Поле.Слои.Добавить("Маршруты85", Тип("ПолилинейныйОбъектГеографическойСхемы"));
        Маршруты.Текст = "Учебная линия A→B→C";
        Маршруты.Видимость = Истина;
        Маршруты.РазрешитьВыбор = Истина;
        Линия = Маршруты.Объекты.Добавить();
        Линия.Значение = "geo85-line-ABC";
        Линия.Видимость = Истина;
        Линия.ОтображатьДанные = Ложь;
        Линия.Цвет = Новый Цвет(230, 120, 25);
        Сегмент = Линия.Сегменты.Добавить();
        Для Каждого СтрокаПункта Из Данные Цикл
            Сегмент.Добавить(Пункты.НайтиПоЗначению(СтрокаПункта.Код).Координаты);
        КонецЦикла;
        ПрочитатьСобственнуюГеометрию85(Поле);
        Поле.ОтображатьКоординаты = Истина;
        Поле.ПоддержкаМасштаба = РежимОтображенияГеографическойСхемы.ВсеДанные;
        Поле.АктивныйОбъект = Пункты.НайтиПоЗначению("geo85-A");
        Если Не Поле.ОтображатьКоординаты Или Поле.ПоддержкаМасштаба <> РежимОтображенияГеографическойСхемы.ВсеДанные Тогда
            ВызватьИсключение "Начальный режим своего поля не прочитался обратно";
        КонецЕсли;
        ПроверитьСобственныйАктивныйОбъект85(Поле, "geo85-A");
        Поле.Обновление = Истина;
        ГеометрияГотова85 = Истина;
        Состояние85 = "Свои3 пункта и линия готовы. ВсеДанные, ОбластьПунктаБ85, УдвоитьМасштаб85, ПанельКоординат85 меняют только отображение своей формы.";
    Исключение
        Поле.Обновление = Истина;
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

Процедура ВсеДанные85(Кнопка)
    ПрименитьСобственныйПрофиль85("ВсеДанные");
КонецПроцедуры

Процедура ОбластьПунктаБ85(Кнопка)
    ПрименитьСобственныйПрофиль85("ОбластьБ");
КонецПроцедуры

Процедура УдвоитьМасштаб85(Кнопка)
    ПрименитьСобственныйПрофиль85("Масштаб");
КонецПроцедуры

Процедура ПанельКоординат85(Кнопка)
    ПрименитьСобственныйПрофиль85("Координаты");
КонецПроцедуры

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

Функция СобственныеКоординаты85()
    Данные = Новый Массив;
    Данные.Добавить(Новый ФиксированнаяСтруктура("Код,Широта,Долгота,Высота", "geo85-A", 55, 37, 100));
    Данные.Добавить(Новый ФиксированнаяСтруктура("Код,Широта,Долгота,Высота", "geo85-B", 55.1, 37.2, 110));
    Данные.Добавить(Новый ФиксированнаяСтруктура("Код,Широта,Долгота,Высота", "geo85-C", 55.15, 37.05, 120));
    Возврат Новый ФиксированныйМассив(Данные);
КонецФункции

Функция ПрочитатьСобственнуюГеометрию85(Поле)
    Если Поле.Слои.Количество() <> 2 Или Поле.Слои.Получить(0).Имя <> "Пункты85"
        Или Поле.Слои.Получить(1).Имя <> "Маршруты85" Тогда
        ВызватьИсключение "Допустимы ровно2 слоя, созданные этим модулем собственного поля";
    КонецЕсли;
    Пункты = Поле.Слои.Получить(0);
    Маршруты = Поле.Слои.Получить(1);
    Если Пункты.ТипОбъектов <> Тип("ТочечныйОбъектГеографическойСхемы") Или Пункты.Объекты.Количество() <> 3
        Или Маршруты.ТипОбъектов <> Тип("ПолилинейныйОбъектГеографическойСхемы") Или Маршруты.Объекты.Количество() <> 1 Тогда
        ВызватьИсключение "Неверны типы или состав собственной геометрии";
    КонецЕсли;
    Данные = СобственныеКоординаты85();
    Части = Новый Массив;
    Для Индекс = 0 По 2 Цикл
        Пункт = Пункты.Объекты.Получить(Индекс);
        Если Пункт.Значение <> Данные[Индекс].Код Или Пункт.Слой <> Пункты
            Или Пункты.НайтиПоЗначению(Данные[Индекс].Код) <> Пункт Тогда
            ВызватьИсключение "Собственный пункт не принадлежит actual слою этого поля";
        КонецЕсли;
        Координаты = Пункт.Координаты;
        Если ТипЗнч(Координаты) <> Тип("ГеографическиеКоординаты")
            Или ТипЗнч(Координаты.Широта) <> Тип("Число") Или Координаты.Широта <> Данные[Индекс].Широта
            Или ТипЗнч(Координаты.Долгота) <> Тип("Число") Или Координаты.Долгота <> Данные[Индекс].Долгота
            Или ТипЗнч(Координаты.Высота) <> Тип("Число") Или Координаты.Высота <> Данные[Индекс].Высота Тогда
            ВызватьИсключение "Actual координаты своего пункта отличаются от literal подготовки";
        КонецЕсли;
        Части.Добавить(Строка(Пункт.Значение));
        Части.Добавить(Строка(Координаты.Широта));
        Части.Добавить(Строка(Координаты.Долгота));
        Части.Добавить(Строка(Координаты.Высота));
    КонецЦикла;
    Линия = Маршруты.Объекты.Получить(0);
    Если Линия.Слой <> Маршруты Или Линия.Значение <> "geo85-line-ABC" Или Линия.Сегменты.Количество() <> 1 Тогда
        ВызватьИсключение "Нужна ровно собственная линия A→B→C";
    КонецЕсли;
    Сегмент = Линия.Сегменты.Получить(0);
    Если Сегмент.Количество() <> 3 Тогда
        ВызватьИсключение "Собственный сегмент обязан содержать все3 координаты";
    КонецЕсли;
    Для Индекс = 0 По 2 Цикл
        Координаты = Сегмент.Получить(Индекс);
        Если Координаты.Широта <> Данные[Индекс].Широта Или Координаты.Долгота <> Данные[Индекс].Долгота
            Или Координаты.Высота <> Данные[Индекс].Высота Тогда
            ВызватьИсключение "Actual последовательность координат линии повреждена";
        КонецЕсли;
        Части.Добавить(Строка(Координаты.Широта));
        Части.Добавить(Строка(Координаты.Долгота));
        Части.Добавить(Строка(Координаты.Высота));
    КонецЦикла;
    Если Поле.Проекция <> ТипПроекцииГеографическойСхемы.ЦилиндрическаяРавноудаленнаяПроекция
        Или Поле.СмещениеШироты <> 0 Или Поле.СмещениеДолготы <> 0 Или Поле.Вывод <> ИспользованиеВывода.Запретить Тогда
        ВызватьИсключение "Изменена собственная проекция, смещение или политика вывода";
    КонецЕсли;
    Возврат СтрСоединить(Части, Символы.ПС);
КонецФункции

Процедура ПроверитьСобственныйАктивныйОбъект85(Поле, КодПункта)
    Если КодПункта <> "geo85-A" И КодПункта <> "geo85-B" Тогда
        ВызватьИсключение "В этом маршруте программно выбирают только свои A или B";
    КонецЕсли;
    Пункты = Поле.Слои.Получить(0);
    Пункт = Пункты.НайтиПоЗначению(КодПункта);
    Активный = Поле.АктивныйОбъект;
    ИндексПункта = ?(КодПункта = "geo85-A", 0, 1);
    Если ТипЗнч(Активный) <> Тип("ТочечныйОбъектГеографическойСхемы") Или Активный <> Пункт
        Или Активный.Слой <> Пункты Или Пункты.Объекты.Получить(ИндексПункта) <> Активный Тогда
        ВызватьИсключение "АктивныйОбъект не прочитался как настоящий свой пункт actual поля";
    КонецЕсли;
КонецПроцедуры

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

Процедура УстановитьСобственныеГраницы85(Поле, Границы)
    Если ТипЗнч(Границы.Юг) <> Тип("Число") Или ТипЗнч(Границы.Север) <> Тип("Число")
        Или ТипЗнч(Границы.Запад) <> Тип("Число") Или ТипЗнч(Границы.Восток) <> Тип("Число") Тогда
        ВызватьИсключение "Все4 границы должны быть числами";
    КонецЕсли;
    Если Границы.Юг < -90 Или Границы.Север > 90 Или Границы.Юг >= Границы.Север
        Или Границы.Запад < -180 Или Границы.Восток > 180 Или Границы.Запад >= Границы.Восток Тогда
        ВызватьИсключение "Недопустимая собственная область: порядок или диапазоны границ";
    КонецЕсли;
    Если Поле.ПоддержкаМасштаба <> РежимОтображенияГеографическойСхемы.ЗаданнаяОбласть Тогда
        ВызватьИсключение "Сначала должен быть выбран native режим ЗаданнаяОбласть";
    КонецЕсли;
    Область = Поле.ОтображаемаяОбласть;
    Если ТипЗнч(Область) <> Тип("ПоказываемаяОбластьГеографическойСхемы") Тогда
        ВызватьИсключение "Нет фактической области собственного поля";
    КонецЕсли;
    Область.ШиротаЮжнойГраницы = Границы.Юг;
    Область.ШиротаСевернойГраницы = Границы.Север;
    Область.ДолготаЗападнойГраницы = Границы.Запад;
    Область.ДолготаВосточнойГраницы = Границы.Восток;
    После = ПрочитатьСобственныеГраницы85(Поле);
    Если После.Юг <> Границы.Юг Или После.Север <> Границы.Север Или После.Запад <> Границы.Запад Или После.Восток <> Границы.Восток Тогда
        ВызватьИсключение "Повторное чтение actual поля не сохранило4 границы; не предполагаем live/copy и не подменяем readonly свойство";
    КонецЕсли;
КонецПроцедуры

Процедура ПрименитьСобственныйПрофиль85(Профиль)
    Если Не ГеометрияГотова85 Тогда
        ВызватьИсключение "Сначала нужна успешно построенная собственная геометрия";
    КонецЕсли;
    Если Профиль <> "ВсеДанные" И Профиль <> "ОбластьБ" И Профиль <> "Масштаб" И Профиль <> "Координаты" Тогда
        ВызватьИсключение "Неизвестный профиль своего учебного отображения";
    КонецЕсли;
    Поле = ПолучитьСобственноеПоле85();
    СнимокДо = ПрочитатьСобственнуюГеометрию85(Поле);
    СтарыйРежим = Поле.ПоддержкаМасштаба;
    СтарыйМасштаб = Поле.Масштаб;
    СтарыеКоординаты = Поле.ОтображатьКоординаты;
    СтарыеГраницы = Неопределено;
    Если СтарыйРежим = РежимОтображенияГеографическойСхемы.ЗаданнаяОбласть Тогда
        СтарыеГраницы = ПрочитатьСобственныеГраницы85(Поле);
    КонецЕсли;
    Если Профиль = "Масштаб" И (ТипЗнч(СтарыйМасштаб) <> Тип("Число") Или СтарыйМасштаб <= 0 Или СтарыйМасштаб > 1000000000000) Тогда
        ВызватьИсключение "Сначала покажите свою геометрию: нужен положительный фактически вычисленный масштаб, без угаданной единицы";
    КонецЕсли;
    Попытка
        Если Профиль = "ВсеДанные" Тогда
            Поле.ПоддержкаМасштаба = РежимОтображенияГеографическойСхемы.ВсеДанные;
        ИначеЕсли Профиль = "ОбластьБ" Тогда
            Поле.ПоддержкаМасштаба = РежимОтображенияГеографическойСхемы.ЗаданнаяОбласть;
            Границы = Новый ФиксированнаяСтруктура("Юг,Север,Запад,Восток", 55.07, 55.13, 37.17, 37.23);
            УстановитьСобственныеГраницы85(Поле, Границы);
        ИначеЕсли Профиль = "Масштаб" Тогда
            Поле.ПоддержкаМасштаба = РежимОтображенияГеографическойСхемы.ЗадаетсяМасштабом;
            ТребуетсяМасштаб = СтарыйМасштаб * 2;
            Поле.Масштаб = ТребуетсяМасштаб;
            Если Поле.Масштаб <> ТребуетсяМасштаб Тогда
                ВызватьИсключение "Actual масштаб не принял выбранное удвоение; не сообщаем об успехе";
            КонецЕсли;
        Иначе
            Поле.ОтображатьКоординаты = Не СтарыеКоординаты;
            Если Поле.ОтображатьКоординаты <> Не СтарыеКоординаты Тогда
                ВызватьИсключение "Настройка собственной панели координат не прочиталась обратно";
            КонецЕсли;
        КонецЕсли;
        Если (Профиль = "ВсеДанные" И Поле.ПоддержкаМасштаба <> РежимОтображенияГеографическойСхемы.ВсеДанные)
            Или (Профиль = "ОбластьБ" И Поле.ПоддержкаМасштаба <> РежимОтображенияГеографическойСхемы.ЗаданнаяОбласть)
            Или (Профиль = "Масштаб" И Поле.ПоддержкаМасштаба <> РежимОтображенияГеографическойСхемы.ЗадаетсяМасштабом) Тогда
            ВызватьИсключение "Actual режим поля не прочитался обратно";
        КонецЕсли;
        Если ПрочитатьСобственнуюГеометрию85(Поле) <> СнимокДо Тогда
            ВызватьИсключение "Режим отображения не должен изменять координаты и состав собственной геометрии";
        КонецЕсли;
    Исключение
        ОшибкаПрофиля = ОписаниеОшибки();
        Попытка
            Поле.ПоддержкаМасштаба = СтарыйРежим;
            Если СтарыеГраницы <> Неопределено Тогда
                УстановитьСобственныеГраницы85(Поле, СтарыеГраницы);
            ИначеЕсли СтарыйРежим = РежимОтображенияГеографическойСхемы.ЗадаетсяМасштабом Тогда
                Поле.Масштаб = СтарыйМасштаб;
                Если Поле.Масштаб <> СтарыйМасштаб Тогда
                    ВызватьИсключение "Не восстановился фактический прежний масштаб";
                КонецЕсли;
            КонецЕсли;
            Поле.ОтображатьКоординаты = СтарыеКоординаты;
            Если Поле.ПоддержкаМасштаба <> СтарыйРежим Или Поле.ОтображатьКоординаты <> СтарыеКоординаты
                Или ПрочитатьСобственнуюГеометрию85(Поле) <> СнимокДо Тогда
                ВызватьИсключение "Не подтвердилось восстановление своего прежнего отображения";
            КонецЕсли;
        Исключение
            ВызватьИсключение ОшибкаПрофиля + "; ошибка восстановления собственного UI: " + ОписаниеОшибки();
        КонецПопытки;
        ВызватьИсключение ОшибкаПрофиля;
    КонецПопытки;
    Если Профиль = "ОбластьБ" Тогда
        Пункты = Поле.Слои.Получить(0);
        Поле.АктивныйОбъект = Пункты.НайтиПоЗначению("geo85-B");
        ПроверитьСобственныйАктивныйОбъект85(Поле, "geo85-B");
    ИначеЕсли Профиль = "ВсеДанные" Тогда
        Пункты = Поле.Слои.Получить(0);
        Поле.АктивныйОбъект = Пункты.НайтиПоЗначению("geo85-A");
        ПроверитьСобственныйАктивныйОбъект85(Поле, "geo85-A");
    КонецЕсли;
    Состояние85 = "Прочитан собственный профиль " + Профиль + ", режим=" + Строка(Поле.ПоддержкаМасштаба)
        + ", actual масштаб=" + Строка(Поле.Масштаб) + ". Геометрия3+1 сохранена. Отрисовку, выбор и границы проверьте вручную.";
КонецПроцедуры

#КонецЕсли
Полный общий модуль допуска собственного стенда

ОбщиеМодули.СтендГеографии85.Модуль

КлиентОбычноеПриложение=Да; Сервер/КлиентУправляемоеПриложение/ВнешнееСоединение/Глобальный/Привилегированный=Нет

Процедура ПроверитьСвойСтенд85() Экспорт
    Если СтрокаСоединенияИнформационнойБазы() <> "File=""C:\1C85_OwnGeoLab\67bf4ed8-e0d9-4642-a3a2-15d18768ea55\Base"";"
        Или ИмяПользователя() <> "География85Ученик" Тогда
        ВызватьИсключение "Допустим только свой отдельный файловый стенд и собственный пользователь";
    КонецЕсли;
    Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
        ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
    КонецЕсли;
    Если Метаданные.Обработки.Количество() <> 1 Или Метаданные.ОбщиеМодули.Количество() <> 1 Тогда
        ВызватьИсключение "Нужны только своя обработка и свой общий модуль";
    КонецЕсли;
    Описание = Метаданные.Обработки.Найти("УчебнаяГеографическаяОбласть85");
    Если Описание = Неопределено Или Метаданные.ОбщиеМодули.Найти("СтендГеографии85") = Неопределено Тогда
        ВызватьИсключение "Не подготовлены точные собственные метаданные";
    КонецЕсли;
    Если Описание.Формы.Количество() <> 1 Или Описание.Формы.Найти("Основная") = Неопределено Тогда
        ВызватьИсключение "Нужна только своя обычная форма Основная";
    КонецЕсли;
    Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
        ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
    КонецЕсли;
    Источники = Новый Массив;
    Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
    Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
    Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
    Для Каждого Источник Из Источники Цикл
        Расширения = РасширенияКонфигурации.Получить(, Источник);
        Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
            ВызватьИсключение "Native список расширений должен иметь тип Массив";
        КонецЕсли;
        Если Расширения.Количество() <> 0 Тогда
            ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
        КонецЕсли;
    КонецЦикла;
    Если ТранзакцияАктивна() Тогда
        ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
    КонецЕсли;
КонецПроцедуры

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

  1. ПриОткрытии получает подготовленное native поле только после exact guard. ТипЗнч и имя подтверждают именно свой actual control. ГеографическаяСхемаField native type явно наследует все свойства/методы ГеографическаяСхема: на его собственных Слои/Объекты создаются точки и линия, не неизвестный объект-аргумент.

  2. Обновление временно отключено на время создания только своей геометрии и включается также при ошибке. Readback подтверждает точные2 слоя,3 точки,1 линию, принадлежность объектов actual слоям,3 координаты сегмента и все9 числовых координат. Состояние готовности устанавливается только после успешных проверок.

  3. Начальный режим ВсеДанные, координатная панель включена; actual АктивныйОбъект выбирает именно собственный A из коллекции текущего поля. Readback проверяет actual point type/identity, слой и объект по известной собственной позиции A=0/B=1 через native Получить. У ОбъектыСлояГеографическойСхемы нет метода Индекс. Не используем объекты отдельной копии схемы или произвольные данные callback.

  4. ОбластьПунктаБ85 переключает native ПоддержкаМасштаба на ЗаданнаяОбласть. Только в этом режиме получает actual Поле.ОтображаемаяОбласть, проверяет её native тип, задаёт4 границы и повторно читает их из поля. Название readonly ссылки и RW границ — разные уровни доступа.

  5. После успешного профиля области выбирается собственный B именно из actual слоя поля; его identity и принадлежность читаются обратно. Подсветка, центр/видимый фрагмент и положение линии требуют ручного наблюдения. Не утверждаем, что одни setter-ы доказали правильную отрисовку.

  6. УдвоитьМасштаб85 читает реально рассчитанное положительное поле.Масштаб и лишь затем переключает ЗадаетсяМасштабом. Новое значение=старое*2 и повторно проверяется. Единица масштаба/визуальная степень увеличения из краткого native описания НЕ угадываются; проверяется параметр, а поведение zoom — вручную.

  7. ВсеДанные85 возвращает режим отображения всех объектов и выбирает actual собственный A. Поле.ОтображатьКоординаты toggles отдельной кнопкой True↔False с readback; координаты точек при этом не изменяются. Дополнительная панель показывает положение курсора по native описанию, не высоты из БД.

  8. Перед каждым изменением проверяется actual geometry и снимается scalar-снимок её кодов/координат, а не архив/файл. После профиля геометрия снова полностью читается и снимок должен совпасть. При неизвестном слое/лишнем объекте/изменённых координатах модуль не продолжает настройку отображения.

  9. Предыдущий режим, масштаб и координатная панель снимаются перед профилем;4 предыдущих границы читаются только если действовал ЗаданнаяОбласть. При ошибке пытаемся восстановить свои значения через новый actual viewport getter и проверяем readback. Ошибка восстановления добавляется к исходной, не скрывается. Это не DBtransaction и не гарантия атомарного UI.

  10. Программный выбор A/B выполняется после проверенного профиля. Если именно setter/проверка выбора ошибается, прежний выбор не гарантируется восстановленным: код не заявляет общий rollback всех UI операций и не печатает успешное состояние. Источник — только in-memory геометрия своей формы.

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

  1. После первого открытия ожидаются3 вымышленных маркера и линия A→B→C без подложки. Модуль проверяет actual geometry/координаты, но автор в1С не запускал и визуальное появление не подтверждал. Никакая внешняя карта или реальная база не используется.

  2. Нажмите ОбластьПунктаБ85: actual режим=ЗаданнаяОбласть,4 повторно прочитанные границы=55.07/55.13/37.17/37.23, actual активный пункт=B. В своём клиенте вручную проверьте видимый участок, B и обрезку линии; A/C не должны попадать в заданные bounds. Readback alone не доказывает renderer.

  3. Нажмите ВсеДанные85: actual режим снова ВсеДанные, active=A; вручную проверьте все3 маркера. Переключение режима не удаляет и не создаёт слои/пункты.

  4. После появления геометрии нажмите УдвоитьМасштаб85: параметр должен совпасть с ранее прочитанным*2, native режим=ЗадаетсяМасштабом. Не подписывайте это как гарантированное визуальное увеличение в2 раза или фиксированные проценты без manual проверки.

  5. ПанельКоординат85 нажмите дважды: True→False→True либо наоборот, actual readback совпадает, geometry snapshot остаётся тем же. Проверьте движение курсора и показ панели вручную.

  6. В своём отдельном учебном тексте поменяйте одну границу на неправильный порядок/тип либо один literal пункт: guard геометрии/bounds должен отказать, без ложного успеха. Не присваивайте Поле.ОтображаемаяОбласть и не создавайте fake viewport. При detached copy readback failure нельзя обходить проверку или подставлять ожидаемые значения.

  7. Связав событие другой кнопки по ошибке с одним из4 handlers, Вы всё равно работаете только с собственным Карта85; не переносите этот код на произвольный incoming объект. Методами из другого модуля не передавайте чужое поле/границы: helpers — внутренний маршрут данной формы, не экспортируемый универсальный API.

  8. Проверьте фактический foreign/missing object guard: собственный A/B обязаны находиться в actual слое и возвращаться actual АктивныйОбъект. Не выдавайте снятие пользовательского выделения/Неопределено за документированный вход setter: в коде программно назначаются только реальные A/B.

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

Ожидаемый ручной результат — своя ordinary карта с3 пунктами/линией, проверяемыми native параметрами области/масштаба/активного объекта и неизменной геометрией. Автор выполнил source/static/native проверки, actual1C/renderer/runtime=0.

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

  1. Только ordinary thick Windows8.5.1.1343. ПолеГеографическойСхемы — не managed Расширение географической схемы; тонкий/web/managed маршрут сюда не переносится. Конструкторов control/viewport нет, actual источник — подготовленная собственная форма.

  2. В native примере ПоказываемаяОбластьГеографическойСхемы ошибочно написано поле.ПоказываемаяОбласть; зарегистрированная property native Field API точно ОтображаемаяОбласть. Используем её, не создаём alias и не подгоняем binding.

  3. В описаниях ШиротаСевернойГраницы/ШиротаЮжнойГраницы native текст ошибочно говорит долготу. Имена и английские Latitude указывают широту. Не меняем смысл север/юг на долготу из-за copy-paste текста; все значения проверяются на своих координатах.

  4. Полученный viewport может вести себя как live/copy; код этого не угадывает. Изменённые значения обязательно читаются через новый getter actual поля. Неизменённые границы после setter — честный отказ. Влияние на renderer при native режиме ЗаданнаяОбласть проверяет пользователь вручную.

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

  6. Запретить у наследуемого Вывод ограничивает printing/saving/clipboard в этом поле по native контракту; не вызываем эти действия и не считаем свойство доказательством защиты секретов/юридических прав/отсутствия иных программных возможностей.

  7. Восстановление профиля касается только own display values. Оно не атомарно, не DBrollback и не отменяет уже изменённый active object после успешного профиля; при сбое программного выбора успех не сообщается. Не скрывайте compound errors.

  8. Бизнес-данные, файлы карт, DB queries/writes, сеть, службы, лицензии, настройки клиентского приложения, COM, печать и clipboard не используются. Геометрия строится в памяти только собственного поля; родительские конфигурации/HTML/JSON/root не менялись.

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

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

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

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

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