При разработке внешних отчетов и обработок на управляемых формах разработчики часто сталкиваются с ситуацией, когда под пользователем с полными правами (или администратором) форма отчета работает корректно, а под пользователями с ограниченными правами поля ввода (например, период, организация, год) пропадают с формы либо становятся недоступными, блокируя стандартный выбор периода.
Проанализируем ситуацию, разберем причины такого поведения платформы 1С:Предприятие 8.3 и рассмотрим правильные варианты реализации интерфейса внешнего отчета.
Выясним причину, из-за которой элементы интерфейса перестают отображаться:
.erf) и обработок (.epf) нет собственных зарегистрированных ролей в дереве метаданных конфигурации. Когда элементы управляемой формы привязаны напрямую к реквизитам объекта (путь к данным вида Отчет.НачалоПериода, Отчет.Год), платформа 1С выполняет динамическую проверку прав на объект метаданных. Если у текущего пользователя нет роли «Полные права» или «Администратор», платформа считает доступ к реквизитам объекта ограниченным и автоматически скрывает связанные элементы формы.Отчет.НачалоПериода, для пользователя без административных прав вызывается исключение «Поле объекта недоступно для чтения» еще до показа диалогового окна.Рассмотрим основной и самый надежный способ решения проблемы. Разберем его по шагам:
ПериодОтчета.СтандартныйПериод.ПериодОтчета в дерево элементов формы (в левую панель). Платформа автоматически создаст поле ввода со встроенной кнопкой выбора периода (троеточием).Год, Организация), создадим аналогичные реквизиты непосредственно в реквизитах формы и привяжем поля ввода к ним, а не к ветке Отчет.*.Посмотрим на пример извлечения дат в коде формирования отчета:
&НаСервере
Процедура СформироватьОтчетНаСервере()
ДатаНачала = ПериодОтчета.ДатаНачала;
ДатаОкончания = ПериодОтчета.ДатаОкончания;
// Получаем объект отчета без привязки к его реквизитам на форме
ОбъектОтчета = РеквизитФормыВЗначение("Отчет");
ОбъектОтчета.Сформировать(ТабличныйДокумент, ДатаНачала, ДатаОкончания);
КонецПроцедуры
Если логика отчета требует хранения двух раздельных полей дат (например, ДатаНачала и ДатаОкончания типа Дата), создадим их в качестве реквизитов формы и настроим открытие диалога выбора периода программно.
Разберем по шагам создание обработчика для кнопки выбора периода:
ВыбратьПериод и добавим кнопку на форму.Посмотрим на пример клиентского кода:
&НаКлиенте
Процедура ВыбратьПериод(Команда)
Диалог = Новый ДиалогРедактированияСтандартногоПериода;
Диалог.Период.ДатаНачала = ДатаНачала;
Диалог.Период.ДатаОкончания = ДатаОкончания;
Оповещение = Новый ОписаниеОповещения("ПослеВыбораПериода", ЭтотОбъект);
Диалог.Показать(Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура ПослеВыбораПериода(ВыбранныйПериод, ДополнительныеПараметры) Экспорт
Если ВыбранныйПериод <> Неопределено Тогда
ДатаНачала = ВыбранныйПериод.ДатаНачала;
ДатаОкончания = ВыбранныйПериод.ДатаОкончания;
КонецЕсли;
КонецПроцедуры
Если архитектура решения требует обязательного использования реквизитов объекта отчета, рассмотрим альтернативный вариант — перенос внешнего отчета в расширение конфигурации:
При таком подходе платформа перестает ограничивать видимость элементов формы, привязанных к Отчет.*, так как права доступа будут явно определены в метаданных конфигурации.