Почему во внешнем отчете не работает выбор периода и пропадают реквизиты?

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

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

Проанализируем ситуацию, разберем причины такого поведения платформы 1С:Предприятие 8.3 и рассмотрим правильные варианты реализации интерфейса внешнего отчета.

Причины недоступности реквизитов внешнего отчета

Выясним причину, из-за которой элементы интерфейса перестают отображаться:

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

Способ 1. Перенос реквизитов с объекта на форму и использование типа СтандартныйПериод

Рассмотрим основной и самый надежный способ решения проблемы. Разберем его по шагам:

  1. Откроем внешнюю форму отчета в конфигураторе.
  2. Перейдем на вкладку Реквизиты (в правой верхней панели редактора формы) и добавим новый реквизит формы, например ПериодОтчета.
  3. Укажем для созданного реквизита тип СтандартныйПериод.
  4. Перетащим ПериодОтчета в дерево элементов формы (в левую панель). Платформа автоматически создаст поле ввода со встроенной кнопкой выбора периода (троеточием).
  5. Если на форме были другие реквизиты объекта (например, Год, Организация), создадим аналогичные реквизиты непосредственно в реквизитах формы и привяжем поля ввода к ним, а не к ветке Отчет.*.

Посмотрим на пример извлечения дат в коде формирования отчета:


&НаСервере
Процедура СформироватьОтчетНаСервере()
    ДатаНачала = ПериодОтчета.ДатаНачала;
    ДатаОкончания = ПериодОтчета.ДатаОкончания;
    
    // Получаем объект отчета без привязки к его реквизитам на форме
    ОбъектОтчета = РеквизитФормыВЗначение("Отчет");
    ОбъектОтчета.Сформировать(ТабличныйДокумент, ДатаНачала, ДатаОкончания);
КонецПроцедуры

Способ 2. Использование диалога редактирования стандартного периода

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

Разберем по шагам создание обработчика для кнопки выбора периода:

  1. Создадим на форме команду ВыбратьПериод и добавим кнопку на форму.
  2. В модуле формы опишем процедуру открытия диалога и обработку оповещения о его закрытии.

Посмотрим на пример клиентского кода:


&НаКлиенте
Процедура ВыбратьПериод(Команда)
    Диалог = Новый ДиалогРедактированияСтандартногоПериода;
    Диалог.Период.ДатаНачала = ДатаНачала;
    Диалог.Период.ДатаОкончания = ДатаОкончания;
    
    Оповещение = Новый ОписаниеОповещения("ПослеВыбораПериода", ЭтотОбъект);
    Диалог.Показать(Оповещение);
КонецПроцедуры

&НаКлиенте
Процедура ПослеВыбораПериода(ВыбранныйПериод, ДополнительныеПараметры) Экспорт
    Если ВыбранныйПериод <> Неопределено Тогда
        ДатаНачала = ВыбранныйПериод.ДатаНачала;
        ДатаОкончания = ВыбранныйПериод.ДатаОкончания;
    КонецЕсли;
КонецПроцедуры

Способ 3. Использование расширений конфигурации

Если архитектура решения требует обязательного использования реквизитов объекта отчета, рассмотрим альтернативный вариант — перенос внешнего отчета в расширение конфигурации:

  1. Создадим или откроем существующее расширение конфигурации.
  2. Добавим отчет в состав метаданных расширения.
  3. В расширении создадим роль (или добавим права в существующую), в которой явно назначим права на чтение и просмотр самого отчета и всех его реквизитов.
  4. Назначим эту роль пользователям информационной базы.

При таком подходе платформа перестает ограничивать видимость элементов формы, привязанных к Отчет.*, так как права доступа будут явно определены в метаданных конфигурации.

← На главную