Здравствуйте форумчане. Платформа 8.3.22.1709. Создан простой отчет. Мне надо чтобы пользователь мог устанавливать отборы из типовой формы отчета. Для этого при изменении реквизита вызывается следующая процедура.

```1c
    Процедура УстановитьЗначениеПараметра(ИмяПараметра, ЗначениеПараметра)

    ПараметрКомпоновки = Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных(ИмяПараметра));
    ПараметрКомпоновки.Использование = Истина;
    ПараметрКомпоновки.Значение = ЗначениеПараметра;

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

Но отчет формируется пустым. Если тоже самое сделать в процедуре "ПриКомпоновкеРезультата" то все работает, а в форме нет.
---
По моему не получится. Я же Вам код отправлял для обычных форм. А у Вас управляшки...
Для учебы, предлагаю создать свой отчет, максимально простой, в котором видны параметры, на нем научиться заполнять параметры и только затем переходить к нужному...
И не забывайте, что параметры могут быть включены в пользовательские настройки, причем пользовательские в этом случае имеют приоритет, поэтому их заполнять тоже надо.

```1c
    &НаСервере
    Процедура ПолеВыбораПриИзмененииНаСервере()
    //установим параметр
    Параметр = Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("Параметр1");
    //тут можно проверить, а найден ли параметр, но на Ваше усмотрение
    Параметр.Значение = ПолеВыбора;
    Параметр.Использование = Истина;
    //отобразим его в пользовательских настройках
    //можно проверить перед этим что установка была успешна: Если ЗначениеЗаполнено(Параметр.ИдентификаторПользовательскойНастройки) Тогда, но это на Ваше усмотрение
    ПользовательскийПараметр = Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти(Параметр.ИдентификаторПользовательскойНастройки);
    //можно проверить: на ТипЗнч(ПользовательскийПараметр) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных"), но это на Ваше усмотрение
    ПользовательскийПараметр.Значение = Параметр.Значение;
    ПользовательскийПараметр.Использование = Истина;
    КонецПроцедуры

    &НаКлиенте
    Процедура ПолеВыбораПриИзменении(Элемент)
    ПолеВыбораПриИзмененииНаСервере();
    КонецПроцедуры
```

Пример прикрепляю...
---
можно это посмотреть
https://infostart.ru/1c/articles/403586/

И ещё

Допустим есть отчет на СКД с параметрами «Начало», «Окончание», формат — дата. Программно зададим значения данных параметров.

Порядок действий
Открыть модуль объекта отчета;
Добавить следующую процедуру:

```1c
    Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    Настройки = КомпоновщикНастроек.Настройки;
    // поиск нужного параметра по наименованию
    ПараметрСКДНачало = Настройки.ПараметрыДанных.Элементы.Найти("Начало");
    // установка значения
    ПараметрСКДНачало.Значение = НачалоКвартала(ТекущаяДата());
    ПараметрСКДНачало.Использование = Истина;

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

Обновляем программу, открываем режим 1С предприятие, проверяем результат.
Также можно в настройках СКД, на вкладке «Другие настройки» отметить галочку «Выводить параметры». Заданные параметры будут отображаться под заголовком отчета, что облегчит тестирование.

В большинстве случаем при установке значения параметра достаточно стандартного интерфейса схемы компоновки данных. Но иногда возникают нестандартные случаи, когда необходимо установить параметр по условию, или возникла ситуация, когда отчет был сформирован программно.
---
А так, в настройках, не подходит?
---
Мне надо устанавливать настройки именно из формы. Там в последствии будут отдельные вызываемые формы для отборов. Короче много нюансов, но пока я столкнулся на первом шаге.
---
можно это посмотреть
https://infostart.ru/1c/articles/403586/

И ещё

Допустим есть отчет на СКД с параметрами «Начало», «Окончание», формат — дата. Программно зададим значения данных параметров.

Порядок действий
Открыть модуль объекта отчета;
Добавить следующую процедуру:

```1c
    Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    Настройки = КомпоновщикНастроек.Настройки;
    // поиск нужного параметра по наименованию
    ПараметрСКДНачало = Настройки.ПараметрыДанных.Элементы.Найти("Начало");
    // установка значения
    ПараметрСКДНачало.Значение = НачалоКвартала(ТекущаяДата());
    ПараметрСКДНачало.Использование = Истина;

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

Обновляем программу, открываем режим 1С предприятие, проверяем результат.
Также можно в настройках СКД, на вкладке «Другие настройки» отметить галочку «Выводить параметры». Заданные параметры будут отображаться под заголовком отчета, что облегчит тестирование.

В большинстве случаем при установке значения параметра достаточно стандартного интерфейса схемы компоновки данных. Но иногда возникают нестандартные случаи, когда необходимо установить параметр по условию, или возникла ситуация, когда отчет был сформирован программно.
---
Да, это работает.

Но странно, почему в типовой форме отчета тогда есть "КомпоновщикНастроек". Зачем он вообще нужен, если все параметры можно установить только в процедуре "При ПриКомпоновкеРезультата"
---
То что Вы пытаетесь сделать, это установка параметров. На форме это делается так, например перед открытием занесем в параметр "Параметр1" число 111:

```1c
    Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
    Настройки = КомпоновщикНастроек.Настройки;
    Параметр = Настройки.ПараметрыДанных.Элементы.Найти("Параметр1");
    Параметр.Значение = "111";
    Параметр.Использование = Истина;
    КонецПроцедуры
```

Но Вы просили отборы...А это несколько иное...Вот пример отбора по иерархии:

```1c
    Включено = Новый СписокЗначений;
    Включено.Добавить(Справочники.Номенклатура.НайтиПоКоду("00000003428"));//сырье
    Включено.Добавить(Справочники.Номенклатура.НайтиПоКоду("00000004867"));//Тушка кур 1 сорт фас. (зам.)
    ПолеОтбора = Новый ПолеКомпоновкиДанных("Номенклатура");
    Отбор = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСпискеПоИерархии;
    Отбор.ЛевоеЗначение = ПолеОтбора;
    Отбор.ПравоеЗначение = Включено;
```
---
Я как раз и пытался поставить параметр по первой процедуре и ничего не получалось. СКД игнорировал то что было установлено.
---
Нажав настройки, можно увидеть установился ли параметр или нет
---
У меня в режиме пользователя параметры недоступны. Ну т.е. отборы, условное оформление и прочее я вижу, а параметров нет.
---
Ой ёй, у Вас еще и управляшки...С этого и нужно было начинать...Там же весь код надо писать на сервере...
...покопайтесь в кнопке "Еще"! И на крайняк, параметры, можно увидеть отладчиком...

И Вы хоть отпишитесь, у Вас получилось задуманное или нет?
---
Да, получилось, я отметил правильный ответ в теме. Там суть в том, что на клиенте ты сохраняешь параметры, а потом обращаешься к ним при компоновке результата.
---
Не хочу Вас разочаровывать, но не у каждого отчета есть процедура компоновки.... Что в таком случае собираетесь делать? Желательно научиться параметры менять до нажатия кнопки сформировать, а не во время выполнения.
---
Я так и хотел, но вот пока не получается. В пн попробую по вашему способу.
---
По моему не получится. Я же Вам код отправлял для обычных форм. А у Вас управляшки...
Для учебы, предлагаю создать свой отчет, максимально простой, в котором видны параметры, на нем научиться заполнять параметры и только затем переходить к нужному...
И не забывайте, что параметры могут быть включены в пользовательские настройки, причем пользовательские в этом случае имеют приоритет, поэтому их заполнять тоже надо.

```1c
    &НаСервере
    Процедура ПолеВыбораПриИзмененииНаСервере()
    //установим параметр
    Параметр = Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("Параметр1");
    //тут можно проверить, а найден ли параметр, но на Ваше усмотрение
    Параметр.Значение = ПолеВыбора;
    Параметр.Использование = Истина;
    //отобразим его в пользовательских настройках
    //можно проверить перед этим что установка была успешна: Если ЗначениеЗаполнено(Параметр.ИдентификаторПользовательскойНастройки) Тогда, но это на Ваше усмотрение
    ПользовательскийПараметр = Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти(Параметр.ИдентификаторПользовательскойНастройки);
    //можно проверить: на ТипЗнч(ПользовательскийПараметр) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных"), но это на Ваше усмотрение
    ПользовательскийПараметр.Значение = Параметр.Значение;
    ПользовательскийПараметр.Использование = Истина;
    КонецПроцедуры

    &НаКлиенте
    Процедура ПолеВыбораПриИзменении(Элемент)
    ПолеВыбораПриИзмененииНаСервере();
    КонецПроцедуры
```

Пример прикрепляю...
---
Спасибо за помощь. Это все действительно работает. Моя ошибка была в том, что я устанавливал параметры, но не дублировал их в пользовательские настройки.

Добавлю один момент для тех кто потом будет читать. Для того, чтобы установить параметры при открытии отчета, надо поставить процедуру установки параметров не в событие "ПриСозданииНаСервере", а в событии "ПриОткрытии".
---
Можно ответ отметить, как решение...
А я то думал, Вы при изменении реквизита параметры меняете...
Да, между ПриСозданииНаСервере и ПриОткрытии выполняется восстановление пользовательских настроек...
Удачи!
---
Я и при создании меняю и при изменении настроек на самой форме.

Три параметра у меня фиксированы, их пользователь менять не сможет, а вот остальные два пусть меняет сам.
---
Может вы еще подскажете. Мне надо вывести диаграмму со средним значением по количеству командировок. В консоле запросов я это делаю очень легко, а вот в СКД у меня не получается. Отчет игнорирует то, что я указываю в ресурсе формулу "среднее" и считает только сумму. Не могу понять, что я делаю не так.

Отчет вы у себя вряд ли откроете, там у меня самописный регистр используется. Но сам текст запроса простой, главное я не могу понять, почему система игнорирует формулу в ресурсах.
---
И правда, с диаграммой не помогу. Могу посоветовать вывести сначала в таблицу и убедиться, что данные присутствуют и они верны, и только затем пытаться сделать диаграмму
---
Так они и в таблице не верны. Тут суть даже не в самой диаграмме. Я не могу посчитать среднее даже в таблице. Даже если делаю группировку в запросе, СКД игнорирует ее и считает сумму.
---
Жаль нет Вашей базы попробовать. Возможно следует у ресурса поиграться с полем "рассчитывать по"
---
Я попробовал все возможные варианты с рассчитывать по. Там все таки конечное количество комбинаций)))

Сейчас сделал через костыль. В отдельном пакете запроса рассчитываю максимальный номер автозаписи по всем месяцам и делю сумму командировок на это значение.

Меня даже посещали мысли что тут глюк платформы. Первый раз вижу, чтобы СКД сам пересчитывал данные. В запросе все считается правильно, а вставляешь в СКД и получаешь совсем другие данные.
---
Погуглил еще. Есть такая проблема - при компоновке результат СКД может изменить итоговый запрос для оптимизации. Это может приводить к ошибкам, как произошло у меня. Есть несколько костыльных вариантов решения проблемы, но самый надежный способ это создание внешнего источника данных.

Собственно с ним у меня данные встали корректно.