Как программно записать адрес в произвольном формате в 1С (БСП)

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

При разработке в конфигурациях, использующих Библиотеку стандартных подсистем (БСП), программисты часто сталкиваются с задачей программного заполнения контактной информации, в частности — адресов. Одной из наиболее распространенных проблем является ситуация, когда код выполняется без ошибок, но данные в справочнике (например, в «Физических лицах») не появляются. В этой статье мы подробно разберем, как правильно реализовать запись адреса в свободном формате, проанализируем типичные ошибки и рассмотрим внутренние механизмы хранения данных в БСП.

Анализ исходной проблемы

Рассмотрим ситуацию: разработчик использует стандартную процедуру УправлениеКонтактнойИнформацией.ДобавитьКонтактнуюИнформацию, передавая в нее объект, строку представления и вид контактной информации. На первый взгляд, код выглядит корректно:


Представление = "398020, Тульская область, г. Тула";
УправлениеКонтактнойИнформацией.ДобавитьКонтактнуюИнформацию(ТекущийОбъект, Представление, Справочники.ВидыКонтактнойИнформации.АдресРегистрации);

Однако после выполнения кода адрес в карточке физического лица остается пустым. Выясним причину этого поведения и разберем по шагам, что необходимо сделать для успешной записи данных.

Шаг 1. Обязательная запись объекта

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

Проанализируем ситуацию: если мы получили объект через Ссылка.ПолучитьОбъект(), внесли изменения и не вызвали метод Записать(), все изменения будут потеряны сразу после завершения работы процедуры. Таким образом, после вызова метода добавления контактной информации необходимо явно вызвать метод записи:


// Получаем объект для редактирования
ТекущийОбъект = ФизЛицоСсылка.ПолучитьОбъект();

// Добавляем информацию в табличную часть объекта
УправлениеКонтактнойИнформацией.ДобавитьКонтактнуюИнформацию(ТекущийОбъект, Представление, Справочники.ВидыКонтактнойИнформации.АдресРегистрации);

// Фиксируем изменения в базе данных
ТекущийОбъект.Записать();

Шаг 2. Настройка вида контактной информации

Даже если объект записывается, адрес может «исчезать» или не отображаться, если в настройках самого Вида контактной информации стоят ограничения. Рассмотрим подробнее настройки справочника ВидыКонтактнойИнформации.

Для того чтобы система позволяла хранить произвольный текст вместо строго структурированного адреса (по ФИАС/ГАР), необходимо проверить следующие настройки для элемента «Адрес регистрации»:

  1. Разрешить ввод произвольного текста: Этот флаг должен быть установлен, если вы планируете записывать данные, которые не проходят валидацию по классификатору.
  2. Редактировать только в диалоге: Если этот флаг установлен, система будет ожидать, что данные соответствуют определенной XDTO-структуре. Для программной записи произвольного текста этот флаг лучше снять или убедиться, что вы правильно формируете внутреннее значение.

Шаг 3. Различие между Представлением и Значением

В современных версиях БСП контактная информация в табличной части хранится в нескольких полях. Основными являются Представление и Значение. Посмотрим на их роль:

Если вы записываете только Представление, а поле Значение оставляете пустым, то при открытии карточки объекта механизм БСП может попытаться «распаковать» пустое значение и затереть ваше текстовое представление. Чтобы этого избежать, рекомендуется использовать метод преобразования строки в системный формат БСП.

Рассмотрим пример использования функции КонтактнаяИнформацияПредставлениеВЗначение:


ВидАдреса = Справочники.ВидыКонтактнойИнформации.АдресРегистрации;
// Преобразуем обычную строку в JSON-структуру, которую «поймет» БСП
ЗначениеДляЗаписи = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияПредставлениеВЗначение(Представление, ВидАдреса);

// Теперь можно вручную заполнить табличную часть или использовать стандартные методы
// Если используем ДобавитьКонтактнуюИнформацию, БСП постарается сделать это сама, 
// но явное формирование значения более надежно в сложных случаях.

Шаг 4. Очистка существующих записей

Часто проблема заключается в том, что у физического лица уже есть запись с видом «Адрес регистрации». Метод ДобавитьКонтактнуюИнформацию может повести себя по-разному в зависимости от версии БСП: либо добавить дублирующую строку в табличную часть, либо проигнорировать действие.

Правильный алгоритм программного обновления адреса выглядит так:

  1. Найти существующую строку в табличной части КонтактнаяИнформация по виду.
  2. Если строка найдена — обновить её поля Представление и Значение.
  3. Если не найдена — добавить новую строку.

Посмотрим на пример кода, реализующий этот подход:


ТекущийОбъект = СсылкаНаФизЛицо.ПолучитьОбъект();
ВидАдреса = Справочники.ВидыКонтактнойИнформации.АдресРегистрации;

// Ищем существующую строку
СтрокаКИ = ТекущийОбъект.КонтактнаяИнформация.Найти(ВидАдреса, "Вид");

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

СтрокаКИ.Представление = "398020, Тульская область, г. Тула";
// Для произвольного адреса Значение можно оставить пустым, если настройки Вида это позволяют,
// но лучше сформировать минимальный JSON
СтрокаКИ.Значение = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияПредставлениеВЗначение(СтрокаКИ.Представление, ВидАдреса);

ТекущийОбъект.Записать();

Дополнительные нюансы и рекомендации

Проанализируем еще несколько моментов, которые могут влиять на результат:

Международный формат: Если адрес не российский и не должен проверяться по ФИАС, в структуре адреса часто указывают код страны (отличный от 643). В этом случае БСП автоматически переходит в режим работы с произвольным текстом.

Регистр сведений: В некоторых старых конфигурациях или при определенных настройках БСП контактная информация может храниться не в табличной части объекта, а в регистре сведений КонтактнаяИнформация. В этом случае работа через ТекущийОбъект.КонтактнаяИнформация не даст результата. Выясним это, заглянув в метаданные вашего справочника «Физические лица». Если табличной части нет — используйте менеджер регистра сведений для создания набора записей с отбором по объекту и виду.

Обновление формы: Если вы выполняете код на форме и хотите сразу увидеть результат, не забывайте, что данные в объекте формы могут не обновиться автоматически после записи объекта в базу. Используйте метод КопироватьДанныеФормы(ТекущийОбъект, Объект) или оповещение об изменении.

Подводя итог, можно сказать, что для успешной записи адреса в свободном формате необходимо сочетание трех факторов: корректные настройки Вида контактной информации, использование стандартных функций БСП для формирования Значения и обязательный вызов метода Записать() для владельца контактной информации.

← На главную