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

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

При проектировании справочников часто возникает задача ввода структурированного адреса (страна, регион, город, улица, дом). Пользователю необходимо вводить данные по отдельным полям или выбирать их из классификатора, а на самой форме объекта и в списках адрес должен отображаться компактно — в виде одной строки с перечислением полей через запятую. При этом важно обеспечить возможность повторного открытия адреса для редактирования с сохранением всех составных частей.

Разберем два основных подхода к решению этой задачи: использование типового функционала «Библиотеки стандартных подсистем» (БСП) и разработку собственного независимого механизма на управляемых формах.

Вариант 1. Использование типовой подсистемы «Контактная информация» (БСП)

Если конфигурация разработана на базе типовых решений (например, «1С:Зарплата и управление персоналом», «1С:ERP», «1С:Комплексная автоматизация» или «1С:Управление торговлей») либо в нее уже внедрена БСП, оптимальным решением будет использование встроенной подсистемы контактной информации.

В типовой подсистеме хранение и ввод адреса реализованы следующим образом:

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

Этот вариант гарантирует актуальность адресных данных, поддержку классификаторов и стандартизацию интерфейса, поэтому при наличии БСП рекомендуется использовать именно его.

Вариант 2. Разработка собственного механизма на управляемых формах

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

Шаг 1. Архитектура хранения данных в объекте

Чтобы адрес при повторном открытии корректно раскладывался обратно по полям, в справочнике необходимо предусмотреть два реквизита:

  1. АдресПредставление (тип Строка, длина 250–500) — содержит готовое текстовое представление адреса через запятую для вывода на форме и в списках;
  2. АдресЗначения (тип Строка, длина неограниченная) — содержит сериализованные данные полей адреса в формате JSON.

Шаг 2. Настройка поля ввода на форме элемента

На форме элемента справочника размещаем реквизит АдресПредставление. Чтобы пользователь не нарушал форматирование ручным вводом строки, настроим свойства элемента формы:

  1. Установим свойство КнопкаВыбора в значение Истина.
  2. Установим свойство РедактированиеТекста в значение Ложь.

Шаг 3. Создание формы ввода адреса

Создадим отдельную общую форму (или форму обработки) с реквизитами для каждого составного элемента адреса: Страна, Регион, Город, Улица, Дом, Квартира. На форму добавим кнопку подтверждения ввода «ОК».

В управляемом приложении клиентские контексты разных форм строго изолированы. Прямое обращение к экспортным переменным открытой формы невозможно. Для возврата данных используется передача параметров при закрытии формы.

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


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

&НаКлиенте
Процедура КомандаОК(Команда)
	СтруктураРезультата = Новый Структура;
	СтруктураРезультата.Вставить("Страна",   Страна);
	СтруктураРезультата.Вставить("Регион",   Регион);
	СтруктураРезультата.Вставить("Город",    Город);
	СтруктураРезультата.Вставить("Улица",    Улица);
	СтруктураРезультата.Вставить("Дом",      Дом);
	СтруктураРезультата.Вставить("Квартира", Квартира);
	
	// Закрываем форму с передачей результата в оповещение
	Закрыть(СтруктураРезультата);
КонецПроцедуры

Шаг 4. Вызов формы ввода и обработка результата

В модуле формы элемента справочника перехватываем нажатие кнопки выбора у поля адреса. Создаем описание оповещения и открываем форму структурированного ввода.

Разберем реализацию в модуле формы элемента:


&НаКлиенте
Процедура АдресПредставлениеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("АдресJSON", Объект.АдресЗначения);
	
	ОповещениеОЗакрытии = Новый ОписаниеОповещения("ПослеЗакрытияФормыАдреса", ЭтотОбъект);
	ОткрытьФорму("ОбщаяФорма.ФормаВводаАдреса", ПараметрыФормы, ЭтотОбъект, , , , ОповещениеОЗакрытии);
КонецПроцедуры

&НаКлиенте
Процедура ПослеЗакрытияФормыАдреса(Результат, ДополнительныеПараметры) Экспорт
	// Если пользователь отменил ввод или закрыл форму крестиком
	Если ТипЗнч(Результат) <> Тип("Структура") Тогда
		Возврат;
	КонецЕсли;
	
	// Формируем строковое представление и упаковываем структуру в JSON
	СформироватьПредставлениеАдресаНаСервере(Результат);
	Модифицированность = Истина;
КонецПроцедуры

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

Проанализируем преимущества данного подхода:

  1. Надежность хранения: данные не теряются и всегда корректно десериализуются в отдельные поля при повторном открытии.
  2. Корректное форматирование: метод СтрСоединить в сочетании с проверкой на пустые строки предотвращает появление двойных запятых (например, если не указаны регион или квартира).
  3. Соответствие стандартам платформы: передача данных через ОписаниеОповещения работает асинхронно и полностью совместима с режимом блокировки модальных окон в управляемом приложении.
← На главную