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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

КонецЕсли;

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

Т.е. вместо

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

Будет

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

 

19 Comments

  1. VmvLer

    по-моему, в СП и любой типовой в общем модуле по СКД примеров гораздо больше.

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

    Reply
  2. zqzq

    (1) Вы не поверите… Нету там ничего. В своё время решал похожую задачу, отладчик замучал (но решил).

    Автору плюс.

    Reply
  3. oleg-x

    Как раз сегодня решил такую задачку, только там сделал не через пользовательские настройки,а просто через настройки.

    Во всех примерах добавления не было одной строки:

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

    И из-за неё потерял кучу времени, так как без этого не будут работать отборы.

    Reply
  4. qwinter

    Опять ИТС и БСП перепечатывают.

    (3) https://its.1c.ru/db/bsp246doc#content:415:hdoc

    Reply
  5. monkbest

    Это про какую конфу, вид клиента? Где этот код расположен? в форме / в модуле, сервер / клиент, обычное приложение / управляемое? Конфа с БСП / без БСП?

    где можно применить эти советы?

    Reply
  6. the1

    (5) Кстати да

    Reply
  7. Unk92

    (1) А вы загляните и скиньте примеры методов, которые делают тоже самое..

    Reply
  8. Unk92

    (4)Я не претендовал на то, что это статья уникальна в своем роде. На ИТС по вашей ссылке описан один из методов БСП, если хотите, то в данной статье просто показано, как это работает внутри.

    П.С. Если не интересно, то можно всегда пройти мимо =)

    Reply
  9. VmvLer

    (7) откройте общий модуль ОбщегоНазначенияКлиентСервер изучайте примеры, а если проискать по общим модулям «Отбор», то можно еще найти примеры.

    А в примерах автора топика я не увидел, что есть хоть намек на иерархии, а в настойках иерархия сплошь и рядом.

    Reply
  10. Unk92

    (5) В самом начале есть пример кода, который открывает отчет СКД с параметрами.

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

    Отчет = Отчеты.муОтчет.СоздатьОбъект();

    КомпоновщикНастроек = Отчет.КомпоновщикНастроек;

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

    Вернемся к вашим вопросам.

    1. «Это про какую конфу». Это про любую конфу, т.к. речь идет о механизмах платформы 1с 8.3

    2. «Вид клиента». Естественно, что объект вы создаете на сервере, а открываете отчет на клиенте (у данной статьи нет цели рассказывать про клиент серверную архитектуру)

    3. «Где этот код расположен». В месте, где вам нужно открыть отчет =)

    4. «обычное приложение / управляемое?». Управляемое приложение

    5. «Конфа с БСП / без БСП». Без разницы, это не функционал БСП.

    П.С. По-моему часть ваших вопросов только ради вопросов…

    Reply
  11. bulpi

    Ковырять типовые конфы, чтобы это найти- лучше сразу в дурдом. Автор молодец, вот только для меня поздно. Уже сам с большими мучениями это освоил.

    Reply
  12. monkbest

    (9)

    П.С. По-моему часть ваших вопросов только ради вопросов…

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

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

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

    Из Вашего ответа я понял, что в УТ 11 я смогу протестить этот код и если все получиться «намотать на ус»

    Reply
  13. Unk92

    (10)

    я не увидел, что есть хоть намек на иерархии

    Я так полагаю, что речь идет о группах отборов «И», «Или», «Не».

    Если так, то я учел ваш комментарий и дописал статью.

    Reply
  14. VmvLer

    (11) Я, думаю у многих была такая ситуация, когда вы что-то велосипедили день-два, а потом произносили «твою …», когда обнаружили требуемый функционал в модуле формы, объекта, менеджера.

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

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

    Если вы не согласны со мной сейчас, то вам еще необходимо время и опыт на понимание того, что я прав.

    Reply
  15. Unk92

    (12) Посмотрел код типовой УТ 11, должно все сработать, если делать по аналогии с тем. что написано в статье. Т.е. передавать пользовательские настройки через параметры открытия формы.

    П.С. Сам в УТ 11 не пробовал =)

    Reply
  16. Fruit83

    (14)

    в которых миллионы строк кода, который очень часто лаконичен

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

    Reply
  17. insurgut

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

    Например, если отчет — у него несколько вложенных. На форме параметр — список складов. Пользователь если устанавливает отбор — то он во вложенных схемах отработать должен. Если снимает, то отчеты выводятся без отбора по складу. Если с заполненным параметром все вроде как работает, то стоит на форме снять галочку отбора по складу, как вложенные схемы выдают «Не заполнено значение параметра», и это при том, что в самом запросе вложенной схемы используется конструкция {ГДЕ ВложенныйЗапрос.Склад В (&СпиокСкладов)}

    Reply
  18. Unk92

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

    П.с. скорее всего ваша задача решается проще, чем то, как вы ее пытаетесь решить

    Reply
  19. AgentNiCho

    (3)

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

    Спасибо большое за подсказку — тоже потерял кучу времени на этом.

    Reply

Leave a Comment

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