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