При разработке прикладных решений на платформе 1С часто возникают задачи, связанные с хранением и обработкой расстояний между объектами. В данной статье мы разберем, как правильно организовать архитектуру данных для хранения длин отрезков и как с помощью встроенного языка запросов извлечь необходимую информацию.
Прежде чем приступать к написанию кода, важно проанализировать, где именно мы храним данные. Часто начинающие разработчики создают Справочник для хранения связей типа «Точка1 — Точка2 — Длина». Однако это не всегда эффективно. Рассмотрим, почему профессионалы рекомендуют использовать Регистр сведений:
Если вы все же работаете со справочником, помните: всегда оперируйте Ссылка на объект. Использование строковых наименований (названий точек) — это архитектурная ошибка, так как она делает систему уязвимой к опечаткам и изменениям в метаданных.
Рассмотрим задачу: у нас есть две точки, и нам нужно найти длину отрезка между ними, если в базе данных могут существовать записи как «Точка А — Точка Б», так и «Точка Б — Точка А». Чтобы учесть оба варианта, мы используем конструкцию ИЛИ в условии ГДЕ.
Разберем пример кода для поиска минимального значения:
Процедура НайтиРасстояние(ТочкаА, ТочкаБ)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| МИНИМУМ(Отрезки.ДлинаОтрезка) КАК Длина
|ИЗ
| Справочник.Отрезки КАК Отрезки
|ГДЕ
| ((Отрезки.Точка1 = &Точка1 И Отрезки.Точка2 = &Точка2)
| ИЛИ (Отрезки.Точка1 = &Точка2 И Отрезки.Точка2 = &Точка1))
| И НЕ Отрезки.ПометкаУдаления";
Запрос.УстановитьПараметр("Точка1", ТочкаА);
Запрос.УстановитьПараметр("Точка2", ТочкаБ);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Если Выборка.Следующий() Тогда
Длина = ?(Выборка.Длина = NULL, 0, Выборка.Длина);
Сообщить("Минимальное расстояние: " + Длина);
КонецЕсли;
КонецПроцедуры
Как мы видим, поиск через ИЛИ усложняет текст запроса. Чтобы этого избежать, при записи данных в Регистр сведений можно использовать правило упорядочивания: всегда записывать в первое измерение точку с меньшим внутренним кодом (или ссылкой), а во второе — с большим. Тогда поиск всегда будет идти по строго заданным параметрам: Точка1 = &Меньшая И Точка2 = &Большая. Это значительно повышает скорость работы системы.
В некоторых случаях задача поиска расстояния между А и Б — это лишь начало. Если отрезков много, и путь между точками может проходить через промежуточные узлы, мы сталкиваемся с классической транспортной задачей (поиск кратчайшего пути в графе).
Важно помнить следующие аспекты:
Таким образом, для решения задачи:
Регистр сведений вместо справочника.Ссылка на справочник точек вместо сравнения по строковым названиям.Запрос.Проанализировав эти подходы, вы сможете создать надежный и производительный инструмент для работы с пространственными данными в 1С:Предприятие.