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