Почти в каждом отчете в 1С используются отборы. Зачастую в поле отбора требуется выбирать не все элементы справочника, а только конкретный перечень или по каким-нибудь еще отборам и параметрам. И Как же это сделать в СКД? Есть несколько вариантов:
1. Непосредственно в самой схеме компоновки данных, на закладке "Наборы данных", в таблице "Поля". Например можно указать, что выбирать можно только не помеченные на удаления (см. рисунок ниже).
2. Программным способом на форме , в событии "ПриСозданииНаСервере". Есть отборы, которые в конфигураторе не настроить. Например, сделать так, чтобы можно было выбрать только конкретные элементы справочника (не предопределенные).
ПриСозданииНаСервере
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
УстановитьПараметрыРедактирования();
КонецПроцедуры
&НаСервере
Процедура УстановитьПараметрыРедактирования()
ОтчетОбъект = РеквизитФормыВЗначение("Отчет");
// Основная схема компоновки или можно указать конкретный макет
ОсновнаяСхемаКомпоновки = ОтчетОбъект.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
// найдем нужное нам поле набора данных
// наборов данных может быть много, поэтому указывайте тот который вам нужен
Поле_Валюта = ОсновнаяСхемаКомпоновки.НаборыДанных.НаборДанных1.Поля.Найти("Валюта");
Если НЕ Поле_Валюта = Неопределено Тогда
// Найдем в параметрах редактирования нужную настройку "ПараметрыВыбора"
ПараметрыВыбора = Поле_Валюта.ПараметрыРедактирования.Элементы.Найти(Новый ПараметрКомпоновкиДанных("ПараметрыВыбора"));
Если НЕ ПараметрыВыбора = Неопределено Тогда
// Добавим новый параметр выбора
// в нашем случае мы хотим поставить отбор по элементам справочника "Руб" и "EUR"
НовыйПараметрВыбора = ПараметрыВыбора.Значение.Добавить();
// "Отбор." означает, что форма выбора автоматически откроется с указанным отбором
// в Форме выбора поле "Ссылка" дожно иметь признак обязательного использования
НовыйПараметрВыбора.Имя = "Отбор.Ссылка";
// значения отбора вы можете получить как угодно, в данном примере найдем по коду
ОтборПоЭлементам = Новый Массив();
ОтборПоЭлементам.Добавить(Справочники.Валюты.НайтиПоКоду("643"));
ОтборПоЭлементам.Добавить(Справочники.Валюты.НайтиПоКоду("978"));
// присвоим значение отбора
НовыйПараметрВыбора.Значение = ОтборПоЭлементам;
// установим признак использования нашей настройки
ПараметрыВыбора.Использование = Истина;
КонецЕсли;
// также можно и заменить стандартную форму выбора
ФормаВыбора = Поле_Валюта.ПараметрыРедактирования.Элементы.Найти(Новый ПараметрКомпоновкиДанных("ФормаВыбора"));
Если НЕ ФормаВыбора = Неопределено Тогда
ФормаВыбора.Значение = "Справочник.Валюты.Форма.ФормаСписка";
ФормаВыбора.Использование = Истина;
КонецЕсли;
КонецЕсли;
// далее необходимо наши настройки загрузить в компоновщик
АдресСхемы = ПоместитьВоВременноеХранилище(ОсновнаяСхемаКомпоновки,Новый УникальныйИдентификатор());
// тут и происходит инициализация наших настроек
ОтчетОбъект.КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемы));
ОтчетОбъект.КомпоновщикНастроек.ЗагрузитьНастройки(ОсновнаяСхемаКомпоновки.НастройкиПоУмолчанию);
ЗначениеВРеквизитФормы(ОтчетОбъект,"Отчет");
КонецПроцедуры
В моем примере устанавливается отбор на выбор "Валюты". В результате получаем, что пользователь не сможет выбрать другие элементы, кроме "Руб" и "Евро".
Тестировалось на платформе 8.3.13.1644
Управление торговлей, редакция 11 (11.4.3.137)
Тему логичнее назвать
«Программная установка ограничений выбора значений параметров СКД»
(1) В публикации не только про ограничение выбора. Есть пример с подменой стандартной формы выбора.
(2) если вести со мной дальше диалог, то я найду еще 100500 противоречий в вашей поделке?
на первый взгляд бросился в глаза — не четко позиционируемый задачу заголовок, что может ввести
в заблуждение неискушенные умы, а на второй взгляд — код очень условный и монстроидальный.
(3) Сядьте и напишите свою статью. А мы все дружно посмотрим и оценим)
(4) У меня нет таланта в дружеской формулировке мыслей.
Обычно, после прочтения первых абзацев у читателей
пробуждаются первобытные инстинкты, хотя моя цель пробудить логику.
парадокс(
Для БСП в модуле объекта отчета
Показать
Все остальное делается там же
(6) Спасибо за пример)