Введение
За годы работы в организации в системе 1С:Документооборот 2.1 может накопиться огромное количество документов, созданных в строго определенных рабочих группах. Яркий пример — приказы отдела промышленной безопасности и охраны труда, которые годами создавались с настройками «Автоматически вести состав рабочей группы» и «Заполнение рабочей группы является обязательным». Эти настройки — надежный механизм разграничения прав на этапе создания, но он становится серьезной проблемой, когда требуется массово обновить доступ.
Представьте: пришло время обновить устаревшие приказы, а в новых документах необходимо сослаться на старые. Но за 5 лет сменились сотрудники, и теперь у текущих специалистов просто нет прав на просмотр этих исторических документов. Штатного механизма для массового изменения рабочей группы в версии 2.1, в отличие от 3.0, не предусмотрено.
Конечно, всегда можно найти специальные обработки на Infostart или написать свой код. Но зачем усложнять, если в арсенале любой конфигурации 1С уже есть мощный и гибкий инструмент — обработка «Групповое изменение реквизитов»? Ее ключевая особенность — возможность выполнения произвольных алгоритмов — позволяет решить нашу задачу элегантно и без лишних затрат. Именно этому способу и посвящена данная статья.
1. Подготовка: Прежде чем нажать «Изменить реквизиты»
Массовое изменение — это мощно, но и опасно. Чтобы не получить вместо решения проблемы новые трудности, сделайте три простых, но обязательных шага:
- Шаг 1: Сделайте РЕЗЕРВНУЮ КОПИЮ. Самый важный шаг. Создайте любым доступным способом резервную копию перед началом манипуляций. Если что-то пойдет не так, вы сможете быстро все вернуть «как было».
- Шаг 2: Протестируйте на копии базы. Не проводите эксперименты на боевой базе. Выберите 3-5 конкретных документов-жертв, которые точно подходят под ваши условия. Вначале выполните все действия именно для них и проверьте:
- Изменилась ли их рабочая группа?
- Перечитались ли права? (Это особенно важно, если у вас включено отложенное обновление прав).
- Могут ли новые пользователи их увидеть?
- Не потеряли ли доступ к ним старые пользователи (если это нежелательно)?
Только после успешного теста применяйте изменения ко всей массе.
- Шаг 3: Выполняйте в «техническое окно». Запускайте обработку в продуктивной базе в время минимальной активности пользователей (ночью, в выходной). Это предотвратит потенциальные конфликты блокировок данных и не позволит сотрудникам увидеть «исчезновение» или «появление» документов прямо во время работы. _(Примечание: конфликты маловероятны при отложенном обновлении прав, но лучше перестраховаться).
2. Основные процедуры по работе с рабочими группами в 1С ДО 2.1
В рабочей группе документа может содержаться:
- Полная роль
- Подразделение
- Пользователь
- Рабочая группа
Код по работе с рабочими группами расположен в общем модуле РаботаСРабочимиГруппами
// Перезаписывает участников рабочей группы документа
// Перезаписывает документ
//
// Параметры:
// Ссылка (любая ссылка, которая может хранится в измерении Объект РС РабочиеГруппы)
// Участники (ТаблицаЗначений)
// - Участник (СправочникСсылка.Пользователи, СправочникСсылка.РабочиеГруппы, СправочникСсылка.ПолныеРоли)
// ОбновитьПраваДоступа (Булево). Указывает на необходимость обновления прав доступа
// АвторИзменений - Пользователь - пользователь, который запрашивает изменение РГ.
// ЗаполнятьКолонкуИзменение - Булево -
// признак необходимости автоматического заполнения колонки Изменение для добавленных строк.
//
Процедура ПерезаписатьРабочуюГруппуОбъекта(
Ссылка,
Знач Участники,
ОбновитьПраваДоступа,
АвторИзменений = Неопределено)
// Перезаписывает рабочие группы предметов бизнес-процесса
//
// Параметры:
// - БизнесПроцессОбъект - БизнесПроцессОбъект - бизнес процесс объект для которого производится
// запись рабочих групп.
// - Предметы - Массив - массив предметов бизнес-процесса.
//
Процедура ПерезаписатьРабочиеГруппыПредметовБизнесПроцесса(БизнесПроцессОбъект, Предметы)
// Добавляет участников в рабочую группу документа.
//
// Параметры:
// Объект (СправочникСсылка.ВходящиеДокументы, СправочникСсылка.ИсходящиеДокументы, СправочникСсылка.ВнутренниеДокументы и др.)
// Участники (ТаблицаЗначений)
// - Участник (СправочникСсылка.Пользователи, СправочникСсылка.РабочиеГруппы, СправочникСсылка.ПолныеРоли)
// ОбновитьПраваДоступа - если установлен, то будет вызвано обновление прав доступа для указанного предмета
//
Процедура ДобавитьУчастниковВРабочуюГруппуОбъекта(
Объект, Участники, ОбновитьПраваДоступа = Истина, ЗаполнятьКолонкуИзменение = Ложь)
// Добавляет участников в рабочую группу документа из источника
//
// Параметры:
// Документ (СправочникСсылка.ВходящиеДокументы, СправочникСсылка.ИсходящиеДокументы, СправочникСсылка.ВнутренниеДокументы)
// Источник (СправочникСсылка.ВходящиеДокументы, СправочникСсылка.ИсходящиеДокументы, СправочникСсылка.ВнутренниеДокументы, БизнесПроцессСсылка)
//
Процедура ДобавитьУчастниковВРабочуюГруппуДокументаИзИсточника(
Документ, Источник, ЗаписатьДокумент = Истина, ЗаполнятьКолонкуИзменение = Ложь)
Так же полезными могут оказаться процедуры и функции, расположенные в модуле менеджера регистра сведений РабочиеГруппы
// Записывает набор записей в регистр сведений с отбором по объекту
//
Процедура ЗаписатьНаборПоОбъекту(Объект, ТаблицаИсточник, ОбновитьПраваДоступа)
// Возвращает таблицу участников рабочей группы по объекту.
//
Функция ПолучитьУчастниковПоОбъекту(Объект)
// Возвращает пустую таблицу участников рабочей группы.
//
Функция ПолучитьПустуюТаблицуУчастников()
Пример 1
Изменяем флаг "Изменение" и всех, кто находится в рабочей группе документа
ТаблицаНабора = РегистрыСведений.РабочиеГруппы.ПолучитьУчастниковПоОбъекту(Объект);
// Снимем галки изменения для устранения ошибок по правам.
Для Каждого ТекСтрока Из ТаблицаНабора Цикл
ТекСтрока.Изменение = Ложь;
КонецЦикла;
// Обновим рабочую группу
РаботаСРабочимиГруппами.ПерезаписатьРабочуюГруппуОбъекта(Объект, ТаблицаНабора, Истина);
Пример 2
Добавим подразделение "Бухгалтерия" в рабочую группу документа. Напоминаю, что добавляемым/ми участником может быть Пользователь, Рабочая группа, Подразделение или Полная роль.
ДобавляемыйУчастник = Справочники.СтруктураПредприятия.НайтиПоНаименованию("Бухгалтерия", Истина);
Участники = РегистрыСведений.РабочиеГруппы.ПолучитьПустуюТаблицуУчастников();
НоваяСтрока = Участники.Добавить();
НоваяСтрока.Участник = ДобавляемыйУчастник;
НоваяСтрока.Изменение = Ложь;
РаботаСРабочимиГруппами.ДобавитьУчастниковВРабочуюГруппуОбъекта(Объект, Участники, Истина);
Остальными процедурами я не пользовался, но думаю при необходимости разобраться можно без труда по аналогии.
Теперь же предлагаю совместить оба примера и используя обработку "Групповое изменение реквизитов" изменить рабочие группы у объектов. Важное преимущество такого подхода - мы можем интерактивно отбирать нужные документы по нужным отборам и менять только их.
3. Применение обработки "Групповое изменение реквизитов" для изменения рабочей группы объектов
Обработка является встроенной для всех конфигурация, основанных на БСП. Для её запуска в 1С ДО необходимо перейти в раздел "Настройка и Администрирование" и в группе команд "Сервис" найти пункт "Групповое изменение реквизитов"
В открывшейся форме вверху выбираем тип объектов для изменения, в нашем случае это будут Внутренние документы. Для их поиска можно в открывшейся форме можно воспользоваться сочетанием клавиш Ctrl+F и ввести часть искомого текста.
Для того, чтобы отобрать конкретные объекты, нужно перейти по гиперссылке Все элементы" и указать нужные отборы. В нашем случае это будут Приказы
Здесь доступны все реквизиты объекты и по ним можно очень гибко настроить отборы.
Внизу показывается, какие конкретно объекты выбраны и сколько их.
После настройки отборов объектов для изменения нажимаем "ОК", и на вкладку выполнения произвольного алгоритма.
Настройки записи и безопасного режима я использовал такие:
И запись объекта не производил, так как для изменения рабочей группы запись объекта не нужна.
Так как в 1С ДО, когда направляется задача, по какой то причине исполнитель добавляется в рабочую группу с галочкой изменение, а некоторым пользователям изменять данные объекты нельзя, то у меня возникала ошибка. Поэтому я сначала снимаю галки изменение у все в рабочей группе, а затем добавляю подразделение в неё. Если данный алгоритм выполнить дважды, в рабочую группу 2 раза данное подразделение не попадёт.
МойОбъект = Объект.Ссылка;
ТаблицаНабора = РегистрыСведений.РабочиеГруппы.ПолучитьУчастниковПоОбъекту(МойОбъект);
// Снимем галки изменения для устранения ошибок по правам.
Для Каждого ТекСтрока Из ТаблицаНабора Цикл
ТекСтрока.Изменение = Ложь;
КонецЦикла;
// Обновим рабочую группу
РаботаСРабочимиГруппами.ПерезаписатьРабочуюГруппуОбъекта(МойОбъект, ТаблицаНабора, Истина);
ДобавляемыйУчастник = Справочники.СтруктураПредприятия.НайтиПоНаименованию("Бухгалтерия", Истина);
Участники = РегистрыСведений.РабочиеГруппы.ПолучитьПустуюТаблицуУчастников();
НоваяСтрока = Участники.Добавить();
НоваяСтрока.Участник = ДобавляемыйУчастник;
НоваяСтрока.Изменение = Ложь;
РаботаСРабочимиГруппами.ДобавитьУчастниковВРабочуюГруппуОбъекта(МойОбъект, Участники, Истина);
Теперь нажимаем команду "Изменить реквизиты", и система начинает выполнение алгоритма для всех отобранных объектов.
Если никаких ошибок не случилось, система покажет количество изменных объектов.
Если же ошибки происходили во время обработки, то система покажет что за ошибка и при изменении какого объекта она возникла.
Заключение
Обработка «Групповое изменение реквизитов» — мощный и стандартный инструмент для администрирования ДО 2.1 и не только. Его использование требует аккуратности, предварительного тестирования и понимания бизнес-логики системы, но позволяет экономить огромное количество времени и не писать специальные обработки под каждую конкретную задачу.
Проверено на следующих конфигурациях и релизах:
- Документооборот КОРП, релизы 2.1.27.1
Вступайте в нашу телеграмм-группу Инфостарт