Где хранить дополнительные реквизиты контрагентов: телефоны, адреса, e-mail в 1С?

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

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

Давайте вместе разберем эту важную архитектурную задачу, проанализируем различные варианты, их преимущества и недостатки, а также рассмотрим, как эта проблема решена в типовых конфигурациях 1С.

Варианты хранения дополнительных реквизитов

Для решения задачи хранения множественных контактных данных, таких как телефоны, адреса и e-mail для справочника «Контрагенты», мы можем рассмотреть несколько основных подходов, каждый из которых имеет свои особенности и области применения.

1. Использование табличных частей

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

  1. Преимущества:
    • Простота реализации: Это один из самых очевидных и простых способов хранения связанных данных. Все данные находятся в одном месте, что упрощает их создание, чтение и изменение вместе с основным объектом.
    • Удобство переноса данных: При обмене данными (например, через XML-выгрузку/загрузку или конвертацию) вся информация табличной части переносится вместе с основным объектом, поскольку она является его частью. Это обеспечивает целостность данных.
    • Интеграция с формами: Работа с данными табличной части в формах объекта обычно интуитивно понятна и проста для пользователя, так как они видны прямо на вкладке или в группе полей элемента справочника.
    • Совпадение прав доступа: Права доступа к табличной части совпадают с правами доступа к основному объекту, что упрощает управление безопасностью.
  2. Особенности и ограничения:
    • Отсутствие контроля уникальности: На уровне платформы отсутствует встроенный механизм контроля уникальности записей в табличной части. Если нам нужна уникальность (например, чтобы один и тот же телефон не был указан дважды), нам придется реализовывать этот контроль программно.
    • Не подходит для истории: Табличные части плохо подходят для хранения истории изменений. Если нам нужно знать, какой телефон был у контрагента год назад, табличная часть не предоставит такой функциональности без дополнительных программных усилий. При изменении или удалении записи предыдущее состояние теряется.
    • Производительность при большом объеме: Если табличная часть содержит очень много записей для каждого элемента, это может замедлить запись и чтение основного объекта, так как вся табличная часть обрабатывается целиком.

2. Использование регистров сведений

Принцип: Регистры сведений — это мощный механизм 1С, предназначенный для хранения произвольных данных в разрезе нескольких измерений. Они могут быть периодическими или непериодическими. Для контактной информации мы можем создать непериодический регистр сведений, где измерениями будут, например, ссылка на контрагента, тип контактной информации и, возможно, номер строки для обеспечения уникальности, а ресурсами — само значение контакта.

  1. Преимущества:
    • Хранение истории: Периодические регистры сведений идеально подходят для хранения истории изменений информации. Мы можем легко отследить, когда и как менялись телефоны или адреса контрагента.
    • Контроль уникальности: Регистры сведений обеспечивают уникальность записей по составу измерений и периоду (для периодического регистра). Это позволяет избежать дублирования контактов без написания дополнительного кода.
    • Гибкость запросов: Данные регистров легко агрегируются и фильтруются с помощью запросов, что удобно для отчетов и поиска.
    • Независимый обмен данными: Данные регистров участвуют в обмене самостоятельно, что позволяет управлять их миграцией независимо от связанных объектов. Это может быть полезно в сложных распределенных системах.
    • Производительность: В некоторых случаях, если данные контактов очень много и они редко меняются, но часто запрашиваются, хорошо спроектированный регистр сведений с правильными индексами может быть производительнее, чем табличная часть. Также мы можем хранить разную информацию (телефоны, почту) в разных регистрах сведений для более быстрой обработки конкретного типа информации.
  2. Особенности и ограничения:
    • Сложность разработки: Работа с регистрами сведений требует более глубокого понимания платформы и написания большего объема кода для форм и обработки, чем с табличными частями.
    • Разделение данных: Данные хранятся отдельно от основного объекта, что может усложнить их комплексный перенос или удаление (например, при удалении контрагента нужно не забыть удалить связанные записи в регистре).
    • Проблемы с версионированием: Если мы используем стандартное версионирование объектов, то изменения дополнительных реквизитов, хранящихся в регистре сведений, не будут автоматически отображаться в истории версий основного объекта, так как регистр — это отдельный объект.
    • Индексация: Эффективность работы с регистром сведений сильно зависит от правильной настройки измерений и индексов. Неоптимальная структура может привести к низкой производительности.

3. Подсистема "Контактная информация" из БСП

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

  1. Назначение и архитектура:

    Подсистема «Контактная информация» из БСП предлагает готовое, унифицированное решение для хранения, обработки и отображения различных видов контактных данных (телефоны, адреса, e-mail, Skype, веб-страницы и т.д.) для любых объектов системы (контрагентов, контактных лиц, организаций, физических лиц). Она избавляет разработчика от необходимости «изобретать велосипед», предоставляя комплексный функционал.

  2. Механизм хранения:

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

    • Тип: Перечисление, определяющее общую категорию (например, "Адрес", "Телефон", "Адрес электронной почты", "Skype", "Веб-страница", "Факс", "Другое").
    • Вид: Ссылка на справочник «Виды контактной информации», который уточняет тип (например, для типа "Телефон" видом может быть "Мобильный", "Рабочий", "Домашний").
    • ЗначенияПолей: Это поле хранит XML-представление контактной информации. Такая структура позволяет универсально хранить сложные данные, например, структурированный адрес (страна, регион, город, улица, дом).
    • Значение: Часто это поле хранит более простое представление данных, например, в формате JSON, что удобно для обмена или быстрого доступа к неструктурированным данным.

    Для поиска по адресным данным (например, по номеру дома или улице) используются специальные функции общего модуля РаботаСАдресами, которые умеют разбирать и анализировать данные из полей ЗначенияПолей.

  3. Преимущества БСП:
    • Единый подход и стандартизация: Обеспечивает унифицированное хранение и обработку контактной информации для всех объектов, поддерживающих эту подсистему. Это делает систему более консистентной и легкой в поддержке.
    • Экономия времени и ресурсов: Использование готовых механизмов БСП позволяет очень быстро внедрить сложный функционал, не тратя время на его разработку, тестирование и отладку с нуля.
    • Богатая функциональность: Подсистема включает в себя:
      • Хранение различных типов и видов контактной информации.
      • Привязку к различным объектам системы.
      • Валидацию данных (например, проверку корректности формата e-mail или телефона).
      • Механизмы поиска и фильтрации.
      • Поддержку адресного классификатора (ФИАС/ГАР) для корректного ввода и проверки адресов, а также их автозаполнение.
      • Ведение истории изменения адресов, если это предусмотрено видом контактной информации.
    • Интеграция: Упрощает интеграцию с внешними системами (сервисами рассылок, телефонией, картографическими сервисами), так как данные хранятся в стандартизированном виде.
    • Актуальность: Подсистема постоянно развивается и обновляется, поддерживая актуальные стандарты и классификаторы.
  4. Настройка:

    Настройка видов контактной информации производится в разделе «НСИ и администрирование» -> «Администрирование» -> «Общие настройки» -> «Контактная информация» -> «Виды контактной информации». Здесь вы можете настроить список видов контактной информации, который обычно имеет двухуровневую иерархию:

    • Группы: Соответствуют носителям информации (например, «Организации», «Контрагенты», «Контактные лица»).
    • Элементы внутри групп: Определяют состав контактной информации (например, «Телефон рабочий», «Адрес фактический», «E-mail основной»). Для каждого элемента можно указать тип, необходимость использования адресного классификатора, а также опцию ведения истории.

4. Дополнительные реквизиты и сведения (общий механизм)

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

  1. Дополнительные реквизиты:

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

  2. Дополнительные сведения:

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

Этот механизм позволяет гибко расширять функциональность объектов без вмешательства в структуру базы данных через конфигуратор, что упрощает обновления и поддержку.

Сравнение подходов и исторический контекст

Мы видим, что выбор между табличными частями и регистрами сведений, а также использование готовых подсистем, не всегда очевиден. Давайте проанализируем исторические тенденции и основные критерии выбора.

  1. Эволюция подходов в типовых конфигурациях:
    • Ранее (например, УТ10, ОФ): В более старых версиях типовых конфигураций 1С (например, Управление торговлей 10.3) контактная информация часто хранилась в регистрах сведений. Это позволяло гибко управлять данными, вести историю и иметь возможность независимого обмена.
    • Сейчас (например, УТ11, БСП, УФ): В современных типовых конфигурациях, особенно тех, которые активно используют Библиотеку стандартных подсистем (БСП) и разрабатываются на управляемых формах (УФ), наблюдается переход к хранению контактной информации в табличных частях основных справочников. Причинами такого перехода могут быть:
      • Упрощение обмена данными: Когда вся контактная информация находится в табличной части основного объекта, ее перенос между базами становится проще, так как она передается как единое целое.
      • Целостность объекта: Все данные, относящиеся к одному объекту, группируются внутри него, что соответствует принципу целостности данных.
      • Совпадение прав доступа: Права на изменение контактной информации автоматически соответствуют правам на изменение основного объекта.
      • Подход БСП: Подсистема «Контактная информация» в БСП унифицирует этот подход, используя табличные части с полями ЗначенияПолей (XML) и Значение (JSON) для хранения структурированной и неструктурированной информации.
  2. Критерии выбора:

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

    • Сложность данных: Если контактные данные просты и не требуют сложной структуры, табличная часть или регистр сведений могут быть достаточны. Если же данные сложны (например, структурированные адреса с компонентами ФИАС), то БСП предлагает готовое решение.
    • Потребность в истории изменений: Если вам критично отслеживать историю изменений контактной информации (например, когда менялся адрес контрагента), то регистр сведений (периодический) или функционал истории в БСП будут предпочтительнее.
    • Требования к производительности: Для очень большого количества записей и частых запросов к ним, правильно спроектированный регистр сведений может быть более производительным. Однако для типового сценария, когда контактов не слишком много на один объект, табличные части в связке с БСП показывают себя отлично.
    • Использование БСП: Если ваша конфигурация использует БСП, или вы планируете ее использовать, внедрение подсистемы «Контактная информация» из БСП является наиболее целесообразным решением, поскольку оно унифицировано и полнофункционально.

Как сделать выбор?

Принимая решение о способе хранения, давайте зададим себе следующие ключевые вопросы, которые помогут нам определить наиболее подходящий вариант:

  1. Нужна ли история изменений контактной информации?

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

  2. Насколько сложны контактные данные и их валидация?

    Если мы храним простые текстовые строки (например, один телефон или один e-mail), то любая из опций будет работать. Однако, если речь идет о структурированных адресах с разбивкой по регионам, городам, улицам, домам, да еще и с необходимостью проверки по ФИАС/ГАР, то подсистема «Контактная информация» из БСП предлагает готовое и проверенное решение. Ручная реализация такого функционала на табличных частях или регистрах сведений потребует значительных трудозатрат.

  3. Требуется ли стандартизация и интеграция с другими объектами или системами?

    Если контактная информация должна быть унифицирована для различных объектов системы (контрагенты, физические лица, организации, контактные лица) и в будущем планируется интеграция с внешними сервисами (телефония, e-mail рассылки), то БСП является предпочтительным решением. Она обеспечивает единый формат хранения и готовые механизмы для работы с данными.

  4. Каковы требования к производительности и объему данных?

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

  5. Готовы ли мы к дополнительным сложностям при обновлениях и поддержке?

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

Практические рекомендации

Исходя из нашего анализа, сформулируем практические рекомендации по хранению дополнительных реквизитов контрагентов в 1С:

  1. Для большинства случаев (особенно при использовании БСП):

    Используйте подсистему «Контактная информация» из Библиотеки стандартных подсистем (БСП). Это стандартное, наиболее полное и универсальное решение в современных конфигурациях 1С. Она обеспечивает единый подход, богатый функционал (включая проверку адресов по ФИАС/ГАР, ведение истории), легко интегрируется и поддерживается.

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

    Пример программного доступа к контактной информации через БСП:

    
    // Получение контактной информации для контрагента
    Функция ПолучитьКонтактнуюИнформацию(КонтрагентСсылка)
    
        Запрос = Новый Запрос;
        Запрос.Текст = 
        "ВЫБРАТЬ
        |    КонтактнаяИнформация.Вид,
        |    КонтактнаяИнформация.Представление
        |ИЗ
        |    Справочник.Контрагенты.КонтактнаяИнформация КАК КонтактнаяИнформация
        |ГДЕ
        |    КонтактнаяИнформация.Ссылка = &Ссылка";
    
        Запрос.УстановитьПараметр("Ссылка", КонтрагентСсылка);
                
        РезультатЗапроса = Запрос.Выполнить();
        Выборка = РезультатЗапроса.Выбрать();
    
        МассивКонтактнойИнформации = Новый Массив;
        Пока Выборка.Следующий() Цикл
            МассивКонтактнойИнформации.Добавить(Новый Структура("Вид, Представление", Выборка.Вид, Выборка.Представление));
        КонецЦикла;
    
        Возврат МассивКонтактнойИнформации;
    
    КонецФункции
    
    // Пример использования
    // Контрагент = Справочники.Контрагенты.НайтиПоКоду("000000001");
    // Если Контрагент <> Неопределено Тогда
    //    Контакты = ПолучитьКонтактнуюИнформацию(Контрагент);
    //    Для Каждого Контакт Из Контакты Цикл
    //        Сообщить("Вид: " + Контакт.Вид + ", Значение: " + Контакт.Представление);
    //    КонецЦикла;
    // КонецЕсли;
    

    При работе с адресами БСП предоставляет специальные функции для их формирования и разбора, например:

    
    // Предполагается, что АдреснаяСтрока - это строка, введенная пользователем
    // и ФункцииРаботаСАдресами.ПолучитьСтруктуруАдреса(АдреснаяСтрока)
    // может быть вызвана для валидации и структурирования.
    
    // Пример использования общего модуля РаботаСАдресами для форматирования
    // (функции могут отличаться в зависимости от версии БСП)
    // ПредставлениеАдреса = ОбщегоНазначенияБСП.СформироватьПредставлениеАдреса(СтруктураАдреса);
    
  2. Для простых, статичных данных без истории (если БСП не используется):

    Используйте табличные части самого справочника. Этот вариант наиболее прост в реализации и поддержании, когда нет жестких требований к истории изменений, валидации или сложной структуре данных. Это хороший выбор для "чайника", чтобы не усложнять систему на старте.

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

    
    // В конфигураторе:
    // Открыть Справочник.Контрагенты -> ТабличныеЧасти -> Добавить
    // Имя: КонтактныеДанные
    // Реквизиты табличной части:
    //   - ТипКонтактнойИнформации (Тип: ПеречислениеСсылка.ТипыКонтактнойИнформации)
    //   - Значение (Тип: Строка, НеограниченнойДлины)
    //   - Комментарий (Тип: Строка)
    
    // В модуле объекта:
    // Программный доступ к табличной части
    // КонтрагентОбъект = Справочники.Контрагенты.СоздатьЭлемент();
    // КонтрагентОбъект.Наименование = "Новый контрагент";
    //
    // НоваяСтрока = КонтрагентОбъект.КонтактныеДанные.Добавить();
    // НоваяСтрока.ТипКонтактнойИнформации = Перечисления.ТипыКонтактнойИнформации.Телефон;
    // НоваяСтрока.Значение = "+7 (XXX) XXX-XX-XX";
    // НоваяСтрока.Комментарий = "Рабочий телефон";
    //
    // НоваяСтрока = КонтрагентОбъект.КонтактныеДанные.Добавить();
    // НоваяСтрока.ТипКонтактнойИнформации = Перечисления.ТипыКонтактнойИнформации.Email;
    // НоваяСтрока.Значение = "info@example.com";
    //
    // КонтрагентОбъект.Записать();
    
  3. Для исторических или сильно аналитических данных (если БСП не используется):

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

    Пример создания регистра сведений для контактной информации:

    
    // В конфигураторе:
    // Создать РегистрСведений.КонтактнаяИнформацияКонтрагентов
    // Вид регистра: Непериодический (или Периодический, если нужна история)
    // Измерения:
    //   - Контрагент (Тип: СправочникСсылка.Контрагенты)
    //   - ВидКонтакта (Тип: СправочникСсылка.ВидыКонтактнойИнформации, или ПеречислениеСсылка.ТипыКонтактнойИнформации)
    //   - Представление (Тип: Строка, для уникальности)
    // Ресурсы:
    //   - Значение (Тип: Строка, НеограниченнойДлины)
    //   - Комментарий (Тип: Строка)
    
    // Программная запись в регистр:
    // НаборЗаписей = РегистрыСведений.КонтактнаяИнформацияКонтрагентов.СоздатьНаборЗаписей();
    // НаборЗаписей.Отбор.Контрагент.Установить(КонтрагентСсылка); // Для перезаписи или добавления к существующим
    //
    // НоваяЗапись = НаборЗаписей.Добавить();
    // НоваяЗапись.Контрагент = КонтрагентСсылка;
    // НоваяЗапись.ВидКонтакта = Справочники.ВидыКонтактнойИнформации.НайтиПоНаименованию("Телефон рабочий");
    // НоваяЗапись.Представление = "+7 (XXX) XXX-XX-XX"; // Уникальный идентификатор записи
    // НоваяЗапись.Значение = "+7 (XXX) XXX-XX-XX";
    // НоваяЗапись.Комментарий = "Основной телефон";
    //
    // НаборЗаписей.Записать();
    
  4. Для быстрого расширения без изменения конфигурации:

    Для добавления единичных, простых дополнительных полей, которые не являются множественными (т.е. одно значение на один контрагент), используйте механизм дополнительных реквизитов и сведений. Это позволяет гибко расширять функционал без модификации конфигурации.

В завершение, подчеркнем, что использование готовых подсистем БСП – это путь к созданию качественных, поддерживаемых и функциональных решений в 1С:Предприятии. Они содержат в себе лучшие практики разработки и учитывают множество нюансов, о которых новичок может даже не догадываться. Если есть возможность, всегда стремитесь к внедрению готовых проверенных решений.

← На главную