Как лучше хранить контактную информацию в 1С: в табличной части или в регистре сведений?

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

При разработке и сопровождении конфигураций на базе 1С:Предприятие 8 часто возникает вопрос: где именно хранить контактную информацию (адреса, телефоны, email) — в табличной части объекта-владельца или в отдельном регистре сведений? В рамках Библиотеки стандартных подсистем (БСП) существуют обе реализации, и выбор между ними зависит от версии платформы, используемых форм и требований к производительности. В этой статье мы подробно разберем, как устроена подсистема «Контактная информация», проанализируем причины перехода от регистров к табличным частям и выясним, какой метод эффективнее в современных реалиях.

Эволюция подсистемы контактной информации в БСП

Рассмотрим историю вопроса. В ранних версиях БСП и в конфигурациях на «обычных формах» (например, УПП 1.3 или старые версии ЗУП 2.5) доминировал подход с использованием регистра сведений КонтактнаяИнформация. Однако, начиная с версий БСП 2.1–2.2, произошел концептуальный сдвиг в сторону хранения данных в табличных частях объектов (справочников Контрагенты, ФизическиеЛица, Пользователи и др.).

Выясним причину такого перехода. Основная задача разработчиков 1С заключалась в обеспечении атомарности данных. Когда адрес хранится в табличной части, он является неотъемлемой частью объекта. Это гарантирует, что при записи контрагента его контактные данные будут сохранены в той же транзакции. В случае с регистром сведений существовал риск возникновения «сиротских» записей или ситуаций, когда объект записан, а запись в регистр сорвалась из-за блокировки или ошибки в коде.

Хранение в табличной части: Техническая реализация

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

Разберем подробнее структуру реквизита ЗначенияПолей. Это текстовое поле, в котором данные хранятся в структурированном виде (XML или JSON). Рассмотрим, почему это удобно:

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


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

Результат = УправлениеКонтактнойИнформацией.ПредставленияКонтактнойИнформации(ПараметрыЗапроса);
Адрес = Результат.Контрагент.ЮридическийАдрес;

Преимущества использования табличных частей

Рассмотрим основные плюсы, которые дает нам архитектура на базе табличных частей:

  1. Упрощение прав доступа (RLS): Если данные находятся в ТЧ, права на них автоматически ограничиваются правами на сам объект. Программисту не нужно настраивать сложные правила доступа для отдельного регистра сведений, что существенно снижает нагрузку на сервер при расчете прав.
  2. Версионирование объектов: Механизм версионирования в БСП «из коробки» видит изменения в табличных частях. Мы можем легко сравнить две версии карточки контрагента и увидеть, кто и когда изменил номер телефона, не прибегая к анализу истории нескольких разных объектов.
  3. Синхронизация и обмен данными: При использовании РИБ или универсального формата обмена, изменение в табличной части автоматически помечает основной объект к выгрузке. Нам не нужно писать дополнительные обработчики событий (ПриЗаписи регистра), чтобы «подтолкнуть» обмен владельца данных.
  4. Производительность чтения: При открытии формы объекта платформа считывает все данные (включая ТЧ) одним запросом. Это избавляет от необходимости выполнять дополнительные соединения с таблицами регистров на уровне СУБД.

Когда регистра сведений все еще актуален?

Несмотря на явные преимущества ТЧ, во многих современных конфигурациях (например, в ERP или УТ 11) мы все еще встречаем регистр сведений КонтактнаяИнформация. Разберемся, зачем он нужен.

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

Зачастую применяется гибридная схема: мастер-данные хранятся в табличной части объекта для обеспечения целостности, а при записи объекта данные дублируются в скрытый регистр сведений. Это позволяет эффективно выполнять запросы типа:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	КонтактнаяИнформация.Объект КАК Контрагент
    |ИЗ
    |	РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
    |ГДЕ
    |	КонтактнаяИнформация.Представление ПОДОБНО &НомерТелефона";

Запрос.УстановитьПараметр("НомерТелефона", "%9001234567%");
Результат = Запрос.Выполнить();

Анализ недостатков: Проблема модифицированности

Проанализируем ситуацию, упомянутую в обсуждении экспертов. Основной минус табличной части — это необходимость перезаписи всего объекта при изменении одного лишь телефона. Это влечет за собой несколько последствий:

С другой стороны, работа через форму регистра (если бы мы использовали только РС) позволяет вносить правки «незаметно» для самого справочника. Однако в современных управляемых интерфейсах БСП эта грань стирается: даже если данные физически лежат в РС, при редактировании их через форму объекта флаг модифицированности формы все равно установится.

Выясним, что же в итоге лучше?

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

Использование регистра сведений оправдано только в двух случаях:

  1. Вы работаете в старой конфигурации на Обычных формах.
  2. Вам критически важна скорость полнотекстового поиска или поиска по маске по всей базе контактов (в этом случае используйте регистр как вспомогательное «зеркало»).

Важно помнить, что в современной БСП работа с контактной информацией максимально абстрагирована. Разработчику не рекомендуется обращаться к табличным частям или регистрам напрямую запросом. Вместо этого следует использовать функции программного интерфейса модуля УправлениеКонтактнойИнформацией, что позволит вашему коду оставаться работоспособным даже при изменении способа хранения данных в будущих версиях платформы.

Рассмотрим пример правильного добавления нового адреса программно:


// Создание новой записи КИ для объекта
ВидКИ = Справочники.ВидыКонтактнойИнформации.ЮридическийАдресКонтрагента;
ЗначенияПолей = "Город=Москва;Улица=Ленина;Дом=1"; // Упрощенно

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

Таким образом, мы обеспечиваем корректную запись данных вне зависимости от того, какая реализация выбрана в конкретной конфигурации — через ТЧ или через РС. Это и есть профессиональный подход к разработке на базе 1С:Библиотеки стандартных подсистем.

← На главную