В современных конфигурациях 1С, таких как Управление торговлей 11, ERP 2 или Комплексная автоматизация, работа с контактной информацией (КИ) существенно отличается от старых версий. Адрес больше не является просто набором строк; он представляет собой сложную структуру, хранящуюся в формате JSON. Часто стандартных полей (город, улица, дом, квартира) недостаточно, и возникает необходимость добавить специфические данные, такие как код домофона, зона доставки или предпочтительное время разгрузки.
В этой статье мы подробно разберем, как расширить структуру адреса, сохранив при этом совместимость с типовыми механизмами Библиотеки стандартных подсистем (БСП).
Прежде чем приступать к разработке, проанализируем, как система хранит данные. В табличной части КонтактнаяИнформация (или в соответствующем регистре) поле ЗначенияПолей содержит сериализованный объект XDTO. Если вы откроете это поле программно, то увидите структуру JSON, где адрес разложен по узлам, соответствующим классификатору ГАР (ФИАС).
Для нашей задачи наиболее важен узел AdditionalElements (Дополнительные элементы). В стандартном интерфейсе 1С уже есть возможность добавлять произвольные поля в форму ввода адреса, но они не являются предопределенными. Наша цель — сделать так, чтобы поля выбирались из списка или имели фиксированные имена.
Рассмотрим самый простой вариант, который не требует глубокого программирования. В форме ввода адреса (которая открывается при нажатии на гиперссылку адреса в карточке контрагента) предусмотрена кнопка добавления произвольных полей после поля "Квартира".
Особенности этого метода:
JSON.Чтобы поля стали "предопределенными" (например, выпадающий список для зоны доставки), нам потребуется вмешательство в логику БСП. Выясним причину, по которой это делается именно через форму: логика сборки адреса в строку JSON инкапсулирована в общих формах и модулях.
Разберем по шагам алгоритм реализации:
Все адреса в системе вводятся через общую форму ФормаВводаАдреса. Нам нужно создать расширение и добавить в эту форму новые реквизиты (например, Домофон_СпецПоле, ЗонаДоставки_СпецПоле).
Разместим эти реквизиты на форме. Теперь нам нужно обеспечить их заполнение при открытии и сохранение при закрытии.
Проанализируем процедуру ПриЧтенииНаСервере или аналогичные обработчики, отвечающие за инициализацию формы. Нам нужно извлечь данные из структуры JSON. БСП использует API общего модуля УправлениеКонтактнойИнформацией.
Пример логики извлечения данных из структуры:
// В расширении формы ввода адреса
&НаСервере
Процедура Расш_ПриЧтенииНаСервереПосле(ТекущиеДанные)
// СтруктураАдреса - это десериализованный JSON
Для Каждого Элемент Из СтруктураАдреса.AdditionalElements Цикл
Если Элемент.Наименование = "Домофон" Тогда
ЭтаФорма.Домофон_СпецПоле = Элемент.Значение;
ИначеЕсли Элемент.Наименование = "ЗонаДоставки" Тогда
ЭтаФорма.ЗонаДоставки_СпецПоле = Элемент.Значение;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
При нажатии кнопки "ОК" форма собирает данные обратно в строку. Нам нужно перехватить этот момент (обычно в процедуре, подготавливающей результат выбора) и внедрить наши значения в коллекцию AdditionalElements.
Посмотрим на пример формирования структуры перед закрытием:
&НаКлиенте
Процедура Расш_ПередЗавершениемРаботыСФормой(Результат)
// Находим или создаем элементы в массиве дополнительных полей
ДобавитьИлиОбновитьДополнительныйЭлемент(СтруктураАдреса, "Домофон", ЭтаФорма.Домофон_СпецПоле);
ДобавитьИлиОбновитьДополнительныйЭлемент(СтруктураАдреса, "ЗонаДоставки", ЭтаФорма.ЗонаДоставки_СпецПоле);
// Далее вызывается стандартная сериализация в JSON
КонецПроцедуры
Для корректной работы важно использовать методы БСП. Рассмотрим основные функции, которые могут понадобиться:
УправлениеКонтактнойИнформацией.КонтактнаяИнформацияВJSON — преобразует структуру/XDTO в строку для хранения в БД.УправлениеКонтактнойИнформацией.КонтактнаяИнформацияИзJSON — восстанавливает структуру из строки.УправлениеКонтактнойИнформацией.СформироватьПредставлениеАдреса — эта функция отвечает за то, как адрес выглядит "в одну строку" в справочнике. Если вы хотите, чтобы домофон отображался в представлении, вам придется переопределить и этот метод в расширении.Если такие данные, как "Зона доставки", необходимы вам для построения отчетов или автоматического расчета логистики, не ограничивайтесь хранением только внутри JSON. Поиск по тексту внутри JSON-строки в SQL-запросах крайне медленный и неэффективный.
Рекомендуемый подход для аналитических данных:
КонтактнаяИнформация (через расширение справочника Партнеры или Контрагенты).Партнер.АдресДоставки.ЗонаДоставки без парсинга сложных строк.В последних версиях БСП появилась возможность добавлять Дополнительные реквизиты непосредственно к объекту "Вид контактной информации". Это позволяет добавить поле "Зона доставки" к виду "Адрес доставки" без изменения кода форм. Однако это поле будет отображаться в списке реквизитов адреса, но не внутри самого конструктора адреса (классификатора). Для бизнес-логики (зон, тарифов) это зачастую самый правильный и "чистый" путь, не требующий написания сложного кода по обработке JSON.
Подведем итог: если вам нужно просто расширить карточку адреса визуально, используйте расширение общей формы ФормаВводаАдреса и работу с узлом AdditionalElements. Если же данные нужны для расчетов — используйте дополнительные реквизиты БСП или дублирующие поля в табличной части.