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

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

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

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

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

  1. Выполнил. Часть1  – 1 в 1 как пример в самом курсе. Другие вопросы по ФО направлял в МГ, надеюсь увижу ответы :)
    Часть2 – вот ту помаялся… но все таки поборол

  2. elitekGAVA 08.11.2010 в 16:17

    Выполнил. без затруднений

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

  4. Александр Егошин 08.11.2010 в 13:01

    1. Выполнил. Затруднений не возникло.
    2. Выполнил через рекурсию. Пришлось повозиться с выводом в дерево значений и определением типов объектов метаданных.

  5. andrey2000 08.11.2010 в 09:36

    Добавил склады, функциональную опцию “УчетПоСкладам”, для параметра хранение указал “Справочник.Организации.Реквизит.УчетПоСкладам”. В организацию добавил реквизит логического типа “Учет по складам” В Параметры фукнциональный опций добавил Организацию с использованием для справочника типа “Организации”. Процедура УстановитьПараметрыФункциональныхОпцийФормы работает и для реквизитов шапки и табличной части.
    При разработке обработки “Метаданные документа” заполнял дерево значений при обходе по реквизитам метаданных указанного документа. Заполнение проводил в функции, в которой циклом обходил реквизиты. При этом для каждого реквизита пытаюсь методом “НайтиПоТипу” описание метаданных, если это описание (объект) найден – делаю обход реквизитов этого объекта.
    Для отображения дерева вывел на форму элемент-дерево с одной колонкой. Для корня дерева или для строки дерева при рекурсивном вызове для реквизитов получаю коллекцию подчиненных элементов методом ПолучитьЭлементы() и добавляю строки с реквизитами в эту коллекцию.

  6. Сделано. Первое задание без затруднений через функциональные опции. Во втором через рекурсию плюс проверка на ранее выведенные типы.

  7. ДЗ выполнено, с деревом значений пришлось повозится.

  8. Все, что касаемо ФО, прошло как по маслу. С обработкой пришлось посидеть…. предлагаю на народный суд:
    &НаСервере
     Процедура СформироватьСтруктуруМетаданныхНаСервере(МетаИмя)    // 
      РезультатДерево = РеквизитФормыВЗначение(“СтруктураДок”);
     
      Док = Метаданные.Документы[МетаИмя];
     
      ПостроитьДеревце(Док, РезультатДерево.Строки);
     
      ЗначениеВРеквизитФормы(РезультатДерево,”СтруктураДок”);
     
     КонецПроцедуры// СформироватьСтруктуруМетаданныхНаСервере()
     
     &НаСервереБезКонтекста
     Процедура ПостроитьДеревце(ОбъектМетаданных, СтрокиДерева)
     
      СписокКоллекцийОбъектовМетаданных = Новый Соответствие;
      Попытка СписокКоллекцийОбъектовМетаданных.Вставить(“Реквизиты”,      ОбъектМетаданных.Реквизиты);     Исключение КонецПопытки;
      Попытка СписокКоллекцийОбъектовМетаданных.Вставить(“ТабличныеЧасти”, ОбъектМетаданных.ТабличныеЧасти); Исключение КонецПопытки;
      Попытка СписокКоллекцийОбъектовМетаданных.Вставить(“Формы”,          ОбъектМетаданных.Формы);          Исключение КонецПопытки;
      Попытка СписокКоллекцийОбъектовМетаданных.Вставить(“Макеты”,         ОбъектМетаданных.Макеты);         Исключение КонецПопытки;
      Попытка СписокКоллекцийОбъектовМетаданных.Вставить(“Команды”,        ОбъектМетаданных.Команды);        Исключение КонецПопытки;
     
       Попытка
        ОписаниеОбъекта = Строка(ОбъектМетаданных.Тип)
       Исключение
        ОписаниеОбъекта=””; 
       КонецПопытки;
      
       ОписаниеОбъекта = ?(СписокКоллекцийОбъектовМетаданных.Количество()>0, ОбъектМетаданных.Синоним+” (“+
            ОбъектМетаданных.ПолноеИмя()+”)”, ОписаниеОбъекта);
      
       Если ЗначениеЗаполнено(ОписаниеОбъекта) Тогда
        Корень = СтрокиДерева.Добавить();
        Корень.МетаДок = ОписаниеОбъекта;
       КонецЕсли;
     
               
      Для каждого ЭлементСпискаКоллекций Из СписокКоллекцийОбъектовМетаданных Цикл
       Коллекция = Корень.Строки.Добавить();
       Коллекция.МетаДок = ЭлементСпискаКоллекций.Ключ;
      
       Для каждого ОбъектКоллекции Из ЭлементСпискаКоллекций.Значение Цикл
        ОбъектыКоллекции = Коллекция.Строки.Добавить();
        ОбъектыКоллекции.МетаДок = ОбъектКоллекции;
       
        Попытка
         МассивТиповРеквизита = ОбъектКоллекции.Тип.Типы();
         // Тут будет цикл по типам
         Для Н=0 По МассивТиповРеквизита.Количество()-1 Цикл
          Результат = Метаданные.НайтиПоТипу(МассивТиповРеквизита[Н]);
          Если НЕ Результат = Неопределено  Тогда
           ПостроитьДеревце( Результат, ОбъектыКоллекции.Строки);
          Иначе // для примитивных типов 
            ОбъектыКоллекции.МетаДок = ОбъектКоллекции.Имя + ” (” +Строка(ОбъектКоллекции.Тип)+”)”;
          КонецЕсли;
         КонецЦикла;
        Исключение
          ПостроитьДеревце( ОбъектКоллекции, ОбъектыКоллекции.Строки);
        КонецПопытки;
       КонецЦикла;
      КонецЦикла;
     
     КонецПроцедуры // ПостроитьДеревце()

    • Единственное, пока не придумал, как остановить итерацию, если в справочнике используется тот же тип реквизита, что и выводимый справочник. Попробовал на “Управлении небольшой фирмой”, там в справочнике “Валюты” есть реквизит “ПодчиненныйКурсОт” с типом “Валюты”. И обработка уходит в бесконечный цикл….

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

  10.  Готово..
    Правда в отличие от остальных вопрос по 1 пункту, вернее о принципе работы ПараметровФО..
    Суть вопроса, если ФО задаются в Константе – действуют на все объекты, если в справочнике – нуно уточнять ч/з ПараметрыФО?!..
     Маятником 2 задания был скрин Ильи Чернова !..  ;))
    Вот и мой: http://s016.radikal.ru/i334/1011/e1/818cd2f6254b.png

    •  Как-то я “просмотрел” момент про ПараметрыФО – все популярно оговорено в 0.17.09

    •  При проверке в УПП – обработка зацыкливается и 1С падает..

  11. Выполнено.
    По первой части задания проблем не возникло. Делал как и все тут, через функциональную опцию.
    Вторая часть вызвала затруднения. Не оч хорошо еще с деревом разобрался. Перебор делал через циклы
    Мет=докум.Метаданные();
    Для каждого РеквизитОб из Мет.Формы Цикл
    Мет=докум.Метаданные();
    Для каждого РеквизитОбъекта из Мет.Формы Цикл
    аналогично для Мет.Реквизиты и т.д.
    Хочу очень посмотреть на правильный ответ:) имхо моему решению не хватает “легкости”

  12. Задание выполнил. Первая часть по учебнику. Вторая с помощью рекурсии.

  13. Задание выполнил.
    По п.1 сложностей не возникло, сделал так же, как в видеоролике.
    В п.2 есть два нюанса:
    1) Реквизит может иметь составной ссылочный тип. Я решил с этим не заморачиваться, просто беру первый найденный тип. По идее можно сделать как в конструкторе запросов – открываешь строку реквизита, там перечень типов и в каждом типе его структура.
    2) Ссылочные типы могут ссылаться друг на друга. Например, у контрагента есть реквизит “ОсновнойДоговор” со ссылкой на справочник “Договоры”, а в договоре есть реквизит “Плательщик” со ссылкой на справочник “Контрагенты”. В такой ситуации возникнет бесконечный цикл. Решил это с помощью кэша – записываю объекты метаданных в массив.
    Есть проблемы с программным разворачиванием дерева в управляемой форме:
    1) Хочу развернуть в структуру выбранного документа, чтобы сразу было видно его реквизиты, формы и т. д., но не разворачивать дерево полностью. Не понятно, как это сделать. В процедуру “Развернуть” подставляется идентификатор строки (число – я так понял, что это номер строки в дереве), но как получить идентификатор нужной мне строки?
    2) При изменении документа на сервере формирую дерево значений, вывожу его на форму: ЗначениеВРеквизитФормы(Дерево, “ДеревоМетаданных”);
    На клиенте разворачиваю первую строку в дереве: Элементы.ДеревоМетаданных.Развернуть(0);
    Запускаю обработку, выбираю документ – все работает, выбираю другой – возникает ошибка:
    “Ошибка при вызове метода контекста (Развернуть): Отсутствует строка данных
    Элементы.ДеревоМетаданных.Развернуть(0);”. При этом дерево отображается правильно, просто не раскрывается первая строка.
    Похоже надо заглянуть в базовый курс.

    • С ошибками разобрался. В базовом курсе это рассмотрено. Прошу прощения за лишнюю информацию. )

  14. Александр Горлов 06.11.2010 в 06:36

    П.1 – выполнен без затруднений. Все детально описано в видео. Только важно учесть, что если ошибиться в наименовании параметра ФО, то никаких ошибок не будет, код отработает, но изменений на форме не произойдет. Тут 1С ведет себя как и при ошибке в инструкциях препроцессору…

  15. spec20091c 06.11.2010 в 02:53

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

    2) Коллекции метаданных документа сгруппировал в дереве по соответствующим разделам – Реквизиты, Табличные части, Формы, Макеты.

    &НаСервереБезКонтекста
    Процедура ДобавитьРеквизитыОбъектаМетаданныхВДерево(Дерево, КоллекцияМетаданных)

    Для каждого ОбъектМетаданных Из КоллекцияМетаданных Цикл

    СтрокаВерхнегоУровня = Дерево.Строки.Добавить();
    СтрокаВерхнегоУровня.ОбъектМетаданных = ОбъектМетаданных.Имя;

    МетаданныеОбъекта = Метаданные.НайтиПоТипу(ОбъектМетаданных.Тип.Типы()[0]);
    Если МетаданныеОбъекта <> Неопределено Тогда
    ДобавитьРеквизитыОбъектаМетаданныхВДерево(СтрокаВерхнегоУровня, МетаданныеОбъекта.Реквизиты);
    ДобавитьТЧОбъектаМетаданныхВДерево(СтрокаВерхнегоУровня, МетаданныеОбъекта.ТабличныеЧасти);
    КонецЕсли;

    КонецЦикла;

    КонецПроцедуры

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

    &НаСервереБезКонтекста
    Процедура ДобавитьТЧОбъектаМетаданныхВДерево(Дерево, КоллекцияМетаданных)

    Для каждого ОбъектМетаданных Из КоллекцияМетаданных Цикл
    СтрокаВерхнегоУровня = Дерево.Строки.Добавить();
    СтрокаВерхнегоУровня.ОбъектМетаданных = ОбъектМетаданных.Имя;

    ДобавитьРеквизитыОбъектаМетаданныхВДерево(СтрокаВерхнегоУровня, ОбъектМетаданных.Реквизиты);
    КонецЦикла;

    КонецПроцедуры

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

  16. Задание выполнил.
    С первым пунктом проблем не возникло.
    С обработкой пришлось повозиться. Здесь подсмотрел метод НайтиПоТипу(), до этого определял тип и соответствующие ему объект метаданных по-кривому.
    Столкнулся со странностью платформы: в процедуру (на клиенте без контекста) передаю элемент структуры, в этой процедуре обращаюсь к свойству “ключ”. В отладчике все работает, в предприятии выдается ошибка (свойства “ключ” не видит). Версия платформы 8.2.12.96

    • Это странная ситуация.
      Приведите пример кода, демонстрирующий проблему (все не относящееся к делу вычеркните).

  17. Первую часть нет проблем. Делал через Хранилище конфигураций. Вторую часть реализовывал уже давно. Сейчас досмотрю лекции и наверно, все переделаю…

  18. Сергей Калмыков 05.11.2010 в 16:08

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

  19. С функциональными опциями все просто – 2 строчки кода и все работает, как задумано. Я вообще в восторге от такого механизма!
    С объектами метаданных посложнее, но зато интереснее. Использовала рекурсивную функцию ЗаполнитьПоМетаданным, ссылочный тип или нет определяла через Метаданные.НайтиПоТипу(Реквизит.Тип.Типы()[0]) (где Реквизит – это очередной реквизит документа или ТЧ из коллекции реквизитов). Также пришлось вспомнить про функции РеквизитФормыВЗначение и ЗначениеВРеквизитФормы для заполнения дерева значений на форме.

  20. ДЗ №3 выполнил.
    1)  Создал функциональную опцию и параметр для нее. Определил ее состав. В модуле формы описал утановку параметра функциональной опции при изменении организации и при открытии формы
    2) Выделил четыре вида коллекций – если перед нами коллекция реквизитов, то перебираем типы возможных значений, добавляем их в дерево, и если они ссылочного типа – то рекурсивно обходим реквизиты и этого типа, если перед нами табличная часть – то обходим ее реквизиты, а если перед нами макеты или формы, то реквизиты необходим.

  21. Илья Чернов 04.11.2010 в 18:12

    Готово, первая часть без вопросов.
    Вторая тоже. Дерево получилось.
    Заполнение идет двумя функциями, первая обходит метаданные, вторая заполняет дерево. Вторая если встречается ссылочный тип, вызывает рекурсивно первую и так далее.
    http://prntscr.com/15aio

  22. Задание 3 выполнено! Первая часть показалась даже слишком легкой. Реализована с помощью функциональных опций, все по главе 17. Зато вторая часть далась только со второго подхода. Выбор документа как в главе 19, заполнение ветвей дерева с помощью рекурсий.

  23. Выполнено.
    1. По первой части основное затруднение вызвал поиск состава функциональной опции. В первых релизах платформы включенность в функциональные опции была в палитре свойств реквизита, если мне это не приснилось. И я долго и упорно искал свойство “функциональные опции” в палитре свойств реквизита Склад.  :)
    2. Сделал. Немного повозился с определением из обчнкта метаданных справочник это или документ. Сделал через Метаданные.Справочники.Найти(Реквизит.Тип) или Метаданные.Документы.Найти(Реквизит.Тип)

  24. Первую часть сделал без затруднений.
    Вторая часть оказалась гораздо сложнее. Даже описать как я ее делал – и то сложно :)))
    &НаСервере
    Процедура ДобавитьВсеПодчиненныеУзлы(ОбъектМетаданных, НоваяСтрока);
    ДобавитьВнутренниеОбъекты(ОбъектМетаданных, “Реквизиты”, НоваяСтрока);  
    ДобавитьВнутренниеОбъекты(ОбъектМетаданных, “ТабличныеЧасти”, НоваяСтрока);  
    ДобавитьВнутренниеОбъекты(ОбъектМетаданных, “Формы”, НоваяСтрока);  
    ДобавитьВнутренниеОбъекты(ОбъектМетаданных, “Макеты”, НоваяСтрока);  
    КонецПроцедуры
    В процедуре ДобавитьВнутренниеОбъекты реализовал простой обход этих коллекций и рекурсивных вывод их в дерево. Сложность возникла с определением ссылочного типа у реквизита. Выкрутился так:
    Если ТипЗНЧ(ОбъектМетаданных) <> Тип(“Неопределено”) Тогда
    ДобавитьВсеПодчиненныеУзлы(ОбъектМетаданных, НоваяСтрока); 
    КонецЕсли;
    Собственно, потратил на решение второй части задачи в общей сложности часов 6.
    Вообще не понял один момент в итоге:  как в модуле управляемой формы сделать общую серверную переменную? Из лекций я понял, что переменная жива только в пределах контекста самой серверной процедуры. Я хотел при создании формы инициализировать массив со строковыми значениями (“Реквизиты”, “ТабличныеЧасти” и т.д.). Протаскивать этот массив в рекурсивную процедуру не хотелось. Погуглив, решил сделать реквизит формы с типом список значений. Но отображать этот список не нужно на форме.  Поэтому вообще не понял, как с реквизитом формы, не отображенным на ней, можно работать. Евгений, если Вас не затруднит сильно, не могли бы Вы пояснить этот момент. Я что-то выпустил это из внимания :(

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

  25. Филимонов Юрий 04.11.2010 в 12:57

    Домашнее задание оказалось очень простым – все для его выполнения есть в материалах курса и мастер-группы.
    1. Учет по складам реализован с помощью функциональной опции и параметра функциональных опций
    2. В формах документов использовал метод управляемой формы УстановитьПараметрыФункциональныхОпцийФормы.
    3. Обработку “Метаданные документа” реализовал с помощью рекурсии

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

  27. Я определила, что реквизит является ссылочным поиском среди метаданных
    ТекОбъектМетаданных = Метаданные.Справочники.Найти(ТекСвойство.Тип);
    Если ТекОбъектМетаданных=Неопределено Тогда
    Иначе
    ЗаполнитьРеквизиты(ТекОбъектМетаданных,Строка.ПолучитьЭлементы());

    КонецЕсли;

  28. Кудрявцев Олег 03.11.2010 в 18:39

    Задание выполнил.
    1 часть никаких затруднений не было.
    2 часть – были трудности в определении типа реквизита (ссылка или нет). Я определял тип полученного значения с помощью ТипРекв=Рекв.Тип.ПривестиЗначение();
    затем проверял в функции ссылочный тип или нет с помощью проверок, например,
    Если ТипЗНЧ(ТипРекв)=Тип(“Число”) и так далее.
    Для заполнения дерева используется рекурсия.
     

    • Кудрявцев Олег 03.11.2010 в 18:55

      Кстати, чтобы удобнее было работать с метаданными (в контекстной подсказке) использовал команду
      #Если Призрак Тогда
      Документ=Документы.ПоступлениеТоваровИУслуг.ПолучитьСсылку();
      #КонецЕсли
      :)

  29. Леонид 03.11.2010 в 18:28

    ДЗ сделал.
    п1 – использовал функциональную опцию.
    п2 – Использовал список для описания объектов, которые нужно выводить (реквизиты, формы и т.д.), потом проходил рекурсивно.

  30. Задание готово. Все по лекциям.

  31. Домашнее задание выполнено, все получилось без проблем. Все очень подробно (как всегда:) ) было изложено в уроках

  32. 1)Создал Функциональную Опцию “ВестиУчетПоСкладам”, указал хранение в справочнике Справочник.Организации.Реквизит.ВестиУчетПоСкладам, В Составе ФО указал Реквизит “Склад” в Документе ПоступлениеТоваровИУслуг, также указал Реквизит склад табличной части Документа РеализацияТоваровИУслуг.
    Создал ПараметрФункциональнойОпции “Организация” использование “Справочник.Организация” В модуляФормы документов РеализацияТоваровИУслуг и ПоступлениеТоваровИУслуг на события ПриСозданииНаСервере, ПриИзмененииОрганизации устанавливаюПараметрыФункциональнойОпции.
    2)Алгоритм работы:
    – создал СписокЗначений ВидыМетаданных, в который занес значения(“Реквизиты”,”ТабличныеЧасти”,”Формы”,”Макеты”)
    – Получая метаданные по указанному виду Документа, пытаюсь получить элементы коллекций для ВидыМетаданных,
    — Для реквизитов вызываю рекурсивно эту же функцию и также пробегаю по ОбъектуМетаданных пытаюсь получитьЭлементы коллекции для ВидыМетаданных.
    — Для ТабличныхЧастей ВидыМетаданных состоит только из Реквизитов, для реквизиты табличных частей полный список ВидыМетаданнх.
    — Для Форм и Макетов просто добавляю название форм и макетов.

    ОсновнаяПроблема состояла в том как определить какой тип у Реквизита объекта метаданных, создал функцию которая определяет по ИмениРеквизита какой тип реквизита
    Если Метаданные.Документы.Найти(ИмяРеквизита )<>Неопределено Тогда возврат “Документы” Конецесли;
    Если Метаданные.Справочники.Найти(ИмяРеквизита )<>Неопределено Тогда возврат “Документы” Конецесли;
    и т.д.
    Попути заполняю ДеревоЗначений.

    Почитав Комментарий, использовав НайтиПоТипу() убрал свою основную проблему.
    http://s007.radikal.ru/i300/1011/b8/7dc7667066f2.jpg

    P.S. если есть возможность, можете выкладывать ДЗ с утра?

    • Почитав комментарии добавил чтобы работало также и для Составного типа

  33. ДЗ сделано. Трудностей не возникло.

  34. ДЗ № 3 выполнила.
    1) Все сделала как учили, проблем и вопросов не возникло.
    2) Создала обработку как требовалось в задании. Использую рекурсивный вызов процедуры для построения дерева. Затруднений не возникло. Все работает, получилось красиво :)

  35. ДЗ выполнено. Часть 1 – все как в видео, работает. Часть 2 – в обработке вызываю рекурсивно заполнение ветви дерева данными (стандартные реквизиты, реквизиты, макеты, формы), примитивные типы вывожу “как есть”. Для избежания зацикливания вывожу только до 4 уровня вложенности (правильнее, наверное, анализировать уже заполненные объекты в ветви)

  36. ДЗ выполнил.
    Часть 1- без затруднений, материал подробный.
    Часть 2 – учел стандартные реквизиты и отображение составных типов данных.

  37. progr-2008 02.11.2010 в 23:00

    Сделала 1-ю часть ДЗ.
    Добавила объекты и реквизиты по заданию.
    Создала функциональную опцию УчетПоСкладам для складов в документах поступления и реализации, а также, параметр функциональных опций Организация.
    На форму документов добавила Организацию.  В модуле формы Организация –  ОбновитьИнтерфейс.
    В поступлении и реализации -УстановитьПараметрыФункциональныхОпцийФормы.
    В  лекциях все подробно.
    Понравилось, работает, а  почти без программирования.

    • progr-2008 06.11.2010 в 00:05

      Сделала 2-ю часть задания. 
      Сначала сделала обработку по материалам лекций для выбора документов.
      Потом стала добавлять и корректировать код для ДЗ.
      Отдельно выводила реквизиты, табличные части, формы, макеты.
      Использовала рекурсивный вызов процедур – это и было для меня самым сложным.
      Например, для реквизитов, сделала процедуру СтруктураРеквизитов(ИмяДок,Строки)
       с проверкой ТекОбъектМетаД.Реквизиты.Количество() > 0.
      Получилось после изучения лекций, комментариев в этой теме и попыток разработки нескольких вариантов.

  38. Третье ДЗ выполнено.
    Использовал код, аналогичный
    НоваяСтрокаР = ДокументСтруктура.ПолучитьЭлементы().Добавить();
    НоваяСтрокаР.Реквизит = “Реквизиты”;
    Для Каждого Реквизит Из Метаданные.Документы.Найти(ИмяДок).Реквизиты цикл
    для Каждого СтрокаТипа из Реквизит.Тип.типы() цикл
    Поиск = Метаданные.НайтиПоТипу(СтрокаТипа);
    НоваяСтрока = НоваяСтрокаР.ПолучитьЭлементы().Добавить();
    НоваяСтрока.Реквизит = Строка(Реквизит);
    Попытка
    Если Поиск.Реквизиты.Количество() > 0 тогда
    РазобратьПодчиненный(Поиск,ДокументСтруктура,НоваяСтрока)
    КонецЕсли;
    Исключение
    КонецПопытки;
    КонецЦикла;
    КонецЦикла;
    Проходил отдельно по реквизитам, отдельно по ТЧ, макетам и формам.
     
    первая часть ДЗ затруднений не вызвала.

  39. Алексей Иванов 02.11.2010 в 17:28

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

  40. Александр Горлов 02.11.2010 в 16:36

    Глава 16 выпала из обучения? ;) Или просто ДЗ изучение этой темы не требует?