Как добавить реквизит (координаты, маршрут) к контактной информации в 1С:Управление Торговлей 11.5?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Торговля и дистрибуция
← На главную

В современных конфигурациях 1С, таких как "Управление торговлей 11" (УТ 11), "ERP" или "Комплексная автоматизация", работа с адресами и телефонами построена на базе Библиотеки Стандартных Подсистем (БСП). Это означает, что контактная информация — это не просто строка, а сложный механизм с хранением данных в XML (XDTO) или JSON, валидацией через ФИАС и динамическими формами.

Часто перед разработчиками и аналитиками встает задача: необходимо к адресу доставки привязать дополнительные данные, например, географические координаты (широта, долгота), номер маршрута, этаж, код домофона или специфические метки для TMS-систем (систем управления транспортом). Давайте разберем подробно, почему это вызывает трудности и как правильно решить эту задачу программным способом.

В чем сложность задачи?

Многие привыкли, что если нужно добавить поле к справочнику, мы просто добавляем новый реквизит или используем механизм "Дополнительные реквизиты и сведения" (ПВХ). Однако контактная информация в УТ 11 хранится в табличной части КонтактнаяИнформация.

  1. Табличная часть: Механизм дополнительных реквизитов (БСП) в типовых решениях обычно подключается к самому справочнику (шапке), а не к строкам его табличной части. То есть, добавить доп. реквизит к конкретной строке адреса стандартными средствами в режиме "Предприятие" нельзя.
  2. Сложная структура: Поле "Значение" в контактной информации адреса содержит XML-структуру. Добавление данных внутрь этого XML требует изменения пакетов XDTO конфигурации, что крайне не рекомендуется, так как это усложнит обновление и может нарушить работу адресного классификатора.

Поэтому нам необходимо найти способ, как "подружить" адрес и наши новые данные (координаты). Рассмотрим варианты решения, предложенные в обсуждении, и углубимся в техническую реализацию.

Вариант решения: Программное расширение видов контактной информации

Наиболее корректный способ вмешательства в работу подсистемы контактной информации — использование переопределяемых модулей БСП. Это позволяет нам настроить поведение системы так, чтобы при добавлении определенного вида информации срабатывали наши алгоритмы.

В теме форума предложено решение, которое позволяет зарегистрировать особый вид контактной информации (например, "Координаты") и определить его поведение. Давайте разберем этот процесс по шагам.

Шаг 1. Создание вида контактной информации

Прежде чем писать код, нам нужно создать сущность, с которой мы будем работать. В режиме "1С:Предприятие" (или программно через обновление ИБ) необходимо зайти в справочник ВидыКонтактнойИнформации.

Нам нужно создать новый элемент справочника:

Шаг 2. Программное переопределение настроек

Теперь нам нужно, чтобы система "подхватила" этот вид и знала, как с ним работать. Для этого используется общий модуль УправлениеКонтактнойИнформациейПереопределяемый (в некоторых версиях старых БСП код может располагаться в общем модуле УправлениеКонтактнойИнформацией, но править нужно именно переопределяемый или использовать расширение).

Нас интересует процедура ПриОпределенииНастроек. Этот метод вызывается при инициализации форм объектов, содержащих контактную информацию.

Разберем код, который необходимо добавить в эту процедуру:


Процедура ПриОпределенииНастроек(Настройки) Экспорт
    
    // 1. Находим ссылку на наш новый вид контактной информации
    // В реальном проекте лучше использовать предопределенный элемент или поиск по кешу, 
    // чтобы не делать запрос к БД при каждом открытии формы.
    КоординатыВид = Справочники.ВидыКонтактнойИнформации.НайтиПоНаименованию("Координаты");
    
    Если Не КоординатыВид.Пустая() Тогда
        
        // 2. Копируем настройки для типа "Другое"
        // Мы берем стандартное поведение для текстового поля "Другое" как базу
        Описание = ОбщегоНазначения.СкопироватьРекурсивно(
            УправлениеКонтактнойИнформацией.КомандыТипаКонтактнойИнформации(
                Перечисления.ТипыКонтактнойИнформации.Другое
            )
        );
        
        // 3. Здесь можно дополнительно настроить Описание.
        // Например, указать подсказку или регулярное выражение для проверки ввода
        // Описание.Подсказка = "Введите координаты в формате XX.XXXXXX, YY.YYYYYY";
        
        // 4. Присваиваем описание нашему виду
        Настройки.ОписаниеКоманд[КоординатыВид] = Описание;
        
    КонецЕсли;

КонецПроцедуры

Что делает этот код?

  1. Он сообщает системе, что для конкретного элемента справочника ВидыКонтактнойИнформации (наши "Координаты") нужно использовать определенный набор команд и настроек интерфейса.
  2. Функция КомандыТипаКонтактнойИнформации возвращает структуру настроек по умолчанию для типа. Мы берем тип "Другое", так как он наиболее гибкий.
  3. Помещая это в Настройки.ОписаниеКоманд, мы гарантируем, что на форме партнера это поле отрисуется корректно.

Альтернативный архитектурный подход: Адрес vs Партнер

Хотя вышеописанный метод решает задачу "добавить поле", давайте проанализируем ситуацию глубже. В сообщении №8 автор темы указывает: "Тут не хватает возможности, чтоб эти дополнительные поля были сразу определены при добавлении Адреса доставки".

Если мы просто добавим вид контактной информации "Координаты", то у нас в карточке партнера будут два разрозненных поля: "Адрес доставки" и "Координаты". Они визуально могут стоять рядом, но логически они не связаны. Если у партнера 5 адресов доставки, то добавление 5 полей координат превратит форму в хаос, и будет непонятно, какие координаты к какому адресу относятся.

Рекомендуемый подход для УТ 11:

В идеологии 1С:ERP и УТ 11, если у клиента (Партнера) есть несколько точек доставки с разными параметрами (координаты, график работы, контактное лицо, маршрут), то правильнее использовать иерархию справочника Партнеры.

  1. Создается головной Партнер (Клиент).
  2. Для каждого адреса доставки создается подчиненный Партнер (фактически — точка доставки).
  3. В этом подчиненном Партнере заполняется один юридический/фактический адрес.

При таком подходе вы можете использовать типовой механизм Дополнительных реквизитов (Администрирование -> Общие настройки -> Дополнительные реквизиты и сведения). Вы просто добавляете доп. реквизиты "Координаты (Широта)", "Координаты (Долгота)", "Номер маршрута" к справочнику Партнеры.

Преимущества этого метода:

Продвинутая техника: Хранение JSON в значении КИ

Если же архитектура с подчиненными партнерами невозможна, и нужно хранить данные именно внутри строки адреса, рассмотрим техническую возможность, появившуюся в новых версиях БСП.

Поле Значение табличной части КонтактнаяИнформация — это строка неограниченной длины. В последних версиях платформы и БСП разработчики начали использовать формат JSON для хранения сложных структур.

Чтобы реализовать это, нам потребуется:

  1. Создать расширение конфигурации.
  2. Перехватить событие "ПередЗаписью" владельца контактной информации (Справочника Партнеры).
  3. Сформировать структуру, содержащую и представление адреса, и координаты.
  4. Сериализовать эту структуру в JSON.
  5. Записать JSON в поле Значение.

Пример (концептуальный):


СтруктураАдреса = Новый Структура;
СтруктураАдреса.Вставить("АдресСтрокой", ТекущийАдрес);
СтруктураАдреса.Вставить("Lat", 55.7558);
СтруктураАдреса.Вставить("Lon", 37.6173);

ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, СтруктураАдреса);
СтрокаДляСохранения = ЗаписьJSON.Закрыть();

// Эту строку помещаем в ТЧ.КонтактнаяИнформация.Значение

Важно: Этот метод требует серьезной доработки форм ввода, так как стандартное поле ввода адреса не умеет отображать и редактировать JSON. Вам придется рисовать свои поля на форме и программно собирать/разбирать JSON при открытии и сохранении. Это трудоемкий путь.

Выводы и рекомендации

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

  1. Самый простой и надежный способ: Использовать иерархию Партнеров (один адрес = один партнер). Добавлять координаты как штатные Дополнительные реквизиты справочника. Это полностью соответствует логике УТ 11.
  2. Способ через код (из форума): Если адрес один или их мало, можно добавить новый вид контактной информации "Координаты" через переопределение модуля УправлениеКонтактнойИнформацией. Это создаст отдельное поле ввода.
  3. Сложный способ: Переделывать структуру хранения адреса, записывая туда JSON. Рекомендуется только опытным разработчикам в исключительных случаях, когда другие варианты не подходят.

Для задачи интеграции с TMS (системы маршрутизации) чаще всего используется первый вариант, так как точка доставки является ключевой сущностью логистики.

← На главную