На закрытом прямоугольнике проверяем покрытие двух пунктов и показываем разницу направлений пространственного поиска.
Где и как запускать
Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.
Подготовка
Собственная учебная база 8.5.1.1343, толстый клиент Windows. ГеографическаяСхема из этого урока недоступна в тонком/веб-клиенте: не вставляйте код в тонкий клиент.
Создайте отдельную внешнюю обработку с управляемой формой, командой Выполнить и кнопкой этой команды. Вставьте весь код одного урока в модуль формы; назначьте команде обработчик Выполнить.
Каждый запуск создаёт новую схему в локальной переменной. Реквизиты карты и макеты не нужны; готовые карты, SHP, GPS и сервисы карт не загружаются.
Точки и зоны вымышленные учебные объекты. Координаты заданы в градусах, высота в метрах; это не местоположение пользователей или реальных заказов.
На схеме нет подложки с границами стран/дорогами. Это собственная геометрия, а не полноценный навигатор. Показать открывает отдельное окно схемы.
Запускайте уроки по одному. Статические проверки сверяют API установленной справки, но отрисовка и геометрические операции в 1С пока не проверены запуском.
&НаКлиенте
Процедура Выполнить(Команда)
Схема = Новый ГеографическаяСхема;
Схема.Обновление = Ложь;
Схема.Проекция = ТипПроекцииГеографическойСхемы.ЦилиндрическаяРавноудаленнаяПроекция;
Схема.СмещениеШироты = 0;
Схема.СмещениеДолготы = 0;
Пункты = Схема.Слои.Добавить("УчебныеПункты", Тип("ТочечныйОбъектГеографическойСхемы"));
Пункты.Текст = "Учебные пункты";
Пункты.Видимость = Истина;
Пункты.РазрешитьВыбор = Истина;
ПунктА = Пункты.Объекты.Добавить();
ПунктА.Значение = "guide-point-A";
ПунктА.Координаты = Новый ГеографическиеКоординаты(55, 37, 100);
ПунктА.Видимость = Истина;
ПунктА.ТипОтрисовки = ТипОтображенияТочечногоОбъектаГеографическойСхемы.Маркер;
ПунктА.Маркер = ТипМаркераГеографическойСхемы.БольшойКруг;
ПунктА.Цвет = Новый Цвет(25, 95, 180);
ПунктА.ОтображатьДанные = Ложь;
ПунктА.Подсказка = "Вымышленный пункт А; только учебные данные";
ПунктА.Расшифровка = Новый Структура("УчебныйКод", "guide-point-A");
ПунктБ = Пункты.Объекты.Добавить();
ПунктБ.Значение = "guide-point-B";
ПунктБ.Координаты = Новый ГеографическиеКоординаты(55.1, 37.2, 110);
ПунктБ.Видимость = Истина;
ПунктБ.ТипОтрисовки = ТипОтображенияТочечногоОбъектаГеографическойСхемы.Маркер;
ПунктБ.Маркер = ТипМаркераГеографическойСхемы.БольшойТреугольник;
ПунктБ.Цвет = Новый Цвет(35, 145, 75);
Зоны = Схема.Слои.Добавить("УчебныеЗоны", Тип("ПолигональныйОбъектГеографическойСхемы"));
Зоны.Текст = "Учебная зона";
Зона = Зоны.Объекты.Добавить();
Зона.Значение = "guide-zone-001";
Зона.Видимость = Истина;
Зона.Цвет = Новый Цвет(225, 240, 255);
Зона.ЦветГраницы = Новый Цвет(90, 130, 175);
Зона.ОтображатьДанные = Ложь;
Зона.Подсказка = "Вымышленная прямоугольная зона";
Зона.Расшифровка = "guide-zone-001";
Контур = Зона.Контуры.Добавить();
Контур.Добавить(Новый ГеографическиеКоординаты(54.9, 36.9));
Контур.Добавить(Новый ГеографическиеКоординаты(54.9, 37.3));
Контур.Добавить(Новый ГеографическиеКоординаты(55.2, 37.3));
Контур.Добавить(Новый ГеографическиеКоординаты(55.2, 36.9));
Контур.Добавить(Новый ГеографическиеКоординаты(54.9, 36.9));
ГдеПроверять = Новый Массив;
ГдеПроверять.Добавить(Зона);
Сообщить(Схема.ПроверитьПоРасположению(ПунктА, ГдеПроверять, ТипПоискаОбъектовГеографическойСхемы.ВключаютПолностью));
Сообщить(Схема.ПроверитьПоРасположению(ПунктБ, ГдеПроверять, ТипПоискаОбъектовГеографическойСхемы.ВключаютПолностью));
Покрывающие = Схема.НайтиПоРасположению(ПунктА, ГдеПроверять, ТипПоискаОбъектовГеографическойСхемы.ВключаютПолностью);
Сообщить(Покрывающие.Количество() = 1);
ГдеИскать = Новый Массив;
ГдеИскать.Добавить(ПунктА);
ГдеИскать.Добавить(ПунктБ);
Внутренние = Схема.НайтиПоРасположению(Зона, ГдеИскать, ТипПоискаОбъектовГеографическойСхемы.ВключаетПолностью);
Сообщить(Внутренние.Количество() = 2);
Выбранные = Новый Массив;
Выбранные.Добавить(ПунктА);
Выбранные.Добавить(ПунктБ);
Схема.УстановитьСвойствоОбъектов(Выбранные, "Цвет", Новый Цвет(180, 70, 35));
Схема.Слои.Сдвинуть(Схема.Слои.Индекс(Зоны), -1);
Сообщить(Схема.Слои.Получить(0) = Зоны);
Сообщить(Схема.Слои.Количество() = 2);
Схема.Обновление = Истина;
Схема.Показать("Собственная учебная схема — guide-owned-geo");
КонецПроцедурыРазбор по шагам
Оба пункта строго внутри прямоугольника, не на его границе: широта 54.9–55.2, долгота 36.9–37.3.
ВключаютПолностью ищет кандидатов, которые покрывают переданный объект. Передаём пункт как объект поиска и зону как кандидата.
ВключаетПолностью ищет кандидатов, которые входят в переданный объект. Поэтому для обратного поиска передаём зону и массив пунктов.
ПроверитьПоРасположению возвращает Булево, НайтиПоРасположению массив. Для этой учебной геометрии ожидаются одна покрывающая зона и два внутренних пункта.
УстановитьСвойствоОбъектов получает явно собранный список двух собственных пунктов и существующее свойство Цвет. Внешние имена свойств не принимаются.
Слой зоны был вторым; сдвиг на −1 ставит его первым, чтобы точки рисовались поверх заливки. Не перемещаем координаты объектов.
Как проверить результат
Шесть логических проверок ожидаются Истина; при фактическом запуске проверьте поиск и порядок слоёв.
Две точки должны остаться видимыми поверх зоны; операция изменяет только новую локальную схему.
Ожидаемый результат
На ясной собственноручно построенной геометрии показаны направленный поиск и оформление списка объектов.
На что обратить внимание
Для точки на границе сложного полигона нельзя переносить результаты этого прямоугольного примера без проверки.
Включает и Включают имеют противоположные направления. Названия не взаимозаменяемы.
Сдвинуть слоя не меняет широту/долготу; это порядок отрисовки.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.