комментария 2 на “Продвинутый курс. Занятие №7”

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

    Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
        //{{__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ
        // Данный фрагмент построен конструктором.
        // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
        Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ПоступлениеТоваровИУслуг") Тогда
            // Заполнение шапки
            Договор = ДанныеЗаполнения.Договор;
            Контрагент = ДанныеЗаполнения.Контрагент;
            Организация = ДанныеЗаполнения.Организация;
            Для Каждого ТекСтрокаТовары Из ДанныеЗаполнения.Товары Цикл
                НоваяСтрока = Товары.Добавить();
                НоваяСтрока.Количество = ТекСтрокаТовары.Количество;
                НоваяСтрока.Номенклатура = ТекСтрокаТовары.Номенклатура;
                НоваяСтрока.Сумма = ТекСтрокаТовары.Сумма;
                НоваяСтрока.Цена = ТекСтрокаТовары.Цена;
            КонецЦикла;
        ИначеЕсли ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.РеализацияТоваровИУслуг") Тогда
            // Заполнение шапки
            Договор = ДанныеЗаполнения.Договор;
            Контрагент = ДанныеЗаполнения.Контрагент;
            Организация = ДанныеЗаполнения.Организация;
            Для Каждого ТекСтрокаТовары Из ДанныеЗаполнения.Товары Цикл
                НоваяСтрока = Товары.Добавить();
                НоваяСтрока.Количество = ТекСтрокаТовары.Количество;
                НоваяСтрока.Номенклатура = ТекСтрокаТовары.Номенклатура;
                НоваяСтрока.Склад = ТекСтрокаТовары.Склад;
                НоваяСтрока.Сумма = ТекСтрокаТовары.Сумма;
                НоваяСтрока.Цена = ТекСтрокаТовары.Цена;
            КонецЦикла;
        КонецЕсли;
        //}}__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ
    КонецПроцедуры

    6. В формах списка и документа обоих документов появилась на командной панели команда “Создать на основании – Реализация товаров и услуг”;
    7. Добавляем Реквизит “РодительскийДокумент” составного типа “ДокументСсылка.ПоступлениеТоваровИУслуг; ДокументСсылка.РеализацияТоваровИУслуг”;
    8. Добавляем в процедуру “ОбработкаЗаполнения()” строчку:

        РодительскийДокумент = ДанныеЗаполнения;

    9. Добавляем реквизит “РодительскийДокумент” только для просмотра на форму документа, тестируем.
    Реквизит заполняется, однако странное поведение наблюдается по функциональной опции “УчетПоСкладам” –
    он то виден, то не виден в форме, хотя ФО привязана к другим атрибутам.
    10. Создаем команду “Структура подчиненности”
    11. В панель навигации формы документа “ПоступлениеТоваровИУслуг” не лезет почему-то, поэтому в командную панель
    12. Создаем общую форму “ФормаСтруктураПодчиненности” с деревом значений с полем “Документ”
    13. Создаем вызов её из команды “СтруктураПодчиненности” документа “ПоступлениеТоваровИУслуг” с передачей параметра – ссылки на документ

    &НаКлиенте
    Процедура СтруктураПодчиненности(Команда)
        ОткрытьФорму("ОбщаяФорма.ФормаСтруктураПодчиненности",Новый Структура("Док",Объект.Ссылка));
    КонецПроцедуры

    14. Вставляем обработчик формы “ФормаСтруктураПодчиненности”
    Процедура ДобавитьДокументы(УДЗ) // УДЗ – Узел дерева значений

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

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

    15. Копируем реквизит “РодительскийДокумент” в документ “ПоступлениеТоваровИУслуг”
    16. Двойной щелчок по документу “Поступление товаров и услуг” – вкладка “Ввод на основании”;
    17. Вводится на основании – выбираем “Документ.ПоступлениеТоваровИУслуг” и “Документ.РеализацияТоваровИУслуг”;
    18. Нажимаем кнопку “Конструктор ввода на основании”;
    19. Для обоих объектов жмем “Заполнить выражение”, убираем только “РодительскийДокумент”;
    20. Жмем “ОК”, формируется код, добавляем туда еще строчку для заполнения родительского документа текущим:

    Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
        //{{__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ
        // Данный фрагмент построен конструктором.
        // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
        РодительскийДокумент = ДанныеЗаполнения;
        Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ПоступлениеТоваровИУслуг") Тогда
            // Заполнение шапки
            Договор = ДанныеЗаполнения.Договор;
            Комментарий = ДанныеЗаполнения.Комментарий;
            Контрагент = ДанныеЗаполнения.Контрагент;
            Организация = ДанныеЗаполнения.Организация;
            Склад = ДанныеЗаполнения.Склад;
            Для Каждого ТекСтрокаВыгрузка Из ДанныеЗаполнения.Выгрузка Цикл
                НоваяСтрока = Выгрузка.Добавить();
                НоваяСтрока.Узел = ТекСтрокаВыгрузка.Узел;
            КонецЦикла;
            Для Каждого ТекСтрокаТовары Из ДанныеЗаполнения.Товары Цикл
                НоваяСтрока = Товары.Добавить();
                НоваяСтрока.Количество = ТекСтрокаТовары.Количество;
                НоваяСтрока.Номенклатура = ТекСтрокаТовары.Номенклатура;
                НоваяСтрока.Сумма = ТекСтрокаТовары.Сумма;
                НоваяСтрока.Цена = ТекСтрокаТовары.Цена;
            КонецЦикла;
        ИначеЕсли ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.РеализацияТоваровИУслуг") Тогда
            // Заполнение шапки
            Договор = ДанныеЗаполнения.Договор;
            Контрагент = ДанныеЗаполнения.Контрагент;
            Организация = ДанныеЗаполнения.Организация;
            Для Каждого ТекСтрокаТовары Из ДанныеЗаполнения.Товары Цикл
                НоваяСтрока = Товары.Добавить();
                НоваяСтрока.Количество = ТекСтрокаТовары.Количество;
                НоваяСтрока.Номенклатура = ТекСтрокаТовары.Номенклатура;
                НоваяСтрока.Сумма = ТекСтрокаТовары.Сумма;
                НоваяСтрока.Цена = ТекСтрокаТовары.Цена;
            КонецЦикла;
        КонецЕсли;
        //}}__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ
    КонецПроцедуры

    21. В формы списка добавляем колонку для отобажения родительского документа, тестируем – всё ОК!
    22. Про критерии отбора не понял, что это и зачем
    23. Авторазворот – добавляем строчку в процедуру формирования формы:

        Элементы.СтруктураПодчиненности.НачальноеОтображениеДерева = НачальноеОтображениеДерева.РаскрыватьВсеУровни;
  2. Здравствуйте!

    Обработка СтруктураПодчиненности Модуль формы:

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

        КонецЦикла;

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


    &НаСервере
    Процедура ЗаполнитьНаСервере()
       
        мДок = Новый Массив;
        ДокКореньДерева = ДокОснования;
        Пока ЗначениеЗаполнено(ДокКореньДерева.Основание) Цикл
            фЭлНайден = мДок.Найти(ДокКореньДерева);
           
            мДок.Добавить(ДокКореньДерева);
            ДокКореньДерева = ДокКореньДерева.Основание;
           
            Если фЭлНайден <> Неопределено Тогда
                Прервать;
            КонецЕсли;
           
        КонецЦикла;
       
        КореньДерева = Новый ДеревоЗначений;
        КореньДерева.Колонки.Добавить("ДокСсылка");
        ДерСтрока = КореньДерева;
        ЗаполнитьДеревоНаСервереБезКонтекста(ДерСтрока, КореньДерева, ДокКореньДерева);
        ЗначениеВРеквизитФормы(ДерСтрока, "Дер");
           
    КонецПроцедуры

    &НаКлиенте
    Процедура Заполнить(Команда)
        ЗаполнитьНаСервере();
        РазвернутьДерево();
    КонецПроцедуры

    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
        ФСформировать = Параметры.Свойство("Док", ДокОснования);
        Если фСформировать Тогда
            ЗаполнитьНаСервере();
        КонецЕсли;
    КонецПроцедуры

    &НаКлиенте
    Процедура ПриОткрытии(Отказ)
       
        РазвернутьДерево();

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

    &НаКлиенте
    Процедура РазвернутьДерево()
       
        Для Каждого Эл Из Дер.ПолучитьЭлементы() Цикл
           
            Элементы.Дер.Развернуть(Эл.ПолучитьИдентификатор(), Истина);
           
        КонецЦикла;
       
    КонецПроцедуры