Как программно заполнить список выбора у поля ввода адреса по аналогии с типовой конфигурацией?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия
← На главную

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

Многие начинающие разработчики сталкиваются с заблуждением, что этот список где-то «запоминается» платформой автоматически. На самом деле, это результат работы программного кода. Разберем подробно, как реализовать этот функционал, проанализируем типовые механизмы и рассмотрим конкретные примеры кода.

Анализ механизма работы списка выбора

Для начала проанализируем ситуацию: почему в типовом документе список «есть», а в новом — «пропадает»? Ответ кроется в динамическом формировании данных. В 1С:Бухгалтерия 3.0 список выбора для поля адреса не хранится в базе данных как часть метаданных элемента формы. Он генерируется программно при каждом удобном случае: при открытии формы, при выборе контрагента или при изменении грузополучателя.

Важный момент: если вы просто запишете строку адреса в реквизит документа, это сохранит только текст. Чтобы при повторном открытии формы у поля ввода снова появился список вариантов, его нужно заполнить заново в процедуре ПриСозданииНаСервере или ПриЧтенииНаСервере.

Реализация функции получения адресов

Рассмотрим основной программный блок, который отвечает за сбор информации об адресах из карточки контрагента. В типовых конфигурациях для этого используется подсистема «Контактная информация». Мы можем использовать методы общих модулей, например, УправлениеКонтактнойИнформациейБП.

Ниже приведен пример функции, которая собирает все доступные адреса для указанного контрагента и формирует из них СписокЗначений:


Функция СписокАдресовДоставки(Контрагент, Грузополучатель, Дата)
    СписокАдресов = Новый СписокЗначений;
    
    // Определяем, чей адрес нам нужен: грузополучателя или основного контрагента
    КонтрагентДоставки = ?(ЗначениеЗаполнено(Грузополучатель), Грузополучатель, Контрагент);
    
    Если НЕ ЗначениеЗаполнено(КонтрагентДоставки) Тогда
        Возврат СписокАдресов;
    КонецЕсли;
    
    ТипыКИ = Новый Массив;
    ТипыКИ.Добавить(Перечисления.ТипыКонтактнойИнформации.Адрес);
    
    Объекты = Новый Массив();
    Объекты.Добавить(КонтрагентДоставки);
    
    // Получаем актуальные контактные данные на нужную дату
    Адреса = УправлениеКонтактнойИнформациейБП.КонтактнаяInformationОбъектовНаДату(Объекты, ТипыКИ, , Дата);
    
    // Формируем список для выбора пользователем
    Для Каждого Адрес Из Адреса Цикл
        // Представление — это то, что увидит пользователь
        // Значение — это то, что запишется в реквизит
        СписокАдресов.Добавить(Адрес.Представление, Строка(Адрес.Вид) + ": " + Адрес.Представление);
    КонецЦикла;
    
    Возврат СписокАдресов;
КонецФункции

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

Настройка элемента формы

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

  1. КнопкаСпискаВыбора: Установите значение Да. Это добавит маленькую стрелочку в правой части поля, при нажатии на которую будет выпадать наш список.
  2. РежимВыбораИзСписка: Для адресов чаще всего устанавливается Ложь. Это позволяет пользователю как выбрать значение из предложенных вариантов, так и ввести произвольный текст вручную, если нужного адреса нет в базе.
  3. СписокВыбора: Это свойство элемента формы, которое мы и будем заполнять.

События, в которых нужно обновлять список

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

1. При открытии формы (на сервере):
Разберем пример кода, который инициализирует список при открытии документа:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    ОбновитьСписокВыбораАдреса();
КонецПроцедуры

&НаСервере
Процедура ОбновитьСписокВыбораАдреса()
    Список = СписокАдресовДоставки(Объект.Контрагент, Объект.Грузополучатель, Объект.Дата);
    Элементы.АдресДоставки.СписокВыбора.ЗагрузитьЗначения(Список.ВыгрузитьЗначения());
КонецПроцедуры

2. При изменении контрагента:
Если пользователь меняет контрагента в документе, старый список адресов становится неактуальным. Нам нужно очистить его и заполнить заново:


&НаКлиенте
Процедура КонтрагентПриИзменении(Элемент)
    ОбновитьСписокВыбораАдресаНаСервере();
КонецПроцедуры

&НаСервере
Процедура ОбновитьСписокВыбораАдресаНаСервере()
    ОбновитьСписокВыбораАдреса();
КонецПроцедуры

Нюансы хранения адреса в формате ФИАС

Важно помнить, что в современных конфигурациях 1С адрес — это не просто строка. Это сложная структура, которая часто хранится в скрытом реквизите в формате XML или JSON. Если вы реализуете выбор адреса, убедитесь, что вы копируете не только текстовое Представление, но и структуру адреса, если это требуется для корректной работы классификатора (ФИАС/ГАР).

Проанализируем ситуацию: если вы выберете адрес из списка, в поле запишется строка. Но если пользователь решит нажать кнопку «три точки» (выбор), откроется форма редактирования адреса. Чтобы она не оказалась пустой, типовые механизмы при выборе из списка программно заполняют скрытый реквизит (например, АдресДоставкиЗначение).

Заключение

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

Такой подход делает работу пользователя с программой быстрой и минимизирует количество ошибок при вводе данных.

← На главную