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