Имя: Пароль:
1C
 
СКД: ограничить список значений параметра
0 sound
 
28.10.24
19:09
Всем доброго времени!

Есть отчет на СКД в конфигурации УТ, форм отчет не имеет, есть параметр "Организации" с типом "СправочникСсылка.Организации" и установленной галкой "Доступен список значений". Нужно список выбора организаций формировать программно. В теле модуля отчета пишу:

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

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


Но у пользователя список выбора не ограничивается и видны все организации. Подскажите как правильно это сделать?
1 Волшебник
 
28.10.24
19:09
доступ к организациям лучше ограничить через RLS
2 sound
 
28.10.24
19:13
Отчет формируют по нескольким организациям.
В справочнике Организации есть несколько "технических" элементов, и нужно чтобы некоторые из них нельзя было отметить галочками и чтобы данные по ним не попали в отчет.
3 Волшебник
 
28.10.24
19:14
(2) Доступ к "техническим" элементам лучше ограничить через RLS. Ещё можно вычищать запрещённые элементы перед самым формированием отчёта.
4 sound
 
28.10.24
19:22
Как это сделать в процедуре ПриКомпоновкеРезультата я примерно понимаю, а вот как сделать чтобы при таких настройках, когда нет формы у отчета, ограничить список выбора организаций у параметра на форме, которая "сама генерируется"?
5 Волшебник
 
28.10.24
19:26
(4) RLS это сделает. Ещё можно вшить ограничение в форму выбора, но лучше его продублировать зачисткой перед самым формированием отчёта.
6 Волшебник
 
28.10.24
19:27
А ещё можно в схему компоновки данных прямо в запрос добавить условие
ГДЕ НЕ Организация В (&Запрещенные)
7 sound
 
28.10.24
19:45
(5) RLS это сделает, но также RLS скроет от пользователя эти организации и из других мест, а нужно скрыть только в этом отчете.

(6) В схеме компоновки есть лишь набор данных Объект - таблица значений, которая собирается программно из разных баз через http-сервисы, там все сложно короче ).

Сейчас посмотрел, отладчик после выполнения основного модуля отчета попадает в общую форму "ФормаОтчета", может в ней дело?
8 Hans
 
28.10.24
22:09
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.ДоступныеПараметры.Элементы[0].ДоступныеЗначения.Добавить("5");    
    
КонецПроцедуры
9 Hans
 
28.10.24
22:10
Ну можешь сделать свою форму. Можешь БСП разбирать или что там у тебя. Мой код работает. Я добавил в список еще одно число.
10 Волшебник
 
28.10.24
22:11
(8) говнокод
11 Hans
 
28.10.24
22:11
И оно появилось в пользовательских настройках.
12 Волшебник
 
28.10.24
22:12
(11) И не стыдно делиться такими "шедеврами"?
13 Hans
 
28.10.24
22:14
(12) норма. Досканально СКД не знаю.
14 Волшебник
 
28.10.24
22:15
(13) За такой код надо веником по лицу
15 Hans
 
28.10.24
22:16
(10) Ну планирую на курс Шилова идти и Лосяша. Ну и надо фундаментал на других языках изучать.
16 Волшебник
 
28.10.24
22:16
(15) Займитесь лучше питоном. В 1С вы ни бум-бум
17 Hans
 
28.10.24
22:19
(16) Я сертифицировнный специалист по платформе!!!
18 Волшебник
 
28.10.24
22:20
(17) Я эти тесты писал!
19 sound
 
28.10.24
22:27
(8) Речь идёт о том, что форм у отчета нет никаких, ни формы отчета, ни формы настроек, ни других, и добавлять формы в планах нет.
20 Hans
 
28.10.24
22:40
Мой код оказывается и в модуле отчета прекрасно работает. Сам не знал что так можно.
21 osa1C
 
28.10.24
22:41
(19) Твой отчет использует общую форму "ФормаОтчета", что значит формы нет? А в "ФормаОтчета" есть процедура ПриСозданииНаСервере. Проблема только в том, что форма общая, поэтому тебе надо в ней определять, что именно твой отчет формируется и для него делать ограничение по организациям. Например формировать отдельные массивы организаций в зависимости от прав. Т.е. сначала в массив добавить организации, доступные всем, а потом по условию добавлять дяя каждых ролей доступные только им организации.
22 Hans
 
28.10.24
22:43
тело модуля
23 Hans
 
28.10.24
22:44
Нашли новую фишку.
24 Hans
 
28.10.24
22:45
Это открывает широкие возможности манипулирования параметрами и всем СКД.
25 Шурик71
 
28.10.24
22:51
(19) Бсп умеет прокидывать обработчики в модуль.

Краткая инструкция (мог что-то и пропустить)

1. В модуле отчета:

Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт
    
    Настройки.События.ПриСозданииНаСервере = Истина;
        //возможно, понадобится еще    
    //Настройки.События.ПередЗагрузкойВариантаНаСервере = Истина;
    //Настройки.События.ПередЗаполнениемПанелиБыстрыхНастроек    = Истина;
    
КонецПроцедуры

Процедура ПриСозданииНаСервере(Форма, Отказ, СтандартнаяОбработка) Экспорт
   //тут нужный код
КонецПроцедуры

2. Если это внешний отчет, то этого достаточно.
Если это внутренний отчет, тогда еще

- в общем модуле ВариантыОтчетовПереопределяемый:

Процедура НастроитьВариантыОтчетов(Настройки)                                          
    ВариантыОтчетов.НастроитьОтчетВМодулеМенеджера(Настройки, Метаданные.Отчеты.ИмяМоегоОтчета);  
КонецПроцедуры

- в модуле менеджера отчета:
Процедура НастроитьВариантыОтчета(Настройки, НастройкиОтчета) Экспорт
    НастройкиОтчета.ОпределитьНастройкиФормы = Истина;
КонецПроцедуры
26 sound
 
29.10.24
01:19
(25) Спасибо. Почитать бы еще где-то про прокидывание обработчиков.
27 sound
 
29.10.24
10:42
Нашел где почитать https://blog.livegig.ru/archives/2452
Всем спасибо!
28 DiMel_77
 
29.10.24
11:26
(27) Делается все просто. Делается добавлением 2-х экспортных функций в модуль объекта. Как то так:
Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт
    Настройки.События.ПриОпределенииПараметровВыбора = Истина;
КонецПроцедуры

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

//Если хотите тупо списком ограничить
Процедура ПриОпределенииПараметровВыбора(Форма, СвойстваНастройки) Экспорт

ИмяПоля = Строка(СвойстваНастройки.ПолеКД);     
Если ИмяПоля = "ПараметрыДанных.<Имя нужного параметра>" Тогда

        ЗначенияДляВыбора = Новый СписокЗначений;
    <Тут код по добавлению нужных значений>
        
        СвойстваНастройки.ОграничиватьВыборУказаннымиЗначениями = Истина;
    СвойстваНастройки.ЗначенияДляВыбора = ЗначенияДляВыбора;

КонецЕсли;

КонецПроцедуры
29 Franchiser
 
29.10.24
11:31
(0) можно создать временную таблицу программно со списком организаций , и потом ее передать в скд
30 Franchiser
 
29.10.24
11:35
(28) как это решает проблему с тем что пользователь может не выбрать организации, но нужно результат ограничить списком данных по доступным организациям?
31 DiMel_77
 
29.10.24
11:46
(30) Задача была ограничить список выбора параметра при формировании отчета. Никто не мешает сделать параметр обязательным к заполнению или отработать ситуацию с незаполненным параметром добавлением фильтра по "доступным" организациям при формировании отчета с незаполненным параметром. А как этот фильтр накладывается уже неважно, через выражение СКД, либо через условие в запросе с временной таблицей и т.п.
32 Шурик71
 
29.10.24
12:07
(30) Это решает проблему отсутствия формы и ее обработчиков.

А при наличии обработчиков формы - тут уже дело техники.

Можно, например, в обработчике "ПриСозданииНаСервере" программно свое поле на форме для отбора сгенерировать, а типовое отключить.

А можно в обработчике ПослеЗаполненияПанелиБыстрыхНастроек найти сгенерированный типовой элемент отбора и у него проставить "выбор из списка" и заполнить список доступными значениями.
33 Шурик71
 
29.10.24
12:14
Пардон, в (32) я немного ошибся с комментарием - думал, что (30) это ответ на мое сообщение (26).

Возможно, совет в (28) через ПриОпределенииПараметровВыбора будет лучшим вариантом.
34 Franchiser
 
29.10.24
13:26
Вообще конечно странно, каким образом пользователь может выбрать в список лишние организации, если у него должен быть в базе настроен rls и такие организации в принципе не могут быть доступны.
35 RVN
 
29.10.24
13:34
(34) Они могут быть не лишние вообще. Они могут быть "лишние" в данном конкретном отчете.
36 Franchiser
 
29.10.24
13:46
Есть ещё один вариант : написать в модуле объекта:
Процедура ИнициализацияОтчета()

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

ИнициализацияОтчета();