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