При работе с подсистемой контактной информации (КИ) в типовых решениях на базе БСП (например, 1С:Управление торговлей 11) разработчики часто сталкиваются с задачей: необходимо вывести номер телефона или адрес на форме контрагента для просмотра, но при этом не записывать эти данные в табличную часть объекта и не помечать форму как модифицированную.
Разберем, почему стандартное добавление строк в коллекцию Объект.КонтактнаяИнформация на клиенте не дает результатов, и проанализируем способы решения этой задачи.
Рассмотрим распространенную ошибку. Разработчики пытаются сформировать XML/JSON-структуру контактной информации и добавить строку напрямую в табличную часть объекта на клиенте:
Представление = "1234567890";
xmlТелефон = "<КонтактнаяИнформация xmlns=""http://www.v8.1c.ru/ssl/contactinfo"" Представление=""" + Представление + """><Комментарий/><Состав xsi:type=""НомерТелефона""/></КонтактнаяИнформация>";
НоваяСтрока = Объект.КонтактнаяИнформация.Добавить();
НоваяСтрока.Тип = Перечисления.ТипыКонтактнойИнформации.Телефон;
НоваяСтрока.Вид = Справочники.ВидыКонтактнойИнформации.МобильныйТелефонЧастногоЛицаКонтрагента;
НоваяСтрока.ЗначенияПолей = xmlТелефон;
При выполнении этого кода в интерфейсе ничего не меняется. Элементы формы остаются пустыми или не отображают переданные данные. Выясним причину такого поведения подсистемы:
ПриСозданииНаСервере. Они не привязаны напрямую к колонкам табличной части объекта как обычные таблицы.Объект.КонтактнаяИнформация на клиенте не приводит к перерисовке динамически созданных элементов формы.Проанализируем самый быстрый и простой способ отображения данных на форме без сохранения объекта в базу данных. Подразумевается прямое обращение к программно созданному реквизиту формы, отвечающему за нужное поле КИ.
Если вид контактной информации уже выведен на форму при её открытии, подсистема создала соответствующий реквизит формы (например, с именем КонтактнаяИнформацияПоле2). Мы можем напрямую присвоить ему значение на клиенте:
ЭтаФорма.КонтактнаяИнформацияПоле2 = "1234567890";
Посмотрим на особенности этого решения:
КонтактнаяИнформацияПоле1, КонтактнаяИнформацияПоле2) формируются подсистемой БСП при открытии формы, поэтому их состав и нумерация зависят от порядка вывода видов контактной информации.Если требуется корректно заполнить контактную информацию с использованием серверных процедур БСП, разберем следующий алгоритм:
УправлениеКонтактнойИнформациейКлиентСервер или УправлениеКонтактнойИнформацией.Объект.КонтактнаяИнформация.УправлениеКонтактнойИнформацией.ОбновитьКонтактнуюИнформацию(ЭтаФорма, Объект).Рассмотрим пример заполнения строки КИ на сервере:
// Заполнение контактной информации на сервере
СтруктураКИ = УправлениеКонтактнойИнформациейКлиентСервер.СформироватьСтруктуруТелефона("89991234567", "");
ЗначенияПолей = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияВXML(СтруктураКИ);
СтрокаКИ = Объект.КонтактнаяИнформация.Добавить();
СтрокаКИ.Тип = Перечисления.ТипыКонтактнойИнформации.Телефон;
СтрокаКИ.Вид = Справочники.ВидыКонтактнойИнформации.ТелефонКонтрагента;
СтрокаКИ.Представление = "89991234567";
СтрокаКИ.ЗначенияПолей = ЗначенияПолей;
// Вызов процедуры БСП для перерисовки элементов формы
УправлениеКонтактнойИнформацией.ОбновитьКонтактнуюИнформацию(ЭтаФорма, Объект);
Важное ограничение: При таком подходе модифицируется табличная часть самого объекта (Объект.КонтактнаяИнформация), из-за чего флаг ЭтаФорма.Модифицированность станет равен Истина. Если пользователь попробует закрыть форму, система предложит сохранить изменения.
Если задача заключается исключительно во временном отображении некоторого номера телефона (например, подтягиваемого из внешней системы или телефонии) и данные не должны ассоциироваться со справочником контрагента, рекомендуется добавить на форму отдельный реквизит.
Рассмотрим по шагам, как это реализовать:
ВременныйТелефон с типом Строка.
ЭтаФорма.ВременныйТелефон = "+7 (999) 000-00-00";
Этот способ полностью изолирует временные данные от подсистемы КИ, не вызывает конфликтов с динамическими элементами БСП и не взводит признак модифицированности формы.