При работе с современными конфигурациями 1С, такими как Управление торговлей 11.3, разработчики часто сталкиваются с ситуацией: программный код по добавлению адреса или телефона выполняется без ошибок, данные физически записываются в табличную часть КонтактнаяИнформация, их можно увидеть через консоль запросов, но на самой форме элемента в режиме «1С:Предприятие» поля остаются пустыми. Это происходит из-за особенностей работы подсистемы «Контактная информация» из состава Библиотеки стандартных подсистем (БСП).
В этой статье мы подробно разберем, почему данные могут не отображаться, изучим разницу в хранении информации для партнеров и контрагентов, а также рассмотрим несколько рабочих способов программного заполнения контактной информации (КИ).
Проанализируем основные причины «невидимости» данных, которые обсуждались в рамках технической проблемы:
Партнеры используются одни элементы справочника ВидыКонтактнойИнформации, а для Контрагенты — другие. Если записать в контрагента телефон с видом «Телефон партнера», стандартная форма его просто не отфильтрует для показа.ЗначенияПолей пустое или заполнено некорректно, форма посчитает данные поврежденными и ничего не выведет.Партнер — это управленческая сущность, а Контрагент — юридическое лицо. Часто в настройках программы включено отображение контактной информации партнера в формах контрагента. Если заполнить данные только одному объекту, во втором они могут не появиться автоматически.Рассмотрим способы правильного заполнения этих данных.
Самый надежный метод — использовать экспортные процедуры общих модулей. Это гарантирует, что все служебные поля (включая JSON-структуру) будут сформированы правильно. Разберем пример добавления адреса электронной почты для контрагента.
// Определим исходные данные
АдресЭП = "info@example.com";
ТипКИ = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты;
ВидКИ = Справочники.ВидыКонтактнойИнформации.EmailКонтрагента;
// Формируем структуру данных через XDTO (внутренний механизм БСП)
ОбъектXDTOКИ = УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияXDTOПоПредставлению(АдресЭП, ТипКИ);
ЗначенияПолей = УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияXDTOВXML(ОбъектXDTOКИ);
// Записываем информацию в объект
// КонтрагентОбъект — это предварительно полученный объект справочника
УправлениеКонтактнойИнформацией.ЗаписатьКонтактнуюИнформацию(КонтрагентОбъект, ЗначенияПолей, ВидКИ, ТипКИ);
КонтрагентОбъект.Записать();
В данном примере функция КонтактнаяИнформацияXDTOВXML (или аналогичная для JSON в более свежих версиях) создает ту самую строку, которую «понимает» форма. Обратите внимание, что метод ЗаписатьКонтактнуюИнформацию сам управляет очисткой старых записей и добавлением новых с тем же видом.
Если в вашей версии УТ 11.3 уже используется формат JSON, то подход через прямое формирование структуры будет более эффективным. Рассмотрим ситуацию с заполнением номера телефона, где важно правильно разделить код страны, код города и номер.
&НаСервере
Процедура ЗаполнитьТелефонКонтрагента(КонтрагентСсылка, НомерТелефонаСтрока)
КонтрагентОбъект = КонтрагентСсылка.ПолучитьОбъект();
ВидКИ = Справочники.ВидыКонтактнойИнформации.ТелефонКонтрагента;
ТипКИ = Перечисления.ТипыКонтактнойИнформации.Телефон;
// Создаем структуру новой контактной информации
ДанныеКИ = УправлениеКонтактнойИнформациейКлиентСервер.ОписаниеНовойКонтактнойИнформации(ТипКИ);
// Заполняем поля структуры (в реальной задаче лучше распарсить строку на коды)
ДанныеКИ.Number = НомерТелефонаСтрока; // Сам номер
ДанныеКИ.Value = НомерТелефонаСтрока; // Представление
// Сериализуем структуру в строку JSON для записи в БД
СтрокаJSON = УправлениеКонтактнойИнформациейСлужебный.СтруктураВСтрокуJSON(ДанныеКИ);
// Добавляем или обновляем запись в табличной части
УправлениеКонтактнойИнформацией.ДобавитьКонтактнуюИнформацию(КонтрагентОбъект, СтрокаJSON, ВидКИ, Дата(1,1,1), Истина);
КонтрагентОбъект.Записать();
КонецПроцедуры
Вызов функции ОписаниеНовойКонтактнойИнформации позволяет получить пустой шаблон структуры, соответствующий требованиям БСП. Это избавляет нас от необходимости вручную прописывать ключи JSON-объекта.
Этот метод мы проанализируем как наиболее подверженный ошибкам, но иногда необходимый для быстрой отладки или простых типов данных (например, поле «Заметка»). Главное правило здесь — заполнить все обязательные реквизиты строки табличной части КонтактнаяИнформация.
НоваяСтрока = КонтрагентОбъект.КонтактнаяИнформация.Добавить();
НоваяСтрока.Тип = Перечисления.ТипыКонтактнойИнформации.Телефон;
НоваяСтрока.Вид = Справочники.ВидыКонтактнойИнформации.ТелефонКонтрагента;
НоваяСтрока.Представление = "8 (999) 123-45-67";
// Критически важные поля для телефонов:
НоваяСтрока.НомерТелефона = "9991234567";
НоваяСтрока.НомерТелефонаБезКодов = "1234567";
// Поле ВидДляСписка часто используется для фильтрации на формах списка
НоваяСтрока.ВидДляСписка = Справочники.ВидыКонтактнойИнформации.ТелефонКонтрагента;
// Оставлять пустым ЗначенияПолей в новых версиях НЕЛЬЗЯ.
// Как минимум, запишите туда XML или JSON структуру представления.
НоваяСтрока.ЗначенияПолей = "<Structure xmlns=""http://v8.1c.ru/8.1/data/core""><Property name=""Представление""><Value xmlns:xs=""http://www.w3.org/2001/XMLSchema"" xsi:type=""xs:string"">" + НоваяСтрока.Представление + "</Value></Property></Structure>";
КонтрагентОбъект.Записать();
Важный момент: Если вы заполняете адрес, использование ручного метода крайне не рекомендуется. Адреса в 1С привязаны к классификатору ФИАС (ГАР). Чтобы адрес считался валидным и отображался в соответствующих полях (город, улица, дом), необходимо использовать сложные функции парсинга из модуля УправлениеКонтактнойИнформациейКлиентСервер.
В Управлении торговлей 11.3 часто возникает путаница: разработчик заполняет КИ контрагента, а пользователь открывает форму партнера. Выясним, как с этим работать. Если в настройках системы включено использование партнеров, то первичной сущностью для CRM является именно Партнер.
Проанализируем ситуацию: если в коде создается новый партнер и к нему привязывается контрагент, контактную информацию необходимо дублировать или записывать обоим объектам, если это предусмотрено бизнес-логикой. При этом виды КИ будут отличаться:
Справочники.ВидыКонтактнойИнформации.ТелефонПартнераСправочники.ВидыКонтактнойИнформации.ТелефонКонтрагентаЕсли вы открываете форму контрагента, а видите там данные партнера, значит, в конфигурации настроено динамическое считывание КИ. В этом случае программная запись напрямую в табличную часть контрагента может не дать визуального эффекта до тех пор, пока данные не будут синхронизированы с партнером.
Чтобы программное заполнение контактной информации в УТ 11.3 работало корректно, придерживайтесь следующих правил:
Вид контактной информации. Он должен принадлежать той группе (справочнику), в который вы производите запись.ЗначенияПолей. Не надейтесь на одно только Представление. Если вы не хотите возиться с форматом JSON/XML, используйте функцию УправлениеКонтактнойИнформацией.ЗаписатьКонтактнуюИнформацию, которая сделает это за вас.НомерТелефона (строка цифр) и НомерТелефонаБезКодов, иначе поиск по номеру телефона в базе работать не будет.ДействуетС заполнен актуальной датой (или пустой датой, если история не используется).Следуя этим рекомендациям и используя встроенные механизмы БСП, вы сможете избежать проблем с отображением данных и обеспечите корректную работу всех механизмов системы 1С.