Как подключить адресный классификатор к произвольному реквизиту или табличной части в 1С

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

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

Постановка задачи и анализ механизмов БСП

Проанализируем стандартную ситуацию: у нас есть справочник или документ, в табличную часть которого мы добавили реквизит АдресОбъекта. Нам нужно, чтобы при нажатии на кнопку выбора в этом поле открывалось привычное окно ввода адреса, где пользователь может выбрать регион, город и улицу из классификатора, а результат сохранялся бы в нашу строку.

Важный нюанс: В системе 1С адрес — это не просто строка. Это сложная структура, которая в современных версиях БСП хранится в формате JSON, а в более старых — в формате XML. Чтобы классификатор «узнавал» ранее введенный адрес при повторном открытии, нам нужно хранить не только текстовое представление (г. Москва, ул. Ленина...), но и саму структуру данных.

Следовательно, в нашей табличной части (или в реквизитах объекта) желательно иметь два поля:

  1. АдресПредставление (Строка) — для отображения пользователю.
  2. АдресЗначение (Строка неограниченной длины) — для хранения внутренней структуры (JSON/XML).

Шаг 1. Настройка Вида контактной информации

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

Разберем, как это сделать:

  1. Перейдем в справочник Виды контактной информации.
  2. Найдем группу, соответствующую вашему объекту (например, «Контактная информация справочника Объекты»).
  3. Добавим новый вид с типом Адрес. Это позволит использовать все типовые проверки БСП.

Шаг 2. Программный вызов формы ввода адреса

Перейдем к написанию кода. Нам нужно перехватить событие НачалоВыбора у поля ввода в табличной части на форме. Рассмотрим пример реализации на стороне клиента.

Проанализируем ситуацию: так как платформа 8.3 работает в асинхронном режиме (без модальности), нам обязательно понадобится ОписаниеОповещения для обработки результата закрытия формы адреса.


&НаКлиенте
Процедура ТЧОбъектыАдресНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    ТекущаяСтрока = Элементы.ТЧОбъекты.ТекущиеДанные;
    
    // Подготавливаем параметры для открытия формы ввода адреса
    ПараметрыВыбора = Новый Структура;
    ПараметрыВыбора.Вставить("Вид", ПредопределенноеЗначение("Справочник.ВидыКонтактнойИнформации.АдресОбъекта"));
    ПараметрыВыбора.Вставить("Значение", ТекущаяСтрока.АдресЗначение); // Здесь хранится JSON/XML
    ПараметрыВыбора.Вставить("Представление", ТекущаяСтрока.АдресПредставление);
    
    // Описание оповещения, которое сработает после закрытия формы
    Оповещение = Новый ОписаниеОповещения("ПослеВыбораАдреса", ЭтотОбъект, ТекущаяСтрока.ПолучитьИдентификатор());
    
    // Вызываем стандартный метод БСП для редактирования адреса
    УправлениеКонтактнойИнформациейКлиент.РедактироватьКонтактнуюИнформацию(ПараметрыВыбора, Оповещение);
    
КонецПроцедуры

Шаг 3. Обработка результата выбора

Теперь разберем, как получить данные обратно. Когда пользователь нажмет «ОК» в форме адресного классификатора, управление вернется в процедуру, которую мы указали в ОписаниеОповещения.


&НаКлиенте
Процедура ПослеВыбораАдреса(РезультатВыбора, ДополнительныеПараметры) Экспорт
    
    Если РезультатВыбора = Неопределено Тогда
        Возврат; // Пользователь закрыл форму без сохранения
    КонецЕсли;
    
    ИдентификаторСтроки = ДополнительныеПараметры;
    ТекущаяСтрока = Объект.ТЧОбъекты.НайтиПоИдентификатору(ИдентификаторСтроки);
    
    Если ТекущаяСтрока <> Неопределено Тогда
        // РезультатВыбора содержит структуру с полями 'значение' и 'представление'
        ТекущаяСтрока.АдресЗначение = РезультатВыбора.Значение;
        ТекущаяСтрока.АдресПредставление = РезультатВыбора.Представление;
        
        // Помечаем форму как измененную
        ЭтаФорма.Модифицированность = Истина;
    КонецЕсли;
    
КонецПроцедуры

Шаг 4. Работа на стороне сервера: парсинг и представления

Рассмотрим подробнее ситуацию, когда нам нужно программно сформировать строковое представление адреса из сохраненного XML/JSON или наоборот. В БСП версии 2.3 и выше (которая используется в Документообороте 2.1) для этого предназначены методы модуля УправлениеКонтактнойИнформацией.

Если вы столкнулись с тем, что функция ЗначенияПолейКонтактнойИнформацииСервер отсутствует, как упоминалось в обсуждении, проанализируем альтернативные варианты:

  1. Получение текста из структуры: Используйте функцию УправлениеКонтактнойИнформацией.ПредставлениеКонтактнойИнформации(Значение). Она принимает ваш JSON/XML и возвращает красивую строку.
  2. Проверка корректности: Для валидации адреса на сервере используйте методы из модуля РаботаСАдресами (в зависимости от версии БСП название может варьироваться, например, РаботаСАдресамиКлиентСервер).

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


&НаСервереБезКонтекста
Функция СформироватьТекстАдреса(ЗначениеАдреса)
    Возврат УправлениеКонтактнойИнформацией.ПредставлениеКонтактнойИнформации(ЗначениеАдреса);
КонецФункции

Советы по хранению данных в табличной части

При работе с табличными частями важно помнить о производительности. Посмотрим на рекомендации:

Таким образом, мы выяснили, что «магия» подключения классификатора заключается в правильном вызове процедур общего модуля УправлениеКонтактнойИнформациейКлиент и правильной обработке структуры Значение. Использование этого подхода позволит вашим пользователям вводить адреса так же удобно, как в типовых карточках Контрагентов или Физических лиц.

← На главную