Как получить доступ к реквизиту расширения в коде внешней печатной формы?

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

Разработка внешней печатной формы (ВПФ) для объектов, измененных с помощью расширений, часто вызывает у разработчиков 1С закономерный вопрос: почему СсылкаНаДокумент.ИмяРеквизита возвращает ошибку «Поле объекта не обнаружено»? Давайте разберемся, почему так происходит и как правильно извлекать данные в таких случаях.

Почему возникает ошибка обращения через точку

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

Решение проблемы через запрос

Наиболее надежный и правильный способ получить данные — это использование запроса. Запрос позволяет «заглянуть» в базу данных напрямую и получить значения полей, даже если они были добавлены в расширении. Рассмотрим процесс по шагам.

Шаг 1: Подготовка запроса

Вместо того чтобы обращаться к свойствам объекта, мы формируем текст запроса, где явно указываем нужные нам поля. Если реквизит является ссылочным (например, Заказ), мы можем сразу обратиться к его полям через точку в самом запросе или использовать соединение.


ВЫБРАТЬ
    СписаниеБезналичныхДенежныхСредств.Номер КАК Номер,
    СписаниеБезналичныхДенежныхСредств.Заказ.Договор КАК ЗаказДоговор,
    СписаниеБезналичныхДенежныхСредств.СуммаДокумента КАК СуммаДокумента
ИЗ
    Документ.СписаниеБезналичныхДенежныхСредств КАК СписаниеБезналичныхДенежныхСредств
ГДЕ
    СписаниеБезналичныхДенежныхСредств.Ссылка = &Ссылка

Шаг 2: Установка параметров

Важно помнить, что в процедуру Печать(МассивОбъектов, ПараметрыПечати) всегда передается массив ссылок. Чтобы запрос сработал, вам нужно передать конкретную ссылку из этого массива в качестве параметра запроса.


Запрос = Новый Запрос;
Запрос.Текст = ...; // Текст запроса выше
Запрос.УстановитьПараметр("Ссылка", МассивОбъектов[0]);
Результат = Запрос.Выполнить().Выбрать();

Как правильно организовать сложный запрос с соединениями

Если вам нужно получить данные не только из документа, но и из связанных объектов, используйте ЛЕВОЕ СОЕДИНЕНИЕ. Это позволит объединить таблицу документа с таблицей связанного объекта, расширяя доступную область данных.


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

Советы по отладке

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

Использование запроса — это универсальный стандарт работы в 1С. Даже если вы перейдете на работу внутри расширения, запрос останется самым производительным способом получения данных для вывода в табличный документ, так как он позволяет извлечь всю необходимую информацию за одно обращение к серверу базы данных.

← На главную