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