При разработке в конфигурации «1С:Управление торговлей 11.4» часто возникает задача вывода контактной информации, в частности мобильного телефона физического лица, в печатные формы или отчеты. Новички часто совершают ошибку, пытаясь найти нужный вид контактной информации по текстовому наименованию. В этой статье мы разберем, почему такой подход ненадежен, и изучим профессиональные способы решения этой задачи с использованием механизмов Библиотеки Стандартных Подсистем (БСП).
Рассмотрим ситуацию: разработчик пытается найти вид контактной информации с помощью метода НайтиПоНаименованию("Мобильный телефон"). Проанализируем, почему это плохая практика:
ВидыКонтактнойИнформации может быть несколько элементов с именем «Телефон» (для контрагентов, для пользователей, для физлиц).Вместо этого мы будем использовать программные идентификаторы и специализированные функции БСП.
В современных конфигурациях 1С (УТ 11, ERP, КА) виды контактной информации часто являются предопределенными или создаются программно при первом запуске с жестко заданными именами в метаданных. Разберем, как обратиться к ним напрямую.
Для получения телефона физического лица нам понадобится элемент Справочники.ВидыКонтактнойИнформации.ТелефонФизЛица. Посмотрим на пример корректного получения представления телефона:
// Получаем ссылку на вид контактной информации
ВидТелефона = Справочники.ВидыКонтактнойИнформации.ТелефонФизЛица;
// Получаем строковое представление телефона
ТелефонПредставление = УправлениеКонтактнойИнформацией.ПредставлениеКонтактнойИнформацииОбъекта(ФизическоеЛицоСсылка, ВидТелефона);
Важный нюанс: Если в вашей версии БСП элементы создаются только программно, рекомендуется использовать метод ПредопределенноеЗначение, чтобы избежать ошибок компиляции, если ссылка еще не инициализирована в базе.
ВидТелефона = ПредопределенноеЗначение("Справочник.ВидыКонтактнойИнформации.ТелефонФизЛица");
Если нам нужно получить данные максимально корректно, следуя логике разработчиков фирмы «1С», следует использовать общий модуль УправлениеКонтактнойИнформацией. Этот модуль содержит функции, которые учитывают иерархию, настройки доступа и формат хранения данных. Для быстрого подбора готовых процедур и функций подсистем можно использовать справочник по методам БСП с примерами вызовов.
Проанализируем метод ПолучитьКонтактнуюИнформациюОбъекта. Он возвращает структуру или таблицу с данными. Это наиболее универсальный путь, если вам нужно не просто «красивое представление», а, например, только цифры номера для интеграции с SMS-сервисом.
// Определяем вид информации
ВидИнформации = Справочники.ВидыКонтактнойИнформации.ТелефонФизЛица;
// Вызываем метод БСП
ДанныеКИ = УправлениеКонтактнойИнформацией.ПолучитьКонтактнуюИнформациюОбъекта(СсылкаНаФизЛицо, ВидИнформации);
// В ДанныеКИ будет содержаться представление и другие поля
Если ДанныеКИ.Количество() > 0 Тогда
НомерТелефона = ДанныеКИ[0].Представление;
КонецЕсли;
Выясним причину, по которой методы из Способа 1 и 2 не подходят для формирования больших отчетов. При вызове функции в цикле (например, при обходе 1000 сотрудников) система будет делать 1000 отдельных запросов к базе данных, что существенно замедлит работу. В таких случаях мы будем использовать запрос.
Контактная информация физических лиц хранится в табличной части КонтактнаяИнформация справочника ФизическиеЛица. Разберем структуру запроса:
ВЫБРАТЬ
ФизЛицаКонтактнаяИнформация.Представление КАК НомерТелефона,
ФизЛицаКонтактнаяИнформация.Ссылка КАК ФизЛицо
ИЗ
Справочник.ФизическиеЛица.КонтактнаяИнформация КАК ФизЛицаКонтактнаяИнформация
ГДЕ
ФизЛицаКонтактнаяИнформация.Ссылка В(&МассивФизЛиц)
И ФизЛицаКонтактнаяИнформация.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ТелефонФизЛица)
В этом запросе мы обращаемся напрямую к табличной части. Поле Представление содержит готовую строку (например, «+7 (999) 123-45-67»), а поле Вид позволяет отфильтровать именно мобильные телефоны, игнорируя адреса или электронную почту.
В последних релизах УТ 11.4 данные контактной информации могут храниться в формате JSON в поле ЗначенияПолей. Это позволяет хранить отдельно код страны, код города и добавочный номер. Если вам нужно вытащить только цифры, рассмотрим следующий алгоритм:
НомерТелефона.
// Пример получения только цифр номера
СтрокаJSON = ... // Получаем из поля ЗначенияПолей
ДанныеТелефона = УправлениеКонтактнойИнформациейКлиентСервер.ДесериализоватьКонтактнуюИнформацию(СтрокаJSON);
Если ДанныеТелефона.Свойство("НомерТелефона") Тогда
ТолькоЦифры = ДанныеТелефона.НомерТелефона; // Например: 9991234567
КонецЕсли;
Подведем итог и выделим лучшие практики для работы с контактной информацией в УТ 11.4:
НайтиПоНаименованию для поиска видов КИ. Это главная причина ошибок при обновлении или изменении настроек пользователями.УправлениеКонтактнойИнформацией.ПредставлениеКонтактнойИнформацииОбъекта.УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъектов. Этот метод принимает массив ссылок и возвращает таблицу значений за один запрос, что в десятки раз быстрее работы в цикле.Перечисления.ТипыКонтактнойИнформации.Телефон.Используя эти методы, вы обеспечите стабильную работу вашей разработки и соответствие стандартам разработки 1С.