|   |   | 
| 
 | СКД: ограничить список значений параметра timurhv, Дмитрий, Prog_man, SleepyHead, formista2000, Волшебник, Franchiser, DiMel_77, RVN, АнализДанных, Kobol, sikuda, Доминошник, youalex, Mr_Boogie, orakool, Gucci76, Шурик71, kir-g, KJlag, sound, yurikmellon2, El_Lipo, Андрей_Андреич, dedmoroz777, Fregat, comp2006, Хряк, СвинТуз, boozin, Жеглофф, Fedor-1971, DimR_71, Климов Сергей, Мультук, dmt, Буковка, osa1C, denk, spiller26, программистище, elka302, Скучный бух, toypaul, dimm7310, Amfiaray, obs191, Hans, 2mugik, Admin_Net_1C, AAA | ☑ | ||
|---|---|---|---|---|
| 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 | 
        Есть ещё один вариант : написать в модуле объекта:
 Процедура ИнициализацияОтчета() // добавляем список доступных значений СписокОрганизаций= Новый СписокЗначений; ПараметрСхемы = СхемаКомпоновкиДанных.Параметры.Найти("Организация"); ПараметрСхемы.УстановитьДоступныеЗначения(СписокОрганизаций); КонецПроцедуры // ИнициализацияОтчета ИнициализацияОтчета(); | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |