При разработке собственных расширений или модификации типовых конфигураций (например, 1С:Документооборот, 1С:ERP или 1С:УТ) часто возникает задача: прикрутить стандартный выбор адреса из классификатора (ФИАС) к полю, которое не входит в состав типовой табличной части КонтактнаяИнформация. Рассмотрим детально, как реализовать этот механизм, используя программный интерфейс Библиотеки стандартных подсистем (БСП).
Проанализируем стандартную ситуацию: у нас есть справочник или документ, в табличную часть которого мы добавили реквизит АдресОбъекта. Нам нужно, чтобы при нажатии на кнопку выбора в этом поле открывалось привычное окно ввода адреса, где пользователь может выбрать регион, город и улицу из классификатора, а результат сохранялся бы в нашу строку.
Важный нюанс: В системе 1С адрес — это не просто строка. Это сложная структура, которая в современных версиях БСП хранится в формате JSON, а в более старых — в формате XML. Чтобы классификатор «узнавал» ранее введенный адрес при повторном открытии, нам нужно хранить не только текстовое представление (г. Москва, ул. Ленина...), но и саму структуру данных.
Следовательно, в нашей табличной части (или в реквизитах объекта) желательно иметь два поля:
АдресПредставление (Строка) — для отображения пользователю.АдресЗначение (Строка неограниченной длины) — для хранения внутренней структуры (JSON/XML).Выясним причину, почему БСП требует контекста для ввода адреса. Системе нужно знать, какие правила валидации применять (например, только российские адреса или международные). Поэтому даже для произвольного реквизита рекомендуется создать запись в справочнике ВидыКонтактнойИнформации.
Разберем, как это сделать:
Виды контактной информации.Перейдем к написанию кода. Нам нужно перехватить событие НачалоВыбора у поля ввода в табличной части на форме. Рассмотрим пример реализации на стороне клиента.
Проанализируем ситуацию: так как платформа 8.3 работает в асинхронном режиме (без модальности), нам обязательно понадобится ОписаниеОповещения для обработки результата закрытия формы адреса.
&НаКлиенте
Процедура ТЧОбъектыАдресНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ТекущаяСтрока = Элементы.ТЧОбъекты.ТекущиеДанные;
// Подготавливаем параметры для открытия формы ввода адреса
ПараметрыВыбора = Новый Структура;
ПараметрыВыбора.Вставить("Вид", ПредопределенноеЗначение("Справочник.ВидыКонтактнойИнформации.АдресОбъекта"));
ПараметрыВыбора.Вставить("Значение", ТекущаяСтрока.АдресЗначение); // Здесь хранится JSON/XML
ПараметрыВыбора.Вставить("Представление", ТекущаяСтрока.АдресПредставление);
// Описание оповещения, которое сработает после закрытия формы
Оповещение = Новый ОписаниеОповещения("ПослеВыбораАдреса", ЭтотОбъект, ТекущаяСтрока.ПолучитьИдентификатор());
// Вызываем стандартный метод БСП для редактирования адреса
УправлениеКонтактнойИнформациейКлиент.РедактироватьКонтактнуюИнформацию(ПараметрыВыбора, Оповещение);
КонецПроцедуры
Теперь разберем, как получить данные обратно. Когда пользователь нажмет «ОК» в форме адресного классификатора, управление вернется в процедуру, которую мы указали в ОписаниеОповещения.
&НаКлиенте
Процедура ПослеВыбораАдреса(РезультатВыбора, ДополнительныеПараметры) Экспорт
Если РезультатВыбора = Неопределено Тогда
Возврат; // Пользователь закрыл форму без сохранения
КонецЕсли;
ИдентификаторСтроки = ДополнительныеПараметры;
ТекущаяСтрока = Объект.ТЧОбъекты.НайтиПоИдентификатору(ИдентификаторСтроки);
Если ТекущаяСтрока <> Неопределено Тогда
// РезультатВыбора содержит структуру с полями 'значение' и 'представление'
ТекущаяСтрока.АдресЗначение = РезультатВыбора.Значение;
ТекущаяСтрока.АдресПредставление = РезультатВыбора.Представление;
// Помечаем форму как измененную
ЭтаФорма.Модифицированность = Истина;
КонецЕсли;
КонецПроцедуры
Рассмотрим подробнее ситуацию, когда нам нужно программно сформировать строковое представление адреса из сохраненного XML/JSON или наоборот. В БСП версии 2.3 и выше (которая используется в Документообороте 2.1) для этого предназначены методы модуля УправлениеКонтактнойИнформацией.
Если вы столкнулись с тем, что функция ЗначенияПолейКонтактнойИнформацииСервер отсутствует, как упоминалось в обсуждении, проанализируем альтернативные варианты:
УправлениеКонтактнойИнформацией.ПредставлениеКонтактнойИнформации(Значение). Она принимает ваш JSON/XML и возвращает красивую строку.РаботаСАдресами (в зависимости от версии БСП название может варьироваться, например, РаботаСАдресамиКлиентСервер).Пример получения строкового представления на сервере:
&НаСервереБезКонтекста
Функция СформироватьТекстАдреса(ЗначениеАдреса)
Возврат УправлениеКонтактнойИнформацией.ПредставлениеКонтактнойИнформации(ЗначениеАдреса);
КонецФункции
При работе с табличными частями важно помнить о производительности. Посмотрим на рекомендации:
АдресПредставление делайте длиной 500-1000 символов. Поле АдресЗначение обязательно делайте неограниченной длины (строка), так как сериализованный JSON сложного адреса с дополнительными реквизитами может быть очень объемным.АдресЗначение. Если вам нужен поиск по адресу, лучше индексируйте отдельные части адреса (город, улица), предварительно выгрузив их в скрытые реквизиты ТЧ при записи.Таким образом, мы выяснили, что «магия» подключения классификатора заключается в правильном вызове процедур общего модуля УправлениеКонтактнойИнформациейКлиент и правильной обработке структуры Значение. Использование этого подхода позволит вашим пользователям вводить адреса так же удобно, как в типовых карточках Контрагентов или Физических лиц.