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