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