Продвинутый курс. Домашнее задание №3
Эта запись посвящена участникам 2-го потока продвинутого курса по программированию.
Третье задание по 0-му блоку продвинутого курса.
Для выполнения рекомендуется изучить следующие главы 0-го курса.
Глава 16.Настройка командного интерфейса конфигурации.
Глава 17. Функциональные опции.
Глава 18. Простые правила разработки интерфейсов.
Глава 19. Работа с метаданными.
Глава 20. Параметры сеанса.
К сожалению, у Вас недостаточно прав для просмотра этой записи. Если Вы еще не залогинены на сайте — залогиньтесь. Если Вы оплачивали курс, у Вас активирован токен доступа, Вы залогинены, но Вы видите эту запись — напишите нам на e-mail поддержки.
Выполнил. Часть1 – 1 в 1 как пример в самом курсе. Другие вопросы по ФО направлял в МГ, надеюсь увижу ответы :)
Часть2 – вот ту помаялся… но все таки поборол
Выполнил. без затруднений
ДЗ 3 выполнил. Первая часть не вызвала затруднений. Для ее реализации была введена функциональная опция ВестиУчетПоСкладам и соответствующий параметр функциональной опции. В процедурах форм соотв. документов ПриОткрытии и ОрганизацияПриИзменении вызывается метод, запускающий УстановитьПараметрыФункциональныхОпцийФормы
Вторая часть была посложнее. Для реализации была создана рекурсивная процедура СделатьДерево, в которой обходились элементы передаваемой коллекции и добавлялись в дерево. Для того чтобы добыть из реквизита тип соотв метаданного использовалось: метаданные.НайтиПоТипу(элемент.тип.типы()[0])
С сервера дерево возвращалось в форму :
ЗначениеВРеквизитФормы(Дерево1, “ДеревоМетаданных”);
1. Выполнил. Затруднений не возникло.
2. Выполнил через рекурсию. Пришлось повозиться с выводом в дерево значений и определением типов объектов метаданных.
Добавил склады, функциональную опцию “УчетПоСкладам”, для параметра хранение указал “Справочник.Организации.Реквизит.УчетПоСкладам”. В организацию добавил реквизит логического типа “Учет по складам” В Параметры фукнциональный опций добавил Организацию с использованием для справочника типа “Организации”. Процедура УстановитьПараметрыФункциональныхОпцийФормы работает и для реквизитов шапки и табличной части.
При разработке обработки “Метаданные документа” заполнял дерево значений при обходе по реквизитам метаданных указанного документа. Заполнение проводил в функции, в которой циклом обходил реквизиты. При этом для каждого реквизита пытаюсь методом “НайтиПоТипу” описание метаданных, если это описание (объект) найден – делаю обход реквизитов этого объекта.
Для отображения дерева вывел на форму элемент-дерево с одной колонкой. Для корня дерева или для строки дерева при рекурсивном вызове для реквизитов получаю коллекцию подчиненных элементов методом ПолучитьЭлементы() и добавляю строки с реквизитами в эту коллекцию.
Сделано. Первое задание без затруднений через функциональные опции. Во втором через рекурсию плюс проверка на ранее выведенные типы.
ДЗ выполнено, с деревом значений пришлось повозится.
Все, что касаемо ФО, прошло как по маслу. С обработкой пришлось посидеть…. предлагаю на народный суд:
&НаСервере
Процедура СформироватьСтруктуруМетаданныхНаСервере(МетаИмя) //
РезультатДерево = РеквизитФормыВЗначение(“СтруктураДок”);
Док = Метаданные.Документы[МетаИмя];
ПостроитьДеревце(Док, РезультатДерево.Строки);
ЗначениеВРеквизитФормы(РезультатДерево,”СтруктураДок”);
КонецПроцедуры// СформироватьСтруктуруМетаданныхНаСервере()
&НаСервереБезКонтекста
Процедура ПостроитьДеревце(ОбъектМетаданных, СтрокиДерева)
СписокКоллекцийОбъектовМетаданных = Новый Соответствие;
Попытка СписокКоллекцийОбъектовМетаданных.Вставить(“Реквизиты”, ОбъектМетаданных.Реквизиты); Исключение КонецПопытки;
Попытка СписокКоллекцийОбъектовМетаданных.Вставить(“ТабличныеЧасти”, ОбъектМетаданных.ТабличныеЧасти); Исключение КонецПопытки;
Попытка СписокКоллекцийОбъектовМетаданных.Вставить(“Формы”, ОбъектМетаданных.Формы); Исключение КонецПопытки;
Попытка СписокКоллекцийОбъектовМетаданных.Вставить(“Макеты”, ОбъектМетаданных.Макеты); Исключение КонецПопытки;
Попытка СписокКоллекцийОбъектовМетаданных.Вставить(“Команды”, ОбъектМетаданных.Команды); Исключение КонецПопытки;
Попытка
ОписаниеОбъекта = Строка(ОбъектМетаданных.Тип)
Исключение
ОписаниеОбъекта=””;
КонецПопытки;
ОписаниеОбъекта = ?(СписокКоллекцийОбъектовМетаданных.Количество()>0, ОбъектМетаданных.Синоним+” (“+
ОбъектМетаданных.ПолноеИмя()+”)”, ОписаниеОбъекта);
Если ЗначениеЗаполнено(ОписаниеОбъекта) Тогда
Корень = СтрокиДерева.Добавить();
Корень.МетаДок = ОписаниеОбъекта;
КонецЕсли;
Для каждого ЭлементСпискаКоллекций Из СписокКоллекцийОбъектовМетаданных Цикл
Коллекция = Корень.Строки.Добавить();
Коллекция.МетаДок = ЭлементСпискаКоллекций.Ключ;
Для каждого ОбъектКоллекции Из ЭлементСпискаКоллекций.Значение Цикл
ОбъектыКоллекции = Коллекция.Строки.Добавить();
ОбъектыКоллекции.МетаДок = ОбъектКоллекции;
Попытка
МассивТиповРеквизита = ОбъектКоллекции.Тип.Типы();
// Тут будет цикл по типам
Для Н=0 По МассивТиповРеквизита.Количество()-1 Цикл
Результат = Метаданные.НайтиПоТипу(МассивТиповРеквизита[Н]);
Если НЕ Результат = Неопределено Тогда
ПостроитьДеревце( Результат, ОбъектыКоллекции.Строки);
Иначе // для примитивных типов
ОбъектыКоллекции.МетаДок = ОбъектКоллекции.Имя + ” (” +Строка(ОбъектКоллекции.Тип)+”)”;
КонецЕсли;
КонецЦикла;
Исключение
ПостроитьДеревце( ОбъектКоллекции, ОбъектыКоллекции.Строки);
КонецПопытки;
КонецЦикла;
КонецЦикла;
КонецПроцедуры // ПостроитьДеревце()
Единственное, пока не придумал, как остановить итерацию, если в справочнике используется тот же тип реквизита, что и выводимый справочник. Попробовал на “Управлении небольшой фирмой”, там в справочнике “Валюты” есть реквизит “ПодчиненныйКурсОт” с типом “Валюты”. И обработка уходит в бесконечный цикл….
Выполнил, затруднение было с определением типа.. сделал так:
СправочникиОписание = Новый ОписаниеТипов(Справочники.ТипВсеСсылки());
ДокументыОписание = Новый ОписаниеТипов(Документы.ТипВсеСсылки());
потом в цикле сравнивал
ТТ = Рекв.Тип.Типы()[0];
Если СправочникиОписание.СодержитТип(ТТ) Тогда
ПолучитьДанныеСправочника(Рекв.Имя);
ИначеЕсли ДокументыОписание.СодержитТип(ТТ) Тогда
ПолучитьДанныедокумента(Рекв.Имя);
КонецЕсли;
Готово..
Правда в отличие от остальных вопрос по 1 пункту, вернее о принципе работы ПараметровФО..
Суть вопроса, если ФО задаются в Константе – действуют на все объекты, если в справочнике – нуно уточнять ч/з ПараметрыФО?!..
Маятником 2 задания был скрин Ильи Чернова !.. ;))
Вот и мой: http://s016.radikal.ru/i334/1011/e1/818cd2f6254b.png
Как-то я “просмотрел” момент про ПараметрыФО – все популярно оговорено в 0.17.09
При проверке в УПП – обработка зацыкливается и 1С падает..
Выполнено.
По первой части задания проблем не возникло. Делал как и все тут, через функциональную опцию.
Вторая часть вызвала затруднения. Не оч хорошо еще с деревом разобрался. Перебор делал через циклы
Мет=докум.Метаданные();
Для каждого РеквизитОб из Мет.Формы Цикл
Мет=докум.Метаданные();
Для каждого РеквизитОбъекта из Мет.Формы Цикл
аналогично для Мет.Реквизиты и т.д.
Хочу очень посмотреть на правильный ответ:) имхо моему решению не хватает “легкости”
Задание выполнил. Первая часть по учебнику. Вторая с помощью рекурсии.
Задание выполнил.
По п.1 сложностей не возникло, сделал так же, как в видеоролике.
В п.2 есть два нюанса:
1) Реквизит может иметь составной ссылочный тип. Я решил с этим не заморачиваться, просто беру первый найденный тип. По идее можно сделать как в конструкторе запросов – открываешь строку реквизита, там перечень типов и в каждом типе его структура.
2) Ссылочные типы могут ссылаться друг на друга. Например, у контрагента есть реквизит “ОсновнойДоговор” со ссылкой на справочник “Договоры”, а в договоре есть реквизит “Плательщик” со ссылкой на справочник “Контрагенты”. В такой ситуации возникнет бесконечный цикл. Решил это с помощью кэша – записываю объекты метаданных в массив.
Есть проблемы с программным разворачиванием дерева в управляемой форме:
1) Хочу развернуть в структуру выбранного документа, чтобы сразу было видно его реквизиты, формы и т. д., но не разворачивать дерево полностью. Не понятно, как это сделать. В процедуру “Развернуть” подставляется идентификатор строки (число – я так понял, что это номер строки в дереве), но как получить идентификатор нужной мне строки?
2) При изменении документа на сервере формирую дерево значений, вывожу его на форму: ЗначениеВРеквизитФормы(Дерево, “ДеревоМетаданных”);
На клиенте разворачиваю первую строку в дереве: Элементы.ДеревоМетаданных.Развернуть(0);
Запускаю обработку, выбираю документ – все работает, выбираю другой – возникает ошибка:
“Ошибка при вызове метода контекста (Развернуть): Отсутствует строка данных
Элементы.ДеревоМетаданных.Развернуть(0);”. При этом дерево отображается правильно, просто не раскрывается первая строка.
Похоже надо заглянуть в базовый курс.
С ошибками разобрался. В базовом курсе это рассмотрено. Прошу прощения за лишнюю информацию. )
Ок :)
П.1 – выполнен без затруднений. Все детально описано в видео. Только важно учесть, что если ошибиться в наименовании параметра ФО, то никаких ошибок не будет, код отработает, но изменений на форме не произойдет. Тут 1С ведет себя как и при ошибке в инструкциях препроцессору…
Задание выполнил.
1) Добавил функциональную опцию ВестиУчетПоСкладам и одноименный параметр функциональной опции.
В обработчике события формы документа ПриСозданииНаСервере и ПриИзменении организации использую метод управляемой формы
УстановитьПараметрыФункциональныхОпцийФормы для установки параметров ФО и обновления формы.
2) Коллекции метаданных документа сгруппировал в дереве по соответствующим разделам – Реквизиты, Табличные части, Формы, Макеты.
&НаСервереБезКонтекста
Процедура ДобавитьРеквизитыОбъектаМетаданныхВДерево(Дерево, КоллекцияМетаданных)
Для каждого ОбъектМетаданных Из КоллекцияМетаданных Цикл
СтрокаВерхнегоУровня = Дерево.Строки.Добавить();
СтрокаВерхнегоУровня.ОбъектМетаданных = ОбъектМетаданных.Имя;
МетаданныеОбъекта = Метаданные.НайтиПоТипу(ОбъектМетаданных.Тип.Типы()[0]);
Если МетаданныеОбъекта <> Неопределено Тогда
ДобавитьРеквизитыОбъектаМетаданныхВДерево(СтрокаВерхнегоУровня, МетаданныеОбъекта.Реквизиты);
ДобавитьТЧОбъектаМетаданныхВДерево(СтрокаВерхнегоУровня, МетаданныеОбъекта.ТабличныеЧасти);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Для добавление метаданных реквизитов использую рекурсивный вызов процедуры добавления реквизитов в дерево.
Определение определения реквизитов ссылочных типов использую поиск по типу в коллекции метаданных.
&НаСервереБезКонтекста
Процедура ДобавитьТЧОбъектаМетаданныхВДерево(Дерево, КоллекцияМетаданных)
Для каждого ОбъектМетаданных Из КоллекцияМетаданных Цикл
СтрокаВерхнегоУровня = Дерево.Строки.Добавить();
СтрокаВерхнегоУровня.ОбъектМетаданных = ОбъектМетаданных.Имя;
ДобавитьРеквизитыОбъектаМетаданныхВДерево(СтрокаВерхнегоУровня, ОбъектМетаданных.Реквизиты);
КонецЦикла;
КонецПроцедуры
Для табличных частей использую соответствующую процедуру.
С добавлением объектов метаданных форм и макетов сложностей не возникло.
Задание выполнил.
С первым пунктом проблем не возникло.
С обработкой пришлось повозиться. Здесь подсмотрел метод НайтиПоТипу(), до этого определял тип и соответствующие ему объект метаданных по-кривому.
Столкнулся со странностью платформы: в процедуру (на клиенте без контекста) передаю элемент структуры, в этой процедуре обращаюсь к свойству “ключ”. В отладчике все работает, в предприятии выдается ошибка (свойства “ключ” не видит). Версия платформы 8.2.12.96
Это странная ситуация.
Приведите пример кода, демонстрирующий проблему (все не относящееся к делу вычеркните).
Первую часть нет проблем. Делал через Хранилище конфигураций. Вторую часть реализовывал уже давно. Сейчас досмотрю лекции и наверно, все переделаю…
Уперся в дерево значений… :(
1) Первая часть задания проблем не вызвала. Создал Функциональную опцию “УчетПоСкладам” и параметр функциональной опции “Организация”.
В Накладных в событиях открытия формы и изменении организации прописал УстановитьПараметрыФункциональныхОпцийФормы(Новый Структура(“Организация”,Объект.Организация));
2) С второй частью были проблеммы. Пришлось повторить тему базового курса по работе с деревом значений, рекурсию. Самостоятельно получилось сделать все, кроме разворачивания структуры ссылочных реквизитов. Дальнейшие действия – изучение коментариев и эталонного решения, когда оно появится.
С функциональными опциями все просто – 2 строчки кода и все работает, как задумано. Я вообще в восторге от такого механизма!
С объектами метаданных посложнее, но зато интереснее. Использовала рекурсивную функцию ЗаполнитьПоМетаданным, ссылочный тип или нет определяла через Метаданные.НайтиПоТипу(Реквизит.Тип.Типы()[0]) (где Реквизит – это очередной реквизит документа или ТЧ из коллекции реквизитов). Также пришлось вспомнить про функции РеквизитФормыВЗначение и ЗначениеВРеквизитФормы для заполнения дерева значений на форме.
ДЗ №3 выполнил.
1) Создал функциональную опцию и параметр для нее. Определил ее состав. В модуле формы описал утановку параметра функциональной опции при изменении организации и при открытии формы
2) Выделил четыре вида коллекций – если перед нами коллекция реквизитов, то перебираем типы возможных значений, добавляем их в дерево, и если они ссылочного типа – то рекурсивно обходим реквизиты и этого типа, если перед нами табличная часть – то обходим ее реквизиты, а если перед нами макеты или формы, то реквизиты необходим.
Готово, первая часть без вопросов.
Вторая тоже. Дерево получилось.
Заполнение идет двумя функциями, первая обходит метаданные, вторая заполняет дерево. Вторая если встречается ссылочный тип, вызывает рекурсивно первую и так далее.
http://prntscr.com/15aio
Задание 3 выполнено! Первая часть показалась даже слишком легкой. Реализована с помощью функциональных опций, все по главе 17. Зато вторая часть далась только со второго подхода. Выбор документа как в главе 19, заполнение ветвей дерева с помощью рекурсий.
Выполнено.
1. По первой части основное затруднение вызвал поиск состава функциональной опции. В первых релизах платформы включенность в функциональные опции была в палитре свойств реквизита, если мне это не приснилось. И я долго и упорно искал свойство “функциональные опции” в палитре свойств реквизита Склад. :)
2. Сделал. Немного повозился с определением из обчнкта метаданных справочник это или документ. Сделал через Метаданные.Справочники.Найти(Реквизит.Тип) или Метаданные.Документы.Найти(Реквизит.Тип)
Первую часть сделал без затруднений.
Вторая часть оказалась гораздо сложнее. Даже описать как я ее делал – и то сложно :)))
&НаСервере
Процедура ДобавитьВсеПодчиненныеУзлы(ОбъектМетаданных, НоваяСтрока);
ДобавитьВнутренниеОбъекты(ОбъектМетаданных, “Реквизиты”, НоваяСтрока);
ДобавитьВнутренниеОбъекты(ОбъектМетаданных, “ТабличныеЧасти”, НоваяСтрока);
ДобавитьВнутренниеОбъекты(ОбъектМетаданных, “Формы”, НоваяСтрока);
ДобавитьВнутренниеОбъекты(ОбъектМетаданных, “Макеты”, НоваяСтрока);
КонецПроцедуры
В процедуре ДобавитьВнутренниеОбъекты реализовал простой обход этих коллекций и рекурсивных вывод их в дерево. Сложность возникла с определением ссылочного типа у реквизита. Выкрутился так:
Если ТипЗНЧ(ОбъектМетаданных) <> Тип(“Неопределено”) Тогда
ДобавитьВсеПодчиненныеУзлы(ОбъектМетаданных, НоваяСтрока);
КонецЕсли;
Собственно, потратил на решение второй части задачи в общей сложности часов 6.
Вообще не понял один момент в итоге: как в модуле управляемой формы сделать общую серверную переменную? Из лекций я понял, что переменная жива только в пределах контекста самой серверной процедуры. Я хотел при создании формы инициализировать массив со строковыми значениями (“Реквизиты”, “ТабличныеЧасти” и т.д.). Протаскивать этот массив в рекурсивную процедуру не хотелось. Погуглив, решил сделать реквизит формы с типом список значений. Но отображать этот список не нужно на форме. Поэтому вообще не понял, как с реквизитом формы, не отображенным на ней, можно работать. Евгений, если Вас не затруднит сильно, не могли бы Вы пояснить этот момент. Я что-то выпустил это из внимания :(
Верно, одним из вариантов хранения значений между вызовами сервера это создание реквизитов управляемой формы.
Домашнее задание оказалось очень простым – все для его выполнения есть в материалах курса и мастер-группы.
1. Учет по складам реализован с помощью функциональной опции и параметра функциональных опций
2. В формах документов использовал метод управляемой формы УстановитьПараметрыФункциональныхОпцийФормы.
3. Обработку “Метаданные документа” реализовал с помощью рекурсии
Первая часть – как по учебнику.
Вторая часть вроде бы тоже несложная, если не считать разворачивание ссылочных типов.
Сделал по главным коллекциям документов – станд. реквизиты, реквизиты шапки, табл части, формы, макеты отдельные циклы, в которых вызываю рекурсивную процедуру вывода строк.
Подглядел в каментах и использовал Реквизит.Тип.типы(). Специально добавлял в документы реквизиты типа документов – работает красиво
Я определила, что реквизит является ссылочным поиском среди метаданных
ТекОбъектМетаданных = Метаданные.Справочники.Найти(ТекСвойство.Тип);
Если ТекОбъектМетаданных=Неопределено Тогда
Иначе
ЗаполнитьРеквизиты(ТекОбъектМетаданных,Строка.ПолучитьЭлементы());
КонецЕсли;
Задание выполнил.
1 часть никаких затруднений не было.
2 часть – были трудности в определении типа реквизита (ссылка или нет). Я определял тип полученного значения с помощью ТипРекв=Рекв.Тип.ПривестиЗначение();
затем проверял в функции ссылочный тип или нет с помощью проверок, например,
Если ТипЗНЧ(ТипРекв)=Тип(“Число”) и так далее.
Для заполнения дерева используется рекурсия.
Кстати, чтобы удобнее было работать с метаданными (в контекстной подсказке) использовал команду
#Если Призрак Тогда
Документ=Документы.ПоступлениеТоваровИУслуг.ПолучитьСсылку();
#КонецЕсли
:)
Отлично :)
ДЗ сделал.
п1 – использовал функциональную опцию.
п2 – Использовал список для описания объектов, которые нужно выводить (реквизиты, формы и т.д.), потом проходил рекурсивно.
Задание готово. Все по лекциям.
Домашнее задание выполнено, все получилось без проблем. Все очень подробно (как всегда:) ) было изложено в уроках
1)Создал Функциональную Опцию “ВестиУчетПоСкладам”, указал хранение в справочнике Справочник.Организации.Реквизит.ВестиУчетПоСкладам, В Составе ФО указал Реквизит “Склад” в Документе ПоступлениеТоваровИУслуг, также указал Реквизит склад табличной части Документа РеализацияТоваровИУслуг.
Создал ПараметрФункциональнойОпции “Организация” использование “Справочник.Организация” В модуляФормы документов РеализацияТоваровИУслуг и ПоступлениеТоваровИУслуг на события ПриСозданииНаСервере, ПриИзмененииОрганизации устанавливаюПараметрыФункциональнойОпции.
2)Алгоритм работы:
– создал СписокЗначений ВидыМетаданных, в который занес значения(“Реквизиты”,”ТабличныеЧасти”,”Формы”,”Макеты”)
– Получая метаданные по указанному виду Документа, пытаюсь получить элементы коллекций для ВидыМетаданных,
— Для реквизитов вызываю рекурсивно эту же функцию и также пробегаю по ОбъектуМетаданных пытаюсь получитьЭлементы коллекции для ВидыМетаданных.
— Для ТабличныхЧастей ВидыМетаданных состоит только из Реквизитов, для реквизиты табличных частей полный список ВидыМетаданнх.
— Для Форм и Макетов просто добавляю название форм и макетов.
ОсновнаяПроблема состояла в том как определить какой тип у Реквизита объекта метаданных, создал функцию которая определяет по ИмениРеквизита какой тип реквизита
Если Метаданные.Документы.Найти(ИмяРеквизита )<>Неопределено Тогда возврат “Документы” Конецесли;
Если Метаданные.Справочники.Найти(ИмяРеквизита )<>Неопределено Тогда возврат “Документы” Конецесли;
и т.д.
Попути заполняю ДеревоЗначений.
Почитав Комментарий, использовав НайтиПоТипу() убрал свою основную проблему.
http://s007.radikal.ru/i300/1011/b8/7dc7667066f2.jpg
P.S. если есть возможность, можете выкладывать ДЗ с утра?
Почитав комментарии добавил чтобы работало также и для Составного типа
ДЗ сделано. Трудностей не возникло.
ДЗ № 3 выполнила.
1) Все сделала как учили, проблем и вопросов не возникло.
2) Создала обработку как требовалось в задании. Использую рекурсивный вызов процедуры для построения дерева. Затруднений не возникло. Все работает, получилось красиво :)
ДЗ выполнено. Часть 1 – все как в видео, работает. Часть 2 – в обработке вызываю рекурсивно заполнение ветви дерева данными (стандартные реквизиты, реквизиты, макеты, формы), примитивные типы вывожу “как есть”. Для избежания зацикливания вывожу только до 4 уровня вложенности (правильнее, наверное, анализировать уже заполненные объекты в ветви)
ДЗ выполнил.
Часть 1- без затруднений, материал подробный.
Часть 2 – учел стандартные реквизиты и отображение составных типов данных.
Сделала 1-ю часть ДЗ.
Добавила объекты и реквизиты по заданию.
Создала функциональную опцию УчетПоСкладам для складов в документах поступления и реализации, а также, параметр функциональных опций Организация.
На форму документов добавила Организацию. В модуле формы Организация – ОбновитьИнтерфейс.
В поступлении и реализации -УстановитьПараметрыФункциональныхОпцийФормы.
В лекциях все подробно.
Понравилось, работает, а почти без программирования.
Сделала 2-ю часть задания.
Сначала сделала обработку по материалам лекций для выбора документов.
Потом стала добавлять и корректировать код для ДЗ.
Отдельно выводила реквизиты, табличные части, формы, макеты.
Использовала рекурсивный вызов процедур – это и было для меня самым сложным.
Например, для реквизитов, сделала процедуру СтруктураРеквизитов(ИмяДок,Строки)
с проверкой ТекОбъектМетаД.Реквизиты.Количество() > 0.
Получилось после изучения лекций, комментариев в этой теме и попыток разработки нескольких вариантов.
Третье ДЗ выполнено.
Использовал код, аналогичный
НоваяСтрокаР = ДокументСтруктура.ПолучитьЭлементы().Добавить();
НоваяСтрокаР.Реквизит = “Реквизиты”;
Для Каждого Реквизит Из Метаданные.Документы.Найти(ИмяДок).Реквизиты цикл
для Каждого СтрокаТипа из Реквизит.Тип.типы() цикл
Поиск = Метаданные.НайтиПоТипу(СтрокаТипа);
НоваяСтрока = НоваяСтрокаР.ПолучитьЭлементы().Добавить();
НоваяСтрока.Реквизит = Строка(Реквизит);
Попытка
Если Поиск.Реквизиты.Количество() > 0 тогда
РазобратьПодчиненный(Поиск,ДокументСтруктура,НоваяСтрока)
КонецЕсли;
Исключение
КонецПопытки;
КонецЦикла;
КонецЦикла;
Проходил отдельно по реквизитам, отдельно по ТЧ, макетам и формам.
первая часть ДЗ затруднений не вызвала.
Задание выполнил.
Склады добавил, функциональную опцию «ВестиУчетПоСкладам» добавил.
Доработал модуль формы документов «Поступление» и «Реализация» по образцу, приведенному в видеоуроке – вызов процедуры «УстановитьПараметрыФункциональныхОпцийФормы»
Обработку «Метаданные документа» сделал следующим образом:
– Сделал реквизит «Документ» – тип «ДокументСсылка», для него добавил обработчик «При изменении». Можно, в принципе выбирать и из коллекции метаданных документа
– Добавил дерево значений на форму
– Добавил процедуру «ЗаполнитьМетаданныеСсылочногоОбъекта» в данной процедуре для объекта ссылочного типа заполняю добавляю подчиненные строки в дерево: «Реквизиты», «ТабличныеЧасти», «Формы», «Макеты». Для каждого ветви вызываю процедуру «ЗаполнитьВетвь»
– Добавил процедуру «ЗаполнитьВетвь», в которой для каждой указанной в условии коллекции объекта метаданных («Реквизиты», «ТабличныеЧасти», «Формы», «Макеты») заполняются сами объекты. При этом для табличной части рекурсивно вызывается процедура ЗаполнитьВетвь – для заполнения реквизитов табличной части. Если в процедуре заполняются реквизиты, то выполняется через «Попытку-исключение» следующие строки:
Значение = Элемент.Тип.ПривестиЗначение(Неопределено);
МетРеквизита = Значение.Метаданные();
То есть я пытаюсь для описания типа реквизита привести значение к ссылочному (пустая ссылка) и из него получить метаданные. Если тип составной или не ссылочный – то приведенное значение не будет ссылочным. То есть для составного типа я дерево не продолжаю.
Если исключение не срабатывает и метаданные получены, то я вызываю рекурсивно процедуру «ЗаполнитьМетаданныеСсылочногоОбъекта» – и начинается очередная рекурсия заполнения метаданных объекта ссылочного типа.
При рекурсивном вызове процедур «ЗаполнитьМетаданныеСсылочногоОбъекта» и «ЗаполнитьВетвь» я передаю массив добавленных в дерево объектов метаданных – для прерывания бесконечных рекурсий на какой-либо ветви. Для процедуры «ЗаполнитьМетаданныеСсылочногоОбъекта» использую передачу этого параметра по значению, чтобы один и тот же объект метаданных мог попасть в разные ветви дерева.
Для обработчика «При изменении» реквизита «Документ» добавил вызов серверной процедуры «ЗаполнитьДеревоМетаданных()». Из данной процедуры я выполняю первый вызов процедуры «ЗаполнитьМетаданныеСсылочногоОбъекта» с параметром Документ.Метаданные().
Глава 16 выпала из обучения? ;) Или просто ДЗ изучение этой темы не требует?
Исправлено :)