Как программно заполнить контактную информацию на форме контрагента без сохранения в базу в 1С?

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

При работе с подсистемой контактной информации (КИ) в типовых решениях на базе БСП (например, 1С:Управление торговлей 11) разработчики часто сталкиваются с задачей: необходимо вывести номер телефона или адрес на форме контрагента для просмотра, но при этом не записывать эти данные в табличную часть объекта и не помечать форму как модифицированную.

Разберем, почему стандартное добавление строк в коллекцию Объект.КонтактнаяИнформация на клиенте не дает результатов, и проанализируем способы решения этой задачи.

Выясним причину: почему добавление строки в Объект.КонтактнаяИнформация не работает

Рассмотрим распространенную ошибку. Разработчики пытаются сформировать XML/JSON-структуру контактной информации и добавить строку напрямую в табличную часть объекта на клиенте:


Представление = "1234567890";
xmlТелефон = "<КонтактнаяИнформация xmlns=""http://www.v8.1c.ru/ssl/contactinfo"" Представление=""" + Представление + """><Комментарий/><Состав xsi:type=""НомерТелефона""/></КонтактнаяИнформация>";

НоваяСтрока = Объект.КонтактнаяИнформация.Добавить();
НоваяСтрока.Тип = Перечисления.ТипыКонтактнойИнформации.Телефон;
НоваяСтрока.Вид = Справочники.ВидыКонтактнойИнформации.МобильныйТелефонЧастногоЛицаКонтрагента;
НоваяСтрока.ЗначенияПолей = xmlТелефон;

При выполнении этого кода в интерфейсе ничего не меняется. Элементы формы остаются пустыми или не отображают переданные данные. Выясним причину такого поведения подсистемы:

  1. Динамическое создание элементов: Поля ввода контактной информации на управляемой форме генерируются программно на сервере в событии ПриСозданииНаСервере. Они не привязаны напрямую к колонкам табличной части объекта как обычные таблицы.
  2. Отсутствие автоматической синхронизации: Простое изменение коллекции Объект.КонтактнаяИнформация на клиенте не приводит к перерисовке динамически созданных элементов формы.
  3. Служебные реквизиты формы: Подсистема БСП хранит текущие отображаемые данные в специальных реквизитах самой формы, а не только в объекте.

Способ 1. Изменение динамического реквизита формы

Проанализируем самый быстрый и простой способ отображения данных на форме без сохранения объекта в базу данных. Подразумевается прямое обращение к программно созданному реквизиту формы, отвечающему за нужное поле КИ.

Если вид контактной информации уже выведен на форму при её открытии, подсистема создала соответствующий реквизит формы (например, с именем КонтактнаяИнформацияПоле2). Мы можем напрямую присвоить ему значение на клиенте:

ЭтаФорма.КонтактнаяИнформацияПоле2 = "1234567890";

Посмотрим на особенности этого решения:

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

Способ 2. Обновление отображения КИ через механизмы БСП

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

  1. Сформировать данные контактной информации с помощью методов общего модуля УправлениеКонтактнойИнформациейКлиентСервер или УправлениеКонтактнойИнформацией.
  2. Заполнить соответствующую строку в Объект.КонтактнаяИнформация.
  3. Вызвать серверную процедуру обновления интерфейса подсистемы БСП — УправлениеКонтактнойИнформацией.ОбновитьКонтактнуюИнформацию(ЭтаФорма, Объект).

Рассмотрим пример заполнения строки КИ на сервере:


// Заполнение контактной информации на сервере
СтруктураКИ = УправлениеКонтактнойИнформациейКлиентСервер.СформироватьСтруктуруТелефона("89991234567", "");
ЗначенияПолей = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияВXML(СтруктураКИ);

СтрокаКИ = Объект.КонтактнаяИнформация.Добавить();
СтрокаКИ.Тип = Перечисления.ТипыКонтактнойИнформации.Телефон;
СтрокаКИ.Вид = Справочники.ВидыКонтактнойИнформации.ТелефонКонтрагента;
СтрокаКИ.Представление = "89991234567";
СтрокаКИ.ЗначенияПолей = ЗначенияПолей;

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

Важное ограничение: При таком подходе модифицируется табличная часть самого объекта (Объект.КонтактнаяИнформация), из-за чего флаг ЭтаФорма.Модифицированность станет равен Истина. Если пользователь попробует закрыть форму, система предложит сохранить изменения.

Способ 3. Использование отдельного реквизита формы для временного ввода

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

Рассмотрим по шагам, как это реализовать:

  1. В редакторе формы добавить новый реквизит формы, например, ВременныйТелефон с типом Строка.
  2. Перетащить реквизит на форму для создания элемента управления (поля ввода).
  3. Заполнять данный реквизит программно в любой момент времени: ЭтаФорма.ВременныйТелефон = "+7 (999) 000-00-00";

Этот способ полностью изолирует временные данные от подсистемы КИ, не вызывает конфликтов с динамическими элементами БСП и не взводит признак модифицированности формы.

← На главную