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