Программное заполнение пользовательских параметров и отборов СКД

Программирование - Практика программирования

СКД пользовательский параметр программная установка параметра пользовательский отбор программная установка отбора отбор СКД параметр СКД пользовательский отбор

91
Публикация представляет из себя краткие примеры того, как можно заполнять параметры СКД программно так, чтобы все параметры и отборы были доступны в быстрых настройках и в обычных (типовых) настройках параметров и отборов СКД.

1. Пользовательские настройки СКД


При программном заполнении параметров отчета СКД часто возникает ситуация, когда нужно программно установить параметры отчета или добавить отборы.

Проблема возникает в том, что не всегда эти параметры или отборы отображаются на форме так, как нам бы хотелось.

В общем случае, для того, чтобы открыть отчет с заполненными параметрами используется следующая конструкция:

ПараметрыОткрытия = Новый Структура();
ПараметрыОткрытия.Вставить("СформироватьПриОткрытии", Истина);
ПараметрыОткрытия.Вставить("Вариант", КомпоновщикНастроек.Настройки);
ПараметрыОткрытия.Вставить("ПользовательскиеНастройки", КомпоновщикНастроек.ПользовательскиеНастройки);
ОткрытьФорму("Отчет.муОтчет.Форма.ФормаОтчета", ПараметрыОткрытия, ЭтаФорма, Истина);

В данной статье описаны примеры того, как нужно заполнять параметры СКД, чтобы они отображались на форме так, как нужно, а именно Настройки и ПользовательскиеНастройки компоновщика данных.

1.1. Установка пользовательских параметров СКД

Для установки значения параметра обычно используется такая конструкция:

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

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

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

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

КонецЕсли;

Данный код по значению идентификатора пользовательской настройки находит элемент этой настройки и устанавливает значение параметра еще и там.

1.2. Установка пользовательских отборов СКД

1.2.1. Пример открытия отчета с фиксированным отбором

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


Отбор.Вставить("Номенклатура", ОтборПоНоменклатуре);		
ПараметрыОткрытия = Новый Структура(); 	
ПараметрыОткрытия.Вставить("СформироватьПриОткрытии", Истина);
ПараметрыОткрытия.Вставить("Отбор", Отбор);
ОткрытьФорму("Отчет.муОтчет.Форма.ФормаОтчета", ПараметрыОткрытия, ЭтаФорма, Истина);

В данном случае форма откроется с отбором, но отбор не будет доступен для редактирования.

1.2.2. Пример открытия отчета с пользовательским отбором

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

//Ищем пользовательский отбор
ПользовательскийОтбор = КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти(
   КомпоновщикНастроек.Настройки.Отбор.ИдентификаторПользовательскойНастройки);

ЭлементОтбораПользовательский =  ПользовательскийОтбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));

ЭлементОтбораПользовательский.ИдентификаторПользовательскойНастройки = Новый УникальныйИдентификатор();
ЭлементОтбораПользовательский.ВидСравнения = ВидСравнения;
ЭлементОтбораПользовательский.ЛевоеЗначение = ПолеКомпоновкиЭлемента;
ЭлементОтбораПользовательский.ПравоеЗначение = Значение;
ЭлементОтбораПользовательский.Использование = Истина;

В данном случае ненужно заполнять отбор обычных настроек компоновщика (так как в таком случае элементы формы будут задублированы), нужно взять из настроек идентификатор пользовательских настроек и по нему найти их.

После чего добавить отбор в пользовательские настройки. Он появится на форме, в быстрых настройках СКД, и на вкладке "Отборы".

---------------New. 15.11.2018----------------

Если пользовательские отборы нужно объединить в группу отборов ("И", "Или", "Не"), тогда нужно сначала добавить группу пользовательского отбора:

ПользовательскийОтбор = КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти(
	КомпоновщикНастроек.Настройки.Отбор.ИдентификаторПользовательскойНастройки);
		
//Добавляем в пользовательский отбор группу
ГруппаОтбора = ПользовательскийОтбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
ГруппаОтбора.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИли;	

//Убрано для того, чтобы группа не показывалась на форме и в основных настройках, а была только на вкладке "Отбор"
//ГруппаОтбора.ИдентификаторПользовательскойНастройки = Новый УникальныйИдентификатор();

У группы отборов есть свойство "Элементы", чтобы элемент отбора был подчинен данной группе (находился в этой группе) Отбор нужно добавлять именно в эту группу.

Т.е. вместо

ЭлементОтбораПользовательский =  ПользовательскийОтбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));

Будет

ЭлементОтбораПользовательский =  ГруппаОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));

 

91

См. также

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. VmvLer 13.11.18 10:55 Сейчас в теме
по-моему, в СП и любой типовой в общем модуле по СКД примеров гораздо больше.

хотя спасибо за то, что скопировали пару строк кода из первой попавшейся формы или модуля.
qwinter; chebser; A_Max; rpgshnik; +4 Ответить
2. zqzq 17 13.11.18 13:52 Сейчас в теме
(1) Вы не поверите... Нету там ничего. В своё время решал похожую задачу, отладчик замучал (но решил).

Автору плюс.
bulpi; CyberCerber; Unk92; +3 Ответить
7. Unk92 99 14.11.18 11:16 Сейчас в теме
(1) А вы загляните и скиньте примеры методов, которые делают тоже самое..
10. VmvLer 14.11.18 11:28 Сейчас в теме
(7) откройте общий модуль ОбщегоНазначенияКлиентСервер изучайте примеры, а если проискать по общим модулям "Отбор", то можно еще найти примеры.


А в примерах автора топика я не увидел, что есть хоть намек на иерархии, а в настойках иерархия сплошь и рядом.
13. Unk92 99 15.11.18 08:33 Сейчас в теме
(10)
я не увидел, что есть хоть намек на иерархии

Я так полагаю, что речь идет о группах отборов "И", "Или", "Не".
Если так, то я учел ваш комментарий и дописал статью.
3. oleg-x 5 13.11.18 14:28 Сейчас в теме
Как раз сегодня решил такую задачку, только там сделал не через пользовательские настройки,а просто через настройки.
Во всех примерах добавления не было одной строки:
ЭлементОтбора.ИдентификаторПользовательскойНастройки = Новый УникальныйИдентификатор();
И из-за неё потерял кучу времени, так как без этого не будут работать отборы.
4. qwinter 515 13.11.18 14:52 Сейчас в теме
8. Unk92 99 14.11.18 11:19 Сейчас в теме
(4)Я не претендовал на то, что это статья уникальна в своем роде. На ИТС по вашей ссылке описан один из методов БСП, если хотите, то в данной статье просто показано, как это работает внутри.

П.С. Если не интересно, то можно всегда пройти мимо =)
5. monkbest 98 14.11.18 09:10 Сейчас в теме
Это про какую конфу, вид клиента? Где этот код расположен? в форме / в модуле, сервер / клиент, обычное приложение / управляемое? Конфа с БСП / без БСП?

где можно применить эти советы?
6. the1 321 14.11.18 11:05 Сейчас в теме
9. Unk92 99 14.11.18 11:28 Сейчас в теме
(5) В самом начале есть пример кода, который открывает отчет СКД с параметрами.

Все чего там не хватает это

Отчет = Отчеты.муОтчет.СоздатьОбъект();
КомпоновщикНастроек = Отчет.КомпоновщикНастроек;

В другие примерах речь как раз идет о том, как заполнить компоновщик настроек, чтобы отборы были такими, какими ожидает их видеть пользователь.

Вернемся к вашим вопросам.
1. "Это про какую конфу". Это про любую конфу, т.к. речь идет о механизмах платформы 1с 8.3
2. "Вид клиента". Естественно, что объект вы создаете на сервере, а открываете отчет на клиенте (у данной статьи нет цели рассказывать про клиент серверную архитектуру)
3. "Где этот код расположен". В месте, где вам нужно открыть отчет =)
4. "обычное приложение / управляемое?". Управляемое приложение
5. "Конфа с БСП / без БСП". Без разницы, это не функционал БСП.

П.С. По-моему часть ваших вопросов только ради вопросов...
12. monkbest 98 14.11.18 14:11 Сейчас в теме
(9)
П.С. По-моему часть ваших вопросов только ради вопросов...

неее, просто мне задача такая часто попадается, и поэтому очень интересно, т.к. каждый раз как в первый раз трачу кучу времени в отладчике, чтобы понять, куда программно вставить значение, чтобы все красиво было. С nой попытки я нахожу куда сунуть настройки, чтобы работало, а с nХ2 - чтобы и отображалось корректно. И везде все решается по разному.

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

Ранее еб***ся с УТ 11.4. Там вроде СКД и УФ, но не совсем, т.к. есть БСП и общая формаОтчета с кучей кода в своем модуле и мне было очень грустно его читать, чтобы открыть отчет в котором на форме все красиво.

Из Вашего ответа я понял, что в УТ 11 я смогу протестить этот код и если все получиться "намотать на ус"
15. Unk92 99 15.11.18 09:09 Сейчас в теме
(12) Посмотрел код типовой УТ 11, должно все сработать, если делать по аналогии с тем. что написано в статье. Т.е. передавать пользовательские настройки через параметры открытия формы.
П.С. Сам в УТ 11 не пробовал =)
11. bulpi 137 14.11.18 13:55 Сейчас в теме
Ковырять типовые конфы, чтобы это найти- лучше сразу в дурдом. Автор молодец, вот только для меня поздно. Уже сам с большими мучениями это освоил.
14. VmvLer 15.11.18 08:50 Сейчас в теме
(11) Я, думаю у многих была такая ситуация, когда вы что-то велосипедили день-два, а потом произносили "твою ...", когда обнаружили требуемый функционал в модуле формы, объекта, менеджера.

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

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

Если вы не согласны со мной сейчас, то вам еще необходимо время и опыт на понимание того, что я прав.
16. Fruit83 28 21.11.18 12:50 Сейчас в теме
(14)
в которых миллионы строк кода, который очень часто лаконичен


Новичек хочет разобраться в теме и вы предлагаете ему миллионы строк лаконичного кода. Может лучше начать с простых примеров? Не?
Оставьте свое сообщение