При разработке и сопровождении конфигураций на базе 1С:Предприятие 8 часто возникает вопрос: где именно хранить контактную информацию (адреса, телефоны, email) — в табличной части объекта-владельца или в отдельном регистре сведений? В рамках Библиотеки стандартных подсистем (БСП) существуют обе реализации, и выбор между ними зависит от версии платформы, используемых форм и требований к производительности. В этой статье мы подробно разберем, как устроена подсистема «Контактная информация», проанализируем причины перехода от регистров к табличным частям и выясним, какой метод эффективнее в современных реалиях.
Рассмотрим историю вопроса. В ранних версиях БСП и в конфигурациях на «обычных формах» (например, УПП 1.3 или старые версии ЗУП 2.5) доминировал подход с использованием регистра сведений КонтактнаяИнформация. Однако, начиная с версий БСП 2.1–2.2, произошел концептуальный сдвиг в сторону хранения данных в табличных частях объектов (справочников Контрагенты, ФизическиеЛица, Пользователи и др.).
Выясним причину такого перехода. Основная задача разработчиков 1С заключалась в обеспечении атомарности данных. Когда адрес хранится в табличной части, он является неотъемлемой частью объекта. Это гарантирует, что при записи контрагента его контактные данные будут сохранены в той же транзакции. В случае с регистром сведений существовал риск возникновения «сиротских» записей или ситуаций, когда объект записан, а запись в регистр сорвалась из-за блокировки или ошибки в коде.
Проанализируем, как именно БСП организует данные внутри табличной части. Обычно табличная часть называется КонтактнаяИнформация и содержит стандартный набор реквизитов: Тип, Вид, Представление, а также критически важный реквизит ЗначенияПолей.
Разберем подробнее структуру реквизита ЗначенияПолей. Это текстовое поле, в котором данные хранятся в структурированном виде (XML или JSON). Рассмотрим, почему это удобно:
Посмотрим на пример того, как программно может выглядеть работа с данными КИ, если они хранятся в табличной части. Для этого используются методы программного интерфейса БСП:
// Пример получения представления адреса из ТЧ объекта
ПараметрыЗапроса = УправлениеКонтактнойИнформацией.ПараметрыПолученияПредставлений();
ПараметрыЗапроса.Вставить("Контрагент", Объект.Ссылка);
Результат = УправлениеКонтактнойИнформацией.ПредставленияКонтактнойИнформации(ПараметрыЗапроса);
Адрес = Результат.Контрагент.ЮридическийАдрес;
Рассмотрим основные плюсы, которые дает нам архитектура на базе табличных частей:
ПриЗаписи регистра), чтобы «подтолкнуть» обмен владельца данных.Несмотря на явные преимущества ТЧ, во многих современных конфигурациях (например, в ERP или УТ 11) мы все еще встречаем регистр сведений КонтактнаяИнформация. Разберемся, зачем он нужен.
Во-первых, это совместимость. Многие внешние системы интеграции и старые отчеты настроены на чтение данных из регистра. Во-вторых, это индексация и поиск. Поиск контрагента по номеру телефона технически гораздо проще и быстрее выполнять по индексу регистра, чем по текстовым полям множества табличных частей различных справочников.
Зачастую применяется гибридная схема: мастер-данные хранятся в табличной части объекта для обеспечения целостности, а при записи объекта данные дублируются в скрытый регистр сведений. Это позволяет эффективно выполнять запросы типа:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| КонтактнаяИнформация.Объект КАК Контрагент
|ИЗ
| РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
|ГДЕ
| КонтактнаяИнформация.Представление ПОДОБНО &НомерТелефона";
Запрос.УстановитьПараметр("НомерТелефона", "%9001234567%");
Результат = Запрос.Выполнить();
Проанализируем ситуацию, упомянутую в обсуждении экспертов. Основной минус табличной части — это необходимость перезаписи всего объекта при изменении одного лишь телефона. Это влечет за собой несколько последствий:
ПередЗаписью модуля объекта, даже если мы изменили только email. Это может замедлять работу, если в объекте прописаны сложные проверки бизнес-логики.С другой стороны, работа через форму регистра (если бы мы использовали только РС) позволяет вносить правки «незаметно» для самого справочника. Однако в современных управляемых интерфейсах БСП эта грань стирается: даже если данные физически лежат в РС, при редактировании их через форму объекта флаг модифицированности формы все равно установится.
Подведем итог нашему анализу. Если вы разрабатываете новую подсистему «с нуля» на современной версии БСП, однозначным выбором будет использование табличной части. Это соответствует актуальной архитектуре фирмы «1С» и существенно упрощает механизмы контроля целостности, версионирования и обмена.
Использование регистра сведений оправдано только в двух случаях:
Важно помнить, что в современной БСП работа с контактной информацией максимально абстрагирована. Разработчику не рекомендуется обращаться к табличным частям или регистрам напрямую запросом. Вместо этого следует использовать функции программного интерфейса модуля УправлениеКонтактнойИнформацией, что позволит вашему коду оставаться работоспособным даже при изменении способа хранения данных в будущих версиях платформы.
Рассмотрим пример правильного добавления нового адреса программно:
// Создание новой записи КИ для объекта
ВидКИ = Справочники.ВидыКонтактнойИнформации.ЮридическийАдресКонтрагента;
ЗначенияПолей = "Город=Москва;Улица=Ленина;Дом=1"; // Упрощенно
УправлениеКонтактнойИнформацией.ЗаписатьКонтактнуюИнформацию(СсылкаНаКонтрагента, ЗначенияПолей, ВидКИ, ТипыКонтактнойИнформации.Адрес);
Таким образом, мы обеспечиваем корректную запись данных вне зависимости от того, какая реализация выбрана в конкретной конфигурации — через ТЧ или через РС. Это и есть профессиональный подход к разработке на базе 1С:Библиотеки стандартных подсистем.