Потребовалось поменять значения и обработчики ПКС сразу для кучи определенных свойств документов. Стандартная обработка в КД "Групповая обработка справочников и документов" для этого не совсем подошла, т.к. там невозможно использовать код для обработки, да и не очень удобно отбор создавать. Поэтому вставил в КД типовую обработку "Универсальный подбор и обработка объектов" и привязал её открытие к выбранным ПКО/ПКС в форме редактирования правил обмена.
На форму (в командные панели списков ПКО и ПКС) добавляются кнопки "Обработка объектов" и "Обработка свойств". Они позволяют открыть групповую обработку сразу с установленным отбором в зависимости от текущего выбранного ПКО/ПКС. Поддерживается множественный выбор.
Инструкция:
1) Включаем возможность изменения в КД, добавляем в обработки "Универсальный подбор и обработка объектов" с ИТС под именем "УниверсальныеПодборИОбработкаОбъектов"
2) Открываем общую форму "ПравилаОбмена" и вставляем в конец модуля формы (перед комментариями "ОПЕРАТОРЫ ОСНОВНОЙ ПРОГРАММЫ") кусок кода:
//{ Конвертация данных }
Процедура ПриОткрытии_КД()
// Типовой обработчик
ПриОткрытии();
Если Метаданные.Обработки.Найти("УниверсальныеПодборИОбработкаОбъектов") = Неопределено Тогда
ТекстСообщения =
"Необходимо добавить в конфигурацию обработку ""УниверсальныеПодборИОбработкаОбъектов""
|Путь на ИТС: \1CIts\EXE\EXTREPS\UNIREPS82\UniversalSelection\УниверсальныеПодборИОбработкаОбъектов.epf";
Сообщить(ТекстСообщения);
Иначе
Кнопка = Элементыформы.КоманднаяПанельПКО.Кнопки.Добавить("РазделительОбработкаОбъектов_КД", ТипКнопкиКоманднойПанели.Разделитель);
Кнопка = Элементыформы.КоманднаяПанельПКО.Кнопки.Добавить("ОбработкаОбъектов_КД", ТипКнопкиКоманднойПанели.Действие, "Обработка объектов", Новый Действие("ОбработкаОбъектов_КД"));
Кнопка.Подсказка = "Групповая обработка объектов";
Кнопка.Пояснение = "Групповая обработка объектов";
Кнопка = Элементыформы.КоманднаяПанельПКС.Кнопки.Добавить("РазделительОбработкаСвойств_КД", ТипКнопкиКоманднойПанели.Разделитель);
Кнопка = Элементыформы.КоманднаяПанельПКС.Кнопки.Добавить("ОбработкаСвойств_КД", ТипКнопкиКоманднойПанели.Действие, "Обработка свойств", Новый Действие("ОбработкаСвойств_КД"));
Кнопка.Подсказка = "Групповая обработка свойств";
Кнопка.Пояснение = "Групповая обработка свойств";
КонецЕсли;
КонецПроцедуры
Процедура ОбработкаОбъектов_КД(Кнопка)
ТекущееПКО = ЭлементыФормы.ПравилаКонвертацииОбъектов.ТекущаяСтрока;
Если ТекущееПКО = Неопределено Тогда
Возврат;
КонецЕсли;
СсылкаНаПКО = ТекущееПКО.Ссылка;
ВыбранныеПКО = ЭлементыФормы.ПравилаКонвертацииОбъектов.ВыделенныеСтроки;
ГрупповаяОбработка = Обработки.УниверсальныеПодборИОбработкаОбъектов.Создать();
ГрупповаяОбработка.ТипОбъектовПоиска = Тип("СправочникСсылка.ПравилаКонвертацииОбъектов");
ФормаОбработки = ГрупповаяОбработка.ПолучитьФорму(, ЭтаФорма, Новый УникальныйИдентификатор);
ФормаОбработки.Открыть();
ПостроительОтбор = ФормаОбработки.ПостроительОтчета.Отбор;
// Дополнительный отбор на элементы
ОтборГруппа = ПостроительОтбор.Добавить("Объект.ЭтоГруппа");
ОтборГруппа.ВидСравнения = ВидСравнения.Равно;
ОтборГруппа.Значение = Ложь;
ОтборГруппа.Использование = Истина;
Если ВыбранныеПКО.Количество() > 1 Тогда
// Отбор на несколько выбранных ПКО
МассивСтрок = Новый Массив;
ЕстьГруппы = Ложь;
Для Каждого СтрокаПКО Из ВыбранныеПКО Цикл
Если СтрокаПКО.Ссылка.Пустая() Тогда
// Отбор на все ПКО (конвертацию)
МассивСтрок.Очистить();
ТекущееПКО = СтрокаПКО;
Прервать;
КонецЕсли;
МассивСтрок.Добавить(СтрокаПКО.Ссылка);
Если СтрокаПКО.ЭтоГруппа Тогда
ЕстьГруппы = Истина;
КонецЕсли;
КонецЦикла;
Если МассивСтрок.Количество() <> 0 Тогда
ОтборСписок = ПостроительОтбор.Добавить("Объект");
ОтборСписок.ВидСравнения = ?(ЕстьГруппы, ВидСравнения.ВСпискеПоИерархии, ВидСравнения.ВСписке);
ОтборСписок.Значение.ЗагрузитьЗначения(МассивСтрок);
ОтборСписок.Использование = Истина;
КонецЕсли;
Иначе
Если НЕ СсылкаНаПКО.Пустая() Тогда
// Отбор на текущее ПКО
Если НЕ ТекущееПКО.ЭтоГруппа Тогда
ОтборПКО = ПостроительОтбор.Добавить("Объект");
ОтборПКО.ВидСравнения = ВидСравнения.Равно;
ОтборПКО.Значение = СсылкаНаПКО;
ОтборПКО.Использование = Истина;
КонецЕсли;
// Отбор на группу текущего ПКО
Если ТекущееПКО.ЭтоГруппа ИЛИ НЕ ТекущееПКО.Родитель.Пустая() Тогда
ОтборРодитель = ПостроительОтбор.Добавить("Объект.Родитель");
ОтборРодитель.ВидСравнения = ВидСравнения.ВИерархии;
ОтборРодитель.Значение = ?(ТекущееПКО.ЭтоГруппа, СсылкаНаПКО, ТекущееПКО.Родитель);
ОтборРодитель.Использование = ТекущееПКО.ЭтоГруппа;
КонецЕсли;
КонецЕсли;
КонецЕсли;
// Отбор на все ПКО (конвертацию)
ОтборКонвертация = ПостроительОтбор.Добавить("Объект.Владелец");
ОтборКонвертация.ВидСравнения = ВидСравнения.Равно;
ОтборКонвертация.Значение = ?(СсылкаНаПКО.Пустая(), Конвертация, ТекущееПКО.Владелец);
ОтборКонвертация.Использование = СсылкаНаПКО.Пустая();
ФормаОбработки.вВыполнитьОтчет();
КонецПроцедуры
Процедура ОбработкаСвойств_КД(Кнопка)
ТекущееПКО = ЭлементыФормы.ПравилаКонвертацииОбъектов.ТекущаяСтрока;
Если ТекущееПКО = Неопределено Тогда
Возврат;
КонецЕсли;
СсылкаНаПКО = ТекущееПКО.Ссылка;
ВыбранныеПКС = ЭлементыФормы.ПравилаКонвертацииСвойств.ВыделенныеСтроки;
ГрупповаяОбработка = Обработки.УниверсальныеПодборИОбработкаОбъектов.Создать();
ГрупповаяОбработка.ТипОбъектовПоиска = Тип("СправочникСсылка.ПравилаКонвертацииСвойств");
ФормаОбработки = ГрупповаяОбработка.ПолучитьФорму(, ЭтаФорма, Новый УникальныйИдентификатор);
ФормаОбработки.Открыть();
ПостроительОтбор = ФормаОбработки.ПостроительОтчета.Отбор;
Если ВыбранныеПКС.Количество() > 1 Тогда
// Отбор на несколько выбранных ПКС
МассивСтрок = Новый Массив;
Для Каждого СтрокаПКС Из ВыбранныеПКС Цикл
МассивСтрок.Добавить(СтрокаПКС.Ссылка);
КонецЦикла;
ОтборСписок = ПостроительОтбор.Добавить("Объект");
ОтборСписок.ВидСравнения = ВидСравнения.ВСписке;
ОтборСписок.Значение.ЗагрузитьЗначения(МассивСтрок);
ОтборСписок.Использование = Истина;
Иначе
Если НЕ СсылкаНаПКО.Пустая() Тогда
// Отбор на текущее ПКО
Если НЕ ТекущееПКО.ЭтоГруппа Тогда
ОтборПКО = ПостроительОтбор.Добавить("Объект.Владелец");
ОтборПКО.ВидСравнения = ВидСравнения.Равно;
ОтборПКО.Значение = СсылкаНаПКО;
ОтборПКО.Использование = Истина;
КонецЕсли;
// Отбор на группу текущего ПКО
Если ТекущееПКО.ЭтоГруппа ИЛИ НЕ ТекущееПКО.Родитель.Пустая() Тогда
ОтборРодитель = ПостроительОтбор.Добавить("Объект.Владелец.Родитель");
ОтборРодитель.ВидСравнения = ВидСравнения.ВИерархии;
ОтборРодитель.Значение = ?(ТекущееПКО.ЭтоГруппа, СсылкаНаПКО, ТекущееПКО.Родитель);
ОтборРодитель.Использование = ТекущееПКО.ЭтоГруппа;
КонецЕсли;
КонецЕсли;
КонецЕсли;
// Отбор на все ПКО (конвертацию)
ОтборКонвертация = ПостроительОтбор.Добавить("Объект.Владелец.Владелец");
ОтборКонвертация.ВидСравнения = ВидСравнения.Равно;
ОтборКонвертация.Значение = ?(СсылкаНаПКО.Пустая(), Конвертация, ТекущееПКО.Владелец);
ОтборКонвертация.Использование = СсылкаНаПКО.Пустая();
ФормаОбработки.вВыполнитьОтчет();
КонецПроцедуры
ЭтаФорма.УстановитьДействие("ПриОткрытии", Новый Действие("ПриОткрытии_КД"));
//} Конвертация данных
Для тех у кого с КД интегрирована подсистема "Инструменты разработчика" добавлять типовую обработку не надо (она уже есть в подсистеме) и код будет такой:
//{ Конвертация данных }
Процедура ПриОткрытии_КД()
// Типовой обработчик
ПриОткрытии();
Если Метаданные.Обработки.Найти("ирПодборИОбработкаОбъектов") = Неопределено Тогда
Возврат;
КонецЕсли;
Кнопка = Элементыформы.КоманднаяПанельПКО.Кнопки.Добавить("РазделительОбработкаОбъектов_КД_ИР", ТипКнопкиКоманднойПанели.Разделитель);
Кнопка = Элементыформы.КоманднаяПанельПКО.Кнопки.Добавить("ОбработкаОбъектов_КД_ИР", ТипКнопкиКоманднойПанели.Действие, "Обработка объектов", Новый Действие("ОбработкаОбъектов_КД_ИР"));
Кнопка.Подсказка = "Групповая обработка объектов";
Кнопка.Пояснение = "Групповая обработка объектов";
Кнопка = Элементыформы.КоманднаяПанельПКС.Кнопки.Добавить("РазделительОбработкаСвойств_КД_ИР", ТипКнопкиКоманднойПанели.Разделитель);
Кнопка = Элементыформы.КоманднаяПанельПКС.Кнопки.Добавить("ОбработкаСвойств_КД_ИР", ТипКнопкиКоманднойПанели.Действие, "Обработка свойств", Новый Действие("ОбработкаСвойств_КД_ИР"));
Кнопка.Подсказка = "Групповая обработка свойств";
Кнопка.Пояснение = "Групповая обработка свойств";
КонецПроцедуры
Процедура ОбработкаОбъектов_КД_ИР(Кнопка)
ТекущееПКО = ЭлементыФормы.ПравилаКонвертацииОбъектов.ТекущаяСтрока;
Если ТекущееПКО = Неопределено Тогда
Возврат;
КонецЕсли;
СсылкаНаПКО = ТекущееПКО.Ссылка;
ВыбранныеПКО = ЭлементыФормы.ПравилаКонвертацииОбъектов.ВыделенныеСтроки;
ГрупповаяОбработка = Обработки.ирПодборИОбработкаОбъектов.Создать();
ФормаОбработки = ГрупповаяОбработка.ПолучитьФорму(, ЭтаФорма, "Справочник.ПравилаКонвертацииОбъектов");
ФормаОбработки.Открыть();
КомпоновщикОтбор = ФормаОбработки.Компоновщик.Настройки.Отбор.Элементы;
// Дополнительный отбор на элементы
ОтборГруппа = КомпоновщикОтбор.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборГруппа.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ЭтоГруппа");
ОтборГруппа.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборГруппа.ПравоеЗначение = Ложь;
ОтборГруппа.Использование = Истина;
Если ВыбранныеПКО.Количество() > 1 Тогда
// Отбор на несколько выбранных ПКО
СписокСтрок = Новый СписокЗначений;
ЕстьГруппы = Ложь;
Для Каждого СтрокаПКО Из ВыбранныеПКО Цикл
Если СтрокаПКО.Ссылка.Пустая() Тогда
// Отбор на все ПКО (конвертацию)
СписокСтрок.Очистить();
ТекущееПКО = СтрокаПКО;
Прервать;
КонецЕсли;
СписокСтрок.Добавить(СтрокаПКО.Ссылка);
Если СтрокаПКО.ЭтоГруппа Тогда
ЕстьГруппы = Истина;
КонецЕсли;
КонецЦикла;
Если СписокСтрок.Количество() <> 0 Тогда
ОтборСписок = КомпоновщикОтбор.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборСписок.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка");
ОтборСписок.ВидСравнения = ?(ЕстьГруппы, ВидСравненияКомпоновкиДанных.ВСпискеПоИерархии, ВидСравненияКомпоновкиДанных.ВСписке);
ОтборСписок.ПравоеЗначение = СписокСтрок;
ОтборСписок.Использование = Истина;
КонецЕсли;
Иначе
Если НЕ СсылкаНаПКО.Пустая() Тогда
// Отбор на текущее ПКО
Если НЕ ТекущееПКО.ЭтоГруппа Тогда
ОтборПКО = КомпоновщикОтбор.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборПКО.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка");
ОтборПКО.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборПКО.ПравоеЗначение = СсылкаНаПКО;
ОтборПКО.Использование = Истина;
КонецЕсли;
// Отбор на группу текущего ПКО
Если ТекущееПКО.ЭтоГруппа ИЛИ НЕ ТекущееПКО.Родитель.Пустая() Тогда
ОтборРодитель = КомпоновщикОтбор.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборРодитель.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Родитель");
ОтборРодитель.ВидСравнения = ВидСравненияКомпоновкиДанных.ВИерархии;
ОтборРодитель.ПравоеЗначение = ?(ТекущееПКО.ЭтоГруппа, СсылкаНаПКО, ТекущееПКО.Родитель);
ОтборРодитель.Использование = ТекущееПКО.ЭтоГруппа;
КонецЕсли;
КонецЕсли;
КонецЕсли;
// Отбор на все ПКО (конвертацию)
ОтборКонвертация = КомпоновщикОтбор.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборКонвертация.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Владелец");
ОтборКонвертация.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборКонвертация.ПравоеЗначение = ?(СсылкаНаПКО.Пустая(), Конвертация, ТекущееПКО.Владелец);
ОтборКонвертация.Использование = СсылкаНаПКО.Пустая();
ФормаОбработки.вВыполнитьОтчет();
КонецПроцедуры
Процедура ОбработкаСвойств_КД_ИР(Кнопка)
ТекущееПКО = ЭлементыФормы.ПравилаКонвертацииОбъектов.ТекущаяСтрока;
Если ТекущееПКО = Неопределено Тогда
Возврат;
КонецЕсли;
СсылкаНаПКО = ТекущееПКО.Ссылка;
ВыбранныеПКС = ЭлементыФормы.ПравилаКонвертацииСвойств.ВыделенныеСтроки;
ГрупповаяОбработка = Обработки.ирПодборИОбработкаОбъектов.Создать();
ФормаОбработки = ГрупповаяОбработка.ПолучитьФорму(, ЭтаФорма, "Справочник.ПравилаКонвертацииСвойств");
ФормаОбработки.Открыть();
КомпоновщикОтбор = ФормаОбработки.Компоновщик.Настройки.Отбор.Элементы;
Если ВыбранныеПКС.Количество() > 1 Тогда
// Отбор на несколько выбранных ПКС
СписокСтрок = Новый СписокЗначений;
Для Каждого СтрокаПКС Из ВыбранныеПКС Цикл
СписокСтрок.Добавить(СтрокаПКС.Ссылка);
КонецЦикла;
ОтборСписок = КомпоновщикОтбор.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборСписок.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка");
ОтборСписок.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
ОтборСписок.ПравоеЗначение = СписокСтрок;
ОтборСписок.Использование = Истина;
Иначе
Если НЕ СсылкаНаПКО.Пустая() Тогда
// Отбор на текущее ПКО
Если НЕ ТекущееПКО.ЭтоГруппа Тогда
ОтборПКО = КомпоновщикОтбор.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборПКО.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Владелец");
ОтборПКО.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборПКО.ПравоеЗначение = СсылкаНаПКО;
ОтборПКО.Использование = Истина;
КонецЕсли;
// Отбор на группу текущего ПКО
Если ТекущееПКО.ЭтоГруппа ИЛИ НЕ ТекущееПКО.Родитель.Пустая() Тогда
ОтборРодитель = КомпоновщикОтбор.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборРодитель.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Владелец.Родитель");
ОтборРодитель.ВидСравнения = ВидСравненияКомпоновкиДанных.ВИерархии;
ОтборРодитель.ПравоеЗначение = ?(ТекущееПКО.ЭтоГруппа, СсылкаНаПКО, ТекущееПКО.Родитель);
ОтборРодитель.Использование = ТекущееПКО.ЭтоГруппа;
КонецЕсли;
КонецЕсли;
КонецЕсли;
// Отбор на все ПКО (конвертацию)
ОтборКонвертация = КомпоновщикОтбор.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборКонвертация.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Владелец.Владелец");
ОтборКонвертация.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборКонвертация.ПравоеЗначение = ?(СсылкаНаПКО.Пустая(), Конвертация, ТекущееПКО.Владелец);
ОтборКонвертация.Использование = СсылкаНаПКО.Пустая();
ФормаОбработки.вВыполнитьОтчет();
КонецПроцедуры
ЭтаФорма.УстановитьДействие("ПриОткрытии", Новый Действие("ПриОткрытии_КД"));
//} Конвертация данных