Как получить контактную информацию (должность) физического лица в 1С при отсутствии табличной части

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

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

Выясняем причину: особенности архитектуры хранения контактной информации

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

  1. Классический (старый) подход: Все контактные данные (адреса, телефоны, email, должности) хранятся в едином независимом регистре сведений КонтактнаяИнформация. При этом у самих справочников-владельцев никаких табличных частей для этого нет. Данный подход использовался во всех типовых решениях поколения УПП 1.3, УТ 10.3, КА 1.1 и унаследован множеством самописных конфигураций.
  2. Современный подход (БСП 2.x/3.x): Контактная информация хранится непосредственно внутри табличной части КонтактнаяИнформация конкретного объекта (физлица, контрагента или партнера).

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

Решение 1: Извлечение данных из регистра сведений "КонтактнаяИнформация"

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

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


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

Запрос.УстановитьПараметр("ФизическоеЛицо", СсылкаНаФизЛицо);
// Получаем конкретный вид контактной информации для должности
ВидКИДолжность = Справочники.ВидыКонтактнойИнформации.НайтиПоНаименованию("Должность");
Запрос.УстановитьПараметр("ВидКИ", ВидКИДолжность);

Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
    ДолжностьСтрокой = Выборка.Должность;
КонецЕсли;

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

Решение 2: Проверка связи через справочник "Контактные лица"

Часто должность "Гендиректор" или "Директор" относится не напрямую к физическому лицу как к человеку, а к его роли в рамках контрагента. В этом случае данные привязываются к справочнику КонтактныеЛица (или КонтактныеЛицаКонтрагентов).

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


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

Запрос.УстановитьПараметр("ФизическоеЛицо", СсылкаНаФизЛицо);
Запрос.УстановитьПараметр("ВидКИ", Справочники.ВидыКонтактнойИнформации.НайтиПоНаименованию("Должность"));

Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
    ДолжностьСтрокой = Выборка.Должность;
КонецЕсли;

Решение 3: Поиск данных через свойства и дополнительные реквизиты

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

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


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

Запрос.УстановитьПараметр("ФизическоеЛицо", СсылкаНаФизЛицо);

Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
    ДолжностьСтрокой = Выборка.Должность; // Здесь может быть как строка, так и ссылка на другой справочник
КонецЕсли;

Решение 4: Локализация источника данных через Конфигуратор

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

  1. Откроем конфигурацию в режиме Конфигуратор.
  2. Найдем справочник ФизическиеЛица (или тот объект, форму которого мы анализируем) и откроем его основную форму элемента.
  3. Найдем на форме элемент управления, отображающий строковое значение должности (например, поле ввода).
  4. Откроем палитру свойств этого элемента управления и обратим внимание на свойство ПутьКДанным (DataPath).
  5. Если путь ведет к реквизиту формы, который не связан напрямую с объектом (например, ЭлементыФормы.ПолеДолжность.Значение или просто переменная мДолжность), переходим в модуль формы.
  6. В модуле формы найдем процедуру-обработчик ПриЧтенииНаСервере (для управляемых форм) или ПриОткрытии / ПередОткрытием (для обычных форм).
  7. Внутри этих процедур обязательно будет присутствовать вызов функции заполнения этого поля. Например, чтение из нетипового регистра сведений или кадровых данных. Данный метод гарантированно покажет истинный источник данных.

Справочно: Как это решается в современных конфигурациях на БСП

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


// Получаем нужный вид контактной информации
ВидКИ = Справочники.ВидыКонтактнойИнформации.НайтиПоНаименованию("Должность");

// Вызываем метод БСП для получения представления
ДолжностьСтрокой = УправлениеКонтактнойИнформацией.ПредставлениеКонтактнойИнформацииОбъекта(СсылкаНаФизЛицо, ВидКИ);

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

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

← На главную