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