Продвинутый курс. Занятие №10

Заключительное занятие 1-го блока продвинутого курса.

Необходимо изучить следующие главы текущего блока.
Глава 10. Разработка управляемых форм.
Глава 11. Открытие управляемых форм.
Глава 12. Параметры управляемых форм.
Глава 13. Запись в управляемых формах.
Глава 14. Отображение и настройка списков.
Глава 15. Элементы формы.
Глава 16. Команды формы.
Глава 17. Программная модификация форм.
Глава 18. Оптимизация работы управляемых форм.
Глава 19. Сообщение пользователю.
Глава 20. Примеры работы с управляемыми формами.

К сожалению, у Вас недостаточно прав для просмотра этой записи. Если Вы еще не залогинены на сайте
залогиньтесь.

Если не активировали токен — посмотрите видео-инструкцию (видео N5)

Если вы залогинены, у Вас активирован токен доступа, но вы все равно видите эту запись —
напишите нам на e-mail поддержки.

комментарий 41 на “Продвинутый курс. Занятие №10”

  1. Задание выполнено.

    Первая часть задания реализована посредством запуска внешней обработки с помощью параметра /execute командной строки. Требуемый отбор журнала документов реализован с помощью настройки отбора динамического списка.

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

    Обратная связь по 1-му блоку.

    1. Что узнал нового:
    – вопросы оптимизации производительности;
    – приемы работы с управляемыми формами;
    – некоторые приемы работы с запросами.

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

    3. Информации достаточно.  Спасибо.

  2. Добрый день.
    Подскажите, плз.
    Есть задача рассчитать цены и загрузить в документ “установка цен компании”. Документ не записывать – открыть.
    Загрузить сделал, открывается. Но после открытия формы нужно изменить реквизиты формы. Не могу понять как сделать – есть таблица значений и там нужно изменить значения.
    Создал серверную процедуру – передаю туда коллекцию. Пишет “нельзя изменять поле содержащее данные формы”.
    Что бы воспользоватья методом “РеквизитФормыВЗначение” надо быть на сервере. Но на сервер нельзя передать форму нового документа…
    Как решить эту задачу?

    • Используйте контекстную серверную процедуру.
      И это самое оптимальное решение при работе с коллекциями (мы этот момент отмечали в главах по оптимизации).

  3. Добрый день.
    Есть внешний отчет.  Реквизит формы – табличный документ (ТД).
    Заполняется ТД из экселя, с помощью  процедуры “наСервереБезКонтекста”. В процедуру передается как параметр. Процедура отрабатывает, ТД заполняется и на форме отображается.
    Затем надо из этого ТД заполнить таблицу значений. Из клиентской процедуры вызывается серверная , где идет обработка. И тут проблема – В клиентской высота ТД ненулевая, а в серверной уже нулевая. и по выходу из серверной в клиентской уже тоже нулевая. На форме ТД отображается.
    Пришлось сделать запонение ТД не “наСервереБезКонтекста”, а “наСервере”. Тогда все заработало.
    В чем проблема может быть?

    • Интересное поведение.
      Несколько вопросов.
      >Пришлось сделать запонение ТД не «наСервереБезКонтекста», а «наСервере».
      Правильно я понял, что речь идет о заполнении таблицы значений на сервере, а не ТД.

      Релиз платформы используется последний?

      Сделайте демонстрационный пример. Создайте обработку, заполните ТД (не обращаясь к Excel, просто выведите одну ячейку), рассмотрим проблему детальнее.

      • заполняется «наСервереБезКонтекста» именно табличный документ. а потом из него (другой командой) заполняется таблица значений.
         

      • и еще вопрос:
        у реквизита формы “табличный документ” есть признак “сохраняемые данные” (если войти в сам реквизит). но в дереве реквизитов этот признак почему то не отображается (в отличие от других элементов). соответсвенно данные не сохраняются.

        • Возможно Вы путаете “Сохраняемые данные” и “Использовать всегда”, либо “Сохраняемые данные” и признак сохранения данных в настройках формы.
          Важно понимать, что установка “Сохраняемые данные” будет влиять на модицифированность формы при корректировки реквизита пользователем (есть еще ряд нюансов, например автоматически устанавливается объектная блокировка), но не влияет на сохранение данных в настройках формы.

  4. Задание выполнила. Использовала внешнюю обработку. Для запуска в параметрах командной строки использовала Execute. Отбор и условное форматирование делала программно. С этим пришлось повозиться.
    Новое – программная работа с управляемыми формами, оптимизация запросов, клиент-серверного взаимодействия.

  5. еще вопрос.
    есть отчет (внешний).
    есть 2 таблицы значений.  у первой ТЗ колонка выводит данные из второй ТЗ.  поиск идет по определенному полю.
    в обычном режиме можно задейстовать события “приПолученииДанных” и “ПриВыводеСтроки”. В упр.режиме таких событий нет.
    как решить эту задачу?

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

      Сделать это можно либо алгоритмическим путем (перебор строк ТЗ), либо запросом (поместив ТЗ во временные таблицы).

      Если это решение Вас не устраивает, опишите более конкретно задачу.

      • Пришлось сделать как Вы предлагаете. Но мне кажется это не совсем оптимальный вариант. Если таблицы большие, то возможны тормоза (например при открытии – при восстановлении настроек).
        А событие “ПриПолученииДанных” позволяло получать данные порциями и используя алгоритмы кэширования работало все довольно быстро.
        Задача:
        есть ТЗ1 и ТЗ2 – загружаются из Excel.
        ТЗ1 (соответствие номенклатуры кодам ТНВЭД) – артикул, наименование, кодТНВЭД.
        ТЗ2 (справочник ТНВЭД) – кодТНВЭД, наименование ТНВЭД.
        На форме в ТЗ1 хотелось бы иметь колонку, где отображалось бы наименованиеТНВЭД из ТЗ2 (ключевое поле – кодТНВЭД).

        • Полагаю, что загрузка таблиц из Excel идет сильно дольше, чем создание временной таблицы. А уж выполнение запроса к временной таблице должно быть мгновенным.
          У вас иные результаты?

          • Согласен, что загрузка идет дольше. Но эти таблицы сохраняются и восстанавливаются при открытии. + идет поиск в справочнике “Номенклатура” на соответствие артикулу – если артикул в справочнике есть , то красить строку черным , иначе красным.
            Примеров можно придумать много – с табличной частью документа. Не станешь же создавать реквизит…
            Не совсем понятно почему отказались от событий “ПриПолученииДанных” и “ПриВыводеСтроки” – это затрудняет работу.

            • Изменилась архитектура платформы, видимо поэтому и отказались…

  6. Добрый день.
    Подскажите, плз, аналог “Состояние”. Раньше было удобно туда выводить прогресс (загрузки например – типа “стр 23 из 100”).
    Чем сейчас это можно заменить?
     

    • Но ведь и сейчас есть функция Состояние(), доступная в тонком клиенте.
      Она выводит самый настоящий прогресс-бар.

      • Загрузка идет на сервере, т.к. загружается в таблицу значений. Какая есть возможность отобразить прогресс загрузки?

        • На сервере нельзя сделать никакой интерфейсный вывод.
          Ведь код выполняется на сервере.
          Вывод нужно делать на клиенте.

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

  7. Добрый день.
    Поскажите, плз, как управлять доступность переключателя.
    Пример: есть переключатель с 3 значениями. Как сделать так чтоб ббыла возможность заблокировать одно значение, а выбирать только из 2 оставшихся? Ведь управляющий элемент только один.
     

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

  8. Добрый день.
    Есть реквизит формы типа “ТаблицаЗначений”. Структура генерируется програмно. Програмно добавляется элемент формы связанный с этой ТЗ и ее колонками.

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

    Пример:
    в ТЗ добавили 2 строки. В элементе это будут строки с индексами 0 и 1. Потом ТЗ очистили, сгенерили колонки , поместили обратно на форму. В связанном элементе это будут индексы 3 и 4.

    • Это штатное поведение системы. Таблица формы обеспечивает уникальные номера строк в пределах жизни формы.
      Чтобы получить настоящий индекс строки нужно обратиться к идентификатору ДанныеФормыЭлементКоллекции.
      Например, так:
      Элементы.Таблица.ТекущиеДанные.ПолучитьИдентификатор();
      Элементы.Таблица.ДанныеСтроки(НомерСтроки).ПолучитьИдентификатор();

      Далее, по этому идентификатору можно обращаться к данным формы, например
      Объект.ДанныеТовары[ПолученныйИдентификатор]

      • что -то не получается.
        есть ТЗ, на форме отображается. состоит из 2 строк. запоминается и восстанавливается при открытии формы.
        Задача:
        проверять, что это первая строка и не давать редактировать.
        использую событие “ПередНачаломИзменения”.
        Если стоим на 1ой строке и использовать код “Элемент.ТекущиеДанные.ПолучитьИдентификатор() ” выдает 2.  Где “элемент” это элемент на форме.
        “ТаблицаСоответствий[Элемент.ТекущиеДанные.ПолучитьИдентификатор()]” выдает сообщение “индекс находится за границами массива”.
         

        • Прошу прощения.
          Метод ПолучитьИдентификатор() как раз и возвращает уникальный номер элемента коллекции, не зависящий от строки.

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

          То есть в Вашем случае:
          ТаблицаСоответствий.НайтиПоИдентификатору(Элемент.ТекущиеДанные.ПолучитьИдентификатор());

  9. 1. Создал внешнюю обработку, в которой в событии ПриОткрытии открывается форма списка Реализаций с отбором. Для запуска этой обработки во время старта системы указал в дополнительных параметры запуска ключ /Execute и путь к обработке.

    Форма = ПолучитьФорму(“Документ.РеализацияТоваровИУслуг.ФормаСписка”);
    Отбор = Форма.Список.Отбор;

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

    ЭлементПроведен = ГруппаОтбора.Элементы.Добавить(Тип(“ЭлементОтбораКомпоновкиДанных”));
    ЭлементПроведен.Использование = Истина;
    ЭлементПроведен.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(“Проведен”);
    ЭлементПроведен.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    ЭлементПроведен.ПравоеЗначение = Истина;

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

    ЭлементДатаНачала = ГруппаОтбораДат.Элементы.Добавить(Тип(“ЭлементОтбораКомпоновкиДанных”));
    ЭлементДатаНачала.Использование = Истина;
    ЭлементДатаНачала.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(“Дата”);
    ЭлементДатаНачала.ВидСравнения = ВидСравненияКомпоновкиДанных.БольшеИлиРавно;
    ЭлементДатаНачала.ПравоеЗначение = НачалоДня(ТекущаяДата());

    ЭлементДатаНачала = ГруппаОтбораДат.Элементы.Добавить(Тип(“ЭлементОтбораКомпоновкиДанных”));
    ЭлементДатаНачала.Использование = Истина;
    ЭлементДатаНачала.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(“Дата”);
    ЭлементДатаНачала.ВидСравнения = ВидСравненияКомпоновкиДанных.МеньшеИлиРавно;
    ЭлементДатаНачала.ПравоеЗначение = КонецДня(ТекущаяДата());

    Форма.Открыть();
    Отказ = Истина;

    2. Добавил перечисление с тремя цветами и реквизит в документ. При создании формы списка добавляется три элемента условного оформления, вот вариант одного из них

    Оформление = Список.УсловноеОформление.Элементы.Добавить();
    Оформление.Использование = Истина;
    Отбор = Оформление.Отбор.Элементы.Добавить(Тип(“ЭлементОтбораКомпоновкиДанных”));
    Отбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(“ЦветОформленияВЖурнале”);
    Отбор.ПравоеЗначение = Перечисления.Цвета.Красный;
    Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    Оформление.Оформление.УстановитьЗначениеПараметра(“ЦветФона”, WebЦвета.Красный);

    Обратная связь.
    1.Практически весь материал был новым, поэтому сильно менять взгляды не пришлось. Однако после изучения глав по оптимизации, кое-где пришлось пересмотреть собственные подходы в разработке и менять программный код в собственной конфигурации. Например, пересчет табличных частей вынести на сервер, а также пересмотреть подход по передаче данных между формой документа и формой подбора номенклатуры.
    2.Конечно же запросы на первом месте. Помогает разобраться только самостоятельное выполнение практических задач. Как бы коряво и не оптимально они не выполнялись, однако только после их выполнения можно оценить всю элегантность эталонного решения.
    3.Сложно сказать чего-бы еще хотелось. Хотя тема с регулярными выражениями мне показалась какой-то недосказанной. Из уроков не совсем понятно, как в шаблонах оператора LIKE использовать спецсимволы в качестве самих себя. И еще мне на практике пришлось решить задачу о передаче параметров из модуля объекта ОбработкаЗаполнения в модуль формы ПриСозданииНаСервере через общий модуль с кешированием возвращаемых значений, как это и рекомендуется в уроках. Не сразу дошло, как это реализовать, поэтому думаю, что разбор практического примера не помешает.

  10. Задание сделала.
    1. Создала внешнюю обработку которая запускается через параметр командной строки /Execute.
    Сначала пыталась настроить отбор через процедуру ОткрытьФорму, но не получилось создать в отборе группу, поэтому сначала получаю форму, а потом настраиваю отбор.
    &НаКлиенте
    Процедура ПриОткрытии(Отказ)
    ФормаДокумента = ПолучитьФорму(“Документ.РеализацияТоваровИУслуг.ФормаСписка”);

    ГруппаЭлементовОтбораИЛИ = ФормаДокумента.Список.Отбор.Элементы.Добавить(Тип(“ГруппаЭлементовОтбораКомпоновкиДанных”));
    ГруппаЭлементовОтбораИЛИ.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИли;
    ГруппаЭлементовОтбораИЛИ.Использование = Истина;

    ЭлементОтбора = ГруппаЭлементовОтбораИЛИ.Элементы.Добавить(Тип(“ЭлементОтбораКомпоновкиДанных”)); ЭлементОтбора.Использование = Истина;
    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(“Проведен”);
    ЭлементОтбора.ПравоеЗначение = Истина;

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

    ЭлементОтбора = ГруппаЭлементовОтбора.Элементы.Добавить(Тип(“ЭлементОтбораКомпоновкиДанных”));
    ЭлементОтбора.Использование = Истина;
    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.БольшеИлиРавно;
    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(“Дата”);
    ЭлементОтбора.ПравоеЗначение = НачалоДня(ТекущаяДата());

    ЭлементОтбора = ГруппаЭлементовОтбора.Элементы.Добавить(Тип(“ЭлементОтбораКомпоновкиДанных”));
    ЭлементОтбора.Использование = Истина;
    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.МеньшеИлиРавно;
    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(“Дата”);
    ЭлементОтбора.ПравоеЗначение = КонецДня(ТекущаяДата());

    ФормаДокумента.Открыть();
    Отказ = Истина;
    КонецПроцедуры
    2. Реквизит ЦветДокумента сделала типа Перечисление. Условное оформление устанавливаю так для каждого цвета.
    Оформление = Список.УсловноеОформление.Элементы.Добавить();
    Оформление.Использование = Истина;
    Отбор = Оформление.Отбор.Элементы.Добавить(Тип(“ЭлементОтбораКомпоновкиДанных”));
    Отбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(“ЦветДокумента”);
    Отбор.ПравоеЗначение = Перечисления.Цвета.Желтый;
    Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    Отбор.Использование = Истина;
    Оформление.Оформление.УстановитьЗначениеПараметра(“ЦветФона”, WebЦвета.Желтый);
    Хотелось сделать универсальней, через
    //Отбор.ПравоеЗначение = Перечисления.Цвета.ПустаяСсылка();
    //Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.НеРавно;
    //Оформление.Оформление.УстановитьЗначениеПараметра(“ЦветФона”, …);
    но не поняла можно ли тут обратится к значению элемента динамического списка.
    По обратной связи: нового для меня лично – очень много, интересны механизмы работы с управляемыми формами, пакетные запросы раньше не использовала, к сожалению времени маловато, со всех сил стараюсь не отставать, но не всегда это получается.

  11. respublica 12.06.2011 в 21:01

    Задание выполнено.
    В виде внешних средст выбрал запуск обработки через доп. параметр запуска “/execute d:\temp\opentest.epf “. В обработчике “ПриОткрытии” получаю форму списка документов “реализации..” и в ней программно настраиваю отбор и условное оформление. Большой неожиданностью стало, что в системном перечислении ВидСравненияКомпоновкиДанных  нет значения Интервал, для отбора по дате пришлось создавать доп. группу отбора :)
    Пример установки отбора:
    <code>
    мЭлементыДостПолей = мОтбор.ДоступныеПоляОтбора.Элементы;

    ГруппаОтбора = мОтбор.Элементы.Добавить(Тип(“ГруппаЭлементовОтбораКомпоновкиДанных”));
    ГруппаОтбора.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИли;

    ЭлементОтбора = ГруппаОтбора.Элементы.Добавить(Тип(“ЭлементОтбораКомпоновкиДанных”));
    ЭлементОтбора.Использование = Истина;
    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    ЭлементОтбора.ИдентификаторПользовательскойНастройки = “Проведен”;
    ЭлементОтбора.ЛевоеЗначение = мЭлементыДостПолей.Найти(“Проведен”).Поле;
    ЭлементОтбора.ПравоеЗначение = Истина;
    </code>
    Пример установки условного оформления:
    <code>
    ЭлементУслОформления = мУсловноеОформлениеЭлементы.Добавить();
    ЭлементУслОформления.Использование = Истина;
    ЭлементОформления = ЭлементУслОформления.Оформление.Элементы.Найти(“ЦветФона”);
    ЭлементОформления.Использование = Истина;
    ЭлементОформления.Значение = Новый Цвет(255, 0, 0); // красный

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

    мПоля = ЭлементУслОформления.Поля;
    Для Каждого мПоле ИЗ мПоля.ДоступныеПоляОформляемыхПолей.Элементы Цикл
    мПолеДоб = мПоля.Элементы.Добавить();
    мПолеДоб.Поле = мПоле.Поле;
    КонецЦикла;

    </code>
    1.  Намного расширил свои представления об оптимизации кода (касается и запросов, и работы с объектами и формами), работе с запросами. Очень много нового узнал из глав, посвященных работе с управляемыми формами.
    2.  Работа с командами. Материал полностью новый для меня. Для усвоения переслушал материал и поэкспериментировал на платформе.
    3.  Оптимизацию работы управляемых форм. Например, в программном коде “Библиотеки стандартных подсистем” для меня неясны очень многие применяемые решения, как я понимаю, они обусловлены анализов показателей производительности. Но может быть это придет с опытом.

  12. 1. Создадим вспомогательную внешнюю  обработку, у которой в форме в событии “ПриОткрытии” будем открывать форму списка реализаций и устанавливать отбор.  Обработку будем запускать с помощью параметра запуска /Execute <имя файла внешней обработки>.

    &НаКлиенте
    Процедура ПриОткрытии(Отказ)
    Форма=ПолучитьФорму(“Документ.РеализацияТоваровИУслуг.Форма.ФормаСписка”);
    Отбор=Форма.Список.Отбор.Элементы.Добавить(Тип(“ГруппаЭлементовОтбораКомпоновкиДанных”));
    Отбор.ТипГруппы=ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИли;
    Отбор.Использование=истина;

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

    ЭлементОтбора=Отбор.Элементы.Добавить(Тип(“ЭлементОтбораКомпоновкиДанных”));
    ЭлементОтбора.ЛевоеЗначение=Новый ПолеКомпоновкиДанных(“Дата”);
    ЭлементОтбора.ПравоеЗначение=НачалоДня(ТекущаяДата());
    ЭлементОтбора.ВидСравнения=ВидСравненияКомпоновкиДанных.БольшеИлиРавно;
    ЭлементОтбора.Использование=истина;

    Форма.Открыть();
    Закрыть();
    КонецПроцедуры

    2. Для реквизита документа “Цвет” установим значение Перечисления.Цвета. В форме списка при создании на сервере для каждого элемента перечисления добавляем условное оформление:
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Для каждого Элемент из Перечисления.Цвета цикл
    ДобавитьЭлементУсловногоОФормления(Элемент);
    КонецЦикла;
    КонецПроцедуры

    &НаСервере
    Процедура ДобавитьЭлементУсловногоОформления(Элемент)
    Если Элемент=Перечисления.Цвета.Красный тогда
    Цвет=Новый Цвет(255,0,0);
    ИначеЕсли Элемент=Перечисления.Цвета.Зеленый тогда
    Цвет=Новый Цвет(0,255,0);
    ИначеЕсли Элемент=Перечисления.Цвета.Желтый тогда
    Цвет=Новый Цвет(255,255,0);
    КонецЕсли;

    Оформление=Список.УсловноеОформление.Элементы.Добавить();
    Оформление.Использование=истина;
    Отбор=Оформление.Отбор.Элементы.Добавить(Тип(“ЭлементОтбораКомпоновкиДанных”));
    Отбор.ЛевоеЗначение=Новый ПолеКомпоновкиДанных(“Цвет”);
    Отбор.ПравоеЗначение=Элемент;
    Отбор.ВидСравнения=ВидСравненияКомпоновкиДанных.Равно;
    Отбор.Использование=истина;
    Оформление.Оформление.УстановитьЗначениеПараметра(“ЦветФона”,Цвет);
    КонецПроцедуры

    Вопросы:
    1. Новое – команды и работа с управляемыми формами. В запросах – пакеты запросов, использование временных таблиц.
    2. Затруднения были в задачах с рекурсией.
    3. Оптимизация производительности в других СУБД, в частности в PostgreSQL.

  13. Задание выполнено.
    Для открытия формы списка использовал внешнюю обработку, которая запускается при старте системы с помощью ключа /execute.
    Цвет в документе задается с помощью нового перечисления Цвета (три значения – Красный, Желтый, Зеленый). Отбор документов по признаку проведенности и дате, а также цветовое оформление в списке выполняется программно при открытии формы через обработку. Текст модуля обработки:
    <code>
    Процедура ПриОткрытии(Отказ)
    Отказ = Истина;    
    Форма = ПолучитьФорму(“Документ.РеализацияТоваровИУслуг.ФормаСписка”);

    ЭлементыОтбора = Форма.Список.Отбор.Элементы;
    ЭлементыОтбора.Очистить();
    Группа1 = ЭлементыОтбора.Добавить(Тип(“ГруппаЭлементовОтбораКомпоновкиДанных”));
    Группа1.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИли;

    ОтборПроведен = Группа1.Элементы.Добавить(Тип(“ЭлементОтбораКомпоновкиДанных”));
    ОтборПроведен.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    ОтборПроведен.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(“Проведен”);
    ОтборПроведен.ПравоеЗначение = Истина;

    Группа2 = Группа1.Элементы.Добавить(Тип(“ГруппаЭлементовОтбораКомпоновкиДанных”));
    Группа2.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ;

    ОтборПоДате1 = Группа2.Элементы.Добавить(Тип(“ЭлементОтбораКомпоновкиДанных”));
    ОтборПоДате1.ВидСравнения = ВидСравненияКомпоновкиДанных.БольшеИлиРавно;
    ОтборПоДате1.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(“Дата”);
    ОтборПоДате1.ПравоеЗначение = НачалоДня(ТекущаяДата());

    ОтборПоДате2 = Группа2.Элементы.Добавить(Тип(“ЭлементОтбораКомпоновкиДанных”));
    ОтборПоДате2.ВидСравнения = ВидСравненияКомпоновкиДанных.МеньшеИлиРавно;
    ОтборПоДате2.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(“Дата”);
    ОтборПоДате2.ПравоеЗначение = КонецДня(ТекущаяДата());

    ЭлементыОформления = Форма.Список.УсловноеОформление.Элементы;
    ЭлементыОформления.Очистить();

    ЦветКрасный = ЭлементыОформления.Добавить();
    ЦветКрасныйОтбор = ЦветКрасный.Отбор.Элементы.Добавить(Тип(“ЭлементОтбораКомпоновкиДанных”));
    ЦветКрасныйОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    ЦветКрасныйОтбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(“Цвет”);
    ЦветКрасныйОтбор.ПравоеЗначение = ПредопределенноеЗначение(“Перечисление.Цвета.Красный”);
    ЦветКрасный.Оформление.УстановитьЗначениеПараметра(“ЦветФона”, Новый Цвет(255,0,0));

    ЦветЖелтый = ЭлементыОформления.Добавить();
    ЦветЖелтыйОтбор = ЦветЖелтый.Отбор.Элементы.Добавить(Тип(“ЭлементОтбораКомпоновкиДанных”));
    ЦветЖелтыйОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    ЦветЖелтыйОтбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(“Цвет”);
    ЦветЖелтыйОтбор.ПравоеЗначение = ПредопределенноеЗначение(“Перечисление.Цвета.Желтый”);
    ЦветЖелтый.Оформление.УстановитьЗначениеПараметра(“ЦветФона”, Новый Цвет(255,255,0));

    ЦветЗеленый = ЭлементыОформления.Добавить();
    ЦветЗеленыйОтбор = ЦветЗеленый.Отбор.Элементы.Добавить(Тип(“ЭлементОтбораКомпоновкиДанных”));
    ЦветЗеленыйОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    ЦветЗеленыйОтбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(“Цвет”);
    ЦветЗеленыйОтбор.ПравоеЗначение = ПредопределенноеЗначение(“Перечисление.Цвета.Зеленый”);
    ЦветЗеленый.Оформление.УстановитьЗначениеПараметра(“ЦветФона”, Новый Цвет(0,255,0));

    Форма.Открыть();
    КонецПроцедуры
    </code>
    Если требуется постоянное цветовое оформление, то его можно настроить в конфигураторе в форме списка документа (среди прочих свойств динамического списка).

    • Как и все предыдущие, текущий блок принес довольно много новых знаний. Очень полезной была глава про запросы, задачки на эту тему заставили поломать голову, но зато пришла уверенность в том, что я стал понимать их гораздо лучше. Также было много новой и полезной информации по работе с управляемыми формами вообще и динамическим списком в частности.
      Не знаю к какому блоку это имеет отношение, но хотелось бы мастер-группу на тему работы с Web, парсинга и генерации HTML-страниц, web-сервисов.

  14. Задание выполнено
    1.  В параметрах запуска прописал /execute “c:\temp\open.epf”. Для понимая установки программного отбора сначала сделал все в конфигураторе в свойстве Списка, в отладчке посмотрел как выглядит коллекция элементов отбора. Далее в обработчике ПриОткрытии формы обработки:
    <code>
    ФормаРеализаций = ОткрытьФорму(“Документ.РеализацияТоваровИУслуг.ФормаСписка”, );

    Фильтр = ФормаРеализаций.Список.Отбор.Элементы.Добавить(Тип(“ЭлементОтбораКомпоновкиДанных”));
    Фильтр.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(“Проведен”);
    Фильтр.ПравоеЗначение = Истина;
    Фильтр.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    Фильтр.Использование = Истина;

    Фильтр = ФормаРеализаций.Список.Отбор.Элементы.Добавить(Тип(“ЭлементОтбораКомпоновкиДанных”));
    Фильтр.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(“Дата”);
    Фильтр.ПравоеЗначение = НачалоДня(ТекущаяДата());
    Фильтр.ВидСравнения = ВидСравненияКомпоновкиДанных.БольшеИлиРавно;
    Фильтр.Использование = Истина;

    Фильтр = ФормаРеализаций.Список.Отбор.Элементы.Добавить(Тип(“ЭлементОтбораКомпоновкиДанных”));
    Фильтр.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(“Дата”);
    Фильтр.ПравоеЗначение = КонецДня(ТекущаяДата());
    Фильтр.ВидСравнения = ВидСравненияКомпоновкиДанных.МеньшеИлиРавно;
    Фильтр.Использование = Истина;

    ФормаРеализаций.Открыть();

    Отказ = Истина;
    </code>
    2. Сначала хотел сделать универсально с помощью ДиалогВыборЦвета. Установка реквизита и отображение цвета прошла на ура, но вот программная настройка оформления формы списка, увы, не вышла =(
    В общем, разместил реквизит Цвет(Тип строка) на форме, выставил ему КнопкуСпискаВыбора, обозначил в СпискеВыбора 3 значения (“Красный”, “Синий”, “Зеленый”)  ну и в форме списка настроил условное оформление, сосотящее из 3-х элементов. Все работает, но ощущение чего-то недоделанного не покидает.
    Обратная связь:
    1. Абсолютно новым для меня было практически все, что связано с управляемыми формами, но самым увлекательным все таки любимые запросы
    2. Самым трудным для меня оказалось домашняя работа №8, задание по которой я, откровенно говоря не выполнил. Все жду как появятся полные выходные для детального разбора задачи и еще одной попытки самостоятельного решения
    3.  Еще больше хотелось окунуться в построение сложных запросов, имеющих практический смысл в реальных задачах. Особенно понравились заключительные уроки 7 главы, а именно формат “Постановка Задачи – Решения”

  15. Кононов Сергей 08.06.2011 в 23:29

    Задание выполнил.
    Обе задачи я объединил в одну.  В конфигурации добавил реквизит в документе Реализация Цвет – типа Перечисление, где указал наши три цвета.
    1. Так как код править нельзя, то  я создал внешнюю обработку и запускаю ее вместе с системой с при помощи параметра /Execute. В обработке я создал реквизит ПараметрыФормы типа Произвольный и фому обработки. При открытии обработки я буду в процедуре ПриСозданииНаСервере формировать Параметры отбора и условного оформления для передачи их и открытия формы списка документов Реализации. Далее в процедуре формы моей обработки ПриОткрытии я открываю форму списка документов Реализация и передаю параметры с отбором и оформлением в нее. И выставляю параметру процедуры моей обработки Отказ в Истина, чтобы моя пустая форма обработки н открывалась для пользователя. Таким образом обработка служит только для указания отбора и условного оформления для списка документов Реализация. Приведу код ниже :
    <cod>

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

    ПараметрыФормы = Новый Структура;

    // Условие на проведенность
    ПараметрыФормы.Вставить(“Отбор”, Новый Структура(“Проведен”, Истина));

    // Отбор по текущей дате
    ФиксированныеНастройки = Новый НастройкиКомпоновкиДанных;

    ДобавитьЭлементОтбора(“Дата”, ВидСравненияКомпоновкиДанных.БольшеИлиРавно, НачалоДня(ТекущаяДата()), ФиксированныеНастройки);
    ДобавитьЭлементОтбора(“Дата”, ВидСравненияКомпоновкиДанных.МеньшеИлиРавно, КонецДня(ТекущаяДата()), ФиксированныеНастройки);

    // Оформление цветом
    ДобавитьЭлементОформления(Новый Цвет(255,0,0),   Перечисления.ЦветаДляРеализации.Красный, ФиксированныеНастройки);
    ДобавитьЭлементОформления(Новый Цвет(0,255,0),   Перечисления.ЦветаДляРеализации.Зеленый, ФиксированныеНастройки);
    ДобавитьЭлементОформления(Новый Цвет(255,255,0), Перечисления.ЦветаДляРеализации.Желтый, ФиксированныеНастройки);

    ПараметрыФормы.Вставить(“ФиксированныеНастройки”, ФиксированныеНастройки);

    Объект.ПараметрыФормы = ПараметрыФормы;

    КонецПроцедуры
    &НаСервереПроцедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    ПараметрыФормы = Новый Структура;
    // Условие на проведенность ПараметрыФормы.Вставить(“Отбор”, Новый Структура(“Проведен”, Истина));
    // Отбор по текущей дате ФиксированныеНастройки = Новый НастройкиКомпоновкиДанных;
    ДобавитьЭлементОтбора(“Дата”, ВидСравненияКомпоновкиДанных.БольшеИлиРавно, НачалоДня(ТекущаяДата()), ФиксированныеНастройки);
    ДобавитьЭлементОтбора(“Дата”, ВидСравненияКомпоновкиДанных.МеньшеИлиРавно, КонецДня(ТекущаяДата()), ФиксированныеНастройки);
    // Оформление цветом ДобавитьЭлементОформления(Новый Цвет(255,0,0),   Перечисления.ЦветаДляРеализации.Красный, ФиксированныеНастройки);
    ДобавитьЭлементОформления(Новый Цвет(0,255,0),   Перечисления.ЦветаДляРеализации.Зеленый, ФиксированныеНастройки);
    ДобавитьЭлементОформления(Новый Цвет(255,255,0), Перечисления.ЦветаДляРеализации.Желтый, ФиксированныеНастройки);
    ПараметрыФормы.Вставить(“ФиксированныеНастройки”, ФиксированныеНастройки);
    Объект.ПараметрыФормы = ПараметрыФормы;
    КонецПроцедуры
     

    &НаСервереБезКонтекста
    Процедура ДобавитьЭлементОформления(Цвет, ЗначениеОтбора, ФиксированныеНастройки)

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

    ЭлементОформленияЦветФона = ЭлементОформления.Оформление.Элементы.Найти(“ЦветФона”);
    ЭлементОформленияЦветФона.Использование = Истина;
    ЭлементОформленияЦветФона.Значение = Цвет;

    ДобавитьЭлементОтбора(“Цвет”, ВидСравненияКомпоновкиДанных.Равно, ЗначениеОтбора, ЭлементОформления);

    КонецПроцедуры
     
    &НаСервереБезКонтекста
    Процедура ДобавитьЭлементОтбора(ПолеЛевоеЗначение, ВидСравненияОтбора, ЗначениеОтбора, ФиксированныеНастройки)

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

    КонецПроцедуры
    &НаКлиенте Процедура ПриОткрытии(Отказ) // Открытие формы ОткрытьФорму(“Документ.РеализацияТоваровИУслуг.ФормаСписка”, Объект.ПараметрыФормы); Отказ = Истина; КонецПроцедуры

    </cod>

    • Кононов Сергей 08.06.2011 в 23:33

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

  16. Готово! Т.к. код конфигурации менять нельзя, использовал внешнюю обработку и режим запуска /Execute
    Во внешней обработке использовал динамический список. Для реализации раскраски документов отгрузки в документе добавил реквизит (тип “Перечисление”). В динамическом списке через условное оформление раскрашиваю строки.
    Обратная связь:
    1. Самое основное – это запросы! Мой камень преткновения!  :)  Зато теперь есть ощутимый прогресс!
    2. Опять же – запросы. Пока смотришь, вроде все понятно. Как за практику – ниче не понятно.  :)
    3. И снова запросы. Может, какие-нибудь задачки интересные (нестандартные, хитрые) найдутся?  :) СКД еще не скоро.  :)

  17. Задачу решил с помощью внешней обработки и ключа запуска “/Execute”. Во внешней обработке в событии “ПриОткрытии” выставляется параметр “Отказ” в значение “Истина”. После этого с помощью метода “ПолучитьФорму” получаем форму списка документов. Чтобы реализовать отбор, обращаемся к динамическому списку полученной формы, создаем группу условий “ИЛИ”, в которой содержатся два условия согласно заданию. Условное оформление по цветам настраивается с помощью свойства “УсловноеОформление” динамического списка. Для оформления по цветам создаются 3 элемента оформления, каждый из которых соответствует своему цвету. После того, как динамический список настроен, полученная форма открывается.

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