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