К статье
Практический материал

Отчеты и Аналитика · 9 мин

Как обратиться к реквизиту отчета в 1С

Как обратиться к реквизиту отчета 1С в коде и СКД: обращение через объект отчета, данные формы, компоновщик настроек. Примеры кода, типичные ошибки и FAQ.

Реквизиты отчета в 1С — это поля, которые хранят параметры формирования: период, организацию, склад, контрагента и другие отборы. Чтобы использовать их значения в коде модуля отчета, в форме или в схеме компоновки данных, нужно знать, где именно объявлен реквизит и в каком контексте выполняется обращение. Ошибка чаще всего возникает из-за путаницы между реквизитом объекта отчета, реквизитом формы и параметром СКД.

Способ обращения зависит от того, где написан код. В модуле объекта отчета реквизиты доступны напрямую по имени. В модуле формы — через объект отчета или через реквизиты формы. Во внешних отчетах дополнительно требуется получить сам объект через Отчеты.ИмяОтчета.Создать() или ВнешниеОтчеты.Создать().

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

Где объявляются реквизиты отчета и чем они отличаются

В конфигураторе реквизиты отчета создаются на закладке «Данные» объекта «Отчет». Каждый реквизит имеет имя, тип и признак использования. Именно эти реквизиты платформа автоматически выводит на управляемую форму отчета, если форма не переопределена.

Важно различать три сущности, которые часто путают:

  • Реквизит объекта отчета — хранится в метаданных отчета, доступен в модуле объекта и на форме через Отчет.ИмяРеквизита.
  • Реквизит формы — существует только внутри конкретной формы, не связан с объектом отчета напрямую.
  • Параметр или отбор СКД — живет в настройках компоновщика и может не иметь одноименного реквизита вообще.

Обращение к реквизиту в модуле объекта отчета

Самый простой сценарий — код в модуле объекта отчета, например в обработчике ПриКомпоновкеРезультата. Здесь реквизиты доступны напрямую по имени или через ЭтотОбъект:

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

СтандартнаяОбработка = Ложь;

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

Если НЕ ЗначениеЗаполнено(Организация) Тогда

Сообщить("Не выбрана организация");

Возврат;

КонецЕсли;

// Через ЭтотОбъект — то же самое

ТекущаяОрганизация = ЭтотОбъект.Организация;

КонецПроцедуры

Оба варианта — Организация и ЭтотОбъект.Организация — эквивалентны. Явное указание ЭтотОбъект делает код читаемее, когда рядом используются локальные переменные с похожими именами.

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

Обращение к реквизиту из формы отчета

В модуле основной формы отчета платформа создает реквизит формы Отчет, через который доступны все реквизиты объекта:

&НаКлиенте

Процедура Сформировать(Команда)

Если НЕ ЗначениеЗаполнено(Отчет.Организация) Тогда

ПоказатьПредупреждение(, "Укажите организацию");

Возврат;

КонецЕсли;

СкомпоноватьРезультат();

КонецПроцедуры

Обратите внимание: обращение Отчет.Организация работает только в форме отчета, где платформа автоматически создала такой реквизит формы. В произвольной форме или в форме другого объекта такого реквизита нет — там нужно получать объект отчета отдельно.

Для чтения и записи реквизитов на сервере используется тот же синтаксис. Если форма переопределена и реквизит отчета не вынесен на форму, значение все равно доступно в коде — видимость элемента управления на доступность данных не влияет.

Если отбор сделан параметром СКД, а не реквизитом

В типовых отчетах на СКД отборы часто реализованы параметрами компоновки, и одноименного реквизита у отчета может не быть. Попытка обратиться к Отчет.Период в этом случае вызовет ошибку «Поле объекта не обнаружено». Значение нужно читать из настроек компоновщика:

&НаСервере

Функция ПолучитьПараметрСКД(ИмяПараметра)

Настройки = Отчет.КомпоновщикНастроек.Настройки;

Параметр = Настройки.ПараметрыДанных.НайтиЗначениеПараметра(

Новый ПараметрКомпоновкиДанных(ИмяПараметра));

Если Параметр <> Неопределено Тогда

Возврат Параметр.Значение;

КонецЕсли;

Возврат Неопределено;

КонецФункции

Установка параметра выполняется симметрично: найти параметр, присвоить Значение и установить Использование = Истина. Без флага использования параметр компоновкой игнорируется, даже если значение заполнено.

Понять, как реализован отбор в конкретном отчете, можно в конфигураторе: откройте отчет, посмотрите список реквизитов на закладке «Данные» и параметры в схеме компоновки на закладке «Основная схема компоновки данных».

Типичные ошибки
01
Обращение к Отчет.Период, когда Период — параметр СКД: возникает ошибка «Поле объекта не обнаружено»
02
Установка значения параметра без Использование = Истина: отбор молча не применяется
03
Чтение реквизита на клиенте после изменения на сервере без обновления формы: пользователь видит старое значение
04
Опечатка в имени реквизита: внешний отчет падает только в момент выполнения, а не при сохранении

Обращение к реквизитам внешнего отчета из другого кода

Когда отчет вызывается программно — из обработки, регламентного задания или другого отчета — сначала создается объект, затем заполняются реквизиты:

// Для отчета, встроенного в конфигурацию

ОтчетОбъект = Отчеты.ПродажиПоМенеджерам.Создать();

ОтчетОбъект.Организация = ТекущаяОрганизация;

ОтчетОбъект.ДатаНачала = НачалоМесяца(ТекущаяДатаСеанса());

// Для внешнего отчета из файла

ОтчетОбъект = ВнешниеОтчеты.Создать("C:\Отчеты\МойОтчет.erf", Ложь);

ОтчетОбъект.Склад = ВыбранныйСклад;

После заполнения реквизитов вызывается СкомпоноватьРезультат() или формируется табличный документ через ПриКомпоновкеРезультата. Если отчет подключен через механизм дополнительных отчетов и обработок (БСП), объект создается через ДополнительныеОтчетыИОбработки.ОбъектВнешнейОбработки().

Порядок действий при программном вызове отчета
  1. 1
    Создайте объект отчета: Отчеты.Имя.Создать() или ВнешниеОтчеты.Создать(путь)
  2. 2
    Заполните реквизиты объекта нужными значениями
  3. 3
    Если отборы в СКД — установите параметры компоновщика с Использование = Истина
  4. 4
    Сформируйте результат в табличный документ
  5. 5
    Проверьте, что отборы применились, сравнив результат с ручным формированием

Проверка результата и диагностика проблем

После написания обращения к реквизиту убедитесь, что значение действительно доходит до места использования. Самый быстрый способ — точка останова в отладчике на строке чтения реквизита и просмотр значения в табло.

Контрольные точки

Как проверить результат

Значение реквизита в отладчике
Норма

Реквизит содержит ожидаемое значение нужного типа

Тревожный признак

Неопределено или пустая ссылка при заполненном поле на форме

Применение отбора в результате
Норма

Данные в отчете соответствуют выбранному отбору

Тревожный признак

Отчет содержит данные по всем организациям/периодам

Текст ошибки при обращении
Норма

Ошибок нет

Тревожный признак

«Поле объекта не обнаружено» — реквизита нет, проверьте имя и что отбор не параметр СКД

Если реквизит на форме заполнен, а в модуле объекта пуст — проверьте, что форма стандартная и реквизит формы Отчет связан с объектом. В самописных формах иногда создают отдельный реквизит формы с тем же именем, и значение в объект отчета просто не передается.

Частые вопросы

Ошибка «Поле объекта не обнаружено» при обращении к реквизиту — что делать?

Проверьте три вещи: точное имя реквизита в конфигураторе (включая регистр не важен, но опечатки критичны), существует ли реквизит вообще — возможно, отбор реализован параметром СКД, и в каком контексте выполняется код — в форме нужен префикс Отчет., в модуле объекта его нет.

Как обратиться к реквизиту отчета из внешней обработки?

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

Можно ли обратиться к реквизиту отчета на клиенте?

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

Чем реквизит отчета отличается от параметра СКД?

Реквизит — поле объекта отчета, объявленное в метаданных и доступное в коде напрямую. Параметр СКД существует только внутри схемы компоновки и читается через настройки компоновщика. Один и тот же отбор может быть реализован любым из способов — уточняйте в конфигураторе.

Почему параметр СКД заполнен, но отбор не работает?

Чаще всего не установлено свойство Использование = Истина у параметра. Также проверьте, что параметр не переопределен в пользовательских настройках, которые имеют приоритет над основными настройками компоновщика.

Итог

Что важно запомнить

В модуле объекта отчета реквизит доступен напрямую по имени, в форме — через Отчет.ИмяРеквизита, извне — через созданный объект отчета. Если отбор реализован параметром СКД, работайте с настройками компоновщика и не забывайте про Использование = Истина. Перед изменением типового кода используйте расширение и тестовую копию базы.