Продвинутый курс. Домашнее задание №7
Второе задание по 1-му блоку продвинутого курса.
Для выполнения рекомендуется изучить следующие главы 1-го курса.
Глава 2. Обработчики событий.
Глава 3. Объектные типы данных.
Глава 4. Критерий отбора.
Глава 5. Команды.
В этой же теме необходимо написать отчет о выполнении задания.
К сожалению, у Вас недостаточно прав для просмотра этой записи. Если Вы еще не залогинены на сайте — залогиньтесь. Если Вы оплачивали курс, у Вас активирован токен доступа, Вы залогинены, но Вы видите эту запись — напишите нам на e-mail поддержки.
Дз выполнила.
1.В документах Поступление и Реализация добавила реквизиты Основание.Заполнение основных реквизитов -с помощью конструктора ввода на основании.
2.Создала критерий отбора “ДокументОснование” и команду, открывающую форму обработки. В обработке дерево заполняла, используя рекурсию.
ДЗ №7 сделала
Домашнее задание выполнено.
1) Добавить реквизит «Основание» для документов “Реализация товаров и услуг” и “Поступление товаров и услуг” с составным типом. Настроил данные по «вводу на основанию» на уровне объектов.
2) Создал подписку на событие «обработка заполнения» для тех же документов. Использовал «ЗаполнитьЗначенияСвойств» для однотипных реквизитов, а для табличных частей пришлось пробежаться по метаданным и использовать конструкцию вида
<code>
Для каждого ТЧ Из Источник.Метаданные().ТабличныеЧасти Цикл
ТЧизДЗ = ДанныеЗаполнения.Метаданные().ТабличныеЧасти.Найти(ТЧ.Имя);
Если ТЧизДЗ <> Неопределено Тогда
Источник[ТЧ.Имя].Загрузить(ДанныеЗаполнения[ТЧизДЗ.Имя].Выгрузить());
КонецЕсли;
КонецЦикла;
</code>
3) Создание критерия отбора с составным типом данных на ссылки документов Реализация и Поступление
4) Создание глобальной параметризованной команды, из которой вызывается общая форма «Струкутра подчиннености».
5) В процедуре «ПриСозданииНаСервере» общей формы рекурсивно заполняется дерево значений через метод «Найти » менеджера критерия отбора. Добавлена проверка на зацикливание (на всякий случай, а случаи бывают всякие :) ).
ДЗ. Выполнил.
Добавил реквизит “Основание”, обработку заполнения сгенерировал конструктором.
Для вывод структуры подчиненности добавил команду в критерии отбора. По команде вызывается обработка. Данные вывожу в дерево значения, заполняю дерево значений с помощью рекурсивной функции.
Задача решена.
В документы Приход и Реализация добавлен реквизит Основание. На закладке ВводНаОсновании указаны эти же документы. ОбработкаЗаполнения – при помощи конструктора. В КритерийОтбора – состав – реквизит Основание документов Приход и Реализация. В обработке рекурсивно строим ДеревоЗначений запросом из критерия отбора.
Добавляем ОбщуюКоманду и обрабатываем Параметры
Задание выполнено.
Результат по ссылке.
1. Ввод на основании – полностью конструктором. С созданием реквизита, где хранить основание, понятное дело.
2. Созданы новые объекты: общая команда, критерий отбора, отчет (можно было и общую форму)
3. Команда параметризуемая, параметр – все документы, для которых нужно получать структуру подчиненности.
Команда открывает форму отчета, передав ей текущий документ в параметре формы (пришлось разбираться, где же эти параметры “поймать”, оказалось – только при создании на сервере :) ).
5. Отчет рекурсивно стоит дерево подчиненности, получая ссылки на документ при помощи критерия отбора. Строящий метод вызывает сам себя для проверки ссылок на подчиненные документы. Проверка “зацикливания” не вызывает рекурсию, если документ в дереве уже встречался.
Задание сделал. Несколько жаль, что по критерию не отобрать все дерево подчинения, а только подчиненные документы текущему.
Готово
http://prntscr.com/19gt6
Вместе с проверкой, хотя мало вероятно.
Готово !..
http://s004.radikal.ru/i205/1012/0b/47dc7753efb9.png
Проверку на зацикливание НЕ делал..
Какое может быть зацикливание – как на основании подчиненного, можно создать документ основание?!..
P.S.: Т.е., как яйцо – может снести саму курицу?!.. ;))
Может-может.
Пользователи еще не то смогут сделать :)
Также по ошибке разработчик может сделать зацикливание программно.
Так что проверка совершенно не лишняя.
Добрый вечер!
Задание выполнено.
У документов создан реквизит ДокументОснование. При ОбработкеЗаполнения частично воспользовался конструктором. Добавил и настроил критерий отбора. Добавил общую команду и общую форму, в которой и строится дерево через рекурсию.
Выполнил.
Для запоминания родителя – реквизит ДокументОснование, процедуры ОбработкаЗаполнения формирую конструктором ввода на основании. Добавляю критерий отбора СтруктураПодчиненности,
Общую команду СтруктураПодчиненности (группа Панель навигации формы.Перейти, тип параметра ДокументСсылка.РеализацияТоваровИУслуг, ДокументСсылка.ПоступлениеТоваровИУслуг) .
Новый отчет СтруктураПодчиненности. При создании на сервере вызывается рекурсивная функция ВывестиПодчиненные(пДокумент, СтрокаДерева). НачальноеОтображениеДерева = РаскрыватьВсеУровни.
В модуле команды вызывается форма отчета.
ДЗ 7 выполнил. Сложностей не возникло. Для запоминания родителя добавлен реквизит ДокОснование.
Для создания дерева используется критерий отбора. Дерево строится при помощи рекурсивной процедуры. В ней получается массив :
МассивСсылок = КритерииОтбора.СтруктураПодчиненности.Найти(Ссылка); и при его обходе добавляются подчиненные строки.
ДЗ № 7 выполнено. Затруднений не возникло. Единственное, что не очень радует, так это наличие запроса в цикле. Но по-моему, его не избежать….
1. Добавил реквизиты “ДокументОснование”, создал критерий отбора.
2. Создал отчет, который формирует структуру подчиненности. Ссылку на документ в отчет передаю через параметр формы – “ДокОснование”;
3. У документов создал команду “СтруктураПодчиненности” и вывел ее на панель навигации. В процедуре “ОбработкаКоманды”
ОткрытьФорму(“Отчет.СтруктураПодчиненности.ФормаОбъекта”, ПараметрыФормы,….), где ПараметрыФормы – структура со ссылкой на тек. документ (ПараметрКоманды).
Вроде красиво получилось…. :)
Указываю связи ввода на основания у документов. Создаю реквизиты «ДокументОснования» .
Создаю в общем модуле «РаботаСДокументамиСервер» процедуру «ЗаполениеДокументаПоОсноваию». Выполняю копирование реквизитов шапки при помощи процедуры ЗаполнитьЗначенияСвойств(). Очищию поле «Номер», чтобы при записи произошло автонумерация, присваиваю текущущю дату (так логичнее), заполняю реквизит «ДокументОснование».
Создаю критерий отбора для используемых видов документов.
Создаю общую команду «СтруктураПодчиненности» (группа Панель навигации формы). Команда вызывает обработку «СтруктураПодчинености». Обработка выстраивает дерево подчиненных документов, при помощи запроса к КритериюОтбора….
Задание выполнил.
1) Для запоминания родительского элемента в реквизиты документов
“Поступление товаров и услуг” и “Реализация товаров и услуг” добавил реквизит ДокументОснование.
Обработку заполнения при вводе на основании реализовал с использованием подписки на событие.
2) В форме каждого документа в панели навигации создал команду “Структура
подчиненности”.
Для хранения связей документов использовал критерий отбора “Связанные документы”.
В форму добавил реквизит с типом “Дерево значений”. Для построения дерева связанных документов
использовал запрос к таблице критерия отбора и рекурсивную процедуру.
Задание сделал. Ввод на основании создал конструктором. Структуру подчиненности сделал в общей форме, которая открывается по нажатию общей команды, в обработчике которой передаю параметр формы – ссылку на открытый документ.
Сделала.
Добавила реквизит Основание в документы и сделала ввод документов “Реализация товаров и услуг” и “Поступление товаров и услуг” на основании друг друга и аналогичных – конструктором. Ввела Критерий СтруктураПодчиненности с формой и параметрами. В форме каждого документа в командном интерфейсе включила видимость критерия отбора. Вводы на основании документа стали отображаться. Сначала сделала без дерева, это было просто.
Остальное – получилось только с использованием комментариев к теме. Сделала общую форму и в документах поступление и реализация создала команды, которыми открываю общую форму с деревом подчиненных документов (запрос к критерию отбора).
Задание выполнил.
Сложностей не возникло. Алгоритм решения не оригинален, такой же как и у большинства коллег.
Задание выполнил.
Поскольку требуется заполнять на основании документы разных типов, сделал универсальную процедуру заполнения на основании, вызываемую из подписки на событие “Обработка заполнения”. Реквизиты документов и табличных частей копирую после анализа структуры метаданных – копируются реквизиты с одинаковыми именами. Если у реквизитов не совпадают типы, то после присвоения значения реквизит нового документа остается пустым.
Также заполняю реквизит “ДокументОснование” у документа – при обработке заполнения.
Добавил критерий отбора, тип указал “ДокументСсылка”, включил все галочки в составе.
Дерево подчиненности строю при помощи процедуры, вызываемой рекурсивно с запросом по поиску подчиненных документов к виртуальной таблице критерия отбора. При этом перед добавлением нового документа проверяю наличие этого же документа в вышестоящих строках – чтобы не зациклить рекурсивный вызов.
1.Добавил реквизит ДокументОснование. Конструктор Ввода на основании в 8.2 так же хорош как и в 7.7
2.Рекурсивная функция с Запросом к КритериюОтбора позволяет обойти дерево. Но с выводом отчета на форму текущего документа проблемы. Вывести динамический список как дерево значений не осилил. Использование внешней формы, как это сделано в типовых, противоречит условию задания. Видимо все применившие внешнюю форму так же не осилили. Заполнение дерева значений на форме не осилил. Хотелось бы в мастер группе разобрать: заполнение дерева значений на управляемой форме.
Привет. Может натолкнет на мысл этот код:
Дерево = РеквизитФормыВЗначение(“ДеревоПодчиненности”);
СформироватьСтруктуруПодчиненности(Дерево, Параметры.ДокОснование);
ЗначениеВРеквизитФормы(Дерево,”ДеревоПодчиненности”);
А реквизит формы имеет тип “ДеревоЗначений”
Задание выполнено. В реализацию и поступление добавлен реквизит ДокументОснование. Ввод на основании – конструктором. Структура подчиненности реализована с помощью критерия отбора и одноименной команды.
Выполнено!
Выполнил.
1. Для воода на основании ПТУ и РТУ использовал подписку обработку заполнения.
2. Для команды Структура подчиненности использовал запрос к критерию отбора с передачей параметра, вызов запроса в рекурсии для построения дерева.
ДЗ № 7 выполнила.
1) В документы ПТУ и РТУ добавила реквизит ДокументОснование составного типа. Настроила ввод на основании для этих документов.
2) Создала подписку на событие ОбработкаЗаполнения для документов ПТУ и РТУ. Через дополнительные свойства передаю в обработчик подписки документ-основание и делаю заполнение реквизитов и табличных частей. Там же заполняю реквизит ДокументОснование.
3) Создала критерий отбора СвязанныеДокументы.
4) Создала общую форму “Структура Подчиненности”.
5) Создала общую параметризованную команду в панели навигации формы, по которой вызывается открытие общей формы с ключевым параметром Документ, по которому нужно строить дерево. Данные о подчиненных документах получаю запросом по таблице критерия отбора. С помощью рекурсивной процедуры строится дерево.
Все получилось, трудностей не возникло.
1. В документы поступления и реализации добавил реквизит “ДокументОснования”. Вначале формировал процедуру ввода на основании конструктором, потом переносил в подписку на события.
2. Создал критерий отбора СтруктураПодчиненности. Дерево заполнял с использованием рекурсии.
Выполнено.
Сделано.
Добавлен реквизит ДокументОснование в документы Поступление и Реализация. С помощью подписки на событие ОбработкаЗаполнения и метода ЗаполнитьЗначенияСвойств заполняем общие реквизиты (исключая станд. реквизиты и реквизит ЗапретРедактирования, созданный ранее при работе с РИБ) и реквизиты всех ТЧ (пришлось снова поработать с метаданными :)).
Создан критерий отбора Структура подчиненности и его форма. В форме создан реквизит с типом ДеревоЗначений, куда с помощью запроса к критерию отбора и рекурсии выводим данные о подчиненных документах. Все это происходит в процедуре приСозданииНаСервере, параметр в запрос передается через свойство Параметры. Отбор.Значение. Для избежания зацикливания сделала реквизит ДокументОснование доступным только на просмотр, потому что кроме как вручную, создать зацикливание в данном случае мне кажется невозможным. Может я не права?
Задание выполнено.
В документы ПоступлениеТоваровИУслуг и РеализацияТоваровИУслуг добавляем реквизит ДокументОснование (с типом этих же документов).
Создаем команду комСтруктураПодчиненности (например в группе Панель навигации формы.См. также), для форм списка придется вытягивать ее на форму вручную.
Команда будет открывать общуюформу и при открытии формировать дерево подчиненных документов.
Создаем критерий отбора СтруктураПодчиненности. Настраиваем тип и состав.
Далее при открытии общей формы из команды будет выполняться рекурсивная процедура построения дерева (КритерииОтбора.СтруктураПодчиненности.Найти(ОбъектОтбора))
Задание выполнено.
В документы ПоступлениеТоваровИУслуг и РеализацияТоваровИУслуг добавляем реквизит ДокументОснование (с типом этих же документов).Создаем команду комСтруктураПодчиненности (например в группе Панель навигации формы.См. также), для форм списка придется вытягивать ее на форму вручную.Команда будет открывать общуюформу и при открытии формировать дерево подчиненных документов.Создаем критерий отбора СтруктураПодчиненности. Настраиваем тип и состав.Далее при открытии общей формы из команды будет выполняться рекурсивная процедура построения дерева (КритерииОтбора.СтруктураПодчиненности.Найти(ОбъектОтбора))
Выполнил. Как и многие использовал общую форму, команду и критерий отбора. В документах создал реквизит ДокументОснование соответствующих типов данных. При создании общей формы на сервере обходил рекурсивно результаты запроса по критерию отбора. Получается запрос в цикле, что не Ice, поэтому жду решения Евгения и комментарии как можно оптимизировать решение данной задачи
Задание выполнил.
Настроил ввод на основании документов и добавил обработку заполнения на подписке. Из обработки заполнения вызываю процедуру копирования реквизитов. Каждый реквизит копируется в реквизит нового документа с тем же именем, если он есть. Предварительно проверяется, может ли реквизит нового документа принимать значения типа, равного типу значения исходного реквизита. Эта же процедура вызывается для реквизитов табличной части.
Также в документ добавил реквизит «Основание» – заполняю его исходным документом при заполнении на основании.
Отчет «Структура подчиненности» вызываю через общую параметризированную команду. Подчиненные документы ищу при помощи критерия отбора. Строки заполняю рекурсивно вызываемой процедурой. В процедуре первый параметр – текущая строка, второй параметр (с признаком ЗНАЧ) – массив документов, добавленных в вышестоящие строки. При помощи второго параметра страхуюсь от зацикливания рекурсивного вызова.
Для вызова формы отчета использовал процедуру ОткрытьФорму с параметрами, заполненными по умолчанию. Указал только форму отчета и добавил документ в структуру «ПараметрыФормы».
ДЗ 7 выполнил:
1. В документах РТ и ПТ создал реквизит ДокументОснование. Заполнение при вводе на основание реализовал на основе подписки на событие ОбработкаЗаполнения используя ЗаполнитьЗначенияСвойств исключая реквизиты дата, проведен и номер, отдельно заполняя ТЧ.
2. Создал критерий отбора и его форму. Используя событие ПриСозданииНаСервере и рекурсивную функцию – создаю ДеревоЗначений которое потом показываю в форме. Динамический список формы критерия отбора совсем не использую, хотя там есть возможность включения группировки хотелось бы узнать как есть ли возможность вывести его в виде дерева.
3. Открытие формы критерия отбора вызываю через глобальную команду.
готово
Задание выполнено.
Особых проблем не возникло.
ДЗ №7.
1. В док. реализация и поступление добавил реквизит шапки «ДокументОснование» с соcтавным типом (док. реализация, поступление). На закладке «ВводНаОсновании» добавил для обоих этих документов документы Реализация и Поступление.
Добавил подписку на события «ВводНаОсновании», источник составного типа «ДокументОбъект.РеализацияТоваровИУслуг, ДокументОбъект.ПоступлениеТоваровИУслуг», событие «ОбработкаЗаполнения».
2. Создал критерий отбора «СтруктураПодчиненности». На закладке данные тип «ДокументСсылка», на закладке состав выбрал реквизиты ДокументОснование для поступления и реализации. В документах поступление и реализация создал команды «СтруктураПодчиненности». Создал общую форму «СтруктураПодчиненности». При вызове команд открывается общая форма, в которой с помощью рекурсии заполняется дерево подчиненных документов (используется запрос к критерию отбора).
Задание выполнено – добавила реквизит ДокументОснование в Расходную и Приходную накладные, заполнение на основании сформировала конструктором, добавила критерий отбора СвязанныеДокументы, общую параметризованную команду, общую форму
Задание выполнил, вновь все очень просто.
1. Добавил общую форму и общую команду
2. Формирование дерева структуры подчиненности сделал через рекурсию
3. Для корректной обработки циклических ссылок ограничил глубину вызова рекурсии 20 уровнями вложенности
Задание выполнено.
Использованы общая команда, общая форма и критерий отбора. Применялась рекурсия.
Готово.
1. Реквизит “Основание” для РТУ и ПТУ. Процедуры “ОбработкаЗаполнения” формировал стандартным конструктором.
2. Общая команда, которая вызывает произвольную форму критерия “Структура подчиненности”.
3. Вывод дерева – рекурсией. Для получения подчинненых документов:
<code>МассивДокументов = КритерииОтбора.СтруктураПодчиненности.Найти(Документ);</code>
Учел циклические ссылки. Все выведенные документы записыаются массив. После вывода документа проверяем его на вхождение в массив, если входит (был выведен) тогда возврат из рекурсии. Т.о. если встречается зацикливание – то корень дерева равен самому дальнему листу дерева.
Создал реквизиты “ДокОснование” в документах ПостТУ и РеалТУ. Конструктором сформировал обработчики ввода на основании. Создал критерий отбора “ДокОснование”. В форме документов в команддном интерфейсе проставил крыжик видимости. Поскольку в задании сказано вывести документы, дочерние для текущего, то данный функционал сделан без программирования.
Сергей, имелось ввиду построение дерева.
Внесенные изменения:
– в Документах РеализацияТоваровИУслуг, ПоступлениеТоваровИУслуг, указал что оба они вводятся на основаниии и являются основанием Реализации и Поступления;
– в документы реализация товаров и услуг, добавил реквизит ДокументОснования, куда при вводе на основании записывается документ основания;
– с помощью Метода ЗаполнитьЗначенияСвойств() обеспечил заполнения Реквизитов документа, и табличных частей. Исключил из заполнения стандартные реквизиты;
– создал критерий отбора Подчиненные документы, Данные: Документы Поступления и Реализация, состав: ДокументОснования.
– Рекурсивной функцией и запросом по критерию отбора, заполняю дерево значений;
– вывожу дерево в форму документа http://s005.radikal.ru/i212/1011/85/12963baaa1eb.jpg
забыл указать:
– создал подписку на событие “ОбработкаЗаполнения” для документов РТиУ и ПТиУ
ОК ! Поработаю над деревом. Чтобы вывести несколько уровней подчиненности !
Дерево получилось реализовать конкретно в форме документа
&НаСервере
Функция ПостроитьДеревоНаСервере(ПараметрКоманды)
Дз=Новый ДеревоЗначений;
Дз.Колонки.Добавить(“Документ”);
ПостроитьДерево(ПараметрКоманды,Дз);
ЗначениеВДанныеФормы(Дз,Дзн);
КонецФункции // ПостроитьДеревоНаСервере()
&НаСервере
Процедура ПостроитьДерево(ПараметрКоманды,Дз)
МассивСсылок = КритерииОтбора.ДокОсн.Найти(ПараметрКоманды);
Для Каждого Ссылка Из МассивСсылок Цикл
Стр= Дз.Строки.Добавить();
Стр.Документ=Ссылка;
Сообщить(Стр.Документ);
Если Ссылка=НЕопределено Тогда
Продолжить;
КонецЕсли;
ПостроитьДерево(Ссылка,Стр);
КонецЦикла;
КонецПроцедуры
Пытался еще сделать вариант решения через общую команду – не получилось дерево в реквизит дерево вывести
Красота :)