При разработке в современных конфигурациях 1С, использующих Библиотеку стандартных подсистем (БСП), программисты часто сталкиваются с проблемой: данные в базу записываются, их можно увидеть через запрос или консоль, но на форме элемента (например, справочника ФизическиеЛица) поля остаются пустыми. Давайте разберем, почему так происходит, проанализируем внутренние механизмы хранения контактной информации и разработаем правильный алгоритм программной записи.
В старых версиях платформ и конфигураций контактная информация хранилась в виде простых строк. В современных же системах на базе БСП механизм работы значительно усложнился. Теперь табличная часть КонтактнаяИнформация содержит не только строковое представление, но и скрытые поля Значение и ЗначенияПолей. В этих полях хранятся сериализованные данные в форматах XML или JSON.
Когда открывается управляемая форма, программный интерфейс БСП считывает данные именно из этих скрытых полей, десериализует их и заполняет визуальные элементы. Если вы просто запишете текст в колонку Представление, форма проигнорирует это изменение, так как данные в полях Значение не будут соответствовать вашей правке. Разберем ситуацию на примере кода, предоставленного автором темы.
// Пример НЕПРАВИЛЬНОЙ записи, которая приводит к пустоте на форме
Для Каждого ЭлементСтроки Из СсылкаНаФизлицо.КонтактнаяИнформация Цикл
Если СокрЛП(ЭлементСтроки.Вид) = "Email физ. лица" Тогда
ЭлементСтроки.Представление = email; // Записывается только текст
ЭлементСтроки.ЗначенияПолей = email; // Ошибка: здесь ожидается XML
ЭлементСтроки.Значение = email; // Ошибка: здесь ожидается JSON
КонецЕсли;
КонецЦикла;
Проанализируем структуру, которую ожидает система. Для корректного отображения в поле Значение должна находиться JSON-строка определенного формата, а в поле ЗначенияПолей — XML-структура. Рассмотрим пример правильного наполнения этих полей для адреса электронной почты.
Поле Значение (JSON):
{
"value": "test@test.ru",
"comment": "",
"type": "АдресЭлектроннойПочты"
}
Поле ЗначенияПолей (XML):
<КонтактнаяИнформация xmlns="http://www.v8.1c.ru/ssl/contactinfo" Представление="test@test.ru">
<Состав xsi:type="ЭлектроннаяПочта" Значение="test@test.ru"/>
</КонтактнаяИнформация>
Вместо того чтобы вручную формировать сложные строки XML и JSON (что чревато ошибками при обновлении версии БСП), правильным подходом будет использование штатного программного интерфейса — общего модуля УправлениеКонтактнойИнформацией. Рассмотрим пошагово, как реализовать надежную запись данных.
Для начала нам нужно создать структуру, которую понимает метод записи БСП. Для этого используется функция НоваяКонтактнаяИнформация(). Она создает таблицу значений с правильным набором колонок.
&НаСервере
Процедура ЗаписатьEmailФизЛица(СсылкаНаФизЛицо, НовыйEmail)
// Получаем объект справочника для редактирования
ОбъектФизЛицо = СсылкаНаФизЛицо.ПолучитьОбъект();
// Создаем пустую таблицу контактной информации по структуре БСП
ТаблицаКИ = УправлениеКонтактнойИнформацией.НоваяКонтактнаяИнформация();
// Добавляем строку с данными
НоваяСтрока = ТаблицаКИ.Добавить();
НоваяСтрока.Вид = Справочники.ВидыКонтактнойИнформации.EmailФизическиеЛица;
НоваяСтрока.Тип = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты;
НоваяСтрока.Представление = НовыйEmail;
НоваяСтрока.АдресЭП = НовыйEmail; // Важное поле для типа Email
// Вызываем метод БСП, который сам сформирует XML и JSON
УправлениеКонтактнойИнформацией.УстановитьКонтактнуюИнформациюОбъекта(ОбъектФизЛицо, ТаблицаКИ);
// Записываем сам объект справочника
ОбъектФизЛицо.Записать();
КонецПроцедуры
Давайте разберем, что происходит внутри этого метода. Он не просто копирует данные в табличную часть КонтактнаяИнформация. Он выполняет следующие действия:
ЗначенияПолей, включая все необходимые пространства имен.Значение.Использование этого метода гарантирует, что при открытии карточки физического лица в интерфейсе, поле «Email» будет заполнено корректно.
Рассмотрим ситуацию из сообщения №6 в теме. Автор пытался использовать метод УстановитьКонтактнуюИнформациюОбъекта(Объект, ДанныеЗаполнения), где в качестве первого параметра передавал переменную Объект. В контексте обработки это ссылка на саму обработку, а не на справочник. Это критическая ошибка.
Правило: Первым параметром в методы записи КИ всегда должен передаваться Объект того элемента, который вы хотите изменить (например, СправочникОбъект.ФизическиеЛица).
Еще одна частая ошибка — поиск вида контактной информации по наименованию (СокрЛП(ЭлементСтроки.Вид) = "Email физ. лица"). Это крайне ненадежный способ, так как наименование может измениться или зависеть от языка интерфейса. Всегда используйте ссылки на предопределенные элементы справочника ВидыКонтактнойИнформации.
Если ваша обработка по загрузке данных запущена параллельно с открытой формой физлица, то после выполнения кода данные в БД изменятся, но пользователь на экране их не увидит без перезапуска формы. Чтобы этого избежать, используйте механизм оповещений.
На клиенте, после завершения серверного вызова записи, выполните следующий код:
&НаКлиенте
Процедура ПослеЗагрузки(Результат)
// Оповещаем систему об изменении данных конкретного объекта
ОповеститьОбИзменении(СсылкаНаИзмененноеФизЛицо);
КонецПроцедуры
Это заставит все открытые динамические списки и формы объектов перечитать актуальные данные из базы данных.
Проанализировав проблему, мы выяснили, что современная 1С требует комплексного подхода к записи контактной информации. Основные выводы:
УправлениеКонтактнойИнформацией для подготовки данных.Объект справочника, а не ссылку.Тип и Вид контактной информации.Следуя этим правилам, вы обеспечите стабильную работу системы и корректное отображение данных во всех интерфейсных формах конфигурации. Для быстрого поиска готовых примеров вызова процедур и функций библиотеки можно использовать справочник по методам БСП.