gifts2017

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

Опубликовал Геннадий Пиганов (Totoro) в раздел Обмен - Перенос данных из 1С7.7 в 1C8.X

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

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

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

Инструкция: 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



См. также

Подписаться Добавить вознаграждение
Комментарии
1. Вася Пупкин (bubus) 29.07.16 20:31
Спасибо! Будем пробовать. Кое что уже сделал.
2. Вася Пупкин (bubus) 29.07.16 21:23
А как у нескольких документов изменить убрать источник в ПКС, комментарий например?