Групповая обработка ПКО и ПКС в КД



Встраивание типовой обработки "Универсальный подбор и обработка объектов" в КД для групповой обработки ПКО и ПКС

Потребовалось поменять значения и обработчики ПКС сразу для кучи определенных свойств документов. Стандартная обработка в КД «Групповая обработка справочников и документов» для этого не совсем подошла, т.к. там невозможно использовать код для обработки, да и не очень удобно отбор создавать. Поэтому вставил в КД типовую обработку «Универсальный подбор и обработка объектов» и привязал её открытие к выбранным ПКО/ПКС в форме редактирования правил обмена.

На форму (в командные панели списков ПКО и ПКС) добавляются кнопки «Обработка объектов» и «Обработка свойств». Они позволяют открыть групповую обработку сразу с установленным отбором в зависимости от текущего выбранного ПКО/ПКС. Поддерживается множественный выбор.

Инструкция: 

1) Включаем возможность изменения в КД, добавляем в обработки «Универсальный подбор и обработка объектов» с ИТС под именем «УниверсальныеПодборИОбработкаОбъектов«

2) Открываем общую форму «ПравилаОбмена» и вставляем в конец модуля формы (перед комментариями «ОПЕРАТОРЫ ОСНОВНОЙ ПРОГРАММЫ») кусок кода:

//{ Конвертация данных }

Процедура ПриОткрытии_КД()

    // Типовой обработчик
   
ПриОткрытии();

    Если Метаданные.Обработки.Найти(«УниверсальныеПодборИОбработкаОбъектов») = Неопределено Тогда
       
ТекстСообщения =
           
«Необходимо добавить в конфигурацию обработку «»УниверсальныеПодборИОбработкаОбъектов»»
            |Путь на ИТС: 1CItsEXEEXTREPSUNIREPS82UniversalSelectionУниверсальныеПодборИОбработкаОбъектов.epf»
;
       
Сообщить(ТекстСообщения);
    Иначе
       
Кнопка = Элементыформы.КоманднаяПанельПКО.Кнопки.Добавить(«РазделительОбработкаОбъектов_КД», ТипКнопкиКоманднойПанели.Разделитель);
       
Кнопка = Элементыформы.КоманднаяПанельПКО.Кнопки.Добавить(«ОбработкаОбъектов_КД», ТипКнопкиКоманднойПанели.Действие, «Обработка объектов», Новый Действие(«ОбработкаОбъектов_КД»));
       
Кнопка.Подсказка = «Групповая обработка объектов»;
       
Кнопка.Пояснение = «Групповая обработка объектов»;

        Кнопка = Элементыформы.КоманднаяПанельПКС.Кнопки.Добавить(«РазделительОбработкаСвойств_КД», ТипКнопкиКоманднойПанели.Разделитель);
       
Кнопка = Элементыформы.КоманднаяПанельПКС.Кнопки.Добавить(«ОбработкаСвойств_КД», ТипКнопкиКоманднойПанели.Действие, «Обработка свойств», Новый Действие(«ОбработкаСвойств_КД»));
       
Кнопка.Подсказка = «Групповая обработка свойств»;
       
Кнопка.Пояснение = «Групповая обработка свойств»;
    КонецЕсли;

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

Процедура ОбработкаОбъектов_КД(Кнопка)

    ТекущееПКО = ЭлементыФормы.ПравилаКонвертацииОбъектов.ТекущаяСтрока;
    Если
ТекущееПКО = Неопределено Тогда
        Возврат;
    КонецЕсли;

    СсылкаНаПКО = ТекущееПКО.Ссылка;
   
ВыбранныеПКО = ЭлементыФормы.ПравилаКонвертацииОбъектов.ВыделенныеСтроки;

    ГрупповаяОбработка = Обработки.УниверсальныеПодборИОбработкаОбъектов.Создать();
   
ГрупповаяОбработка.ТипОбъектовПоиска = Тип(«СправочникСсылка.ПравилаКонвертацииОбъектов»);
   
ФормаОбработки = ГрупповаяОбработка.ПолучитьФорму(, ЭтаФорма, Новый УникальныйИдентификатор);
   
ФормаОбработки.Открыть();

    ПостроительОтбор = ФормаОбработки.ПостроительОтчета.Отбор;
   
// Дополнительный отбор на элементы
   
ОтборГруппа = ПостроительОтбор.Добавить(«Объект.ЭтоГруппа»);
   
ОтборГруппа.ВидСравнения = ВидСравнения.Равно;
   
ОтборГруппа.Значение = Ложь;
   
ОтборГруппа.Использование = Истина;
    Если
ВыбранныеПКО.Количество() > 1 Тогда
       
// Отбор на несколько выбранных ПКО
       
МассивСтрок = Новый Массив;
       
ЕстьГруппы = Ложь;
        Для Каждого
СтрокаПКО Из ВыбранныеПКО Цикл
            Если
СтрокаПКО.Ссылка.Пустая() Тогда
               
// Отбор на все ПКО (конвертацию)
               
МассивСтрок.Очистить();
               
ТекущееПКО = СтрокаПКО;
                Прервать;
            КонецЕсли;
           
МассивСтрок.Добавить(СтрокаПКО.Ссылка);
            Если
СтрокаПКО.ЭтоГруппа Тогда
               
ЕстьГруппы = Истина;
            КонецЕсли;
        КонецЦикла;
        Если
МассивСтрок.Количество() <> 0 Тогда
           
ОтборСписок = ПостроительОтбор.Добавить(«Объект»);
           
ОтборСписок.ВидСравнения = ?(ЕстьГруппы, ВидСравнения.ВСпискеПоИерархии, ВидСравнения.ВСписке);
           
ОтборСписок.Значение.ЗагрузитьЗначения(МассивСтрок);
           
ОтборСписок.Использование = Истина;
        КонецЕсли;
    Иначе
        Если НЕ
СсылкаНаПКО.Пустая() Тогда
           
// Отбор на текущее ПКО
           
Если НЕ ТекущееПКО.ЭтоГруппа Тогда
               
ОтборПКО = ПостроительОтбор.Добавить(«Объект»);
               
ОтборПКО.ВидСравнения = ВидСравнения.Равно;
               
ОтборПКО.Значение = СсылкаНаПКО;
               
ОтборПКО.Использование = Истина;
            КонецЕсли;
           
// Отбор на группу текущего ПКО
           
Если ТекущееПКО.ЭтоГруппа ИЛИ НЕ ТекущееПКО.Родитель.Пустая() Тогда
               
ОтборРодитель = ПостроительОтбор.Добавить(«Объект.Родитель»);
               
ОтборРодитель.ВидСравнения = ВидСравнения.ВИерархии;
               
ОтборРодитель.Значение = ?(ТекущееПКО.ЭтоГруппа, СсылкаНаПКО, ТекущееПКО.Родитель);
               
ОтборРодитель.Использование = ТекущееПКО.ЭтоГруппа;
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;
   
// Отбор на все ПКО (конвертацию)
   
ОтборКонвертация = ПостроительОтбор.Добавить(«Объект.Владелец»);
   
ОтборКонвертация.ВидСравнения = ВидСравнения.Равно;
   
ОтборКонвертация.Значение = ?(СсылкаНаПКО.Пустая(), Конвертация, ТекущееПКО.Владелец);
   
ОтборКонвертация.Использование = СсылкаНаПКО.Пустая();

    ФормаОбработки.вВыполнитьОтчет();

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

Процедура ОбработкаСвойств_КД(Кнопка)

    ТекущееПКО = ЭлементыФормы.ПравилаКонвертацииОбъектов.ТекущаяСтрока;
    Если
ТекущееПКО = Неопределено Тогда
        Возврат;
    КонецЕсли;

    СсылкаНаПКО = ТекущееПКО.Ссылка;
   
ВыбранныеПКС = ЭлементыФормы.ПравилаКонвертацииСвойств.ВыделенныеСтроки;

    ГрупповаяОбработка = Обработки.УниверсальныеПодборИОбработкаОбъектов.Создать();
   
ГрупповаяОбработка.ТипОбъектовПоиска = Тип(«СправочникСсылка.ПравилаКонвертацииСвойств»);
   
ФормаОбработки = ГрупповаяОбработка.ПолучитьФорму(, ЭтаФорма, Новый УникальныйИдентификатор);
   
ФормаОбработки.Открыть();

    ПостроительОтбор = ФормаОбработки.ПостроительОтчета.Отбор;
    Если
ВыбранныеПКС.Количество() > 1 Тогда
       
// Отбор на несколько выбранных ПКС
       
МассивСтрок = Новый Массив;
        Для Каждого
СтрокаПКС Из ВыбранныеПКС Цикл
           
МассивСтрок.Добавить(СтрокаПКС.Ссылка);
        КонецЦикла;
       
ОтборСписок = ПостроительОтбор.Добавить(«Объект»);
       
ОтборСписок.ВидСравнения = ВидСравнения.ВСписке;
       
ОтборСписок.Значение.ЗагрузитьЗначения(МассивСтрок);
       
ОтборСписок.Использование = Истина;
    Иначе
        Если НЕ
СсылкаНаПКО.Пустая() Тогда
           
// Отбор на текущее ПКО
           
Если НЕ ТекущееПКО.ЭтоГруппа Тогда
               
ОтборПКО = ПостроительОтбор.Добавить(«Объект.Владелец»);
               
ОтборПКО.ВидСравнения = ВидСравнения.Равно;
               
ОтборПКО.Значение = СсылкаНаПКО;
               
ОтборПКО.Использование = Истина;
            КонецЕсли;
           
// Отбор на группу текущего ПКО
           
Если ТекущееПКО.ЭтоГруппа ИЛИ НЕ ТекущееПКО.Родитель.Пустая() Тогда
               
ОтборРодитель = ПостроительОтбор.Добавить(«Объект.Владелец.Родитель»);
               
ОтборРодитель.ВидСравнения = ВидСравнения.ВИерархии;
               
ОтборРодитель.Значение = ?(ТекущееПКО.ЭтоГруппа, СсылкаНаПКО, ТекущееПКО.Родитель);
               
ОтборРодитель.Использование = ТекущееПКО.ЭтоГруппа;
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;
   
// Отбор на все ПКО (конвертацию)
   
ОтборКонвертация = ПостроительОтбор.Добавить(«Объект.Владелец.Владелец»);
   
ОтборКонвертация.ВидСравнения = ВидСравнения.Равно;
   
ОтборКонвертация.Значение = ?(СсылкаНаПКО.Пустая(), Конвертация, ТекущееПКО.Владелец);
   
ОтборКонвертация.Использование = СсылкаНаПКО.Пустая();

    ФормаОбработки.вВыполнитьОтчет();

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

ЭтаФорма.УстановитьДействие(«ПриОткрытии», Новый Действие(«ПриОткрытии_КД»));

//} Конвертация данных

 

Для тех у кого с КД интегрирована подсистема «Инструменты разработчика» добавлять типовую обработку не надо (она уже есть в подсистеме) и код будет такой:

//{ Конвертация данных }

Процедура ПриОткрытии_КД()

    // Типовой обработчик
   
ПриОткрытии();

    Если Метаданные.Обработки.Найти(«ирПодборИОбработкаОбъектов») = Неопределено Тогда
        Возврат;
    КонецЕсли;

    Кнопка = Элементыформы.КоманднаяПанельПКО.Кнопки.Добавить(«РазделительОбработкаОбъектов_КД_ИР», ТипКнопкиКоманднойПанели.Разделитель);
   
Кнопка = Элементыформы.КоманднаяПанельПКО.Кнопки.Добавить(«ОбработкаОбъектов_КД_ИР», ТипКнопкиКоманднойПанели.Действие, «Обработка объектов», Новый Действие(«ОбработкаОбъектов_КД_ИР»));
   
Кнопка.Подсказка = «Групповая обработка объектов»;
   
Кнопка.Пояснение = «Групповая обработка объектов»;

    Кнопка = Элементыформы.КоманднаяПанельПКС.Кнопки.Добавить(«РазделительОбработкаСвойств_КД_ИР», ТипКнопкиКоманднойПанели.Разделитель);
   
Кнопка = Элементыформы.КоманднаяПанельПКС.Кнопки.Добавить(«ОбработкаСвойств_КД_ИР», ТипКнопкиКоманднойПанели.Действие, «Обработка свойств», Новый Действие(«ОбработкаСвойств_КД_ИР»));
   
Кнопка.Подсказка = «Групповая обработка свойств»;
   
Кнопка.Пояснение = «Групповая обработка свойств»;

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

Процедура ОбработкаОбъектов_КД_ИР(Кнопка)

    ТекущееПКО = ЭлементыФормы.ПравилаКонвертацииОбъектов.ТекущаяСтрока;
    Если
ТекущееПКО = Неопределено Тогда
        Возврат;
    КонецЕсли;

    СсылкаНаПКО = ТекущееПКО.Ссылка;
   
ВыбранныеПКО = ЭлементыФормы.ПравилаКонвертацииОбъектов.ВыделенныеСтроки;

    ГрупповаяОбработка = Обработки.ирПодборИОбработкаОбъектов.Создать();
   
ФормаОбработки = ГрупповаяОбработка.ПолучитьФорму(, ЭтаФорма, «Справочник.ПравилаКонвертацииОбъектов»);
   
ФормаОбработки.Открыть();

    КомпоновщикОтбор = ФормаОбработки.Компоновщик.Настройки.Отбор.Элементы;
   
// Дополнительный отбор на элементы
   
ОтборГруппа = КомпоновщикОтбор.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));
   
ОтборГруппа.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(«ЭтоГруппа»);
   
ОтборГруппа.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
   
ОтборГруппа.ПравоеЗначение = Ложь;
   
ОтборГруппа.Использование = Истина;

    Если ВыбранныеПКО.Количество() > 1 Тогда
       
// Отбор на несколько выбранных ПКО
       
СписокСтрок = Новый СписокЗначений;
       
ЕстьГруппы = Ложь;
        Для Каждого
СтрокаПКО Из ВыбранныеПКО Цикл
            Если
СтрокаПКО.Ссылка.Пустая() Тогда
               
// Отбор на все ПКО (конвертацию)
               
СписокСтрок.Очистить();
               
ТекущееПКО = СтрокаПКО;
                Прервать;
            КонецЕсли;
           
СписокСтрок.Добавить(СтрокаПКО.Ссылка);
            Если
СтрокаПКО.ЭтоГруппа Тогда
               
ЕстьГруппы = Истина;
            КонецЕсли;
        КонецЦикла;
        Если
СписокСтрок.Количество() <> 0 Тогда
           
ОтборСписок = КомпоновщикОтбор.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));
           
ОтборСписок.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(«Ссылка»);
           
ОтборСписок.ВидСравнения = ?(ЕстьГруппы, ВидСравненияКомпоновкиДанных.ВСпискеПоИерархии, ВидСравненияКомпоновкиДанных.ВСписке);
           
ОтборСписок.ПравоеЗначение = СписокСтрок;
           
ОтборСписок.Использование = Истина;
        КонецЕсли;
    Иначе
        Если НЕ
СсылкаНаПКО.Пустая() Тогда
           
// Отбор на текущее ПКО
           
Если НЕ ТекущееПКО.ЭтоГруппа Тогда
               
ОтборПКО = КомпоновщикОтбор.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));
               
ОтборПКО.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(«Ссылка»);
               
ОтборПКО.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
               
ОтборПКО.ПравоеЗначение = СсылкаНаПКО;
               
ОтборПКО.Использование = Истина;
            КонецЕсли;
           
// Отбор на группу текущего ПКО
           
Если ТекущееПКО.ЭтоГруппа ИЛИ НЕ ТекущееПКО.Родитель.Пустая() Тогда
               
ОтборРодитель = КомпоновщикОтбор.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));
               
ОтборРодитель.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(«Родитель»);
               
ОтборРодитель.ВидСравнения = ВидСравненияКомпоновкиДанных.ВИерархии;
               
ОтборРодитель.ПравоеЗначение = ?(ТекущееПКО.ЭтоГруппа, СсылкаНаПКО, ТекущееПКО.Родитель);
               
ОтборРодитель.Использование = ТекущееПКО.ЭтоГруппа;
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;
   
// Отбор на все ПКО (конвертацию)
   
ОтборКонвертация = КомпоновщикОтбор.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));
   
ОтборКонвертация.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(«Владелец»);
   
ОтборКонвертация.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
   
ОтборКонвертация.ПравоеЗначение = ?(СсылкаНаПКО.Пустая(), Конвертация, ТекущееПКО.Владелец);
   
ОтборКонвертация.Использование = СсылкаНаПКО.Пустая();

    ФормаОбработки.вВыполнитьОтчет();

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

Процедура ОбработкаСвойств_КД_ИР(Кнопка)

    ТекущееПКО = ЭлементыФормы.ПравилаКонвертацииОбъектов.ТекущаяСтрока;
    Если
ТекущееПКО = Неопределено Тогда
        Возврат;
    КонецЕсли;

    СсылкаНаПКО = ТекущееПКО.Ссылка;
   
ВыбранныеПКС = ЭлементыФормы.ПравилаКонвертацииСвойств.ВыделенныеСтроки;

    ГрупповаяОбработка = Обработки.ирПодборИОбработкаОбъектов.Создать();
   
ФормаОбработки = ГрупповаяОбработка.ПолучитьФорму(, ЭтаФорма, «Справочник.ПравилаКонвертацииСвойств»);
   
ФормаОбработки.Открыть();

    КомпоновщикОтбор = ФормаОбработки.Компоновщик.Настройки.Отбор.Элементы;
    Если
ВыбранныеПКС.Количество() > 1 Тогда
       
// Отбор на несколько выбранных ПКС
       
СписокСтрок = Новый СписокЗначений;
        Для Каждого
СтрокаПКС Из ВыбранныеПКС Цикл
           
СписокСтрок.Добавить(СтрокаПКС.Ссылка);
        КонецЦикла;
       
ОтборСписок = КомпоновщикОтбор.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));
       
ОтборСписок.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(«Ссылка»);
       
ОтборСписок.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
       
ОтборСписок.ПравоеЗначение = СписокСтрок;
       
ОтборСписок.Использование = Истина;
    Иначе
        Если НЕ
СсылкаНаПКО.Пустая() Тогда
           
// Отбор на текущее ПКО
           
Если НЕ ТекущееПКО.ЭтоГруппа Тогда
               
ОтборПКО = КомпоновщикОтбор.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));
               
ОтборПКО.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(«Владелец»);
               
ОтборПКО.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
               
ОтборПКО.ПравоеЗначение = СсылкаНаПКО;
               
ОтборПКО.Использование = Истина;
            КонецЕсли;
           
// Отбор на группу текущего ПКО
           
Если ТекущееПКО.ЭтоГруппа ИЛИ НЕ ТекущееПКО.Родитель.Пустая() Тогда
               
ОтборРодитель = КомпоновщикОтбор.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));
               
ОтборРодитель.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(«Владелец.Родитель»);
               
ОтборРодитель.ВидСравнения = ВидСравненияКомпоновкиДанных.ВИерархии;
               
ОтборРодитель.ПравоеЗначение = ?(ТекущееПКО.ЭтоГруппа, СсылкаНаПКО, ТекущееПКО.Родитель);
               
ОтборРодитель.Использование = ТекущееПКО.ЭтоГруппа;
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;
   
// Отбор на все ПКО (конвертацию)
   
ОтборКонвертация = КомпоновщикОтбор.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));
   
ОтборКонвертация.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(«Владелец.Владелец»);
   
ОтборКонвертация.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
   
ОтборКонвертация.ПравоеЗначение = ?(СсылкаНаПКО.Пустая(), Конвертация, ТекущееПКО.Владелец);
   
ОтборКонвертация.Использование = СсылкаНаПКО.Пустая();

    ФормаОбработки.вВыполнитьОтчет();

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

ЭтаФорма.УстановитьДействие(«ПриОткрытии», Новый Действие(«ПриОткрытии_КД»));

//} Конвертация данных

2 Comments

  1. bubus

    Спасибо! Будем пробовать. Кое что уже сделал.

    Reply
  2. bubus

    А как у нескольких документов изменить убрать источник в ПКС, комментарий например?

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *