Как правильно получить номер мобильного телефона физического лица в 1С:УТ 11.4

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

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

Проблема поиска по наименованию

Рассмотрим ситуацию: разработчик пытается найти вид контактной информации с помощью метода НайтиПоНаименованию("Мобильный телефон"). Проанализируем, почему это плохая практика:

  1. Неуникальность: В справочнике ВидыКонтактнойИнформации может быть несколько элементов с именем «Телефон» (для контрагентов, для пользователей, для физлиц).
  2. Человеческий фактор: Пользователь может переименовать «Мобильный телефон» в «Моб. тел.» или «Телефон (личный)», и ваш код перестанет работать.
  3. Локализация: В базах с несколькими языками интерфейса наименование может меняться.

Вместо этого мы будем использовать программные идентификаторы и специализированные функции БСП.

Способ 1: Использование предопределенных элементов

В современных конфигурациях 1С (УТ 11, ERP, КА) виды контактной информации часто являются предопределенными или создаются программно при первом запуске с жестко заданными именами в метаданных. Разберем, как обратиться к ним напрямую.

Для получения телефона физического лица нам понадобится элемент Справочники.ВидыКонтактнойИнформации.ТелефонФизЛица. Посмотрим на пример корректного получения представления телефона:


// Получаем ссылку на вид контактной информации
ВидТелефона = Справочники.ВидыКонтактнойИнформации.ТелефонФизЛица;

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

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


ВидТелефона = ПредопределенноеЗначение("Справочник.ВидыКонтактнойИнформации.ТелефонФизЛица");

Способ 2: Использование программного интерфейса БСП

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

Проанализируем метод ПолучитьКонтактнуюИнформациюОбъекта. Он возвращает структуру или таблицу с данными. Это наиболее универсальный путь, если вам нужно не просто «красивое представление», а, например, только цифры номера для интеграции с SMS-сервисом.


// Определяем вид информации
ВидИнформации = Справочники.ВидыКонтактнойИнформации.ТелефонФизЛица;

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

// В ДанныеКИ будет содержаться представление и другие поля
Если ДанныеКИ.Количество() > 0 Тогда
    НомерТелефона = ДанныеКИ[0].Представление;
КонецЕсли;

Способ 3: Получение данных через запрос (для списков)

Выясним причину, по которой методы из Способа 1 и 2 не подходят для формирования больших отчетов. При вызове функции в цикле (например, при обходе 1000 сотрудников) система будет делать 1000 отдельных запросов к базе данных, что существенно замедлит работу. В таких случаях мы будем использовать запрос.

Контактная информация физических лиц хранится в табличной части КонтактнаяИнформация справочника ФизическиеЛица. Разберем структуру запроса:


ВЫБРАТЬ
    ФизЛицаКонтактнаяИнформация.Представление КАК НомерТелефона,
    ФизЛицаКонтактнаяИнформация.Ссылка КАК ФизЛицо
ИЗ
    Справочник.ФизическиеЛица.КонтактнаяИнформация КАК ФизЛицаКонтактнаяИнформация
ГДЕ
    ФизЛицаКонтактнаяИнформация.Ссылка В(&МассивФизЛиц)
    И ФизЛицаКонтактнаяИнформация.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ТелефонФизЛица)

В этом запросе мы обращаемся напрямую к табличной части. Поле Представление содержит готовую строку (например, «+7 (999) 123-45-67»), а поле Вид позволяет отфильтровать именно мобильные телефоны, игнорируя адреса или электронную почту.

Способ 4: Извлечение «чистого» номера из JSON

В последних релизах УТ 11.4 данные контактной информации могут храниться в формате JSON в поле ЗначенияПолей. Это позволяет хранить отдельно код страны, код города и добавочный номер. Если вам нужно вытащить только цифры, рассмотрим следующий алгоритм:

  1. Получаем строку JSON из табличной части или через методы БСП.
  2. Десериализуем строку в структуру.
  3. Извлекаем свойство НомерТелефона.

// Пример получения только цифр номера
СтрокаJSON = ... // Получаем из поля ЗначенияПолей
ДанныеТелефона = УправлениеКонтактнойИнформациейКлиентСервер.ДесериализоватьКонтактнуюИнформацию(СтрокаJSON);

Если ДанныеТелефона.Свойство("НомерТелефона") Тогда
    ТолькоЦифры = ДанныеТелефона.НомерТелефона; // Например: 9991234567
КонецЕсли;

Рекомендации по оптимизации

Подведем итог и выделим лучшие практики для работы с контактной информацией в УТ 11.4:

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

← На главную