Как получить веб-сайт и Email организации из контактной информации в 1С

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

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

Постановка задачи и разбор типичных ошибок

В классическом варианте (например, в старых редакциях конфигураций или самописных базах) вся контактная информация хранится в регистре сведений РегистрСведений.КонтактнаяИнформация. Перед разработчиком стоит задача извлечь из этого регистра данные по конкретной организации, отфильтровав их по типам «Электронная почта» и «Веб-страница».

Рассмотрим типичные сложности, с которыми сталкиваются программисты:

  1. Неправильная передача типов в параметры запроса. Перечисление Перечисления.ТипыКонтактнойИнформации содержит предопределенные значения. В запрос необходимо передавать массив самих значений перечисления, а не текстовые типы.
  2. Затирание данных в цикле выборки. Если у организации заведено несколько сайтов или адресов почты, при обычном обходе выборки переменная может перезаписываться последним найденным значением, из-за чего в итоговый макет попадает только одна строка.
  3. Использование итогов там, где они не нужны. Использование предложения ИТОГИ ПО усложняет выборку и требует многоуровневого обхода группировок, что для плоской задачи получения КИ избыточно.

Решение 1. Оптимальный плоский запрос и обход выборки (для классических баз)

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

Давайте разберем готовый программный код:


// Шаг 1. Формируем массив интересующих нас типов контактной информации
МассивТипов = Новый Массив;
МассивТипов.Добавить(Перечисления.ТипыКонтактнойИнформации.ЭлектроннойПочты);
МассивТипов.Добавить(Перечисления.ТипыКонтактнойИнформации.ВебСтраница);

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

// Шаг 3. Устанавливаем параметры запроса
Запрос.УстановитьПараметр("Организация", Организация); // Ссылка на справочник Организации
Запрос.УстановитьПараметр("Типы", МассивТипов);

// Шаг 4. Выполняем запрос и обходим результаты
Выборка = Запрос.Выполнить().Выбрать();

ВебСтраницы = "";
АдресаПочты = "";

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

// Шаг 5. Выводим результат (для проверки)
Сообщить("Сайты организации: " + ВебСтраницы);
Сообщить("Email организации: " + АдресаПочты);

Важный нюанс: обратите внимание на конструкцию ?(ЗначениеЗаполнено(ВебСтраницы), ", ", ""). Этот тернарный оператор проверяет, записано ли уже что-то в строковую переменную. Если переменная не пуста, к ней прибавляется запятая с пробелом, и только затем новое представление КИ. Это позволяет избежать лишних запятых в самом начале строки.

Решение 2. Современный подход с использованием БСП

В современных конфигурациях 1С (таких как ERP 2, Управление торговлей 11, Комплексная автоматизация 2, Бухгалтерия предприятия 3.0), созданных на основе Библиотеки стандартных подсистем (БСП), архитектура хранения КИ изменилась. Теперь контактная информация хранится в табличных частях самих справочников (например, в табличной части КонтактнаяИнформация справочника Организации).

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

Давайте проанализируем, как получить Email и сайт организации с помощью стандартных функций БСП:


// Пример получения контактной информации для ОДНОЙ организации
ТаблицаКИ = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(Организация, , ТекущаяДата());

ВебСтраницы = "";
АдресаПочты = "";

Для Каждого СтрокаКИ Из ТаблицаКИ Цикл
    // В БСП тип КИ хранится в колонке "Тип" в виде перечисления
    Если СтрокаКИ.Тип = Перечисления.ТипыКонтактнойИнформации.ЭлектроннойПочты Тогда
        АдресаПочты = АдресаПочты + ?(ЗначениеЗаполнено(АдресаПочты), ", ", "") + СтрокаКИ.Представление;
    ИначеЕсли СтрокаКИ.Тип = Перечисления.ТипыКонтактнойИнформации.ВебСтраница Тогда
        ВебСтраницы = ВебСтраницы + ?(ЗначениеЗаполнено(ВебСтраницы), ", ", "") + СтрокаКИ.Представление;
    КонецЕсли;
КонецЦикла;

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

Получение конкретного вида КИ (точечный метод)

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


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

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

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

Оптимизация: Получение КИ для списка организаций

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


// Создаем массив организаций, для которых нужно получить данные
МассивОрганизаций = Новый Массив;
МассивОрганизаций.Добавить(СсылкаОрганизация1);
МассивОрганизаций.Добавить(СсылкаОрганизация2);

// Получаем КИ для всех объектов одним пакетом
ТаблицаВсехКИ = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъектов(МассивОрганизаций, , , ТекущаяДата());

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

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

Резюме и рекомендации

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

← На главную