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