Как программно установить отбор по сотруднику на панели быстрых настроек отчета в 1С:ЗУП?

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

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

Почему стандартная передача параметра «Отбор» приводит к ошибкам

Проанализируем распространенную ошибку: многие разработчики пытаются передать структуру отбора стандартным образом через параметры открытия формы:


ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Отбор", Новый Структура("Сотрудник", ВыбСотрудник));
ОткрытьФорму("Отчет.РасчетныеЛистки.Форма", ПараметрыФормы);

Выясним причину, почему этот способ не решает поставленную задачу:

  1. Платформа 1С помещает такие отборы в коллекцию КомпоновщикНастроек.ФиксированныеНастройки.Отбор, а не в пользовательские настройки.
  2. Фиксированные отборы не отображаются в шапке или на боковой панели быстрых настроек отчета, поэтому пользователь визуально не видит установленного ограничения.
  3. Пользователь теряет возможность интерактивно изменить значение. Более того, если пользователь попытается вручную добавить отбор по тому же сотруднику на панели отчета, система выдаст исключение: «Невозможно применить фиксированные настройки. Пересекаются элементы отборов».

Способ 1. Штатная передача объекта «ПользовательскиеНастройки» в параметры формы

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

Разберем по шагам реализацию клиент-серверного взаимодействия:


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

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

&НаКлиенте
Процедура ОткрытьОтчетПоСотруднику(СотрудникСсылка)
    
    ПараметрыФормы = ПолучитьПараметрыОткрытияОтчета(СотрудникСсылка, "РасчетныеЛистки");
    ОткрытьФорму("Отчет.РасчетныеЛистки.Форма", ПараметрыФормы);

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

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

Способ 2. Модификация настроек через объект не открытой формы

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

Посмотрим на пример реализации:


&НаКлиенте
Процедура ОткрытьФормуСНастройкой(СотрудникСсылка)

    ПараметрыОткрытия = Новый Структура;
    ФормаОтчета = ПолучитьФорму("Отчет.РасчетныеЛистки.Форма", ПараметрыОткрытия);
    
    УстановитьОтборВФормеНаСервере(ФормаОтчета.Отчет.КомпоновщикНастроек, СотрудникСсылка);
    
    ФормаОтчета.Открыть();

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

&НаСервереБезКонтекста
Процедура УстановитьОтборВФормеНаСервере(КомпоновщикНастроек, СотрудникСсылка)

    ПолеОтбора = Новый ПолеКомпоновкиДанных("Сотрудник");
    
    Для Каждого Элемент Из КомпоновщикНастроек.ПользовательскиеНастройки.Элементы Цикл
        Если ТипЗнч(Элемент) = Тип("ЭлементОтбораКомпоновкиДанных") 
            И Элемент.ЛевоеЗначение = ПолеОтбора Тогда
            
            Элемент.Использование = Истина;
            Элемент.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
            Элемент.ПравоеЗначение = СотрудникСсылка;
            Прервать;
        КонецЕсли;
    КонецЦикла;

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

Способ 3. Прямая перезапись сохраненных настроек пользователя и ее риски

Разберем вариант, к которому пришел автор темы: запись значений непосредственно в системное хранилище или служебный справочник сохраненных настроек конфигурации:


// Пример структуры доступа к сохраненным значениям БСП
ЗначенияПанели = ЭтотОбъект.ЗначенияНастроекПанелиПользователя.Получить();
ДинамическиеОтборы = ЗначенияПанели.ДинамическиеОтборы;
ДинамическиеОтборы.Сотрудник = НужныйСотрудник;
// Перезапись настроек в хранилище

Проанализируем, почему к такому способу следует прибегать с осторожностью:

  1. Постоянство изменений: перезапись сохраняет значение в базе навсегда. Когда пользователь в следующий раз откроет отчет штатно из панели отчетов, там по умолчанию останется тот сотрудник, которого передали из карточки программно.
  2. Зависимость от версий БСП: внутренние структуры (такие как ЗначенияНастроекПанелиПользователя) являются закрытыми служебными механизмами. При обновлении релиза ЗУП их формат может измениться, что приведет к аварийному завершению работы программы.

Важные нюансы настройки СКД в ЗУП

Рассмотрим специфические детали конфигурации «Зарплата и управление персоналом», о которых важно помнить при установке отборов:

  1. Идентификатор пользовательской настройки: чтобы отбор отображался на панели, в схеме компоновки данных у соответствующего элемента отбора обязательно должно быть заполнено свойство ИдентификаторПользовательскойНастройки, а свойство РежимОтображения должно иметь значение РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ.
  2. Сотрудник или Физическое лицо: в ряде типовых зарплатных отчетов регистры хранят данные в разрезе физических лиц. Перед программной установкой отбора обязательно сверьте имя поля компоновки в конкретном варианте отчета: им может оказаться не Сотрудник, а ФизическоеЛицо.
← На главную