Продвинутый курс. Домашнее задание №3

Эта запись посвящена участникам 2-го потока продвинутого курса по программированию.
Третье задание по 0-му блоку продвинутого курса.

Для выполнения рекомендуется изучить следующие главы 0-го курса.
Глава 16.Настройка командного интерфейса конфигурации.
Глава 17. Функциональные опции.
Глава 18. Простые правила разработки интерфейсов.
Глава 19. Работа с метаданными.
Глава 20. Параметры сеанса.

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

комментария 94 на “Продвинутый курс. Домашнее задание №3”

  1. Рекурсию победил. Сделано

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

  3. дз 2 и 3 какие-то нудные :) с трудом, но выполнил
    зы когда думаешь рекурсиями ощущение, что мозг заворачивается :)

  4. V.Platonov 27.11.2010 в 13:30

    Сделал.
    ФО затруднений не вызвали.
    С метаданными больше всего времени потратил на рекурсию,  в итоге получилось следующее:
    процедура выводящее в дерево свойства объекта метаданных (реквизиты, Табличные части, формы и макеты) и вторая процедура, которая заполняет типы реквизитов (возможные типы получил через …Тип.Типы()) а для ссылочных типов вызывает первую процедур.

  5. Задание сделала. Первый пункт без проблем. Второй пункт, пришлось повторять материалы базового курса по работе с деревом ну и повозиться с определением ссылочного типа.

  6. Юрий Равилевич 21.11.2010 в 15:44

    1) без проблем
    2) долго мучился с тем, чтобы передать готовое дерево в форму, забыл про ЗначениеВДанныеФормы(), пришлось вернуться к базовому курсу и коллекциям значений :)

  7. ДЗ №3
    Создал ФО «УчетПоСкладам», свойство хранение = Справочник.Организации.Реквизит.ВестиУчетПоСкладам,
    Состав = Поступление.Склад и Реализация.Товары.Склад
    Создал ПараметрФО «Организация», Использование = Справочник.Организации
    Далее в этих документах в модуле формы документа в процедурах ОрганизацияПриИзменении и ПриСозданииНаСервере вставил 2 строчки кода:
    ПараметрыФО = Новый СТруктура(“Организация”, Объект.Организация);
    УстановитьПараметрыФункциональныхОпцийФормы(ПараметрыФО);
    Обработка Метаданные.
    Реквизит Метадокумен типа ДокументСсылка
    Дерево заполнял с помощью рекурсии, обходя коллекции Реквизиты, ТЧ, Формы, Команды, Макеты

  8. Евгений Пехов 17.11.2010 в 08:19

    ДЗ сделал
    С первым пунктом проблем не было,все очень хорошо объяснено в уроках,и в принципе объект не очень трудный на первый взгляд)
    Со вторым пунктом учился работать с метаданными(). первый опыт.Заполнял дерево на сервере с помощью рекурсивной функции,не сделал проверку на перекрестные ссылки.потом передавал в форму с помощью ЗначениеВРеквизитФормы

  9. Задание выполнил. С функциональными опциями пробле не возникло, все как в лекциях. С метаданными возникли затруднения, при получении данных ссылочных типов.  В качестве решения использовал конструкцию Попытка Исключение с методом ПривестиЗначение() внутри. Результат достигнут.

  10. Домашнее задание выполнил!!!

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

    Основная сложность в выполнении второй части ДЗ состоит в разработки алгоритма проверки условия что объект является ссылочным и по нему нужно дополнительно вызывать рекурсивную процедуру.

    Вот мой вариант кода:

    ОбъектМетаданных = Метаданные.НайтиПоТипу(Реквизит.Тип.Типы()[0]);
      Если  ОбъектМетаданных = Неопределено Тогда
       Продолжить;
      КонецЕсли;
      ТипПоиска = Тип(СтрЗаменить(ОбъектМетаданных.ПолноеИмя(), “Справочник”, “СправочникСсылка”));
      
      Если (Справочники.ТипВсеСсылки().СодержитТип(ТипПоиска))  Тогда
      … 
      ПостроитьДерево(СвойстваСправочника, НовыйЭлемент);
      КонецЕсли; 
     
    Очень хотелось бы увидеть правильный вариант данного алгоритма.

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

    п1.  Без затруднений.

    Добавил: функциональную опцию ВестиУчетПоСкладам,  параметр функц. опций Организация. В модулях форм Процедура УстановитьПараметрыФОПоОрганизации() вызывается из процедур

    ПриСозданииНаСервере, ОрганизацияПриИзменении.

    п2.  Возникло одно небольшое затруднение, связанное с заполнением дерева значений.  Сделал так: Дерево = РеквизитФормыВЗначение(“СтруктураДокумента”); Затем заполняю в

    рекурсивной процедуре как привык в 8.1 через свойство Строки и возвращаю в реквизит формы: ЗначениеВРеквизитФормы(Дерево, “СтруктураДокумента”);

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

    Если это справочник (Справочники.ТипВсеСсылки().СодержитТип(Тип)) или документ, то вызываю для объекта метаданных этого реквизита рекурсивную процедуру. Дополнительно

    вывожу стандартные реквизиты для справочников и документов. http://screencast.com/t/trh5lTLj9oda
    

  12. CreativeGroup 13.11.2010 в 10:21

    С первым заданием проблем не возникло.
    Со  вторым пунктом дз пришлось помучаться. Вспомнить как строиться дерево значений , как определить тип реквизита. Подсмотрел у других участников метод НайтиПоТипу() и все встало на свои места ).  Пришла в голову идея использовать событие «ПередРазворачиванием», но так и не принесла своего разумного продолжения, в итоге пришлось остановиться на рекурсии.

  13. Андрей Антипенко 12.11.2010 в 08:55

    Задание выполнено:
    1. Сделано без проблем, в лекциях очень хорошо описано.
    2.Тут долго провозился. Долго искал возможность сделать без обращения явного обращения явного к “”Реквизиты”,”ТабличныеЧасти” и т.п – не нашел:-( В итоге вызываю рекурсивно для ссылочного типа рекурсивную функцию и ограничил уровень максимальный уровень рекурсии 5.  Думаю, что можно реализовать “по-удачнее” с прекращение рекурсии, используя Содержит().. но временем, к сожалению ограничен для дальнейших экскрементов и так отстаю:-(

  14. 1. Выполнил – использовал функциональные опции с параметрами, обрабатывал ПриИзменении организации и ПриСозданииНаСеревере.
    2. Выполнил – использовал рекурсию, зацикливания нет. Долго мучился пытаясь преобразовать ОбъектМетаданных Контрагент в Контрагенты в вообщем конструкцию Метаданные.НайтиПоТипу(Метареквизит.тип.типы()[0]) пришлось подсмотреть у участников :). Для вывода дерева на форму использовал ЗначениеВРеквизитФормы(ДеревоРезультата,”СтруктураМетаданных”).

  15. Шумаев Алексей 11.11.2010 в 01:08

    С первой частью проблем не возникло.
    По второй части. Пришлось получше вникнуть  в типы “Объекты метаданных” и “Типы свойств объектов метаданных”. В семерке было проще… но менее гибко…
    Выполнил с помощью рекурсивных вызовов процедур. Реализована защита от зацикливания. Учтена возможность присутствия в конфигурации составных типов данных…
    А еще было бы здорово, для полной универсальности, иметь тип данных “СвойстваОбъектаМетаданных”.

  16. Игорь Серков 11.11.2010 в 00:05

    ДЗ выполнил.
    1. Использовал ФО и параметры ФО. Все очень подробно описано в лекциях.
    2. Тоже справился. Делал без рекурсии, чтобы не отлавливать зацикливание. Не получается вывести картинки как у Александра Горлова.  Еще покопаюсь, надеюсь получится.

    • Александр Горлов 11.11.2010 в 23:22

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

      • Игорь Серков 12.11.2010 в 07:08

        Спасибо. Сегодня буду пробовать

  17. Добрый день!
    Задание сделал.
    1. Сделано через функциональные опции и их параметры.
    2. Сделано. Построение дерева через рекурсию. Количество вложенных уровней ограничил, так как могут быть зацикливания. По-хорошему, надо, конечно, проверять на вхождение новых реквизитов в уже существующие ветки.

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

  19. Здравствуйте!
    По поводу первого – реализовал чрез функциональную опцию.
    По поводу второго задания – конечно же напрашивается решение через дерево значений и рекурсию, но зайдя сюда и пhочитав, что многие так и сделали, решил придумать что-нибудь этакое..
    Но в моем решение есть недочет, оно не работает на 8.2. Точнее я не знаю как его правильно сделать на 8.2..
    Итак: используем СхемуКомпоновкиДанных, на форме располагаем таблицу КомпоновщикНастроек.Настройка.ДоступныеПоляВыбора
    Все реквизиты документа получаем запросом вида (Выбрать * ИЗ Документ.ПоступлениеТоваровУслуг) – текст запроса меняется в зависимости от вида документа
    Далее в виде текстовых строк в запрос добавляются нужные объекты.. (Имена форм, макетов и проч.) ; Проходим по метаданным документа;
    Получается Запрос примерно с таким текстом (Выбрать *, “ФормаДокумента”, “Макет1” ИЗ Документ.ПоступлениеТоваровУслуг)
    Далее в доступные поля набора схемы компоновки данных добавляются поля-папки (Реквизиты, Макеты, Формы и прочее что нужно)
    Все наши поля, которые находятся в запросе раскладываются по этим папкам..
    Т.е. в Наборе СКД проходимся по полям, и говорим что например все реквизиты будут иметь путь Реквизиты.ИмяРеквизита (Реквизиты – имя нашего поля-папки)
    и так далее..
    Такое расположение позволяет увидеть все наши поля расположенными по папкам и “правильно” отображенными в таблице КомпоновщикНастроек.Настройка.ДоступныеПоляВыбора
    Это работает в 8.1.. И НЕ работает в 8.2. В 8.2 после всех программных манипуляций таблица не меняет своего отображения, на сервере в структуре компоновщика я вижу правильную нужную мне картину,
    а на клиенте все без изменений.. Так что на 8.2 к сожалению у меня с этим проблемы, может кто нибудь знает как выйти из ситуации…

    • Вот так выглядит мое дерево:
      http://www.screencast.com/t/WwM94ynwEw
      Очень интересует вопрос как эту идею реализовать в 8.2. Могли бы вы ответить в рамках МастерГруппы? …

      • Вопрос не совсем понятен. Как сделать в управляемой форме? Так вроде это и требуется в задании :)

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

          

          • Изначально не понял, что речь идет о компоновщике..
            Я рассмотрю этот вопрос несколько позже. А пока может быть коллеги помогут.
            Решение достаточно интересное. Спасибо.

          • Александр Горлов 10.11.2010 в 17:56

            Если Ваша таблица выводится в управляемой форме – попробуйте после обновления данных таблицы (настроек компоновщика) выполнить метод управляемой формы  ОбновитьОтображениеДанных().

  20. Задание выполнил.
    п.1 Использую параметризованную ФО  (значение хранит в реквизите справочника “Организации”). Значения параметров ФО устанавливаю в процедурах модуля формы “ПриСозданииНаСервере” и “ОрганизацияПриИзменении”.
    п.2 Дерево значений по объектам метаданных строю с использованием рекурсивного алгоритма.

  21. Сделано

  22. Константин Павленко 09.11.2010 в 14:48

    Задание выполнено. Первая часть без особых проблем, использовал функциональную опцию УчетПоСкладам, параметр Организация. Сделал всё по главе 17. Единственное на чём споткнулся, когда скопировал код в форму другого документа, не срабатывала предопределенная процедура ПриСозданииНаСервере. Отлавливал отладчиком – не ловится. Оказывается её сначала надо создать  из списка предопределенных процедур, потом можно скопировать. Если память не изменяет, в базовом курсе что-то подобное упоминалось.
    Со второй частью пришлось повозиться.  Вспомнил, что такое дерево и как с ним работать. Результат аналогичен картинке Ильи Чернова. Только у меня ещё сверху добавляется “затравочная” строка самого документа. 
     http://screencast.com/t/kfAMEw40U
    Код получился “сложно-рекурсивный”. Т.е. процедура может вызывать как саму себя, так и через другую процедуру. Конструкцию “Попытка-Исключение” решил не использовать. Недостаток: нет защиты от зацикливания, но уже пора делать следующее ДЗ :) См. код: http://screencast.com/t/ggeI3ZlW

    P.S. Александру Горлову персональное спасибо за идею с Jing и screencast.com :)

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

      • Константин Павленко 10.11.2010 в 17:45

        Про то, что это  свойство формы я вспомнил, только не сразу :) Думал, что раз скопировал ПриСозданииНаСервере(), свойства формы её подхватят автоматом. Сбил0 с толку, что в списке предопределенных процедур она распозналась как “своя”. Теперь точно запомню что к чему.

    • Александр Горлов 11.11.2010 в 22:56

      Насчет Jing – так это не меня нужно благодарить, а Евгения и Фарита. Разве Вы забыли, что в конце Базового курса были описаны способы создать ролик с “живым” видео и аудио с обратной связью по курсу? Там и говорилось, какими инструментами это можно сделать (в том числе, Jing).
      В любом случае, спасибо за “спасибо”. :)

  23. 1) С помощью функциональных опций все получилось без проблем
    2) Тут, как и многим, пришлось попотеть.  Спасибо за “.Тип.Типы()”, с ней я определила ссылочные типы. Решила задачу с помощью двух процедур. Первая заполняет стандартные ветки объекта (реквизиты, формы и.т.д.), из нее же вызывается вторая процедура заполняющая нижние ветки. Когда встречается ссылочный реквизит, то опять вызывается первая процедура и.т.д. Результат аж глаз радует.

    • >Результат аж глаз радует.
      Отлично :)

  24. Задания выполнил.
    1. использую функциональные опции
    2.использую рекурсию
    трудностей не возникло, все хорошо “разжевано” в лекциях. Спасибо :)

  25. 1.Справочник.Склад/реквизиты Склад /ФункциональнаяОпцияСклад
    2.Создание Дерева на сервере. Его рекурсивное заполнение и передачаего в форму – ЗначениеВРеквизитФормы(дер,”Объект.Дерево”)

  26. Задание выполнено. П1 – по лекциям.
    П2 – необходимые коллекции складываю в СписокЗначений. Потом обход Списка с рекурсией. От зацикливания – дважды одно и то же не вывожу. Все работает, но на вид текст -весьма корявенький какой-то. Жду эталон.

  27. Задание выполнил. По п. 1 проблем не было,  по п.2 пришлось немного повозиться.
    По п.2:
    Нужно было бы еще учесть “перекрестные типы по реквизитам” – когда, например, в спр. “Контрагенты” есть реквизит с типом спр. “Номенклатура”, а в спр. “Номенклатура” – реквизит с типом спр. “Контрагенты”. Тогда система, естественно, валится.  Но это не учитывал. Хотелось бы увидеть эту проверку в решении тренера.

  28. Александр Горлов 08.11.2010 в 18:55

    П.1 – отчитался ниже.
    П.2 – вот тут пришлось побороться с метаданными в рекурсии. Для проверки, что реквизит ссылочного типа, признаюсь, подсмотрел в чужих ответах НайтиПоТипу(). Задание выполнил, скриншоты ниже.
    http://screencast.com/t/nMkDb9XrFiyF
    Зато в обмен на подсмотренный код настроил вывод картинок в дереве метаданных и получилось почти как в конфигураторе! :)
    http://screencast.com/t/xepPyQkpa

    • Красота, конфигуратор в предприятии :))

      ps. Ответ на старый вопрос будет дан, но несколько позже..