Как расширить поля адреса и добавить новые реквизиты в 1С:Управление торговлей 11

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

В современных конфигурациях 1С, таких как Управление торговлей 11, ERP 2 или Комплексная автоматизация, работа с контактной информацией (КИ) существенно отличается от старых версий. Адрес больше не является просто набором строк; он представляет собой сложную структуру, хранящуюся в формате JSON. Часто стандартных полей (город, улица, дом, квартира) недостаточно, и возникает необходимость добавить специфические данные, такие как код домофона, зона доставки или предпочтительное время разгрузки.

В этой статье мы подробно разберем, как расширить структуру адреса, сохранив при этом совместимость с типовыми механизмами Библиотеки стандартных подсистем (БСП).

Понимание структуры хранения адреса в JSON

Прежде чем приступать к разработке, проанализируем, как система хранит данные. В табличной части КонтактнаяИнформация (или в соответствующем регистре) поле ЗначенияПолей содержит сериализованный объект XDTO. Если вы откроете это поле программно, то увидите структуру JSON, где адрес разложен по узлам, соответствующим классификатору ГАР (ФИАС).

Для нашей задачи наиболее важен узел AdditionalElements (Дополнительные элементы). В стандартном интерфейсе 1С уже есть возможность добавлять произвольные поля в форму ввода адреса, но они не являются предопределенными. Наша цель — сделать так, чтобы поля выбирались из списка или имели фиксированные имена.

Способ 1: Использование стандартного механизма дополнительных элементов

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

Особенности этого метода:

  1. Вы можете вручную написать "Домофон" и указать значение.
  2. Система сохранит это в массив дополнительных элементов JSON.
  3. Главный минус: имя поля не запоминается для других адресов. Пользователю придется каждый раз вводить слово "Домофон" вручную, что ведет к ошибкам и неудобству.

Способ 2: Программное расширение через механизм расширений

Чтобы поля стали "предопределенными" (например, выпадающий список для зоны доставки), нам потребуется вмешательство в логику БСП. Выясним причину, по которой это делается именно через форму: логика сборки адреса в строку JSON инкапсулирована в общих формах и модулях.

Разберем по шагам алгоритм реализации:

Шаг 1. Расширение общей формы "ФормаВводаАдреса"

Все адреса в системе вводятся через общую форму ФормаВводаАдреса. Нам нужно создать расширение и добавить в эту форму новые реквизиты (например, Домофон_СпецПоле, ЗонаДоставки_СпецПоле).

Разместим эти реквизиты на форме. Теперь нам нужно обеспечить их заполнение при открытии и сохранение при закрытии.

Шаг 2. Чтение данных из JSON при открытии формы

Проанализируем процедуру ПриЧтенииНаСервере или аналогичные обработчики, отвечающие за инициализацию формы. Нам нужно извлечь данные из структуры JSON. БСП использует API общего модуля УправлениеКонтактнойИнформацией.

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


// В расширении формы ввода адреса
&НаСервере
Процедура Расш_ПриЧтенииНаСервереПосле(ТекущиеДанные)
    // СтруктураАдреса - это десериализованный JSON
    Для Каждого Элемент Из СтруктураАдреса.AdditionalElements Цикл
        Если Элемент.Наименование = "Домофон" Тогда
            ЭтаФорма.Домофон_СпецПоле = Элемент.Значение;
        ИначеЕсли Элемент.Наименование = "ЗонаДоставки" Тогда
            ЭтаФорма.ЗонаДоставки_СпецПоле = Элемент.Значение;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Шаг 3. Запись данных обратно в JSON

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

Посмотрим на пример формирования структуры перед закрытием:


&НаКлиенте
Процедура Расш_ПередЗавершениемРаботыСФормой(Результат)
    // Находим или создаем элементы в массиве дополнительных полей
    ДобавитьИлиОбновитьДополнительныйЭлемент(СтруктураАдреса, "Домофон", ЭтаФорма.Домофон_СпецПоле);
    ДобавитьИлиОбновитьДополнительныйЭлемент(СтруктураАдреса, "ЗонаДоставки", ЭтаФорма.ЗонаДоставки_СпецПоле);
    
    // Далее вызывается стандартная сериализация в JSON
КонецПроцедуры

Работа с общим модулем УправлениеКонтактнойИнформацией

Для корректной работы важно использовать методы БСП. Рассмотрим основные функции, которые могут понадобиться:

Важные рекомендации по автоматизации

Если такие данные, как "Зона доставки", необходимы вам для построения отчетов или автоматического расчета логистики, не ограничивайтесь хранением только внутри JSON. Поиск по тексту внутри JSON-строки в SQL-запросах крайне медленный и неэффективный.

Рекомендуемый подход для аналитических данных:

  1. Дублируйте значение "Зоны доставки" в отдельный реквизит табличной части КонтактнаяИнформация (через расширение справочника Партнеры или Контрагенты).
  2. При записи адреса в форме автоматически обновляйте этот отдельный реквизит.
  3. Это позволит вам в любом отчете по продажам просто вытянуть поле Партнер.АдресДоставки.ЗонаДоставки без парсинга сложных строк.

Использование дополнительных реквизитов для видов КИ

В последних версиях БСП появилась возможность добавлять Дополнительные реквизиты непосредственно к объекту "Вид контактной информации". Это позволяет добавить поле "Зона доставки" к виду "Адрес доставки" без изменения кода форм. Однако это поле будет отображаться в списке реквизитов адреса, но не внутри самого конструктора адреса (классификатора). Для бизнес-логики (зон, тарифов) это зачастую самый правильный и "чистый" путь, не требующий написания сложного кода по обработке JSON.

Подведем итог: если вам нужно просто расширить карточку адреса визуально, используйте расширение общей формы ФормаВводаАдреса и работу с узлом AdditionalElements. Если же данные нужны для расчетов — используйте дополнительные реквизиты БСП или дублирующие поля в табличной части.

← На главную