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

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

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 не будет опубликован. Обязательные поля помечены *