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

Второе задание по 1-му блоку продвинутого курса.

Для выполнения рекомендуется изучить следующие главы 1-го курса.
Глава 2. Обработчики событий.
Глава 3. Объектные типы данных.
Глава 4. Критерий отбора.
Глава 5. Команды.

В этой же теме необходимо написать отчет о выполнении задания.

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

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

  1. Задание сделал. отчет по подчиненным документам сделал рекурсией. Поискал, как открыть дерево документов.

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

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

    &НаСервереБезКонтекста
    Процедура ПостроитьДерево(Дерево,ТекСсылка)
    НоваяСтрока=Дерево.Строки.Добавить();
    НоваяСтрока.Документ=ТекСсылка;
    ДобавитьСтрокуВДерево(НоваяСтрока.Строки,ТекСсылка);
    КонецПроцедуры // ПостроитьДерево

    &НаСервереБезКонтекста
    Процедура ДобавитьСтрокуВДерево(РодительскаяСтрока,ТекСсылка)
    Запрос = Новый Запрос;
    Запрос.Текст =
    “ВЫБРАТЬ
    | СтруктураДокументов.Ссылка
    |ИЗ
    | КритерийОтбора.СтруктураДокументов(&Ссылка) КАК СтруктураДокументов”;
    Запрос.УстановитьПараметр(“Ссылка”, ТекСсылка);
    Результат = Запрос.Выполнить();
    ВыборкаДетальныеЗаписи = Результат.Выбрать();
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    НоваяСтрока=РодительскаяСтрока.Добавить();
    НоваяСтрока.Документ=ВыборкаДетальныеЗаписи.Ссылка;
    ДобавитьСтрокуВДерево(НоваяСтрока.Строки,ВыборкаДетальныеЗаписи.Ссылка);
    КонецЦикла;
    КонецПроцедуры // ДобавитьСтрокуВДерево(()

  4. Задание выпонил.
    У документов ПоступлениеТоваровИУслуг и РеализацияТоваровИУслуг добавил реквизит Основание составного типа ДокументСсылка.РеализацияТоваровИУслуг, ДокументСсылка.ПоступлениеТоваровИУслуг. Настроил ввод документов на основании друг друга и самих себя. Алгоритм заполнения документов при вводе на основании реализовал в модулях объектов документов в обработчике ОбработкаЗаполнения.
    Добавил критерий отбора СтруктураПодчиненности со значением составного типа ДокументСсылка.РеализацияТоваровИУслуг, ДокументСсылка.ПоступлениеТоваровИУслуг. В составе указал реквизит Основание соответствующих документов. У критерия отбора создал произвольную форму ФормаСтруктураПодчиненности, в которую добавил реквизиты Документ (составного типа ДокументСсылка.РеализацияТоваровИУслуг, ДокументСсылка.ПоступлениеТоваровИУслуг) и ДеревоДокументов (типа ДеревоЗначений), и разместил эти реквизиты на форме. В ДеревоДокументов добавил колонку Ссылка. У элемента формы ДеревоДокументов свойство НачальноеОтображениеДерева установил в значение «Раскрывать все уровни».
    Создал общую команду СтруктураПодчиненности. Указал группу Панель навигации формы.Важное, тип параметра команды – ДокументСсылка.РеализацияТоваровИУслуг, ДокументСсылка.ПоступлениеТоваровИУслуг.
    При нажатии в форме документов на команду «Структура подчиненности» в окне документа открывается ранее созданная форма критерия отбора, в которую через параметры передается значение реквизита формы Документ:
    <code>
    &НаКлиенте
    Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
                     ПараметрыФормы = Новый Структура(“Документ”, ПараметрКоманды);
                     ОткрытьФорму(“КритерийОтбора.СтруктураПодчиненности.Форма.ФормаСтруктураПодчиненности”, ПараметрыФормы, ПараметрыВыполненияКоманды.Источник, ПараметрыВыполненияКоманды.Уникальность, ПараметрыВыполненияКоманды.Окно);
    КонецПроцедуры
    <code>
    В обработчике ПриСозданииНаСервере модуля формы критерия отбора происходит заполнение дерева значений посредством рекурсивного вызова процедуры ДобавитьДокументВДерево:
    <code>
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
                    Документ = Неопределено;
                    Если Параметры.Свойство(“Документ”, Документ) <> Неопределено Тогда
                                   Дерево = ДанныеФормыВЗначение(ДеревоДокументов, Тип(“ДеревоЗначений”));
                                   ДобавитьДокументВДерево(Документ, Дерево);
                                   ЗначениеВДанныеФормы(Дерево, ДеревоДокументов);
                    КонецЕсли;
    КонецПроцедуры
     
    &НаСервере
    Процедура ДобавитьДокументВДерево(Документ, Дерево)
                    НоваяСтрока = Дерево.Строки.Добавить();
                    НоваяСтрока.Ссылка = Документ;
                    Запрос = Новый Запрос;
                    Запрос.Текст =
                                   “ВЫБРАТЬ
                                   |             СтруктураПодчиненности.Ссылка
                                   |ИЗ
                                   |             КритерийОтбора.СтруктураПодчиненности(&Документ) КАК СтруктураПодчиненности”;
                    Запрос.УстановитьПараметр(“Документ”, Документ);
                    Результат = Запрос.Выполнить();
                    ВыборкаДетальныеЗаписи = Результат.Выбрать();
                    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
                                   ДобавитьДокументВДерево(ВыборкаДетальныеЗаписи.Ссылка, НоваяСтрока)
                    КонецЦикла;
    КонецПроцедуры // ДобавитьДокументВДерево()
    </code>
     

  5. Задание выполнил.
    Создал реквизиты для поступления и реализации –  ДокументОснование, добавил возможность ввода на основании. В обработке заполнения проверяю на тип основания и заполняю шапку в цикле по метаданным. Табличную часть загружаю выгрузкой ТЧ документа основания. Также прописываю ссылку на основание в соответствующий реквизит.
    Создал новый критерий отбора СвязанныеДокументы. Указал тип и состав. Добавил общую форму СтруктураПодчиненности с ДеревомЗначений в качестве основного реквизита.  Создал общую команду с одноименным названием, указал что она относится к панели навигации формы. Команда открывает общую форму, в качестве параметра передается ссылка на документ. При создании на сервере происходит выборка запросом подчиненных документов из ВТ критерия отбора и дальнейшее построение дерева. У таблицы на форме установил свойство НачальноеОтображениеДерева в положение Раскрывать все уровни.
    Сложностей с реализацией не было в принципе, т.к. все необходимые объекты уже использовал на практике.

  6. В документах «Реализация товаров и услуг» и «Поступление товаров и услуг» создал реквизит «Документ основание», тип «ДокументСсылка». Реализовал заполнение документов на основании универсальным образом в процедуре общего модуля, обращаясь к реквизитам через свойство Метаданные и присваивая значение одноименным реквизитам, исключая реквизит «Документ основание». его заполнял значением ссылки, также игнорировал табличную часть «Выгрузка данных» в которой у меня указывались узлы обмена для выгрузки документа.
    Создал критерий отбора «Подчиненные документы» в качестве типа указал «ДокументСсылка», состав: реквизит «Документ основание» документов реализации и поступления.
    Для вывода структуры подчиненности, вначале хотел решить задачу просто. Создал форму критерия отбора и для расположенного на форме списка установил свойство «Отображение»  в «Дерево», а свойство «Начальное отображение дерева» в «Раскрывать все уровни». Затем создал типизированную команду в документе «Поступление товаров и услуг», располагающуюся в панели навигации формы «Перейти» и типом «ДокументСсылка.ПоступлениеТоваровИУслуг» в модуле команды обеспечил открытие формы критерия отбора, куда в качестве параметра передавал Параметр формы, содержащий ссылку на текущий документ. В процедуре ПриСозданииНаСервере формы критерия отбора устанавливал значение переданного параметра для списка.  Но при такой реализации список отображался в линейном виде, а не в виде дерева. Стало очевидным, что дерево придется формировать программным способом.
    Создал обработку «СтруктураПодчиненности» на форме которой расположил ДеревоЗначений и в процедуре формы «ПриСозданииНаСервере» организовал рекурсивную процедуру заполнения дерева, с помощью запроса, обращающегося к виртуальной таблице, созданного критерия отбора и добавляющей строки в дерево. Автоматический разворот каждого элемента дерева обеспечил установкой свойства «Начальное отображение дерева» в «Раскрывать все уровни». Аналогичную операцию по созданию команды выполнил для документа «Реализация товаров и услуг».

  7. Задание выполнила.
    В документы «Реализация» и «Поступление» добавлен реквизит «ДокОснование»- тип «ДокументСсылка». Заполнила свойство «ВводНаОсновании» документами. Процедура «ОбработкаЗаполнения» создана с помощью конструктора, реквизит ДокОснование заполняется ссылкой документа основания.
    Создан Критерий отбора «СвязиДокументов»: состав –  реквизты «ДокОснование» документов «Поступление» и «Реализация», тип – «ДокументСсылка».
    Создана общая команда «СтруктураПодчиненности»: размещение Панель навигации формы «Важное», тип параметра – ДокументСсылка на два документа.
    Создала отчет «ПодчиненныеДокументы» который открывается созданной командой.
    На форму отчета добавила два реквизита: Дерево типа «ДеревоЗначений» и Документ типа «ДокументСсылка». У Дерева установила реквизит «НачальноеОтображениеДерева» = «Раскрывать все уровни» для разворота дерева при открытии.
    В процедуре СформироватьОтчет() реквизиту Документ присваивается ссылка на документ Документ = этаформа.параметры.документ;
    И добавляю первую строку в дерево.
          НоваяСтрока = ДеревоДок.Строки.Добавить();
          НоваяСтрока.ПодчиненныеДокументы = Документ.Ссылка;
          ПостроитьДерево(НоваяСтрока,Документ.Ссылка);
     
    Дальше рекурсивная процедура:
    Процедура ПостроитьДерево(Строка,Док)
          Запрос = Новый Запрос;
          Запрос.Текст =
                      “ВЫБРАТЬ
                      |           СвязиДокументов.Ссылка
                      |ИЗ
                      |           КритерийОтбора.СвязиДокументов(&Ссылка) КАК СвязиДокументов”;
          Запрос.УстановитьПараметр(“Ссылка”, Док);
          Результат = Запрос.Выполнить();
          ВыборкаДетальныеЗаписи = Результат.Выбрать();
          Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
                      ПодчиненнаяСтрока = Строка.Строки.Добавить();
    ПодчиненнаяСтрока.ПодчиненныеДокументы = ВыборкаДетальныеЗаписи.Ссылка;
                      ПостроитьДерево(ПодчиненнаяСтрока,ВыборкаДетальныеЗаписи.Ссылка);
          КонецЦикла;
    КонецПроцедуры

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

    На форму обработки добавил ДеревоЗначений с одним единственным полем Значение.  В ПриСозданииНаСервере() передаю дерево значений в РеквизитФормыВЗначение(), затем вызываю рекурсивную процедуру ПостроитьДерево(ДеревоЗначений, Параметры.РодительскийДокумент.Ссылка);
    После выполнения процедуры выполняю
    ЗначениеВРеквизитФормы()
    Сама процедура простенькая, каркас заимствовал из ДЗ, где строили дерево метаданных. Подчиненный документ выбираю запросом к критерию отбора:
    “ВЫБРАТЬ
    |    ПодчиненныеДокументы.Ссылка,
    |    ПРЕДСТАВЛЕНИЕ(ПодчиненныеДокументы.Ссылка)
    |ИЗ
    |    КритерийОтбора.ПодчиненныеДокументы(&ДокОснование) КАК ПодчиненныеДокументы”, далее если выборка не пустая новый вызов процедуры ПостроитьДерево() и т.д.
    Для разворота дерева подчиненных документов при открытии формы обработки добавил код: Элементы.ДеревоДоков.Развернуть(0,истина);

  9. Почти выполнил.
    1.В документах создал по реквизиту “Родитель”, тип ДокументСсылка.***
    2.В документах реализовал “Ввод на основании” посредством конструктора ввода на основании.
    2.1.Создал критерий отбора “КритерийПодчинённости” с составным типом (ДокументСсылка.Поступление и ДокументСсылка.Продажа), Состав – реквизиты “Родитель” этих документов.
    3.Создаю общую команду, которую разместил в группе “См. так-же”.
    3.1.В обработчике команды пишу:
    Рр = Новый Структура(“РодительскийДокумент”, ПараметрыВыполненияКоманды.Источник.Объект);
    ОткрытьФорму(“Обработка.ПоказатьПодчинённые”, Рр, ПараметрыВыполненияКоманды.Источник, ПараметрыВыполненияКоманды.Уникальность, ПараметрыВыполненияКоманды.Окно);
    4.Создал обработку “ПоказатьПодчиненные” с размещённым на ней деревом значений.
    4.1.В процедуре “При созхдании на сервере” дерево заполняется данными, спасибо – ДЗ№3.
    Само азполнение очень похоже на то как это делал в ДЗ№3, но проще, т.к.  родительские ссылки не могут создавать циклическую ссылку!
    Само заполнение дерева в моём случае свелось к однократному вызову следующей процедуры:
    &НаСервереБезКонтекста
    Процедура ДочерниеУзлыДокумента(Родитель,Строка)
    НаборПодчиненных=КритерииОтбора.КритерийПодчинённости.Найти(Родитель);
    Для Каждого Дочерний_Документ Из НаборПодчиненных Цикл
    Строка2 = Строка.Строки.Добавить();
    Строка2.Документ = Дочерний_Документ;
    ДочерниеУзлыДокумента(Дочерний_Документ,Строка2);
    КонецЦикла;    
    КонецПроцедуры

    единственная загвоздка, что-то не соображу что подсунуть первым параметром в Элементы.Реквизит1.Развернуть(,Истина); что-бы дерево было открыто сверхудонизу (понимаю, что головную строку но как до ней добраться из клиента не соображу).

    • Как обычно “а ларчик просто открывался”:
      Элементы.Реквизит1.Развернуть(0,Истина);

  10. Задание выполнил!
    В документы “Реализация” и “Поступление” добавил реквизит “ДокументОснование” тип ссылка на документ. В свойствах этих документов указал возможность ввода на основании друг друга и самих себя. Прописал процедуру ОбработкаЗаполнения в этих документах где установил соответствие между реквизитами, и где заполняю реквизит ДокументОснование ссылкой документа основания.
    Определил Критерий отбора “СвязиДокументов” где в составе указал на реквизты “ДокументОснование” документов. В данном критерии будут храниться ссылки на связанные документы.
    Для обеспечения вывода структуры подчиненности в документах создал параметрические команды “Структура подчиненности” с параметром ссылка на данный документ и включил их в панель навигации “См.также”.
    Создал отчет ДеревоДокументов который открываю созданной командой.
    На форму отчета добавил реквизит типа “ДеревоЗначений” которое заполняю рекурсивной процедурой:
    Процедура ПостроитьДерево(Дерево,ДокОснование)
    НоваяСтрока = Дерево.Строки.Добавить();
    НоваяСтрока.Значение = ДокОснование;
    //проверяю нет ли подчиненный данному документу
    Запрос = Новый Запрос;
    Запрос.Текст =
    “ВЫБРАТЬ
    | СвязиДокументов.Ссылка,
    | ПРЕДСТАВЛЕНИЕ(СвязиДокументов.Ссылка)
    |ИЗ
    | КритерийОтбора.СвязиДокументов(&ДокОснование) КАК СвязиДокументов”;

    Запрос.УстановитьПараметр(“ДокОснование”, ДокОснование);

    Результат = Запрос.Выполнить();
    ВыборкаДетальныеЗаписи = Результат.Выбрать();

    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    ПостроитьДерево(НоваяСтрока,ВыборкаДетальныеЗаписи.Ссылка);
    КонецЦикла;
    КонецПроцедуры
    Автоматический разворот дерева  обеспечивается установка реквизита дерева НачальноеОтображениеДерева в “Раскрывать все уровни”
     

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

  12. запись закрыта.