Полезные приемы для управляемых форм

Привет всем, кто недавно взялся за управляемые формы 1С.

Хоть идея заложенная в управляемых формах и весьма интересна, однако после толстого клиента возникает несколько вопросов — решение которых весьма нетривиально.

Содержание:

Начнем с простого:


Как получить Макет внешнего отчета/обработки?

ОбъектТМП = РеквизитФормыВЗначение("Объект");
Макет = ОбъектТМП.ПолучитьМакет("МойМакет");


Как сохранить настройки формы отчета или обработки? 

То что раньше мы делали функциями (толстый клиент)

СохранитьЗначение("Имя", Значение);
Значение = ВосстановитьЗначение("Имя");

Теперь делается так (тонкий клиент/управляемые формы):

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

Здесь стоит пояснить пару нюансов:

  1. Пример приведен для конфигурации Управление торговли 11.х. В УТ 11.х есть несколько стандартных хранилищ. Стандартные хранилища не требуют дополнительного кода т.е. можно пользоваться «КАК ЕСТЬ». Нюанс в том что не все из этих хранилищ будут делать то что вам нужно 🙂 — просто подберите то которое будет работать:
    1. ХранилищеПользовательскихНастроекДинамическихСписков
    2. ХранилищеНастроекДанныхФорм
    3. ХранилищеОбщихНастроек
    4. ХранилищеПользовательскихНастроекОтчетов
    5. ХранилищеСистемныхНастроек
  2. В УТ 11 есть также стандартное хранилище ХранилищеВариантовОтчетов — для него в конфигурации уже написан спец обработчик который требует определенной структуры параметров. Если есть желание — можете разобраться с ними самостоятельно.
  3. Есть также объект ХранилищеНастроек — он предназначен для разработки собственных хранилищ. Здесь нюанс в том, что этот объект сам по себе ничего не делает он предоставляет несколько обработчиков (пустых) в которых надо написать код для сохранения переданных значений. Куда и как сохранять дело сугубо личное, каждого кто решил с этим связаться.


Произвольный отбор в управляемых формах.

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

Итак:

  1. Заводим реквизит формы типа КомпоновщикНастроекКомпоновкиДанных (или реквизит обработки, кому как нравится) — назовем его НовыйОтбор (для примера)
  2. Если развернуть крестиком НовыйОтбор, то внутри мы увидим свойство Настройки, а внутри Настройки увидим Отбор — хватаем отбор мышкой и тащим на форму — в результате увидим форму стандартного отбора как в старые добрые …
  3. Инициализация отбора — просто так заполнить отбор элементами не выйдет. Для этого нужно сделать два шага
    1. Создать макет схемы (пример) — для тех кто в курсе как делать схемы СКД поясню простой принцип (кто не в курсе — смотрим пример): Делаем элементарный запрос (в СКД схеме) вида
      ВЫБРАТЬ
        Номенклатура.Ссылка КАК Номенклатура,
        Номенклатура.Производитель КАК Производитель,
        Склады.Ссылка КАК Склад
      ИЗ
        Справочник.Номенклатура,
        Справочник.Склады
      

      По запросу, СКД определит поля доступные для отбора. Если мы хотим чтобы в отборе были уже какие-то поля добавлены автоматически — идем на закладку Настройки (в СКД) -> Отбор и добавляем там поля в левую часть (не забываем устанавливать значения по умолчанию). Если непонятно — смотрим пример.
      Схему добавляем в макеты обработки/отчета.

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

      Код можно запихать например в функцию ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

  4. Использование отбора — Все элементы отбора находятся здесь:
    НовыйОтбор.Настройки.Отбор.Элементы

    Это коллекция, поэтому обходим её стандартным образом

    Для каждого Элемент ИЗ НовыйОтбор.Настройки.Отбор.Элементы Цикл
      //Строка(Элемент.ЛевоеЗначение) - это то что стоит слева   в отборе (например Номенклатура или Склад.Наименование)
      //Элемент.ПравоеЗначение - это значение отбора (например   реальная группа номенклатуры или склад)
      //Элемент.Использование - Истина - если стоит галка на ст  роке отбора
      //Элемент.ВидСравнения - поле типа ВидСравнения (Например  ВидСравнения.Равно)
    КонецЦикла;

 

PS Статья написана для обычных программистов, чтобы облегчить их жизнь. У кого жизнь и так легкая — завидую.
Будут еще плюшки — допишу в статью.
Будут вопросы пишите в почту: info@agency-sd.ru (не гарантирую что отвечу — работы много, но шанс есть)