1. Пользовательские настройки СКД
При программном заполнении параметров отчета СКД часто возникает ситуация, когда нужно программно установить параметры отчета или добавить отборы.
Проблема возникает в том, что не всегда эти параметры или отборы отображаются на форме так, как нам бы хотелось.
В общем случае, для того, чтобы открыть отчет с заполненными параметрами используется следующая конструкция:
ПараметрыОткрытия = Новый Структура();
ПараметрыОткрытия.Вставить("СформироватьПриОткрытии", Истина);
ПараметрыОткрытия.Вставить("Вариант", КомпоновщикНастроек.Настройки);
ПараметрыОткрытия.Вставить("ПользовательскиеНастройки", КомпоновщикНастроек.ПользовательскиеНастройки);
ОткрытьФорму("Отчет.муОтчет.Форма.ФормаОтчета", ПараметрыОткрытия, ЭтаФорма, Истина);
В данной статье описаны примеры того, как нужно заполнять параметры СКД, чтобы они отображались на форме так, как нужно, а именно Настройки и ПользовательскиеНастройки компоновщика данных.
1.1. Установка пользовательских параметров СКД
Для установки значения параметра обычно используется такая конструкция:
ПараметрКомпоновки = Новый ПараметрКомпоновкиДанных(ИмяПараметра);
ПараметрСКД = КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(ПараметрКомпоновки);
ПараметрСКД.Значение = Значение;
ПараметрСКД.Использование = Истина;
Данный код установит значение параметра, но при заполнении отчета переданными настройками значение параметра не отобразится на форме и реквизит будет пустым.
Для того, чтобы пользователь видел значение параметра на форме нужно добавить следующую конструкцию:
Если ЗначениеЗаполнено(ПараметрСКД.ИдентификаторПользовательскойНастройки) Тогда
ПользовательскийПараметр = КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти(
ПараметрСКД.ИдентификаторПользовательскойНастройки);
Если ТипЗнч(ПользовательскийПараметр) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных") Тогда
ПользовательскийПараметр.Значение = ПараметрСКД.Значение;
КонецЕсли;
КонецЕсли;
Данный код по значению идентификатора пользовательской настройки находит элемент этой настройки и устанавливает значение параметра еще и там.
1.2. Установка пользовательских отборов СКД
1.2.1. Пример открытия отчета с фиксированным отбором
В общем случае для того, чтобы открыть отчет с отбором можно использовать следующие конструкции
Отбор.Вставить("Номенклатура", ОтборПоНоменклатуре);
ПараметрыОткрытия = Новый Структура();
ПараметрыОткрытия.Вставить("СформироватьПриОткрытии", Истина);
ПараметрыОткрытия.Вставить("Отбор", Отбор);
ОткрытьФорму("Отчет.муОтчет.Форма.ФормаОтчета", ПараметрыОткрытия, ЭтаФорма, Истина);
В данном случае форма откроется с отбором, но отбор не будет доступен для редактирования.
1.2.2. Пример открытия отчета с пользовательским отбором
Для того, чтобы отбор появился на форме и был доступен как в быстры отборах, так и на вкладке "отбор", нужно использовать следующую конструкцию:
//Ищем пользовательский отбор
ПользовательскийОтбор = КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти(
КомпоновщикНастроек.Настройки.Отбор.ИдентификаторПользовательскойНастройки);
ЭлементОтбораПользовательский = ПользовательскийОтбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбораПользовательский.ИдентификаторПользовательскойНастройки = Новый УникальныйИдентификатор();
ЭлементОтбораПользовательский.ВидСравнения = ВидСравнения;
ЭлементОтбораПользовательский.ЛевоеЗначение = ПолеКомпоновкиЭлемента;
ЭлементОтбораПользовательский.ПравоеЗначение = Значение;
ЭлементОтбораПользовательский.Использование = Истина;
В данном случае ненужно заполнять отбор обычных настроек компоновщика (так как в таком случае элементы формы будут задублированы), нужно взять из настроек идентификатор пользовательских настроек и по нему найти их.
После чего добавить отбор в пользовательские настройки. Он появится на форме, в быстрых настройках СКД, и на вкладке "Отборы".
Если пользовательские отборы нужно объединить в группу отборов ("И", "Или", "Не"), тогда нужно сначала добавить группу пользовательского отбора:
ПользовательскийОтбор = КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти(
КомпоновщикНастроек.Настройки.Отбор.ИдентификаторПользовательскойНастройки);
//Добавляем в пользовательский отбор группу
ГруппаОтбора = ПользовательскийОтбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
ГруппаОтбора.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИли;
//Убрано для того, чтобы группа не показывалась на форме и в основных настройках, а была только на вкладке "Отбор"
//ГруппаОтбора.ИдентификаторПользовательскойНастройки = Новый УникальныйИдентификатор();
У группы отборов есть свойство "Элементы", чтобы элемент отбора был подчинен данной группе (находился в этой группе) Отбор нужно добавлять именно в эту группу.
Т.е. вместо
ЭлементОтбораПользовательский = ПользовательскийОтбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
Будет
ЭлементОтбораПользовательский = ГруппаОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
Обновлено 13.08.2020
Таким образом полный код открытия отчета с пользовательским отбором, которые будет видно в быстрых настройках формы будет следующим:
&НаСервереБезКонтекста
Процедура УстановитьЭлементПользовательскогоОтбораСКД(КомпоновщикНастроек, ВидСравнения, ИмяПоля, Значение)
ПользовательскийОтбор = КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти(
КомпоновщикНастроек.Настройки.Отбор.ИдентификаторПользовательскойНастройки);
ЭлементОтбораПользовательский = ПользовательскийОтбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбораПользовательский.ИдентификаторПользовательскойНастройки = Новый УникальныйИдентификатор();
ЭлементОтбораПользовательский.ВидСравнения = ВидСравнения;
ЭлементОтбораПользовательский.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ИмяПоля);
ЭлементОтбораПользовательский.ПравоеЗначение = Значение;
ЭлементОтбораПользовательский.Использование = Истина;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьПараметрыОткрытияОтчета(ИмяОтчета, Партнер)
ОтчетОбъект = Отчеты[ИмяОтчета].Создать();
КомпоновщикНастроек = ОтчетОбъект.КомпоновщикНастроек;
УстановитьЭлементПользовательскогоОтбораСКД(КомпоновщикНастроек, ВидСравненияКомпоновкиДанных.Равно,
"Партнер", Партнер);
ПараметрыОткрытия = Новый Структура();
ПараметрыОткрытия.Вставить("СформироватьПриОткрытии", Истина);
ПараметрыОткрытия.Вставить("Вариант", КомпоновщикНастроек.Настройки);
ПараметрыОткрытия.Вставить("ПользовательскиеНастройки", КомпоновщикНастроек.ПользовательскиеНастройки);
Возврат ПараметрыОткрытия;
КонецФункции
&НаКлиенте
Процедура ОткрытьОтчет(Команда)
ИмяОтчета = "ЗадолженностьКлиентов";
ПараметрыОткрытия = ПолучитьПараметрыОткрытияОтчета(ИмяОтчета, ЭтотОбъект.Партнер);
ОткрытьФорму("Отчет." + ИмяОтчета + ".ФормаОбъекта", ПараметрыОткрытия, ЭтотОбъект);
КонецПроцедуры
В результате будет открыта форма отчета с установленным пользовательским отбором.
1.2.3. Пример открытия отчета с пользовательским отбором (форма отчета из БСП)
Указанные выше способ не дает желаемого результата в конфигурациях, где используется не типовая форма отчета, а форма из БСП (Тестирование проводилось на конфигурации 1С:Комплексная автоматизация 2 (2.4.12.64)).
Чтобы описанный подход работал для отчетов, которые используют форму из БСП нужно изменить код открытия отчета следующим образом:
&НаСервереБезКонтекста
Процедура УстановитьЭлементОтбораСКД(КомпоновщикНастроек, ВидСравнения, ИмяПоля, Значение)
ЭлементОтбора = КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ИдентификаторПользовательскойНастройки = Новый УникальныйИдентификатор();
ЭлементОтбора.ВидСравнения = ВидСравнения;
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ИмяПоля);
ЭлементОтбора.ПравоеЗначение = Значение;
ЭлементОтбора.Использование = Истина;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьПараметрыОткрытияОтчета(ИмяОтчета, Партнер)
ОтчетОбъект = Отчеты[ИмяОтчета].Создать();
КомпоновщикНастроек = ОтчетОбъект.КомпоновщикНастроек;
УстановитьЭлементОтбораСКД(КомпоновщикНастроек, ВидСравненияКомпоновкиДанных.Равно,
"Партнер", Партнер);
//УстановитьЭлементПользовательскогоОтбораСКД(КомпоновщикНастроек, ВидСравненияКомпоновкиДанных.Равно,
// "Партнер", Партнер);
ПараметрыОткрытия = Новый Структура();
ПараметрыОткрытия.Вставить("СформироватьПриОткрытии", Истина);
ПараметрыОткрытия.Вставить("Вариант", КомпоновщикНастроек.Настройки);
ПараметрыОткрытия.Вставить("ПользовательскиеНастройки", КомпоновщикНастроек.ПользовательскиеНастройки);
ПараметрыОткрытия.Вставить("РежимПоНастройкамКомпоновки");
Возврат ПараметрыОткрытия;
КонецФункции
&НаКлиенте
Процедура ОткрытьОтчет(Команда)
ИмяОтчета = "ЗадолженностьКлиентов";
ПараметрыОткрытия = ПолучитьПараметрыОткрытияОтчета(ИмяОтчета, ЭтотОбъект.Партнер);
ОткрытьФорму("Отчет." + ИмяОтчета + ".ФормаОбъекта", ПараметрыОткрытия, ЭтотОбъект);
КонецПроцедуры
Обратите внимание, что в данном коде заполняются обычные настройки компоновки а не пользовательские, но указывается ИдентификаторПользовательскойНастройки, при этом платформа создаст связанный элемент пользовательского отбора в КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.
Так же появился дополнительный параметр ПараметрыОткрытия.Вставить("РежимПоНастройкамКомпоновки"), для которого нужно доработать логику в метод ПриОбновленииСоставаПользовательскихНастроекНаСервере типовой формы отчета (либо поправить код, либо через расширение).
&НаСервере
Процедура ПриОбновленииСоставаПользовательскихНастроекНаСервере(СтандартнаяОбработка)
//Было
Если Не РежимВариантаОтчета() Тогда
Возврат;
КонецЕсли;
//Нужно
Если Не РежимВариантаОтчета() И Не Параметры.Свойство("РежимПоНастройкамКомпоновки") Тогда
Возврат;
КонецЕсли;
СтандартнаяОбработка = Ложь;
ПараметрыОбновления = Новый Структура("ИмяСобытия", "ПриОбновленииСоставаПользовательскихНастроекНаСервере");
ОбновитьЭлементыФормыНастроекНаСервере(ПараметрыОбновления);
КонецПроцедуры