Как получить юридический адрес контрагента в 1С:Бухгалтерия 3.0?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

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

Причина 1. Специфика работы отладчика 1С («Ошибка чтения значения»)

Часто разработчики предполагают, что запрос не работает, когда видят в табло отладчика текст «Ошибка чтения значения» напротив переменной ВыборкаДетальныеЗаписи или при попытке вычислить выражение РезультатЗапроса.Выбрать(). Это стандартное поведение платформы «1С:Предприятие».

Объект выборки является курсором к выборке данных в СУБД, а не готовой коллекцией. Вы не сможете просмотреть его содержимое в отладчике до тех пор, пока не начнется обход выборки методом Следующий(). Чтобы убедиться, что запрос действительно возвращает данные, выполните временную выгрузку результата в таблицу значений:


// Временный код для проверки в отладчике
ТаблицаПроверки = РезультатЗапроса.Выгрузить();

Таблицу значений ТаблицаПроверки уже можно полноценно открыть и просмотреть через вычислитель выражений в отладчике.

Причина 2. Безопасный режим во внешних печатных формах (ВПФ)

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

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

ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);

После внесения изменений обязательно обновите файл внешней печатной формы в справочнике дополнительных обработок в режиме «1С:Предприятие».

Причина 3. Ошибки в параметрах и тексте запроса

Проанализируем типичный запрос для получения адреса из табличной части контрагента:


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

В данном запросе есть две критические уязвимости:

  1. Избыточное разыменование: Конструкция КонтрагентыКонтактнаяИнформация.Ссылка.Ссылка содержит лишнее обращение через точку. Поле Ссылка табличной части контактной информации уже содержит ссылку на владельца (самого контрагента). Правильно писать: КонтрагентыКонтактнаяИнформация.Ссылка = &Ссылка.
  2. Неверный тип параметра &Ссылка: Если вы вызываете этот код из печатной формы документа, убедитесь, что в параметр &Ссылка вы передаете именно ссылку на контрагента (тип СправочникСсылка.Контрагенты), а не ссылку на сам документ или на договор контрагента. Проверьте тип переменной в отладчике перед установкой параметра.

Способ 1. Получение адреса оптимальным запросом

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


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

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

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

Способ 2. Объектный метод получения адреса (без написания запросов)

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


ЮридическийАдрес = "";
Если ЗначениеЗаполнено(СсылкаНаКонтрагента) Тогда
    // Получаем табличную часть контактной информации контрагента
    ТабЧастьКИ = СсылкаНаКонтрагента.КонтактнаяИнформация;
    
    ПараметрыОтбора = Новый Структура;
    ПараметрыОтбора.Вставить("Вид", Справочники.ВидыКонтактнойИнформации.ЮрАдресКонтрагента);
    
    НайденныеСтроки = ТабЧастьКИ.НайтиСтроки(ПараметрыОтбора);
    Если НайденныеСтроки.Количество() > 0 Тогда
        ЮридическийАдрес = НайденныеСтроки[0].Представление;
    КонецЕсли;
КонецЕсли;

Способ 3. Использование механизмов БСП (для доверенного режима)

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


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

Этот метод самостоятельно выполнит все необходимые запросы к базе данных с учетом прав доступа пользователя и вернет готовое текстовое представление адреса.

← На главную