Как получить значения дополнительных реквизитов и контактной информации в 1С:Предприятие?

Программист 1С v8.3 (Управляемые формы) 1С:ERP Управление предприятием Управленческий учет Торговля и дистрибуция
← На главную

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

Понимание сущностей: Дополнительные реквизиты, Дополнительные сведения и Контактная информация

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

  1. Дополнительные реквизиты: Это поля, которые являются неотъемлемой частью объекта (например, справочника Партнеры или документа) и хранятся непосредственно в его табличной части, обычно называемой ДополнительныеРеквизиты. Они доступны для редактирования пользователям, имеющим права на изменение самого объекта, и часто используются для добавления атрибутов, специфичных для конкретного вида объекта.
  2. Дополнительные сведения: Эти данные об объекте не являются его неотъемлемой частью. Они хранятся в специальном регистре сведений, что позволяет гибко управлять доступом: значения доступны для просмотра и/или редактирования пользователям, имеющим права только на чтение самого объекта, а редактируются они в отдельной карточке. В конфигурациях на основе БСП для использования этого механизма необходимо включить функциональную опцию "Дополнительные реквизиты и сведения".
  3. Контактная информация: В отличие от предыдущих двух, контактная информация (адреса, телефоны, email) имеет свою специфическую структуру. Она также хранится в табличных частях объектов (например, Справочник.Партнеры.КонтактнаяИнформация), но ее виды (например, "Адрес доставки по документам", "Рабочий телефон") определяются в справочнике ВидыКонтактнойИнформации. Это было ключевым моментом в исходной задаче, где искомый "АдресДоставкиПоДокументам" оказался именно контактной информацией.

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

Метод 1: Прямой запрос к табличной части объекта

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

  1. Получение контактной информации

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

    Предположим, нам нужен адрес доставки для конкретного партнера, код которого нам известен. Мы составим запрос следующим образом:

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

    В этом запросе мы:

    • Выбираем поле Представление, которое содержит отформатированное строковое значение контактной информации.
    • Обращаемся к табличной части КонтактнаяИнформация справочника Партнеры.
    • Фильтруем по Ссылке на нужного партнера (используя его Код, который передаем как параметр &КодПартнера).
    • Добавляем условие по Виду контактной информации, чтобы получить именно "АдресДоставкиПоДокументам".

    Этот подход идеально подходит, когда нам нужно получить конкретное строковое представление контактных данных для вывода, например, в печатную форму или отчет.

  2. Получение истинных дополнительных реквизитов

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

    Мы можем использовать следующий пример запроса:

    
    ВЫБРАТЬ
        ДополнительныеРеквизиты.Ссылка,
        ДополнительныеРеквизиты.Свойство,
        ДополнительныеРеквизиты.Значение,
        ДополнительныеРеквизиты.ТекстоваяСтрока
    ИЗ
        Справочник.Партнеры.ДополнительныеРеквизиты КАК ДополнительныеРеквизиты
    ГДЕ
        ДополнительныеРеквизиты.Ссылка = &СсылкаИскомогоПартнера
        И ДополнительныеРеквизиты.Свойство.Наименование = "НазваниеДопРеквизита"
    

    Здесь мы выбираем:

    • Ссылка: ссылка на объект-владелец реквизита.
    • Свойство: ссылка на элемент плана видов характеристик ДополнительныеРеквизитыИСведения, который описывает сам дополнительный реквизит (его имя, тип и т.д.).
    • Значение: само значение дополнительного реквизита. Оно может быть разных типов (строка, число, булево, ссылка на объект и т.д.).
    • ТекстоваяСтрока: текстовое представление значения, полезно для вывода.

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

Метод 2: Использование функций Библиотеки Стандартных Подсистем (БСП)

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

  1. Получение дополнительных реквизитов и сведений через УправлениеСвойствами

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

    Прежде всего, нам нужно получить описание свойства (саму "сущность" дополнительного реквизита или сведения) из плана видов характеристик ДополнительныеРеквизитыИСведения. Затем мы можем использовать это описание для получения значения.

    Пример получения значения одного дополнительного реквизита:

    
    // Шаг 1: Получаем описание дополнительного реквизита по его имени
    // Предположим, у нас есть реквизит с именем "Рост_12f49d4f164847b79effd75a758186c3"
    // (часто имена генерируются системой и могут быть длинными)
    ОписаниеСвойства = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", "Рост_12f49d4f164847b79effd75a758186c3");
    
    Если ОписаниеСвойства <> Неопределено Тогда
        // Шаг 2: Получаем значение этого свойства для конкретного объекта
        // Предположим, мы хотим получить рост для ФизическоеЛицо.Ссылка
        ЗначениеРоста = УправлениеСвойствами.ЗначениеСвойства(ФизическоеЛицо.Ссылка, ОписаниеСвойства);
        Сообщить("Рост: " + ЗначениеРоста);
    Иначе
        Сообщить("Дополнительное свойство 'Рост' не найдено.");
    КонецЕсли;
    

    Функция УправлениеСвойствами.ЗначениеСвойства(Объект, Свойство, КодЯзыка = "") возвращает значение одного дополнительного свойства объекта. Она самостоятельно определяет, хранится ли свойство как дополнительный реквизит или как дополнительное сведение, и извлекает его соответствующим образом.

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

    
    // Получение всех дополнительных реквизитов и сведений для объекта ФизическоеЛицо.Ссылка
    ВсеСвойства = УправлениеСвойствами.ЗначенияСвойств(ФизическоеЛицо.Ссылка);
    // Результат будет в виде ТаблицыЗначений, которую можно обработать в цикле
    Для Каждого СтрокаСвойств ИЗ ВсеСвойства Цикл
        Сообщить(СтрокаСвойств.СвойствоПредставление + ": " + СтрокаСвойств.ЗначениеПредставление);
    КонецЦикла;
    

    Функция УправлениеСвойствами.ЗначенияСвойств(ОбъектыСоСвойствами, ПолучатьДопРеквизиты = Истина, ПолучатьДопСведения = Истина, Свойства = Неопределено, КодЯзыка = "") возвращает таблицу значений со всеми или выбранными дополнительными свойствами одного или нескольких объектов. Это очень удобно для комплексного анализа свойств объекта.

    Преимущества БСП:

    • Универсальность: БСП абстрагируется от конкретной структуры хранения (табличная часть или регистр сведений), что делает ваш код более устойчивым к изменениям в будущих версиях платформы или конфигурации.
    • Автоматическая обработка типов: Функции БСП самостоятельно преобразуют значения к нужному типу и представлению.
    • Поддержка: Код, использующий БСП, легче поддерживать и обновлять, так как он соответствует стандартным методикам разработки 1С.

    Недостатки БСП:

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

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

    Одна из ключевых функций — УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(). Эта функция позволяет получить как представление контактной информации (например, адрес одной строкой), так и детальную таблицу значений со всеми компонентами адреса, телефона или email.

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

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

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

Программное обращение к дополнительным реквизитам на форме

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

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

Пример (псевдокод, для демонстрации идеи):


// Находим элемент в коллекции дополнительных реквизитов формы
Для Каждого ОписаниеРеквизита Из Элементы.Свойства_ОписаниеДополнительныхРеквизитов Цикл
    Если ОписаниеРеквизита.Свойство.Наименование = "НашДопРеквизит" Тогда
        // Теперь у нас есть ОписаниеРеквизита,
        // которое содержит ссылку на соответствующий элемент формы
        // Например, Элементы[ОписаниеРеквизита.ИмяЭлементаФормы].Значение = НовоеЗначение;
        Сообщить("Найден дополнительный реквизит на форме: " + ОписаниеРеквизита.Свойство.Наименование);
        Прервать;
    КонецЕсли;
КонецЦикла;

Этот подход полезен, когда нужно автоматизировать действия на форме, связанные с дополнительными реквизитами, без привязки к их жестко закодированным именам элементов формы.

Рекомендации по выбору метода

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

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

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

← На главную