Как разбить строку контактной информации и получить конкретные данные в 1С:УНФ?

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

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

Начнем с типичной ситуации: мы получаем строковое представление контактной информации с помощью функции УправлениеКонтактнойИнформацией.ПредставлениеКонтактнойИнформацииОбъекта. Эта функция предназначена для формирования удобного для пользователя текстового представления всех или части контактных данных объекта. Например, после вызова этой функции мы можем получить строку следующего вида: "Телефон, ЭлектроннаяПочта, Адрес, Сайт". Наша задача — извлечь из этой строки каждый элемент по отдельности.

Метод 1: Разбиение строки с помощью функции СтрРазделить()

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

Предположим, у нас есть переменная СведенияОНашейОрганизации, которая содержит строку типа "Телефон, ЭлектроннаяПочта, Адрес, Сайт". Чтобы разбить её, мы можем использовать следующий код:

МассивКонтактнойИнформации = СтрРазделить(СведенияОНашейОрганизации, ",",);

В этом примере мы указываем запятую (",") в качестве разделителя. Функция вернет массив строк, где каждый элемент массива будет соответствовать части исходной строки до или после разделителя. Например, МассивКонтактнойИнформации[0] будет содержать телефон, МассивКонтактнойИнформации[1] — электронную почту и так далее.


Сообщить(МассивКонтактнойИнформации[0]); // Выведет "Телефон"
Сообщить(МассивКонтактнойИнформации[1]); // Выведет "ЭлектроннаяПочта"

Важный нюанс: выбор правильного разделителя

На практике мы сталкиваемся с тем, что контактная информация может быть сложной. Например, полный адрес сам по себе может содержать запятые (например, "г. Москва, ул. Ленина, д. 10"). Если в такой ситуации мы используем запятую как разделитель для СтрРазделить(), то элементы адреса (город, улица, номер дома) могут быть ошибочно восприняты как отдельные элементы массива. Это приведет к некорректному результату, когда вместо одного элемента с полным адресом мы получим несколько мелких частей.

Проанализируем эту ситуацию. Если строка, которую мы хотим разбить, выглядит как "Телефон: +7 (XXX) XXX-XX-XX, Адрес: г. Москва, ул. Ленина, д. 10, Сайт: example.com", и мы пытаемся разбить её по запятой, то "г. Москва" станет одним элементом массива, "ул. Ленина" — другим и так далее. Это не то, что нам нужно. В таких случаях необходимо выяснить, какой на самом деле используется разделитель между *различными видами* контактной информации.

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


// Если запятая в адресе вызывает проблемы, попробуем точку с запятой
МассивКонтактнойИнформации = СтрРазделить(СведенияОНашейОрганизации, ";",);

Как показывает опыт, изменение разделителя на точку с запятой (или другой уникальный символ) часто решает проблему, позволяя получить адрес как единый элемент массива.

Метод 2: Прямое получение конкретного вида контактной информации с помощью УправлениеКонтактнойИнформацией.ПолучитьКонтактнуюИнформацияОбъекта()

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


УправлениеКонтактнойИнформацией.ПолучитьКонтактнуюИнформацияОбъекта(Объект, ВидКонтактнойИнформации)

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

Получение телефона и фактического адреса

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


// Предположим, что СсылкаНаДокумент.Организация или СсылкаНаДокумент.Контрагент
// содержит ссылку на объект, чью контактную информацию мы хотим получить
ОбъектКИ = СсылкаНаДокумент.Организация; // Или СсылкаНаДокумент.Контрагент

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

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

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

Для кого мы получаем информацию? Это может быть СсылкаНаДокумент.Организация (если нам нужен адрес нашей организации из какого-либо документа) или СсылкаНаДокумент.Контрагент (если нам нужен адрес партнера из документа, связанного с контрагентом).

Получение юридического адреса

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

  1. Справочники.ВидыКонтактнойИнформации.ЮрАдресОрганизации
  2. Справочники.ВидыКонтактнойИнформации.ЮрАдресКонтрагента

Таким образом, для получения юридического адреса нашей организации или контрагента мы можем написать:


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

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

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

Метод 3: Получение структурированных данных с помощью УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта()

Если нам нужна не просто строка с представлением адреса, а более детальная, структурированная информация (например, отдельно город, улица, дом из адреса), то функция УправлениеКонтактнойИнформацией.ПолучитьКонтактнуюИнформацияОбъекта() может быть недостаточной, так как она обычно возвращает цельную строку адреса. В этом случае мы можем использовать другую функцию, которая возвращает данные в виде ТаблицаЗначений:


УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(Объект, ВидКонтактнойИнформации)

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

Пример получения телефона организации в виде таблицы значений

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


ТелефоныОрганизации = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(СсылкаНаОрганизацию, Справочники.ВидыКонтактнойИнформации.ТелефонОрганизации);

// Теперь мы можем перебрать полученную таблицу значений
// и получить доступ к каждому номеру телефона и его свойствам
Для Каждого СтрокаТелефона Из ТелефоныОрганизации Цикл
    Сообщить("Телефон: " + СтрокаТелефона.Представление + ", Комментарий: " + СтрокаТелефона.Комментарий);
    // Структура столбцов таблицы зависит от вида контактной информации
    // и настроек в конфигурации
КонецЦикла;

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

Метод 4: Использование запросов для получения конкретной контактной информации

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


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

Запрос.УстановитьПараметр("Ссылка", СсылкаНаДокумент.Организация);
Запрос.УстановитьПараметр("Вид", Справочники.ВидыКонтактнойИнформации.ЮрАдресОрганизации);

РезультатЗапроса = Запрос.Выполнить();
Если НЕ РезультатЗапроса.Пустой() Тогда
    Выборка = РезультатЗапроса.Выбрать();
    Выборка.Следующий();
    ЮридическийАдрес = Выборка.Представление;
Иначе
    ЮридическийАдрес = ""; // Или обработка случая, когда адрес не найден
КонецЕсли;

В этом запросе мы обращаемся к табличной части КонтактнаяИнформация справочника Организации. Мы фильтруем данные по ссылке на конкретную организацию (&Ссылка) и по виду контактной информации (&Вид), указывая Справочники.ВидыКонтактнойИнформации.ЮрАдресОрганизации. Таким образом, мы получаем именно строковое представление юридического адреса, которое хранится в поле Представление.

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

Структура хранения контактной информации в 1С

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

Поэтому, когда мы пытаемся разбить эту уже сформированную строку, мы по сути пытаемся "развернуть" процесс обратно. Это может быть ненадежно из-за возможных различий в форматировании или использовании разделителей. Гораздо более предпочтительным является работа со структурированными данными напрямую, минуя этап их преобразования в общую строку, а затем обратного парсинга. Методы с использованием ПолучитьКонтактнуюИнформацияОбъекта() и КонтактнаяИнформацияОбъекта(), а также прямые запросы, следуют этому принципу и являются более надежными и гибкими.

Заключение

Мы рассмотрели несколько подходов к работе с контактной информацией в 1С. Если вы получаете уже сформированную строку и хотите её разбить, функция СтрРазделить() с правильно подобранным разделителем может вам помочь. Однако, для более надежного и структурированного получения данных мы настоятельно рекомендуем использовать специализированные функции из общего модуля УправлениеКонтактнойИнформацией, такие как ПолучитьКонтактнуюИнформацияОбъекта() для получения строкового представления конкретного вида данных или КонтактнаяИнформацияОбъекта() для получения данных в виде ТаблицаЗначений. Для массового извлечения данных предпочтительнее использовать прямые запросы.

Выбирая правильный метод, мы обеспечиваем надежность, читаемость и производительность нашего кода при работе с контактной информацией в 1С.

← На главную