Программное добавление параметров редактирования СКД






В данной публикации приводится пример программного добавления параметров редактирования для поля выборки в СКД.

Почти в каждом отчете в 1С используются отборы. Зачастую в поле отбора требуется выбирать не все элементы справочника, а только конкретный перечень или по каким-нибудь еще отборам и параметрам. И Как же это сделать в СКД? Есть несколько вариантов:

1. Непосредственно в самой схеме компоновки данных, на закладке "Наборы данных", в таблице "Поля". Например можно указать, что выбирать можно только не помеченные на удаления (см. рисунок ниже).

2. Программным способом на форме , в событии "ПриСозданииНаСервере". Есть отборы, которые в конфигураторе не настроить. Например, сделать так, чтобы можно было выбрать только конкретные элементы справочника (не предопределенные). 

 

 

 ПриСозданииНаСервере


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

УстановитьПараметрыРедактирования();

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

&НаСервере
Процедура УстановитьПараметрыРедактирования()

ОтчетОбъект = РеквизитФормыВЗначение("Отчет");
// Основная схема компоновки или можно указать конкретный макет
ОсновнаяСхемаКомпоновки = ОтчетОбъект.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
// найдем нужное нам поле набора данных
// наборов данных может быть много, поэтому указывайте тот который вам нужен
Поле_Валюта = ОсновнаяСхемаКомпоновки.НаборыДанных.НаборДанных1.Поля.Найти("Валюта");
Если НЕ Поле_Валюта = Неопределено Тогда
// Найдем в параметрах редактирования нужную настройку "ПараметрыВыбора"
ПараметрыВыбора = Поле_Валюта.ПараметрыРедактирования.Элементы.Найти(Новый ПараметрКомпоновкиДанных("ПараметрыВыбора"));
Если НЕ ПараметрыВыбора = Неопределено Тогда
// Добавим новый параметр выбора
// в нашем случае мы хотим поставить отбор по элементам справочника "Руб" и "EUR"
НовыйПараметрВыбора = ПараметрыВыбора.Значение.Добавить();
// "Отбор." означает, что форма выбора автоматически откроется с указанным отбором
// в Форме выбора поле "Ссылка" дожно иметь признак обязательного использования
НовыйПараметрВыбора.Имя = "Отбор.Ссылка";
// значения отбора вы можете получить как угодно, в данном примере найдем по коду
ОтборПоЭлементам = Новый Массив();
ОтборПоЭлементам.Добавить(Справочники.Валюты.НайтиПоКоду("643"));
ОтборПоЭлементам.Добавить(Справочники.Валюты.НайтиПоКоду("978"));
// присвоим значение отбора
НовыйПараметрВыбора.Значение = ОтборПоЭлементам;
// установим признак использования нашей настройки
ПараметрыВыбора.Использование = Истина;
КонецЕсли;
// также можно и заменить стандартную форму выбора
ФормаВыбора = Поле_Валюта.ПараметрыРедактирования.Элементы.Найти(Новый ПараметрКомпоновкиДанных("ФормаВыбора"));
Если НЕ ФормаВыбора = Неопределено Тогда
ФормаВыбора.Значение = "Справочник.Валюты.Форма.ФормаСписка";
ФормаВыбора.Использование = Истина;
КонецЕсли;
КонецЕсли;

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

ЗначениеВРеквизитФормы(ОтчетОбъект,"Отчет");


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

 

В моем примере устанавливается отбор на выбор "Валюты". В результате получаем, что пользователь не сможет выбрать другие элементы, кроме "Руб" и "Евро".

 

 

 

Тестировалось на платформе 8.3.13.1644

Управление торговлей, редакция 11 (11.4.3.137)

7 Comments

  1. VmvLer

    Тему логичнее назвать

    «Программная установка ограничений выбора значений параметров СКД»

    Reply
  2. Isonic

    (1) В публикации не только про ограничение выбора. Есть пример с подменой стандартной формы выбора.

    Reply
  3. VmvLer

    (2) если вести со мной дальше диалог, то я найду еще 100500 противоречий в вашей поделке?

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

    в заблуждение неискушенные умы, а на второй взгляд — код очень условный и монстроидальный.

    Reply
  4. Isonic

    (3) Сядьте и напишите свою статью. А мы все дружно посмотрим и оценим)

    Reply
  5. VmvLer

    (4) У меня нет таланта в дружеской формулировке мыслей.

    Обычно, после прочтения первых абзацев у читателей

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

    парадокс(

    Reply
  6. dandykry

    Для БСП в модуле объекта отчета

    Функция СведенияОВнешнейОбработке() Экспорт
    
    ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке(«2.4.5.33»);
    ПараметрыРегистрации.ОпределитьНастройкиФормы = Истина;  //Строка из-за которой приведен кусок
    
    //………………………………………….//
    
    
    Возврат ПараметрыРегистрации;
    
    КонецФункции
    
    
    
    // Настройки общей формы отчета подсистемы «Варианты отчетов».
    //
    // Параметры:
    //   Форма — УправляемаяФорма — Форма отчета.
    //   КлючВарианта — Строка — Имя предопределенного варианта отчета или уникальный идентификатор пользовательского.
    //   Настройки — Структура — см. возвращаемое значение ОтчетыКлиентСервер.ПолучитьНастройкиОтчетаПоУмолчанию().
    //
    Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт
    
    Настройки.События.ПередЗагрузкойНастроекВКомпоновщик = Истина;
    
    КонецПроцедуры
    
    
    Процедура ПередЗагрузкойНастроекВКомпоновщик(Контекст, КлючСхемы, КлючВарианта, НовыеНастройкиКД, НовыеПользовательскиеНастройкиКД) Экспорт
    
    Если ТипЗнч(Контекст) = Тип(«УправляемаяФорма») Тогда
    НастроитьПараметрыОтчетаПоВариантуОтчета(Контекст.НастройкиОтчета, НовыеНастройкиКД, НовыеПользовательскиеНастройкиКД);
    ОтчетыСервер.ПодключитьСхему(ЭтотОбъект, Контекст, СхемаКомпоновкиДанных, КлючСхемы);
    КонецЕсли;
    
    КонецПроцедуры
    
    Процедура НастроитьПараметрыОтчетаПоВариантуОтчета(НастройкиОтчета, НовыеНастройкиКД, НовыеПользовательскиеНастройкиКД)
    
    ПараметрДанныеОтчета = СхемаКомпоновкиДанных.Параметры.Найти(«НужныйПараметр»);
    
    СписокВыбора = Новый СписокЗначений;
    
    //Некий запрос
    
    РезультатЗапроса = Запрос.Выполнить().Выбрать();
    
    Пока РезультатЗапроса.Следующий() Цикл
    СписокВыбора.Добавить(РезультатЗапроса.Ссылка, РезультатЗапроса.Наименование);
    КонецЦикла;
    
    
    ПараметрДанныеОтчета.УстановитьДоступныеЗначения(СписокВыбора);
    
    КонецПроцедуры

    Показать

    Все остальное делается там же

    Reply
  7. Isonic

    (6) Спасибо за пример)

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *