16 июля 2026
1C-RarusTechDay 2026
9-я открытая техническая конференция для специалистов 1С
Зарегистрироваться
{{countBasket}}
От экспертов «1С-Рарус»: Миграция из 1С:Документооборот 2.1 в 3.0. Часть 4 — права доступа и продуктивная миграция
От экспертов «1С-Рарус»: Миграция из 1С:Документооборот 2.1 в 3.0. Часть 4 — права доступа и продуктивная миграция

От экспертов «1С-Рарус»: Миграция из 1С:Документооборот 2.1 в 3.0. Часть 4 — права доступа и продуктивная миграция

29.05.2026
215 мин
1077

Оглавление

  1. Предисловие
  2. Не перенос объектов прав доступа
  3. Решение
  4. Продуктивная миграция
  5. Послесловие

Предисловие

Друзья, наш марафон по теме миграции данных из «1С:Документооборот» Иконка открытия в новом окне редакции 2.1 в 3.0 подходит к финалу.

Перед прочтением рекомендуем ознакомиться с предыдущими частями статьи: первая Иконка открытия в новом окне, вторая Иконка открытия в новом окне, третья Иконка открытия в новом окне. В них мы рассказали о части механизмов заложенных в блоке миграции, о том как подготовиться к этому процессу, и о некоторых подводных камнях, с которыми мы столкнулись и как их преодолели.

На этот раз мы расскажем про стечение обстоятельств, которое сулило уходом времени миграции в бесконечность, и между делом заглянем в «кроличью нору» блока прав доступа 1С:Документооборота. В завершение истории поведаем о нашем пути продуктивной миграции.

Поехали :)

Не перенос объектов прав доступа

Во второй части мы упоминали, что перед продуктивной миграцией был заложен этап тестирования — так называемая «пробная» миграция. И в продолжение тем описанных там, была ещё одна загвоздка, которая не вошла во сторую статью. О том, как это выглядело ниже.

Миграция «тонет» в правах доступа

Во время очередного тестового прогона миграции мы заметили странность. Нет, никакого замедления как в прошлый раз не было, и в целом, процесс выгрузки из ДО2 и загрузки в ДО3 проходил без ошибок.

Однако общее количество объектов, подлежащих переносу, неуклонно росло. На начало миграции система подсчитала, что общее количество исторических данных было порядка 27 млн. На момент обнаружения странности метка «Осталось загрузить» превысила это число в несколько раз.

Прогресс загрузки в ДО3

Прогресс загрузки в ДО3

По нашим ожиданиям работающие в базе пользователи физически не смогли бы сгенерировать столько дельт (изменений данных). Через некоторое время, решив разобраться, мы открыли на стороне ДО2 регистр сведений «Переход. Объекты выгрузки» и обнаружили объект, на который пришелся основной прирост, — «Рабочие группы для перехода (Регистр сведений)».

Количество объектов «Рабочие группы для перехода»

Количество объектов «Рабочие группы для перехода»

Счетчик записей по этому объекту вел себя ненормально. Мы ожидали, что он достигнет некоторого фиксированного значения и остановится, как это было с другими объектами, но его значение продолжало увеличиваться. К тому моменту мы зафиксировали отметку уже в 121 млн записей, и цифры на экране продолжали ползти вверх.

Что такое «Рабочие группы для перехода»?

Чтобы понять природу проблемы, попробуем разобраться, что представляет собой объект «Рабочие группы для перехода».

Из списка «Переход. Объекты выгрузки» мы уже поняли, что это регистр сведений, но конкретную информацию по нему в доступных источниках найти оказалось достаточно сложно. В документации есть небольшая заметка про регламентное задание с созвучным названием «Заполнение рабочих групп для перехода на Документооборот 3.0», которое формирует «переходные рабочие группы», но увы без особых подробностей. Ссылка на ИТС: its.1c.ru/db/updinfo#content:2139:hdoc:issogl2_31.

Мы спросили ИИ-помощника на сайте ИТС:

Рабочие группы для перехода

И как часто бывает — ИИ отвечает не отвечая... Нам нужна была конкретика, поэтому мы честно открыли конфигуратор и попробовали изучить регистр и регламент изнутри.

Что мы поняли о «Рабочих группах для перехода» — это регистр сведений, в который собирается информация обо всех пользователях, когда-либо имевших отношение к объектам документооборота: авторах, подписантах, исполнителях резолюций, участниках согласований и т. д. И указанные сведения применяются для последующего проецирования прав доступа к объектам в среде ДО3.

Алгоритм формирования записей в ДО2 можно представить как пять последовательных этапов:

Схема алгоритма формирования записей Рабочих групп для перехода

Схема алгоритма формирования записей Рабочих групп для перехода
  1. Определение объектов метаданных. На первом шаге система определяет, по каким типам объектов нужно собирать данные о правах доступа. Этот список жестко задан в коде миграции и включает следующие справочники ДО2:
    1. ВнутренниеДокументы;
    2. ВходящиеДокументы;
    3. ИсходящиеДокументы;
    4. Мероприятия;
    5. Проекты;
    6. ШаблоныВнутреннихДокументов;
    7. ШаблоныВходящихДокументов;
    8. ШаблоныИсходящихДокументов.
  2. Выборка порции объектов. На этом этапе для каждого типа объектов из списка выбираются следующие 10 объектов, по которым еще нет записей в регистре «Рабочие группы для перехода».
  3. Сбор «круга причастных» по каждому объекту. Получив на вход 10 конкретных объектов, механизм должен найти всех пользователей, которые когда-либо имели к ним отношение и должны иметь доступ. Для этого выполняется запрос, который прочесывает глобальные настройки прав доступа, поля самого объекта и связанные с ним данные.
  4. Получение прав на изменение. По полученным участникам объектов выполняется запрос к регистру «ПраваПоДескрипторамДоступаОбъектов», по которому определяется имеют ли участники права на изменение:

    Пример прав доступа по Дескрипторам для объектов

    Пример прав доступа по Дескрипторам для объектов
  5. Фиксация результата. Наконец, полученные на предыдущем шаге данные о том, кто и на какой документ имеет право на изменение, записываются в регистр сведений «Рабочие группы для перехода». Именно эти записи впоследствии и выгружаются в ДО3:

    Пример прав доступа по Дескрипторам для объектов

    Пример записей регистра Рабочие группы для перехода

После этого обработка продолжается для следующей порции, и так пока в базе ещё есть не попавшие в регистр объекты.

Как определяется «круг причастных»

Как указано выше, на третьем этапе выполняется запрос к данным базы. Его текст генерируется программно и состав пакетов зависит от обрабатываемого типа данных и глобальных настроек. Но если попытаться описать, куда именно он заглядывает, можно привести такой список:

  • Основные реквизиты. Здесь механизм ищет подготовивших документ пользователей, ответственных, подписантов, утверждающих — тех, кто прямо указан в карточке документа:

    Пример данных участников в карточке документа

    Пример данных участников в карточке документа
  • Связанные объекты. Резолюции, проекты и мероприятия, связанные с документом:

    Пример резолюции по документу

    Пример резолюции по документу

    Пример проекта

    Пример проекта

    Пример мероприятия

    Пример мероприятия
  • Движение и подписи. Анализируется журнал передачи документов, история электронных подписей и исходящая переписка:

    Пример Журнала передачи

    Пример Журнала передачи

    Пример связанных данных, переписки

    Пример связанных данных, переписки
  • Бизнес-процессы. Поиск по бизнес процессам, из которых извлекаются данные об исполнителях, контролерах и проверяющих:

    Пример участников бизнес-процессов

    Пример участников бизнес-процессов
  • Рабочие группы. Поиск участников объекта из регистра сведений «Рабочие группы»:

    Пример регистра Рабочие группы

    Пример регистра Рабочие группы

    Пример регистра Рабочие группы

    Пример добавленного участника без права изменения в рабочую группу документа
  • Участники по дескрипторам доступа для объектов. Поиск участников объекта из регистра сведений: «ПраваПоДескрипторамДоступаОбъектов»:

    Пример участников из регистра «Права по дескрипторам доступа объектов»

    Пример участников из регистра «Права по дескрипторам доступа объектов»

Расследование: почему записей так много?

Список объектов вроде понятен, и в нашей базе по предварительной оценке в среднем на один объект приходилось в среднем 5 уникальных участников. При общем количестве объектов в базе ~660 тыс. ожидаемый объем составлял около 3,3 млн записей. Однако система выдала 121 миллион и количество записей продолжало расти.

Разница между ожиданием и реальностью — в 37 раз! Что-то нам подсказывало, что алгоритм работает совсем не так, как мы предполагали. Где же зарыта «машина бесконечности» — разберем далее.

Мы решили исследовать весь алгоритм сбора данных на конкретном, живом примере. Для иллюстрации мы воспроизвели ситуацию в демобазе ДО2. Возьмем внутренний документ «Счет на оплату исходящий № 15» и вручную выполним те запросы, которые делает регламентное задание.

Текст запроса получения участников формируется в модуле менеджера регистра сведений «РабочиеГруппыДляПерехода» в методе «ТекстЗапросаУчастниковПоМетаданному()».

Для объекта метаданных Справочник.ВнутренниеДокументы сформировался такой запрос:


ВЫБРАТЬ
	РабочиеГруппы.Объект КАК Источник,
	РабочиеГруппы.Участник
ИЗ
	РегистрСведений.РабочиеГруппы КАК РабочиеГруппы
ГДЕ
	ВЫРАЗИТЬ(РабочиеГруппы.Объект КАК Справочник.ВнутренниеДокументы) В (&Ссылки)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	Документы.Ссылка КАК Источник,
	Документы.Ответственный,
	Документы.Зарегистрировал,
	Документы.Подготовил,
	Документы.Подписал,
	Документы.Адресат,
	Документы.Создал
ИЗ
	Справочник.ВнутренниеДокументы КАК Документы
Где
	Документы.Ссылка В (&Ссылки)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	ВнутренниеДокументыСтороны.Подписал,
	ВнутренниеДокументыСтороны.Ссылка КАК Источник
ИЗ
	Справочник.ВнутренниеДокументы.Стороны КАК ВнутренниеДокументыСтороны
Где
	ВнутренниеДокументыСтороны.Ссылка В (&Ссылки)
	И ТИПЗНАЧЕНИЯ(ВнутренниеДокументыСтороны.Подписал) = ТИП(Справочник.Пользователи)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	ВнутренниеДокументыГрифыУтверждения.Ссылка КАК Источник,
	ВнутренниеДокументыГрифыУтверждения.АвторУтверждения
ИЗ
	Справочник.ВнутренниеДокументы.ГрифыУтверждения КАК ВнутренниеДокументыГрифыУтверждения
Где
	ВнутренниеДокументыГрифыУтверждения.Ссылка В (&Ссылки)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	ЭП.Объект КАК Источник,
	ЭП.УстановившийПодпись
ИЗ
	РегистрСведений.ЭлектронныеПодписи КАК ЭП
ГДЕ
	ВЫРАЗИТЬ(ЭП.Объект КАК Справочник.ВнутренниеДокументы) В (&Ссылки)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	Резолюции.ПометкаУдаления,
	Резолюции.АвторРезолюции,
	Резолюции.ВнесРезолюцию,
	Резолюции.Документ КАК Источник
ИЗ
	Справочник.Резолюции КАК Резолюции
ГДЕ
	ВЫРАЗИТЬ(Резолюции.Документ КАК Справочник.ВнутренниеДокументы) В (&Ссылки)
	И Резолюции.ПометкаУдаления = Ложь
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	Контроль.Предмет КАК Источник
ИЗ
	Справочник.Контроль КАК Контроль
ГДЕ
	ВЫРАЗИТЬ(Контроль.Предмет КАК Справочник.ВнутренниеДокументы) В (&Ссылки)
	И НЕ Контроль.ПометкаУдаления
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	Проекты.Руководитель КАК Участник,
	Документы.Ссылка КАК Источник
ИЗ
	Справочник.Проекты КАК Проекты
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ВнутренниеДокументы КАК Документы
		ПО Документы.Ссылка В (&Ссылки)
		И Документы.Проект = Проекты.Ссылка

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	ПроектыПроектнаяКоманда.Исполнитель,
	Документы.Ссылка
ИЗ
	Справочник.Проекты.ПроектнаяКоманда КАК ПроектыПроектнаяКоманда
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ВнутренниеДокументы КАК Документы
		ПО Документы.Ссылка В (&Ссылки)
		И Документы.Проект = ПроектыПроектнаяКоманда.Ссылка
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	ЖурналПередачиДокументов.Пользователь,
	ЖурналПередачиДокументов.Документ КАК Источник
ИЗ
	РегистрСведений.ЖурналПередачиДокументов КАК ЖурналПередачиДокументов
ГДЕ
	ВЫРАЗИТЬ(ЖурналПередачиДокументов.Документ КАК Справочник.ВнутренниеДокументы) В (&Ссылки)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	СведенияОбАдресатах.Контакт,
	ИсходящееПисьмо.Предмет КАК Источник
ИЗ
	РегистрСведений.СведенияОбАдресатах КАК СведенияОбАдресатах
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ИсходящееПисьмо.ПолучателиПисьма КАК ИсходящееПисьмоПолучателиПисьма
			ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ИсходящееПисьмо КАК ИсходящееПисьмо
			ПО ИсходящееПисьмоПолучателиПисьма.Ссылка = ИсходящееПисьмо.Ссылка
		ПО СведенияОбАдресатах.АдресатСообщения = ИсходящееПисьмоПолучателиПисьма.Адресат
ГДЕ
	ТИПЗНАЧЕНИЯ(СведенияОбАдресатах.Контакт) = ТИП(Справочник.Пользователи)
	И ВЫРАЗИТЬ(ИсходящееПисьмо.Предмет КАК Справочник.ВнутренниеДокументы) В (&Ссылки)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	СведенияОбАдресатах.Контакт,
	ИсходящееПисьмо.Предмет
ИЗ
	РегистрСведений.СведенияОбАдресатах КАК СведенияОбАдресатах
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ИсходящееПисьмо.ПолучателиКопий КАК ИсходящееПисьмоПолучателиКопий
			ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ИсходящееПисьмо КАК ИсходящееПисьмо
			ПО ИсходящееПисьмоПолучателиКопий.Ссылка = ИсходящееПисьмо.Ссылка
		ПО СведенияОбАдресатах.АдресатСообщения = ИсходящееПисьмоПолучателиКопий.Адресат
ГДЕ
	ТИПЗНАЧЕНИЯ(СведенияОбАдресатах.Контакт) = ТИП(Справочник.Пользователи)
	И ВЫРАЗИТЬ(ИсходящееПисьмо.Предмет КАК Справочник.ВнутренниеДокументы) В (&Ссылки)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	Мероприятия.Организатор,
	Мероприятия.Секретарь,
	Мероприятия.Председатель,
	Мероприятия.Куратор,
	Мероприятия.Подготовил,
	Мероприятия.Предмет КАК Источник
ИЗ
	Справочник.Мероприятия КАК Мероприятия
ГДЕ
	ВЫРАЗИТЬ(Мероприятия.Предмет КАК Справочник.ВнутренниеДокументы) В (&Ссылки)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	ПротоколыМероприятий.Ответственный,
	ПротоколыМероприятий.Исполнители.(
		Исполнитель),
	Мероприятия.Предмет КАК Источник
ИЗ
	Справочник.ПротоколыМероприятий КАК ПротоколыМероприятий
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Мероприятия КАК Мероприятия
		ПО ПротоколыМероприятий.Владелец = Мероприятия.Ссылка
		И ВЫРАЗИТЬ(Мероприятия.Предмет КАК Справочник.ВнутренниеДокументы) В (&Ссылки)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	Предметы.Предмет КАК Источник,
	Исполнители.Исполнитель
ИЗ
	БизнесПроцесс.Исполнение.Исполнители КАК Исполнители
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ БизнесПроцесс.Исполнение.Предметы КАК Предметы
		ПО Исполнители.Ссылка = Предметы.Ссылка
		И Предметы.Предмет В (&Ссылки)
ГДЕ
	ВЫРАЗИТЬ(Предметы.Предмет КАК Справочник.ВнутренниеДокументы) В (&Ссылки)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	Предметы.Предмет КАК Источник,
	Исполнители.Исполнитель
ИЗ
	БизнесПроцесс.Ознакомление.Исполнители КАК Исполнители
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ БизнесПроцесс.Ознакомление.Предметы КАК Предметы
		ПО Исполнители.Ссылка = Предметы.Ссылка
		И Предметы.Предмет В (&Ссылки)
ГДЕ
	ВЫРАЗИТЬ(Предметы.Предмет КАК Справочник.ВнутренниеДокументы) В (&Ссылки)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	Предметы.Предмет КАК Источник,
	Исполнители.Исполнитель
ИЗ
	БизнесПроцесс.Приглашение.Исполнители КАК Исполнители
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ БизнесПроцесс.Приглашение.Предметы КАК Предметы
		ПО Исполнители.Ссылка = Предметы.Ссылка
		И Предметы.Предмет В (&Ссылки)
ГДЕ
	ВЫРАЗИТЬ(Предметы.Предмет КАК Справочник.ВнутренниеДокументы) В (&Ссылки)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	Предметы.Предмет КАК Источник,
	Исполнители.Исполнитель
ИЗ
	БизнесПроцесс.Согласование.Исполнители КАК Исполнители
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ БизнесПроцесс.Согласование.Предметы КАК Предметы
		ПО Исполнители.Ссылка = Предметы.Ссылка
		И Предметы.Предмет В (&Ссылки)
ГДЕ
	ВЫРАЗИТЬ(Предметы.Предмет КАК Справочник.ВнутренниеДокументы) В (&Ссылки)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	Поручение.Исполнитель,
	Поручение.Контролер,
	Поручение.Проверяющий,
	ПоручениеПредметы.Предмет Как Источник
ИЗ
	БизнесПроцесс.Поручение.Предметы КАК ПоручениеПредметы
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ БизнесПроцесс.Поручение КАК Поручение
		ПО ПоручениеПредметы.Ссылка = Поручение.Ссылка
		И ВЫРАЗИТЬ(ПоручениеПредметы.Предмет КАК Справочник.ВнутренниеДокументы) В (&Ссылки)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	РассмотрениеИсполнителиИсполнения.Исполнитель,
	РассмотрениеПредметы.Предмет КАК Источник
ИЗ
	БизнесПроцесс.Рассмотрение.ИсполнителиИсполнения КАК РассмотрениеИсполнителиИсполнения
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ БизнесПроцесс.Рассмотрение.Предметы КАК РассмотрениеПредметы
		ПО РассмотрениеПредметы.Ссылка = РассмотрениеИсполнителиИсполнения.Ссылка
		И ВЫРАЗИТЬ(РассмотрениеПредметы.Предмет КАК Справочник.ВнутренниеДокументы) В (&Ссылки)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	РассмотрениеИсполнителиОзнакомления.Исполнитель,
	РассмотрениеПредметы.Предмет
ИЗ
	БизнесПроцесс.Рассмотрение.ИсполнителиОзнакомления КАК РассмотрениеИсполнителиОзнакомления
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ БизнесПроцесс.Рассмотрение.Предметы КАК РассмотрениеПредметы
		ПО РассмотрениеПредметы.Ссылка = РассмотрениеИсполнителиОзнакомления.Ссылка
		И ВЫРАЗИТЬ(РассмотрениеПредметы.Предмет КАК Справочник.ВнутренниеДокументы) В (&Ссылки)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	Рассмотрение.Исполнитель,
	Рассмотрение.КонтролерИсполнения,
	Рассмотрение.ПроверяющийИсполнения,
	РассмотрениеПредметы.Предмет КАК Источник
ИЗ
	БизнесПроцесс.Рассмотрение.Предметы КАК РассмотрениеПредметы
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ БизнесПроцесс.Рассмотрение КАК Рассмотрение
		ПО РассмотрениеПредметы.Ссылка = Рассмотрение.Ссылка
		И ВЫРАЗИТЬ(РассмотрениеПредметы.Предмет КАК Справочник.ВнутренниеДокументы) В (&Ссылки)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	Регистрация.Исполнитель,
	РегистрацияПредметы.Предмет КАК Источник
ИЗ
	БизнесПроцесс.Регистрация.Предметы КАК РегистрацияПредметы
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ БизнесПроцесс.Регистрация КАК Регистрация
		ПО РегистрацияПредметы.Ссылка = Регистрация.Ссылка
		И ВЫРАЗИТЬ(РегистрацияПредметы.Предмет КАК Справочник.ВнутренниеДокументы) В (&Ссылки)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	Утверждение.Исполнитель,
	УтверждениеПредметы.Предмет КАК Источник
ИЗ
	БизнесПроцесс.Утверждение.Предметы КАК УтверждениеПредметы
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ БизнесПроцесс.Утверждение КАК Утверждение
		ПО УтверждениеПредметы.Ссылка = Утверждение.Ссылка
		И ВЫРАЗИТЬ(УтверждениеПредметы.Предмет КАК Справочник.ВнутренниеДокументы) В (&Ссылки)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	ПраваПоДескрипторамДоступаОбъектов.Пользователь КАК Пользователь,
	ДескрипторыДляОбъектов.Объект КАК Источник
ИЗ
	РегистрСведений.ПраваПоДескрипторамДоступаОбъектов КАК ПраваПоДескрипторамДоступаОбъектов
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ДескрипторыДляОбъектов КАК ДескрипторыДляОбъектов
			ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ДескрипторыДоступаОбъектов КАК ДескрипторыДоступаОбъектов
			ПО (ДескрипторыДляОбъектов.Дескриптор = ДескрипторыДоступаОбъектов.Ссылка)
		ПО (ПраваПоДескрипторамДоступаОбъектов.Дескриптор = ДескрипторыДляОбъектов.Дескриптор)
		И (ДескрипторыДляОбъектов.Объект В (&Ссылки))
ГДЕ
	ПраваПоДескрипторамДоступаОбъектов.ОбъектОснование = НЕОПРЕДЕЛЕНО
	И ДескрипторыДляОбъектов.ТипДескриптора = 0
	И НЕ ДескрипторыДляОбъектов.Отключен
	И НЕ ПраваПоДескрипторамДоступаОбъектов.Пользователь.Служебный
 

Мы выполнили этот запрос и для анализа проблемы свели всю выданную информацию в одну таблицу со списком участников и указали источники в колонках:

Участники Основные реквизиты Подпи­сал Эл. подписи Исполни­тели бизнес-процессов Дескрип­торы
1 Администратор ✔️ ✔️ ✔️
2 Алмазова Э. Д. ✔️
3 Ася
(бот в помощь)
✔️
4 Береговой Т. И. ✔️
5 Бризова М. А. ✔️
6 Васильков Г. Ф. ✔️
7 Великанова Л. А. ✔️
8 Вершинский А. Б. ✔️
9 Вечерняя З. И. ✔️
10 Вьюгин С. М. ✔️
11 Гвоздика М. С. ✔️
12 Горизонтов П. Г. ✔️
13 Градова В. Р. ✔️
14 Гранитский А. Т. ✔️
15 Дроселев Ш. У. ✔️
16 Закатов Д. П. ✔️
17 Заливная А. С. ✔️
18 Зарянкин Б. В. ✔️
19 Звездин Д. А. ✔️
20 Звездочетова Э. Т. ✔️
21 Зеленец Н. В. ✔️
22 Зисторный Р. Э. ✔️
23 Изумрудов Н. Э. ✔️
24 Инеева А. Г. ✔️
25 Искрова Ж. М. ✔️
26 Камнев Л. В. ✔️
27 Ключевой Е. М. ✔️
28 Колокольчикова М. А. ✔️
29 Кометина А. Р. ✔️
30 Конденсаторный К. О. ✔️
31 Костеркова А. Р. ✔️
32 Лавинская В. М. ✔️
33 Ландышев Т. Р. ✔️
34 Мамонтов В. А. ✔️
35 Мишин С. А. ✔️
36 Мраморова К. Р. ✔️
37 Муссонов А. О. ✔️
38 Нарциссова А. Р. ✔️
39 Николаев Д. А. ✔️
40 Светлакова М. И. ✔️
41 Светоносова А. С. ✔️
42 Федоров О. П. ✔️
43 Штилева К. А. ✔️
44 Янтарный Э. Р. ✔️

Тут мы уже заподозрили неладное — список участников как будто слишком большой. При ближайшем рассмотрении стало ясно, в списке были ВСЕ пользователи базы! Если что, это в демо-базе их всего 44, но в реальной было 16 тысяч.

И если приглядеться к источникам на демобазе можно условно разделить участников на две категории:

  1. Явные участники. Это те люди, которые действительно имеют прямое отношение к документу: автор, подписанты, исполнители по бизнес-процессам.
    Таких всего 5:
    • Администратор (Автор, Подписал, Эл. подпись).
    • Конденсаторный Казбек Олегович (Участник согласования).
    • Мамонтов В. А. (Участник согласования).
    • Мишин С. А. (Участник согласования).
    • Николаев Д. А. (Ответственный).
  2. Остальные. Условно «не явные» участники, остальные 39 человек из таблицы. Те, кто получил права исключительно из дескрипторов доступа — через настройки прав, а не через прямую связь с документом.

Поизучав вторую группу, мы обнаружили ещё один занимательный факт — подавляющее большинство из них были с пометкой «Недействителен».

Это всё похоже на одну большую аномалию, расследуем дальше.

Откуда у пользователей права на документ?

Попробуем найти источник, который выдал им эти права через дескрипторы доступа. Для этой цели нам подойдет одна удобная возможность, которая есть в Документообороте — «Проверка настроенных прав доступа». Такая функциональность есть и в ДО2 Иконка открытия в новом окне и в ДО3 Иконка открытия в новом окне.

Для этого в карточке документа «Счет на оплату исходящий 15» пройдем в пункт меню «Еще» → «Документ» → «Права доступа»:

Переход в меню прав доступа по документу

Переход в меню прав доступа по документу

В открывшемся окне видим всё тот же список всех пользователей базы, и примечаем, что у них указан полный(!) набор прав на чтение/добавление/изменение/удаление:

Права доступа к документу

Права доступа к документу

В этом окне, если нажать на кнопку «Обновить» — система немедленно запустит пересчет прав, и после этого появится вкладка «Данные для расчета прав», в которой выведется информация обо всех настройках, повлиявших на доступ к документу:

Вкладка «Данные для расчета прав»

Вкладка «Данные для расчета прав»

Последовательно проверим каждый источник.

«Политики доступа»

Первым делом переходим в раздел «Политики доступа» — это одна из основных настроек прав, позволяющая определить доступы в определенных разрезах — по видам документам, организациям и др.

Подробней можно ознакомится в статье на ИТС Иконка открытия в новом окне.

В открывшемся окне на вкладке «Общие разрешения» мы просмотрели все разрезы доступа, относящиеся к внутренним документам, но здесь мы не нашли ничего, что давало бы доступ массовым группам пользователей:

Особые разрешения политики доступа для Внутренних документов

Особые разрешения политики доступа для Внутренних документов

А в единственной указанной в списке рабочей группе «Делопроизводители» оказался всего один пользователь:

Участники рабочей группы «Делопроизводители»

Участники рабочей группы «Делопроизводители»

На вкладках «Специальные разрешения» и «Локальные администраторы» и вовсе было пусто:

Специальные разрешения политики доступа для Внутренних документов

Специальные разрешения политики доступа для Внутренних документов

Специальные разрешения для Локальных администраторов для Внутренних документов

Специальные разрешения для Локальных администраторов для Внутренних документов

«Настройки прав папки»

Возвращаемся на вкладку «Данные для расчета прав» и открываем настройку «Настройки прав папки» — данный механизм позволяет выдать доступ к папке в которой находится какой-либо объект базы. И наш документ не исключение, он также находится в родительской папке.

Подробнее о правах к папкам можно почитать на ИТС Иконка открытия в новом окне.

Настройки прав папки

Настройки прав папки

В открывшемся окне видим, что папке документа «Счета на оплату» выдан доступ:

  • Двум конкретным пользователям — Великановой Л. А. и Федорову О. П.
  • И подразделению — Бухгалтерия.

Настройки прав доступа папки документа Счет на оплату

Настройки прав доступа папки документа Счет на оплату

Может быть в бухгалтерии сотни сотрудников, или в нее включена группа пользователей?
Увы нет, в этом подразделении всего три сотрудника, один к тому же бот:

Состав подразделения «Бухгалтерия»

Состав подразделения «Бухгалтерия»

Вкладки «Руководители» и «Делегаты»

Идем дальше. В программе есть ещё пара возможностей выдачи доступа — это временное делегирование прав, например когда сотрудник уходит в отпуск и нужно назначить замещающего, а также расширение прав по руководителям по доступам подчиненных.

Нажимаем на настройку «Руководители» — откроется форма, в которой подсвечены строки с подразделениями и руководителями, которые наследуют права от подчиненнных. В нашем случае это только руководитель подразделения «Бухгалтерия» Зеленец Н. В.:

Состав подразделения «Бухгалтерия» и руководитель

Состав подразделения «Бухгалтерия» и руководитель

Аналогично переходим в настройку «Делегаты». Здесь обнаруживаются записи о делегировании прав, но их всего две:

Настройки делегирования прав доступа

Настройки делегирования прав доступа

«Неограниченные права»

Всё это были единичные настройки, и выдачи прав для 44 сотрудников мы не набираем.

Остается последняя, самая интригующая настройка «Неограниченные права». Название говорящее — именно здесь могут скрываться правила, дающие доступ без каких-либо ограничений:

Настройки по Неограниченным правам

Настройки по Неограниченным правам

При открытии этой настройки система формирует отчет по неограниченным правам для нашего исследуемого документа. И вот он — момент истины!

Отчет по неограниченным правам

Отчет по неограниченным правам

Отчет показывает, что рабочей группе «Все пользователи» выданы полные права на документ. А предоставило эти права полномочие «Выполняющие потоковое сканирование» с одноименной ролью, дающей полный доступ:

Карточка полномочия «Выполняющие потоковое сканирование»

Карточка полномочия «Выполняющие потоковое сканирование»
Полномочия Иконка открытия в новом окне — это справочник, элементы которого объединяют в себе наборы ролей, некий аналог «Профиля доступа» из других конфигураций.

Сама по себе роль «Выполняющие потоковое сканирование» похоже необходима пользователям для доступа к пакетному сканированию — возможности быстро загружать в систему большие объемы отсканированных листов. Об этом можно почитать тут Иконка открытия в новом окне.

И как видно в конфигураторе — роль «Выполняющие потоковое сканирование» дает доступ ко многим объектам без ограничений:

«Выполняющие потоковое сканирование»

Вероятно, это обусловлено особенностями этого блока. И судя по всему подобная роль должна выдаваться ограниченному кругу лиц. А в нашем случае эту роль дали рабочей группе с говорящим названием «Все пользователи»:

Предопределенная рабочая группа «Все пользователи»

Предопределенная рабочая группа «Все пользователи»

Если открыть карточку группы, можно понять, что это предопределенная рабочая группа. Ее состав в системе не подлежит редактированию. И, как и следовало предположить, она включает в себя абсолютно всех пользователей информационной базы — и активных, и недействительных. Без каких-либо исключений.

Далее для упорядочения информации расскажем немного про систему прав в ДО2.

Настройка прав ДО2

Блок прав 1С:Документооборота 2 устроен на основе дескрипторов доступа, его схему тяжело охватить разом, и об этом конечно лучше читать в документации, в разделе «Настройка прав доступа» (its.1c.ru/db/doccorp21#content:791:hdoc).

Но если попытаться охватить все те опции, что мы с вами обошли к текущему моменту, схема выглядит примерно так:

Схема прав доступа ДО2

Схема прав доступа ДО2

Как и в любой базе 1С верхний уровень составляют роли, которые можно поделить на полноправные и содержащие шаблоны доступа. В ролях с ограничениями доступа для установления факта наличия доступа в шаблонах используется запрос к механизму дескрипторов.

Как указано на ИТС Иконка открытия в новом окне:

«Дескриптор создается автоматически для нескольких объектов информационной базы и группирует ключевые поля, влияющие на расчет прав этих объектов (гриф доступа, вид документа, папка и др.) Это позволяет рассчитывать права не для каждого объекта программы, а сразу для нескольких.»

Сами дескрипторы рассчитываются исходя из различных настроек системы, с которыми мы частично познакомились выше.

На схеме мы подсветили желтым те блоки, настройки в которых были причастны к разрастанию очереди.

Итоги расследования — найдена «машина бесконечности»

Делаем выводы:

  • Проблема не в ошибке механизма миграции, а в исходных данных. Механизм формирования записей для переноса прав «Заполнение рабочих групп для перехода» работал корректно, следуя своей логике: собирать всех пользователей, имеющих доступ к документу.
  • Корень зла — настройки прав доступа в ДО2. Предопределенная группа «Все пользователи» благодаря полномочию на потоковое сканирование автоматически наделяла правами доступа к каждому документу всех без исключения пользователей.
  • Эффект «размножения». Для каждого из сотен тысяч документов алгоритм честно пытался записать в регистр миграции информацию о каждом из тысяч пользователей, что приводило к комбинаторному взрыву 660 тыс. объектов * 16 тыс. пользователей = ~10,5 млрд записей.

Очевидно, оставить всё как есть — не получится, такой объем данных (миллиарды записей) делает выполнение регламентного задания бесконечным в практическом смысле, оно не может быть завершено за разумное время.

И учитывая то, что проблема в некорректных настройках прав, первый вариант, который приходит в голову — исправить эти настройки в исходной базе.

Вариант А. «Ревизия прав» в ДО2 до выгрузки

Суть подхода: Внести изменения в настройки доступа ДО2 до миграции:

  • Провести полноценный аудит прав — во-первых, выявить пользователей, которым нужны права на потоковое сканирование; во-вторых, определить списки пользователей по всем нужным разрезам доступов.
  • Исключить группу «Все пользователи» из полномочия «Выполняющие потоковое сканирование».
  • Создать специальные рабочие группы для пользователей работающих с потоковым сканированием, и для остальных пользователей по всем нужным разрезам.
  • Пересчитать права доступа.

Вариант А

Вариант А

Из плюсов — после этих работ механизм миграции должен будет отрабатывать штатно на «правильных» данных.

Из минусов был один нюанс — всё это пришлось бы делать на продуктивной базе ДО2 с 5 тыс. активных пользователей на борту, вмешательство в работу которых для заказчика было бы крайне чувствительным и нежелательным. А кроме того, подобный процесс аудита и тестирования и так был заложен в проект миграции уже на стороне ДО3.

Дабы не выполнять работу дважды, мы пошли другим путем.

Вариант Б. «Пост-обработка» в ДО3 после загрузки

А что если выключить механизм «Рабочих групп для перехода»?

Насколько мы поняли, механизм задуман в первую очередь в связи со сменой архитектуры настроек доступа между ДО2 и ДО3.

Как указано на ИТС (its.1c.ru/db/updinfo#content:1427:hdoc:issogl2_21):

«Рабочие группы в 3.0 будут расширены относительно 2.1. Это обусловлено отказом от Политик доступа: теперь пользователи, которые неявно имели доступ к объектам через политики, будут явно включены в их рабочую группу.»

В наших экспериментах мы попробовали выявить закономерность, что мы теряем в случае отключения механизма и отобразили результаты на схеме прав доступа ДО2:

Что мы теряем из ДО2 при отключении регламента

Что мы теряем из ДО2 при отключении регламента

То что подвечено зеленым переносится стандартным механизмом миграции: Полномочия, Рабочие группы, настройки Руководителей и Делегаты.

Желтым выделен блок доступа по реквизитам объекта, потому что хоть он и попадает в механизм «рабочих групп для перехода», но по сути у нас и в обычной миграции при записи объектов доступ восстанавливался.

Красным помечены те сущности, права которых, как мы посчитали, теряем при отключении механизма: Политики доступа, Настройки прав папок и Связанные объекты бизнес-процессов. Мы изучили эти настройки в нашей продуктивной базе подробнее:

  • Политики доступа — в нашем случае их не было настроено вовсе, так что этот пункт для нас оказался не критичен.
  • Настройки прав папок — каких-то специфически прав выдано не было, по сути у всех были права на всё из-за роли для потокового сканирования.
  • А вот блок Связанных объектов бизнес-процессов нам действительно придется восстановить, так как процессы активно используются в базе.
    И в тему бизнес-процессов нам так или иначе предстояло погрузиться, о чем мы рассказывали во второй части статьи Иконка открытия в новом окне.

Итак, к чему мы пришли: права на стороне ДО2 не трогаем. Чтобы не утонуть в миллиардах «недействительных» записей, предлагается отключить механизм «Рабочих групп для перехода». При этом в ДО3 перенесутся только базовые настройки прав: политики доступа, полномочия и т.п., предусмотренные миграцией штатно. А то чего не хватает — создадим своими силами:

Вариант Б

Вариант Б

Во время периода миграции мы вместе с фокус-группой заказчика проводим аудит и полноценную настройку прав «под ключ», но уже на стороне ДО3:

  1. Отключаем полномочие «Выполняющие потоковое сканирование» для предопределенной группы «Все пользователи».
  2. Выдаем доступы соответствующим группам пользователей — тем, кому он необходим согласно аудиту. Для этой цели предполагали использовать «Роли исполнителей» об этом ниже.
    Также не забываем тех пользователей, кому действительно нужны права для потокового сканирования.
  3. Восстанавливаем доступы участников бизнес-процессов, которые потеряли из-за отключения механизма «Рабочих групп для перехода».

В результате ДО3 получает работающую, чистую и правильно настроенную систему прав, без избыточно выданных прав для «Недействительных» пользователей.

При этом настройка и тестирование должны будут проходить во время миграции до перехода на ДО3, и пользователей в ДО2 это не затронет.

Реализация выбранной стратегии

Первое действие — исключить проблемный регистр из процесса миграции, чтобы в ДО3 не попали миллиарды бесполезных записей.

Отключение миграции Рабочих групп для перехода

Шаг 1. Отключаем регламентное задание в ДО2

В первой части Иконка открытия в новом окне мы рассказывали, что при старте миграции были отключены все регламентные задания, кроме нескольких служебных. Среди них и тот самый регламент «Заполнение рабочих групп для перехода на Документооборот 3.0» и по нашей задумке его следует отключить на стороне ДО3 в первую очередь:

Регламентное задание Заполнения рабочих групп для перехода

Регламентное задание Заполнения рабочих групп для перехода

Шаг 2. Отключаем выгрузку регистра «Рабочие группы для перехода»

Мы производили работы уже в процессе миграции, и чтобы предотвратить передачу ненужных данных решили выключить выгрузку этого объекта. В случае отключения регламента до начала миграции, вероятно, в этом не было бы необходимости.

Для этого в обработке «Миграция на новую версию»:

  1. Переходим на вкладку «Объекты».
  2. И для записи с регистром «Рабочие группы для перехода» снимаем флаг «Выгружать». Это гарантирует, что данные из этого регистра не попадут в файлы выгрузки:

Форма настройки выгрузки объектов

Форма настройки выгрузки объектов

Дополнительно для ускорения записи объектов при миграции в базе приемнике ДО3 рекомендуем включить отложенное обновление прав.

При штатной работе механизм прав пересчитывается синхронно — в той же транзакции при записи объекта, что увеличивает время этого процесса. Отложенное обновление выносит пересчёт прав в очередь и обрабатывает её регламентным заданием отдельно. Это позволяет дополнительно ускорить загрузку и избежать блокировок. Этот особенно важно при массовых операциях.

Чтобы это сделать нужно:

  1. В разделе «Настройка» выбрать пункт «Настройка программы»:

    Переход в настройки программы

    Переход в настройки программы
  2. В открывшемся окне выбрать команду «Права доступа»:

    Переход к настройкам Прав доступа

    Переход к настройкам Прав доступа
  3. В форме настроек установить флаг «Отложенное обновление прав»:

    Настройка включения Отложенного обновления прав

    Настройка включения Отложенного обновления прав

    Подробнее о механизме можно ознакомиться на ИТС:

    • its.1c.ru/db/doc30#content:234:hdoc
    • its.1c.ru/db/pubdocflow300quest/content/294/hdoc

Исключив из миграции регистр «Рабочие группы для перехода», мы не допустили переноса миллиардов лишних записей, которые возникли из-за некорректных настроек прав в ДО2. Такое решение избавило нас от выгрузки и загрузки данных, длительность которых было бы сложно спрогнозировать, выводя миграцию за все приемлемые временные рамки.

Относительно процесса миграции больше изменений нет. Дальше планово проходим все этапы миграции, и завершаем её, как это было описано в разделе «Завершение миграции» первой части статьи Иконка открытия в новом окне.

Анализ мигрированных объектов

После завершения миграции проверим те объекты прав доступа, что были перенесены штатными средствами. Согласно документации это Полномочия и Рабочие группы (its.1c.ru/db/updinfo#content:1427:hdoc:issogl2_21).

Шаг 1. Проверяем полномочия

В ДО3 переходим в меню «Настройка» → «Полномочия»:

Путь к Полномочиям

Путь к Полномочиям
  • Убеждаемся, что все полномочия из ДО2 успешно перенесены. Появились даже новые, но это сейчас не принципиально:

    Список мигрированных полномочий в ДО3

    Список мигрированных полномочий в ДО3
  • Проверяем состав полномочий, откроем, к примеру, «Руководители проектов». Состав участников должен соответствовать настройкам в ДО2:

    Пример состава мигрированного полномочия «Руководители проектов»

    Пример состава мигрированного полномочия «Руководители проектов»

Шаг 2. Проверяем рабочие группы

В ДО3 переходим в меню «НСИ» → «Рабочие группы»:

Путь к Рабочим группам

Путь к Рабочим группам
  • Проверяем, что все рабочие группы перенесены:

    Список Рабочих групп

    Список Рабочих групп
  • Открываем, например, группу «Руководители подразделений» и сверяем ее состав с исходной системой:

    Пример состава мигрированной рабочей группы «Руководители подразделений»

    Пример состава мигрированной рабочей группы «Руководители подразделений»

Итог: базовые настройки прав доступа мигрировали успешно. Теперь мы можем приступить к настройке прав, чтобы устранить проблему избыточного доступа.

Настройка прав доступа

Теперь мы приступаем к построению в ДО3 новой, чистой модели доступа — без «наследственных» ошибок.

Этап 1. «Зачистка»: отключаем доступ для «Всех пользователей»

В первую очередь ликвидируем вольности в правах, которые сыграли с нами злую шутку при миграции — выключаем полномочие «Выполняющие потоковое сканирование».

Шаг 1. Анализируем текущее состояние

Для примера возьмем в нашей демо-базе документ «Счет на оплату исходящий 15» — он имел наибольшее количество участников:

Тестовый мигрированный документ для разбора

Тестовый мигрированный документ для разбора

Открываем карточку этого документа в ДО3 и переходим в «Еще» → «Документ» → «Права доступа»:

Путь к Правам доступа документа

Путь к Правам доступа документа

Видим ту же картину, что и в ДО2, множество пользователей с полными правами:

Права доступа мигрированного тестового документа

Права доступа мигрированного тестового документа

Шаг 2. Исправляем полномочие «Выполняющие потоковое сканирование»

  1. Проходим в список полномочий в подсистеме «Настройка»:

    Переход в меню к Полномочиям

    Переход в меню к Полномочиям
  2. Открываем запись «Выполняющие потоковое сканирование» и переходим по гиперссылке «Кому выданы»:

    «Выполняющие потоковое сканирование»

    В открывшемся списке удаляем группу «Все сотрудники».

  3. При записи полномочия права должны обновиться.
Смена наименования рабочей группы со «Все пользователи» на «Все сотрудники» связана с изменением учета пользователей в ДО3. Мы описывали это кратко в первой части в разделе «Действия по нормализации данных перед миграцией» в пункте «Сопоставление пользователей» Иконка открытия в новом окне.

Шаг 3. Контролируем применение изменений

Так как мы ранее включили отложенное обновление прав, нужно дождаться их обработки. Проверить всё ли завершено можно через очередь обновления.

  1. Переходим в меню «Настройка» → «Управление расчетом прав»:

    Переход к управлению расчета прав

    Переход к управлению расчета прав
  2. В открывшейся форме мы видим состав очередей («Долгая», «Оперативная»):

    Состав очередей

    За их обработку отвечают регламентные задания «Обновление прав доступа (долгое)» и «Обновление прав доступа (оперативное)»:

    Регламентные задания обновления прав доступа

    Регламентные задания обновления прав доступа
    Подробнее про специфику очередей можно ознакомиться на ИТС Иконка открытия в новом окне.
  3. Посмотрим на содержимое очередей нажав на кнопку в правом верхнем углу в виде квадрата со стрелкой:

    Регламентные задания обновления прав доступа

    Открытие Очереди обновления прав доступа

В нашем случае записи попали в оперативную очередь, в дополнительных сведениях было указано «ОбновитьРолиПользователей»:

Состав очереди обновления прав доступа

Состав очереди обновления прав доступа

Дождемся, пока очередь полностью очистится. Это будет означать, что наше изменение было применено ко всем объектам.

Шаг 4. Анализируем результаты изменений

После отработки очередей возвращаемся в карточку документа «Счет на оплату исходящий 15» и снова смотрим на права доступа. Количество участников сократилось до 6.

Права доступа после отключения «Всех сотрудников»

Права доступа после отключения «Всех сотрудников»

Разберем, откуда взялся каждый из них.

  1. Участники, добавленные явно в рабочую группу документа:
    • Администратор — указан как автор документа.
    • Николаев Д. А. — указан как ответственный.

    Рабочая группа по документу

    Рабочая группа по документу
  2. Руководители участников:
    • Белугин М. А. — руководитель участника Николаев Д. А.

      Руководитель участника Николаева Д. А.

      Руководитель участника Николаева Д. А.
    • Зеленец Н. В. — руководитель участника Светлакова М. И.

      Руководитель участника Светлакова М. А.

      Руководитель участника Светлакова М. А.
    • Федоров О. П. — руководитель участников Белугин М. А, Зеленец Н. В.

      Руководитель руководителей

      Руководитель руководителей :)

    Из примера видно, что в списке участников документа появились не только непосредственные исполнители, но и руководители подчиненных сотрудников по всей иерархической цепочке.

    Схема получения руководителей по подчиненным

    Схема получения руководителей по подчиненным

    Как мы упоминали ранее, это произошло из-за того, что в настройках программы включен флаг «Добавлять руководителям доступ подчиненных». На стороне ДО2 были такие же настройки Настройка → Настройка программы → Права доступа (its.1c.ru/db/doc30#content:233:hdoc):

    Настройка добавления прав доступа руководителям от подчиненных

    Настройка добавления прав доступа руководителям от подчиненных
  3. Участники, получившие доступ через полномочия с неограниченными правами:
    • Администратор — входит в полномочие «Администраторы».
    • Светлакова М. И. — входит в полномочие «Выполняющие потоковое сканирование», данный пользователь был указан в нём отдельной строкой, помимо участия в группе «Все сотрудники».

    Пользователи с неограниченными правами на Документы

    Пользователи с неограниченными правами на Документы

    Как можно отметить, на текущем этапе в правах доступа к документу еще отсутствуют участники, связанные с бизнес-процессами (исполнители, согласующие, контролеры). В том, что они существуют можно убедиться на вкладке «процессы и задачи»:

    Пример отсутствующих участников бизнес-процессов документа в правах доступа

    Пример отсутствующих участников бизнес-процессов документа в правах доступа

Этап 2. «Целевое дополнение»: настраиваем доступ для конкретных групп

Теперь, когда мы отняли полные права практически у всех, нужно:

  • Вернуть доступ на потоковое сканирование теперь уже конкретным пользователям.
  • Выдать доступы согласно аудиту прав.

Шаг 1. Дополняем полномочие «Выполняющие потоковое сканирование»

Заказчик предоставил нам список пользователей, которым действительно нужно это право. Теперь возвращаемся в полномочие и добавляем уже целевых пользователей в разделе «Кому выданы». Для примера, на демо-базе добавим пользователей Берёзкин А. С. и Фролова Е. М.:

Добавленные целевые пользователи Потокового сканирования

Добавленные целевые пользователи Потокового сканирования

После обработки Очереди обновления прав, проверяем что доступ у них появился:

Добавленные сотрудники к правам доступа к документу

Добавленные сотрудники к правам доступа к документу

В списке видим указанных пользователей, но помимо них добавился еще сотрудник Великанова Л. А. — это нормально, она является руководителем Фроловой Е. М., что соответствует настройке «Добавлять руководителям доступ подчиненных»:

Руководитель Фроловой Е. М.

Руководитель Фроловой Е. М.

Шаг 2. Создание новой роли исполнителей для доступа к документам из ERP.

Далее вместе с заказчиком был проведен аудит прав и изначально мы предполагали, что ключевой доступ, который нужен многим сотрудникам, касается файлов загружаемых в ДО из интегрированной базы ERP. Однако, при миграции выяснилось, что в ДО3 был упразднен режим хранения «Файлы в отдельных папках», об этом мы рассказывали в третьей части Иконка открытия в новом окне. В итоге это привело к перенастройке интеграции на обмен документами. Поэтому и логика выдачи доступа теперь подразумевала права не на файлы, а на документы.

Идея заключалась в том, чтобы выдать права группам пользователей в разрезе определенных видов документов: то есть мы хотим чтобы какая-то часть пользователей могла работать со всеми документами только определенных видов, например, «Счет на оплату», «Заказы клиентов», «Реализация товаров и услуг».

Для настройки таких прав в новых документах можно использовать настройку шаблона в видах документов (its.1c.ru/db/doc30#content:26:hdoc). Если добавить пользователя или группу в такой шаблон вида, то для новых документов этого вида в них сразу будет прописан для них доступ:

Счет на оплату

В этой задаче для группировки пользователей как нельзя кстати подходит справочник «Рабочие группы» (its.1c.ru/db/doc30#content:230:hdoc) и сначала мы хотели использовать его, но в итоге немного отступили от канона и взяли за основу справочник «Роли исполнителей» (its.1c.ru/db/doc30#content:68:hdoc).

И хоть на схеме объектов доступа ДО3 мы его не приводили, но, как оказалось, элементы этого справочника также можно указывать в шаблоне вида документа. А помимо этого его можно использовать для «хитрой» адресации в бизнес-процессах: роль может быть привязана к организации, подразделению или проекту. Это позволяет адресовать задачу, например по условию, «Менеджеру по реализации ООО „Меркурий“», если в компании несколько организаций и у каждого свой такой менеджер:

Пример группы пользователей по ролям исполнителей

Пример группы пользователей по ролям исполнителей

Для текущей задачи это в целом не важно, но в будущем такая адресация предполагалась к использованию, так что, обсудив с методологами, мы решили использовать этот справочник.

Настройка роли исполнителей

  1. Переходим в раздел «НСИ» → «Роли исполнителей»:
  2. Переход к Ролям исполнителей

    Переход к Ролям исполнителей
  3. Создаем новую роль, например, «Работа с документами Реализации ERP»:

    Новая Роль Исполнителей для работы с документами Реализации ERP

    Новая Роль Исполнителей для работы с документами Реализации ERP
  4. Добавляем в состав роли целевых пользователей. В нашем случае список сотрудников был предоставлен заказчиком на основе анализа деятельности пользователей в ERP.

Наделение роли правами на виды документов

Теперь добавим роль исполнителей в шаблоны в настройках видов документов.

  1. Переходим в раздел «НСИ» → «Виды документов»:

    Путь к Видам документов

    Путь к Видам документов
  2. Открываем вид документа, например, «Счет на оплату»:

    Список Видов документов

    Список Видов документов
  3. На вкладке «Создание документов» → «Доступ к документу» добавляем нашу роль «Работа с документами Реализации ERP»:

    Настройка Участников доступа к виду документов

    Настройка Участников доступа к виду документов

Аналогичные настройки выполняем для всех видов документов, к которым требуется предоставить доступ, к примеру, для «Заказ клиента», «Реализация товаров и услуг» и другим по согласованию с заказчиком.

Теперь при создании нового документа указанных видов система автоматически добавляет роль исполнителей «Работа с документами Реализации ERP» в рабочую группу документа (вкладка «Доступ»). Это обеспечивает участникам Роли право на чтение документа и, как следствие, доступ к прикрепленным файлам на стороне ERP:

Результат применения настроек прав доступа на новом документе

Результат применения настроек прав доступа на новом документе

Данным действием решаем проблему с доступом для целевых сотрудников со стороны ERP системы. Но только для новых документов.

А что делать с существующими? Для таких документов, созданных до момента добавления роли в шаблон, рабочие группы для документов необходимо добавить отдельно. Эту задачу, а также автоматическое добавление «Недостающих» участников бизнес-процессов, мы решим на следующем этапе.

Этап 3. Разработка решения поиска Участников по процессам и механизма расширения прав по настройкам из шаблонов видов документов

Мы подошли к финальному, самому сложному этапу настройки прав доступа. Перед нами остались две задачи.

Первая — прописать доступ для уже существующих документов согласно настройке из шаблонов видов документов.

Вторая — восстановить права доступа к объектам для участников бизнес-процессов (исполнители, согласующие, контролеры). То, чего мы лишились, отключив механизм «Рабочие группы для перехода».

Решение обеих задач возлагалось на команду разработки, предполагалось создать механизмы, которые сделают всё в автоматическом режиме. И так как обе задачи включали восстановление прав доступа, и к тому же мы предполагали использование типовых методов — эти алгоритмы были объединены в одной обработке.

Схема работы донастройки прав доступа

Прежде чем переходить к коду, кратко рассмотрим логику работы механизма.

Как и для некоторых предыдущих обработок в этом цикле статей предполагалось, что механизм будет устроен многопоточно. Схема включает два уровня.

Первый — регламентное задание, которое управляет общей очередью. Выбирает порции объектов по заданным типам последовательно, разбивает их на подпорции, запускает параллельные потоки и ожидает полного завершения.

Второй — каждый поток, который в автономном режиме обрабатывает свою подпорцию. Он актуализирует рабочие группы документов, вызывает механизм пересчета прав и фиксирует изменения.

Ошибки не прерывают общий процесс — проблемные объекты переносятся в следующий цикл обработки.

Схема добавления прав доступа для участников

Схема добавления прав доступа для участников

1. Алгоритм регламентного задания (управляющий уровень)

Регламентное задание «Заполнение рабочих групп доступа» управляет процессом в целом.

  • Шаг 1. Выборка порции объектов текущего типа (например, 1 000 штук), по которым еще нет отметки в регистре «Обработанные объекты прав доступа».
  • Шаг 2. Формирование потоков обработки порции и их запуск. Количество потоков задается параметром.
  • Шаг 3. Ожидание завершения потоков и формирование новых по шагу 1, пока не закончатся объекты.

2. Алгоритм потока (исполнительский уровень)

Каждый поток работает независимо и параллельно с другими. Для каждого объекта из порции:

  • Шаг 1. Выполняется добавление участников:
    • Бизнес-процессов — исполнители, согласующие, контролеры.
    • По шаблонам видов документов.
  • Шаг 2. Расчет прав — вызываются типовые методы расчета прав, которые формируют дескрипторы доступа.
  • Шаг 3. Фиксация результата обработки объекта в регистре «Обработанные объекты прав доступа»:
    • При успехе — отметить объект как обработанный.
    • При ошибке — записать текст ошибки (объект будет повторно обработан в следующий раз).

Когда порция обработана — завершение работы потока.

Выборка объектов обработки

Получение объектов производится в определенном порядке:

  • Сначала справочники: организации, физические лица, контрагенты, виды документов, шаблоны документов.
  • Затем документы предприятия.
  • В последнюю очередь — бизнес-процессы.

Такой порядок мы подсмотрели в типовой логике расчета прав доступа, и там он обусловлен некоторой иерархичностью расчета прав, как мы полагаем, для предотвращения создания дублей дескрипторов.

Для сопровождения процесса обработки также потребовалось создать два вспомогательных регистра сведений. Они обеспечивают управляемость и прозрачность процесса обработки.

Регистр сведений «Обработанные объекты прав доступа».

Назначение: фиксация факта обработки каждого объекта для исключения повторной обработки и контроля хода выполнения.

Измерения:

  • Объект — ссылка на обработанный объект метаданных.

Ресурсы:

  • Обработано — признак успешной обработки.
  • ТекстОшибки (Строка, 200) — описание ошибки, если обработка не удалась.
  • ДатаЗаписи (Дата) — время последней попытки обработки.

Особенности использования:

  • При успешной обработке объекта устанавливается флаг «Обработано = Истина».
  • При возникновении ошибки флаг не устанавливается, записывается ТекстОшибки.
  • В следующем цикле объект будет обработан повторно.

Регистр сведений «Шаблоны видов документов».

Назначение: сопоставление видов документов с шаблонами, из которых следует копировать настройки доступа для уже существующих документов.

Измерения:

  • ВидДокумента (СправочникСсылка.ВидыДокументов).

Ресурсы:

  • Шаблон (СправочникСсылка.ШаблоныДокументов).

Особенности использования:

  • Позволяет для видов документов указать соответствующие шаблоны, содержащие настроенную Роль исполнителей.
  • При выборке документов к обработке отбираются только виды документов указанных в этом регистре.
  • Регистр заполняется вручную.

Описание методов

Головная процедура ЗаполнениеРабочихГруппЗапустить()

Проверяет количество запущенных потоков обработки и, если их меньше максимального количества, вызывает дочерний метод создания потока передавая коллекцию данных.


 
// Управляет процессом заполнения рабочих групп и обновления прав доступа. 
//
Процедура ЗаполнениеРабочихГруппЗапустить()
	
	КоличествоПотоков = 20;
	ПривязкаИмя = "КоличествоПотоковЗаполненияРабочихГруппПоШаблонам";
	Если из_Привязка.Существует(ПривязкаИмя) Тогда
		КоличествоПотоков = из_Привязка.Получить(ПривязкаИмя);		
	КонецЕсли; 
				
	ИмяЗаданияОчистка = "Обновление прав доступа. Очистка очереди заполнения рабочих групп (РГ-Д)";
	ПараметрыОтбора = Новый Структура("Наименование, Состояние", ИмяЗаданияОчистка, СостояниеФоновогоЗадания.Активно);
	
	Если ФоновыеЗадания.ПолучитьФоновыеЗадания(ПараметрыОтбора).Количество() > 0 Тогда
		Возврат;	
	КонецЕсли;
	
	ИмяЗадания = "Заполнение рабочих групп документов, обновление прав (РГ-Д)";
	ПараметрыОтбора = Новый Структура("Наименование, Состояние", ИмяЗадания, СостояниеФоновогоЗадания.Активно);
	
	Если ФоновыеЗадания.ПолучитьФоновыеЗадания(ПараметрыОтбора).Количество() > 0 Тогда
		Возврат;	
	КонецЕсли;	
	
	Коллекция = РГ_ЗаполнениеРабочихГрупп.СправочныеОбъектыПолучить();
	
	Если НЕ Коллекция.Количество() Тогда  
		Коллекция = РГ_ЗаполнениеРабочихГрупп.ДокументыПолучить();	
	КонецЕсли;
	
	Если НЕ Коллекция.Количество() Тогда 
		Коллекция = РГ_ЗаполнениеРабочихГрупп.БизнесПроцессыДействияЗадачПолучить();			
	КонецЕсли; 
		
	Если КоличествоПотоков > 1 Тогда
		РГ_ЗаполнениеРабочихГрупп.ЗаполнитьМногопоточно(Коллекция, КоличествоПотоков);
	Иначе
		РГ_ЗаполнениеРабочихГрупп.Заполнить(Коллекция);
	КонецЕсли;
	
КонецПроцедуры // ЗаполнениеРабочихГруппЗапустить

 

Многопоточная обработка выбранной порции: полученная порция делится на части в соответствии с настройкой количества потоков (по умолчанию — 20).

Методы формирования потоков обработки


// Заполняет переданную коллекцию в многопоточном режиме.
//
// Параметры:
// Коллекция - Массив - коллекция, подлежащая
// заполнению.
// КоличествоПотоков - Число - количество фоновых заданий, которые будут
// запущены параллельно.
Процедура ЗаполнитьМногопоточно(Коллекция, КоличествоПотоков) Экспорт

Задания = Новый Массив;
ФоновыеЗаданияЗаписьИнициализировать(Задания, КоличествоПотоков, Новый Структура("Порция", Коллекция)
, "РГ_ЗаполнениеРабочихГрупп.Заполнить");

РГ_ФоновыеЗадания.ЗаданияЗавершениеОжидать(Задания);

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

// Инициализирует и запускает фоновые задания для многопоточной обработки коллекции.
//
// Параметры:
// Задания - Массив - выходной параметр. В него будут добавлены
// объекты запущенных фоновых заданий.
// КоличествоПотоков - Число - количество параллельных фоновых заданий,
// на которое будет разбита исходная коллекция.
// Параметры - Структура - параметры.
// МетодаИмя - Строка - полное имя экспортного метода (включая общий модуль),
// который будет выполнен в фоновом задании. Метод должен
// принимать параметр типа Структура с ключом "Порция".
Процедура ФоновыеЗаданияЗаписьИнициализировать(Задания, КоличествоПотоков, Параметры, МетодаИмя) Экспорт

Порция = Параметры.Порция;

ДанныеКоличество = Порция.Количество();
Размер = ДанныеКоличество / КоличествоПотоков;
ПорцияРазмер = ?(Размер = Цел(Размер), Размер, Цел(Размер) + 1);

ПредставлениеЗадания = СтрШаблон("Заполнение рабочих групп документов, обновление прав (РГ-Д)");

ПорцияЗадания = Новый Массив;
Для Каждого СоставПараметров Из Порция Цикл
ПорцияЗадания.Добавить(СоставПараметров);

Если ПорцияЗадания.Количество() = ПорцияРазмер Тогда
ПараметрыМетода = Новый Массив;
ПараметрыМетода.Добавить(Новый Структура("Порция", ПорцияЗадания));

Задания.Добавить(ФоновоеЗапустить(МетодаИмя, ПараметрыМетода, , ПредставлениеЗадания));
ПорцияЗадания = Новый Массив;
КонецЕсли;
КонецЦикла;

Если ПорцияЗадания.Количество() Тогда
ПараметрыМетода = Новый Массив;
ПараметрыМетода.Добавить(Новый Структура("Порция", ПорцияЗадания));
Задания.Добавить(ФоновоеЗапустить(МетодаИмя, ПараметрыМетода, , ПредставлениеЗадания));
КонецЕсли;

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

Метод получения справочных объектов


// Формирует массив справочных объектов для порционной обработки прав доступа.
// Выбирает записи, по которым отсутствует отметка об успешной обработке или если объект не записан в регистр
//
// Возвращает: Массив ссылок на объекты справочников.
//
Функция СправочныеОбъектыПолучить() Экспорт

Запрос = Новый Запрос("ВЫБРАТЬ
| Т.Ссылка КАК Ссылка
|ИЗ
| (ВЫБРАТЬ ПЕРВЫЕ 1000
| Организации.Ссылка КАК Ссылка
| ИЗ
| Справочник.Организации КАК Организации
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.me_ОбработанныеПраваДоступа КАК РГм | ПО Организации.Ссылка = РГ.Объект
|ГДЕ
| (РГ.Объект ЕСТЬ NULL
| ИЛИ НЕ РГ.Обработано)
| ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ ПЕРВЫЕ 1000
| ВидыДокументов.Ссылка
| ИЗ
| Справочник.ВидыДокументов КАК ВидыДокументов
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.me_ОбработанныеПраваДоступа КАК РГ
| ПО ВидыДокументов.Ссылка = РГ.Объект
|ГДЕ
| (РГ.Объект ЕСТЬ NULL
| ИЛИ НЕ РГ.Обработано)
|
| ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ ПЕРВЫЕ 1000
| Т.Ссылка
| ИЗ
| Справочник.ШаблоныДокументов КАК Т
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.me_ОбработанныеПраваДоступа КАК РГ
| ПО Т.Ссылка = РГ.Объект
|ГДЕ
| (РГ.Объект ЕСТЬ NULL
| ИЛИ НЕ РГ.Обработано)
|
| ОБЪЕДИНИТЬ ВСЕ |
|ВЫБРАТЬ ПЕРВЫЕ 1000 | Т.Ссылка | ИЗ | Справочник.ФизическиеЛица КАК Т | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.me_ОбработанныеПраваДоступа КАК РГ
| ПО Т.Ссылка = РГ.Объект
|ГДЕ | (РГ.Объект ЕСТЬ NULL
| ИЛИ НЕ РГ.Обработано)
|
| ОБЪЕДИНИТЬ ВСЕ
| ВЫБРАТЬ ПЕРВЫЕ 1000
| Контрагенты.Ссылка
| ИЗ
| Справочник.Контрагенты КАК Контрагенты
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.me_ОбработанныеПраваДоступа КАК РГ
| ПО Контрагенты.Ссылка = РГ.Объект
|ГДЕ
| (РГ.Объект ЕСТЬ NULL
| ИЛИ НЕ РГ.Обработано)
|) КАК Т");

КоллекцияОбъектов = Новый Массив;
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
КоллекцияОбъектов.Добавить(Выборка.Ссылка);
КонецЦикла;

Возврат КоллекцияОбъектов;

КонецФункции // СправочныеОбъектыПолучить

Метод получения документов


/// Возвращает коллекцию документов к обработке
//
// Возвращаемое значение:
// Массив
Функция ДокументыПолучить() Экспорт

УстановитьПривилегированныйРежим(Истина);

Запрос = Новый Запрос("ВЫБРАТЬ РАЗЛИЧНЫЕ
| ВидыДок.ВидДокумента КАК ВидДокумента |ПОМЕСТИТЬ ВидыДок |ИЗ | РегистрСведений.me_ШаблоныВидовДокументов КАК ВидыДок |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ ПЕРВЫЕ 1000 | Т.Ссылка КАК Ссылка |ИЗ | Справочник.ДокументыПредприятия КАК Т | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.me_ОбработанныеПраваДоступа КАК РГ | ПО Т.Ссылка = РГ.Объект |ГДЕ | (РГ.Объект ЕСТЬ NULL | ИЛИ НЕ РГ.Обработано) | И Т.ВидДокумента В | (ВЫБРАТЬ | Т.ВидДокумента | ИЗ | ВидыДок КАК Т) | |УПОРЯДОЧИТЬ ПО | Т.ДатаСоздания УБЫВ"); КоллекцияДокументов = Новый Массив; Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл КоллекцияДокументов.Добавить(Выборка.Ссылка); КонецЦикла; Возврат КоллекцияДокументов; КонецФункции // ДокументыПолучить

Метод получения бизнес-процессов



Функция БизнесПроцессыДействияЗадачПолучить() Экспорт

УстановитьПривилегированныйРежим(Истина);

КоллекцияДокументов = Новый Массив;

Запрос = Новый Запрос("ВЫБРАТЬ РАЗЛИЧНЫЕ
| ВидыДок.ВидДокумента КАК ВидДокумента
|ПОМЕСТИТЬ ВидыДок
|ИЗ
| РегистрСведений.me_ШаблоныВидовДокументов КАК ВидыДок
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Т.Ссылка КАК Ссылка,
| Т.Предмет.ВидДокумента КАК ВидДокумента
|ПОМЕСТИТЬ Процессы
|ИЗ
| (ВЫБРАТЬ ПЕРВЫЕ 1000
| Т.Ссылка,
| Т.Дата,
| П.Предмет
| ИЗ
| БизнесПроцесс.Исполнение КАК Т
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.me_ОбработанныеПраваДоступа КАК РГ
| ПО Т.Ссылка = РГ.Объект
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ БизнесПроцесс.Исполнение.Предметы КАК П
| ПО Т.Ссылка = П.Ссылка
| И (ТИПЗНАЧЕНИЯ(П.Предмет) = ТИП(Справочник.ДокументыПредприятия))
| ГДЕ
| (РГ.Объект ЕСТЬ NULL
| ИЛИ НЕ РГ.Обработано)
| И П.Предмет ЕСТЬ НЕ NULL
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ ПЕРВЫЕ 1000
| Т.Ссылка,
| Т.Дата,
| П.Предмет
| ИЗ
| БизнесПроцесс.КомплексныйПроцесс КАК Т
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.me_ОбработанныеПраваДоступа КАК РГ
| ПО Т.Ссылка = РГ.Объект
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ БизнесПроцесс.КомплексныйПроцесс.Предметы КАК П
| ПО Т.Ссылка = П.Ссылка
| И (ТИПЗНАЧЕНИЯ(П.Предмет) = ТИП(Справочник.ДокументыПредприятия))
| | ГДЕ
| (РГ.Объект ЕСТЬ NULL
| ИЛИ НЕ РГ.Обработано)
| И П.Предмет ЕСТЬ НЕ NULL
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ ПЕРВЫЕ 1000
| Т.Ссылка,
| Т.Дата,
| П.Предмет
| ИЗ
| БизнесПроцесс.Ознакомление КАК Т
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.me_ОбработанныеПраваДоступа КАК РГ
| ПО Т.Ссылка = РГ.Объект
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ БизнесПроцесс.Ознакомление.Предметы КАК П
| ПО Т.Ссылка = П.Ссылка
| И (ТИПЗНАЧЕНИЯ(П.Предмет) = ТИП(Справочник.ДокументыПредприятия))
| ГДЕ
| (РГ.Объект ЕСТЬ NULL
| ИЛИ НЕ РГ.Обработано)
| И П.Предмет ЕСТЬ НЕ NULL
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ ПЕРВЫЕ 1000
| Т.Ссылка,
| Т.Дата,
| П.Предмет
| ИЗ
| БизнесПроцесс.Подписание КАК Т
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.me_ОбработанныеПраваДоступа КАК РГ
| ПО Т.Ссылка = РГ.Объект
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ БизнесПроцесс.Подписание.Предметы КАК П
| ПО Т.Ссылка = П.Ссылка
| И (ТИПЗНАЧЕНИЯ(П.Предмет) = ТИП(Справочник.ДокументыПредприятия))
| ГДЕ
| (РГ.Объект ЕСТЬ NULL
| ИЛИ НЕ РГ.Обработано)
| И П.Предмет ЕСТЬ НЕ NULL
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ ПЕРВЫЕ 1000
| Т.Ссылка,
| Т.Дата,
| П.Предмет
| ИЗ
| БизнесПроцесс.Приглашение КАК Т
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.me_ОбработанныеПраваДоступа КАК РГ
| ПО Т.Ссылка = РГ.Объект
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ БизнесПроцесс.Приглашение.Предметы КАК П
| ПО Т.Ссылка = П.Ссылка
| И (ТИПЗНАЧЕНИЯ(П.Предмет) = ТИП(Справочник.ДокументыПредприятия))
| ГДЕ
| (РГ.Объект ЕСТЬ NULL
| ИЛИ НЕ РГ.Обработано)
| И П.Предмет ЕСТЬ НЕ NULL
|
| ОБЪЕДИНИТЬ ВСЕ |
| ВЫБРАТЬ ПЕРВЫЕ 1000
| Т.Ссылка,
| Т.Дата,
| П.Предмет
| ИЗ
| БизнесПроцесс.Рассмотрение КАК Т
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.me_ОбработанныеПраваДоступа КАК РГ
| ПО Т.Ссылка = РГ.Объект
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ БизнесПроцесс.Рассмотрение.Предметы КАК П
| ПО Т.Ссылка = П.Ссылка
| И (ТИПЗНАЧЕНИЯ(П.Предмет) = ТИП(Справочник.ДокументыПредприятия))
| ГДЕ
| (РГ.Объект ЕСТЬ NULL
| ИЛИ НЕ РГ.Обработано)
| И П.Предмет ЕСТЬ НЕ NULL
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ ПЕРВЫЕ 1000
| Т.Ссылка,
| Т.Дата,
| П.Предмет
| ИЗ
| БизнесПроцесс.Регистрация КАК Т
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.me_ОбработанныеПраваДоступа КАК РГ
| ПО Т.Ссылка = РГ.Объект
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ БизнесПроцесс.Регистрация.Предметы КАК П
| ПО Т.Ссылка = П.Ссылка
| И (ТИПЗНАЧЕНИЯ(П.Предмет) = ТИП(Справочник.ДокументыПредприятия))
| ГДЕ
| (РГ.Объект ЕСТЬ NULL
| ИЛИ НЕ РГ.Обработано)
| И П.Предмет ЕСТЬ НЕ NULL
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ ПЕРВЫЕ 1000
| Т.Ссылка,
| Т.Дата,
| П.Предмет
| ИЗ
| БизнесПроцесс.РешениеВопросовВыполненияЗадач КАК Т
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.me_ОбработанныеПраваДоступа КАК РГ
| ПО Т.Ссылка = РГ.Объект
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ БизнесПроцесс.РешениеВопросовВыполненияЗадач.Предметы КАК П
| ПО Т.Ссылка = П.Ссылка
| И (ТИПЗНАЧЕНИЯ(П.Предмет) = ТИП(Справочник.ДокументыПредприятия))
| ГДЕ
| (РГ.Объект ЕСТЬ NULL
| ИЛИ НЕ РГ.Обработано)
| И П.Предмет ЕСТЬ НЕ NULL
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ ПЕРВЫЕ 1000
| Т.Ссылка,
| Т.Дата,
| П.Предмет
| ИЗ
| БизнесПроцесс.Согласование КАК Т
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.me_ОбработанныеПраваДоступа КАК РГ
| ПО Т.Ссылка = РГ.Объект
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ БизнесПроцесс.Согласование.Предметы КАК П
| ПО Т.Ссылка = П.Ссылка
| И (ТИПЗНАЧЕНИЯ(П.Предмет) = ТИП(Справочник.ДокументыПредприятия))
|
| ГДЕ
| (РГ.Объект ЕСТЬ NULL | ИЛИ НЕ РГ.Обработано
| И П.Предмет ЕСТЬ НЕ NULL
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ ПЕРВЫЕ 1000
| Т.Ссылка,
| Т.Дата,
| П.Предмет
| ИЗ
| БизнесПроцесс.Утверждение КАК Т
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.me_ОбработанныеПраваДоступа КАК РГ
| ПО Т.Ссылка = РГ.Объект
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ БизнесПроцесс.Утверждение.Предметы КАК П
| ПО Т.Ссылка = П.Ссылка
| И (ТИПЗНАЧЕНИЯ(П.Предмет) = ТИП(Справочник.ДокументыПредприятия))
| ГДЕ
| (РГ.Объект ЕСТЬ NULL
| ИЛИ НЕ РГ.Обработано)
| И П.Предмет ЕСТЬ НЕ NULL) КАК Т
|
|
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Процессы.Ссылка КАК Ссылка
|ИЗ
| Процессы КАК Процессы
|ГДЕ
| Процессы.ВидДокумента В
| (ВЫБРАТЬ
| Т.ВидДокумента
| ИЗ
| ВидыДок КАК Т)
|УПОРЯДОЧИТЬ ПО
| Процессы.Ссылка.Дата УБЫВ");

Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
КоллекцияДокументов.Добавить(Выборка.Ссылка);
КонецЦикла;

Возврат КоллекцияДокументов;

КонецФункции
Важная деталь: в запросах можно заметить упорядочение по дате по убыванию. Дело в том, что данная обработка была запланирована в рамках технологического окна, но заранее предвидеть сколько точно времени она займет мы не могли, и было опасение, что время выполнения выйдет за пределы «окна». Идея с сортировкой заключается в приоритизация обработки, мы посчитали, что более «свежие» объекты, как правило, самые актуальные и должны быть обработаны в первую очередь. Такой подход минимизирует риски — даже если пересчет не успеет завершиться в рамках технологического окна, критически важный доступ к актуальным объектам будет уже восстановлен.

Основной метод потока обработки РГ_ЗаполнениеРабочихГрупп.Заполнить

В этой процедуре для расчета прав бизнес-процессов мы просто их перезаписываем. А вот для остальных объектов используется более щадящий прием, через запуск типового метода РассчитатьПрава из модуля ДескрипторыДоступаОбъектов. Это было сделано в угоду тому, что на тестах вызов записи объектов занимал много времени, и к тому же мы опасались, что по документам могут сработать бизнес-события. С бизнес-процессами же подобных проблем не было.



// Заполняет рабочие группы для документов 
//
// Параметры:
//	Коллекция - Массив - Коллекция
//
Процедура Заполнить(Коллекция) Экспорт
	
	ТипыКоллекция = КоллекцияТиповРабочиеГруппыПолучить();
	КоллекцияДескрипторовОбновить = Новый Соответствие;
	Для Каждого Элемент Из Коллекция Цикл 
		НачатьТранзакцию();
		Попытка
			Если ТипыКоллекция.Получить(Элемент.Метаданные().ПолноеИмя()) = Истина Тогда
				ПерезаполнитьРабочуюГруппуДокумента(Элемент, Ложь);	
			КонецЕсли;
			
			Если СтрНайти(Элемент.Метаданные().ПолноеИмя(), "БизнесПроцесс") = 0 Тогда
				Протокол = Новый Массив;
				ТаблицаДескрипторов = ДокументооборотПраваДоступа.ОпределитьДескрипторыОбъекта(Элемент,, Протокол);	
				
				Для каждого СтрокаДескриптора Из ТаблицаДескрипторов Цикл
					// Немедленный расчет прав без обновления зависимых прав.
					Справочники.ДескрипторыДоступаОбъектов.РассчитатьПрава(СтрокаДескриптора.Дескриптор, Протокол);
					КоллекцияДескрипторовОбновить.Вставить(СтрокаДескриптора.Дескриптор);
				КонецЦикла; 
			КонецЕсли;
			
			РезультатОбработкиЗафиксировать(Элемент, Истина, "");
			
			ЗафиксироватьТранзакцию();
		Исключение  
			ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
			ОтменитьТранзакцию();
			ЗаписьЖурналаРегистрации("ирз_ПерезаполнениеРабочихГрупп.Ошибка"
			, УровеньЖурналаРегистрации.Ошибка
			,
			, Элемент
			, ТекстОшибки);
			
			РезультатОбработкиЗафиксировать(Элемент, Ложь, ТекстОшибки);
		КонецПопытки;
	КонецЦикла; 
	
	Для каждого Элемент Из КоллекцияДескрипторовОбновить Цикл
		Попытка
			Справочники.ДескрипторыДоступаОбъектов.ОбновитьПрава(Элемент.Ключ);	
		Исключение
			ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
			ЗаписьЖурналаРегистрации("ирз_ОбновлениеОчередьДолгая.Ошибка"
			, УровеньЖурналаРегистрации.Ошибка
			,
			, Элемент.Ключ
			, ТекстОшибки);
		КонецПопытки;	
	КонецЦикла;
	
	
КонецПроцедуры // Заполнить

 
 

Метод перезаполнения рабочих групп для объектов


// Перезаполняет рабочую группу документа актуальным составом участников.
//
// Метод полностью очищает существующую рабочую группу объекта и формирует
// ее заново на основе нескольких источников: реквизитов документа,
// связанных бизнес-процессов и (для документов предприятия) шаблона вида документа.
//
// Источники формирования участников:
// - Реквизиты документа (автор, ответственный, подписант и т.д.)
// - Бизнес-процессы, связанные с объектом (исполнители, согласующие, контролеры)
// - Шаблон вида документа (для документов предприятия)
//
// Параметры:
// Источник - ЛюбаяСсылка - ссылка на объект (документ, справочник, бизнес-процесс),
// рабочую группу которого необходимо перезаполнить
// ЗаписатьДокумент - Булево - признак необходимости записи объекта после изменений:
// Истина — объект будет записан,
// Ложь — изменения будут только в памяти
//
Процедура ПерезаполнитьРабочуюГруппуДокумента(Источник, ЗаписатьДокумент) Экспорт

УстановитьПривилегированныйРежим(Истина);

ДанныеДокумент = Новый Структура("ВидДокумента");
ЗаполнитьЗначенияСвойств(ДанныеДокумент, Источник);

// Почистим текущие значения
РабочиеГруппыОчистить(Источник);

Если СтрНайти(Источник.Метаданные().ПолноеИмя(),"БизнесПроцесс") Тогда
ТаблицаУчастников = БПУчастникиПоДокументуПолучить(Источник);
РаботаСРабочимиГруппами.ДобавитьУчастниковВРабочуюГруппуОбъекта(Источник, ТаблицаУчастников, ЗаписатьДокумент);
БизнесПроцессОбъект = Источник.ПолучитьОбъект();
БизнесПроцессОбъект.Записать();
Возврат;
КонецЕсли;

// Заполним
ТаблицаУчастников = РаботаСРабочимиГруппами.ПолучитьПустуюТаблицуУчастников();
РаботаСРабочимиГруппами.ДобавитьУчастниковИзИсточника(ТаблицаУчастников, Источник);
ДобавитьУчастниковБизнесПроцессовВТаблицу(ТаблицаУчастников, Источник);
Если ТипЗнч(Источник) = Тип("СправочникСсылка.ДокументыПредприятия") Тогда
ДобавитьУчастниковИзШаблонаВТаблицу(ТаблицаУчастников, Источник, ШаблонПолучить(ДанныеДокумент.ВидДокумента));
КонецЕсли;

РаботаСРабочимиГруппами.ДобавитьУчастниковВРабочуюГруппуОбъекта(Источник, ТаблицаУчастников, ЗаписатьДокумент); КонецПроцедуры

Метод получения участников бизнес-процессов


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

// Добавляет в таблицу участников всех пользователей, связанных с бизнес-процессами документа.
//
// Метод выполняет поиск всех бизнес-процессов, в которых участвует указанный документ,
// и извлекает из них участников (исполнителей, инициаторов, согласующих и др.).
// Поиск выполняется по всем видам бизнес-процессов, присутствующим в метаданных.
//
// Параметры:
//   ТаблицаУчастников - ТаблицаЗначений - таблица с колонками для хранения участников
//                       (структура таблицы соответствует формату РаботаСРабочимиГруппами)
//   ДокументСсылка    - ЛюбаяСсылка     - ссылка на документ, для которого выполняется
//                       поиск связанных бизнес-процессов (может быть документом,
//                       справочником или проектом)
//
Процедура ДобавитьУчастниковБизнесПроцессовВТаблицу(ТаблицаУчастников, ДокументСсылка)
	
	ШаблонЗапросаБизнесПроцессы =
		"ВЫБРАТЬ РАЗЛИЧНЫЕ
		|	БизнесПроцессПредметы.Ссылка КАК Ссылка
		|ИЗ
		|	БизнесПроцесс.[ВидБизнесПроцесса].Предметы КАК БизнесПроцессПредметы
		|ГДЕ
		|	БизнесПроцессПредметы.Предмет = &Предмет";
	
	Если ТипЗнч(ДокументСсылка) = Тип("СправочникСсылка.Проекты") Тогда
		ШаблонЗапросаБизнесПроцессы =
		"ВЫБРАТЬ РАЗЛИЧНЫЕ
		|	БизнесПроцесс.Ссылка КАК Ссылка
		|ИЗ
		|	БизнесПроцесс.[ВидБизнесПроцесса] КАК БизнесПроцесс
		|		ЛЕВОЕ СОЕДИНЕНИЕ БизнесПроцесс.[ВидБизнесПроцесса].Предметы КАК БизнесПроцессПредметы
		|		ПО БизнесПроцесс.Ссылка = БизнесПроцессПредметы.Ссылка
		|ГДЕ
		|	(БизнесПроцесс.Проект = &Предмет
		|			ИЛИ БизнесПроцессПредметы.Предмет = &Предмет
		|			ИЛИ БизнесПроцессПредметы.Предмет В
		|				(ВЫБРАТЬ
		|					ПроектныеЗадачи.Ссылка
		|				ИЗ
		|					Справочник.ПроектныеЗадачи КАК ПроектныеЗадачи
		|				ГДЕ
		|					ПроектныеЗадачи.Владелец = &Предмет))"
	КонецЕсли;
	
	Для каждого МетаданныеБизнесПроцесс Из Метаданные.БизнесПроцессы Цикл
		ТекстЗапросаБизнесПроцессы = СтрЗаменить(ШаблонЗапросаБизнесПроцессы, "[ВидБизнесПроцесса]", МетаданныеБизнесПроцесс.Имя);
		Запрос = Новый Запрос(ТекстЗапросаБизнесПроцессы);
		Запрос.Параметры.Вставить("Предмет", ДокументСсылка);
		Выборка = Запрос.Выполнить().Выбрать();
		Пока Выборка.Следующий() Цикл
			РаботаСРабочимиГруппами.ДобавитьУчастниковИзИсточника(ТаблицаУчастников, Выборка.Ссылка);
		КонецЦикла;
	КонецЦикла;
	
КонецПроцедуры

  

Восстановление доступа разработанным решением

От описания механизма перейдем к тому, как он применяется на практике. На примере документа «Счет на оплату 15» покажем результат восстановления участников объектов, а также продемонстрируем, как работают новые настройки, заданные через шаблоны документов.

Шаг 1. Настройка соответствия видов и шаблонов документов

Перед запуском процесса, заполним служебный регистр сведений «Шаблоны видов документов (РГ)»:

Регистр для настройки видов документов к обработке

Регистр для настройки видов документов к обработке

В этом регистре мы явно указываем соответствие: «Вид документа» — «Шаблон документа», из которого необходимо скопировать настройки доступа (в частности, нашу новую роль исполнителей). Это дает нам гибкость: мы можем точечно управлять тем, для каких документов будет выполняться донастройка без изменения кода.

Шаг 2. Запуск механизма

Активируем регламентное задание «Заполнение рабочих групп, обновление прав (РГ)» с периодичностью запуска, например, раз в 10 секунд:

Регламентное задание дополнения рабочих групп участниками и пересчета прав для объектов

Регламентное задание дополнения рабочих групп участниками и пересчета прав для объектов

После запуска механизм в соответствии с описанной ранее логикой начнет последовательно обрабатывать справочники, документы и бизнес-процессы, записывая результаты в регистр «Обработанные права доступа»:

Регистр фиксации обработанных объектов

Регистр фиксации обработанных объектов

Шаг 3. Мониторинг хода выполнения: сколько еще осталось?

После запуска обработки нужно понимать, как она движется и когда закончится. Тут мы не строили сложных графиков, а использовали простой и наглядный подход: напрямую смотрели в очередь на обработку.

Основной индикатор для нас — это количество объектов, которые еще не получили отметку об успешной обработке в регистре «Обработанные объекты прав доступа (РГ)».

Мы сформировали несколько запросов — по одному на каждый тип обрабатываемых объектов:

  • Справочники — организации, виды документов, шаблоны, физические лица, контрагенты.
  • Документы предприятия выбранных видов.
  • Бизнес-процессы, связанные с этими документами.

Текст запроса (Аналог получения данных к обработке без порций):

 

ВЫБРАТЬ
	Т.Ссылка КАК Ссылка
ПОМЕСТИТЬ ОбъектыСправочниковОбработать
ИЗ
	(ВЫБРАТЬ
		Организации.Ссылка КАК Ссылка
	ИЗ
		Справочник.Организации КАК Организации
			ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.me_ОбработанныеПраваДоступа КАК РГ
			ПО Организации.Ссылка = РГ.Объект
	ГДЕ
		(РГ.Объект ЕСТЬ NULL
				ИЛИ НЕ РГ.Обработано)
	
	ОБЪЕДИНИТЬ ВСЕ
	
	ВЫБРАТЬ
		ВидыДокументов.Ссылка
	ИЗ
		Справочник.ВидыДокументов КАК ВидыДокументов
			ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.me_ОбработанныеПраваДоступа КАК РГ
			ПО ВидыДокументов.Ссылка = РГ.Объект
	ГДЕ
		(РГ.Объект ЕСТЬ NULL
				ИЛИ НЕ РГ.Обработано)
	
	ОБЪЕДИНИТЬ ВСЕ
	
	ВЫБРАТЬ
		Т.Ссылка
	ИЗ
		Справочник.ШаблоныДокументов КАК Т
			ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.me_ОбработанныеПраваДоступа КАК РГ
			ПО Т.Ссылка = РГ.Объект
	ГДЕ
		(РГ.Объект ЕСТЬ NULL
				ИЛИ НЕ РГ.Обработано)
	
	ОБЪЕДИНИТЬ ВСЕ
	
	ВЫБРАТЬ
		Т.Ссылка
	ИЗ
		Справочник.ФизическиеЛица КАК Т
			ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.me_ОбработанныеПраваДоступа КАК РГ
			ПО Т.Ссылка = РГ.Объект
	ГДЕ
		(РГ.Объект ЕСТЬ NULL
				ИЛИ НЕ РГ.Обработано)
	
	ОБЪЕДИНИТЬ ВСЕ
	
	ВЫБРАТЬ
		Контрагенты.Ссылка
	ИЗ
		Справочник.Контрагенты КАК Контрагенты
			ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.me_ОбработанныеПраваДоступа КАК РГ
			ПО Контрагенты.Ссылка = РГ.Объект
	ГДЕ
		(РГ.Объект ЕСТЬ NULL
				ИЛИ НЕ РГ.Обработано)) КАК Т
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
	ВидыДок.ВидДокумента КАК ВидДокумента
ПОМЕСТИТЬ ВидыДок
ИЗ
	РегистрСведений.me_ШаблоныВидовДокументов КАК ВидыДок
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	Т.Ссылка КАК Ссылка
ПОМЕСТИТЬ ДокументыОбработать
ИЗ
	Справочник.ДокументыПредприятия КАК Т
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.me_ОбработанныеПраваДоступа КАК РГ
		ПО Т.Ссылка = РГ.Объект
ГДЕ
	(РГ.Объект ЕСТЬ NULL
			ИЛИ НЕ РГ.Обработано)
	И Т.ВидДокумента В
			(ВЫБРАТЬ
				Т.ВидДокумента
			ИЗ
				ВидыДок КАК Т)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	Т.Ссылка КАК Ссылка,
	Т.Предмет.ВидДокумента КАК ВидДокумента
ПОМЕСТИТЬ Процессы
ИЗ
	(ВЫБРАТЬ
		Т.Ссылка КАК Ссылка,
		Т.Дата КАК Дата,
		П.Предмет КАК Предмет
	ИЗ
		БизнесПроцесс.Исполнение КАК Т
			ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.me_ОбработанныеПраваДоступа КАК РГ
			ПО Т.Ссылка = РГ.Объект
			ВНУТРЕННЕЕ СОЕДИНЕНИЕ БизнесПроцесс.Исполнение.Предметы КАК П
			ПО Т.Ссылка = П.Ссылка
				И (ТИПЗНАЧЕНИЯ(П.Предмет) = ТИП(Справочник.ДокументыПредприятия))
	ГДЕ
		(РГ.Объект ЕСТЬ NULL
				ИЛИ НЕ РГ.Обработано)
		И П.Предмет ЕСТЬ НЕ NULL 
	
	ОБЪЕДИНИТЬ ВСЕ
	
	ВЫБРАТЬ
		Т.Ссылка,
		Т.Дата,
		П.Предмет
	ИЗ
		БизнесПроцесс.КомплексныйПроцесс КАК Т
			ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.me_ОбработанныеПраваДоступа КАК РГ
			ПО Т.Ссылка = РГ.Объект
			ВНУТРЕННЕЕ СОЕДИНЕНИЕ БизнесПроцесс.КомплексныйПроцесс.Предметы КАК П
			ПО Т.Ссылка = П.Ссылка
				И (ТИПЗНАЧЕНИЯ(П.Предмет) = ТИП(Справочник.ДокументыПредприятия))
	ГДЕ
		(РГ.Объект ЕСТЬ NULL
				ИЛИ НЕ РГ.Обработано)
		И П.Предмет ЕСТЬ НЕ NULL 
	
	ОБЪЕДИНИТЬ ВСЕ
	
	ВЫБРАТЬ
		Т.Ссылка,
		Т.Дата,
		П.Предмет
	ИЗ
		БизнесПроцесс.Ознакомление КАК Т
			ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.me_ОбработанныеПраваДоступа КАК РГ
			ПО Т.Ссылка = РГ.Объект
			ВНУТРЕННЕЕ СОЕДИНЕНИЕ БизнесПроцесс.Ознакомление.Предметы КАК П
			ПО Т.Ссылка = П.Ссылка
				И (ТИПЗНАЧЕНИЯ(П.Предмет) = ТИП(Справочник.ДокументыПредприятия))
	ГДЕ
		(РГ.Объект ЕСТЬ NULL
				ИЛИ НЕ РГ.Обработано)
		И П.Предмет ЕСТЬ НЕ NULL 
	
	ОБЪЕДИНИТЬ ВСЕ
	
	ВЫБРАТЬ
		Т.Ссылка,
		Т.Дата,
		П.Предмет
	ИЗ
		БизнесПроцесс.Подписание КАК Т
			ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.me_ОбработанныеПраваДоступа КАК РГ
			ПО Т.Ссылка = РГ.Объект
			ВНУТРЕННЕЕ СОЕДИНЕНИЕ БизнесПроцесс.Подписание.Предметы КАК П
			ПО Т.Ссылка = П.Ссылка
				И (ТИПЗНАЧЕНИЯ(П.Предмет) = ТИП(Справочник.ДокументыПредприятия))
	ГДЕ
		(РГ.Объект ЕСТЬ NULL
				ИЛИ НЕ РГ.Обработано)
		И П.Предмет ЕСТЬ НЕ NULL 
	
	ОБЪЕДИНИТЬ ВСЕ
	
	ВЫБРАТЬ
		Т.Ссылка,
		Т.Дата,
		П.Предмет
	ИЗ
		БизнесПроцесс.Приглашение КАК Т
			ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.me_ОбработанныеПраваДоступа КАК РГ
			ПО Т.Ссылка = РГ.Объект
			ВНУТРЕННЕЕ СОЕДИНЕНИЕ БизнесПроцесс.Приглашение.Предметы КАК П
			ПО Т.Ссылка = П.Ссылка
				И (ТИПЗНАЧЕНИЯ(П.Предмет) = ТИП(Справочник.ДокументыПредприятия))
	ГДЕ
		(РГ.Объект ЕСТЬ NULL
				ИЛИ НЕ РГ.Обработано)
		И П.Предмет ЕСТЬ НЕ NULL 
	
	ОБЪЕДИНИТЬ ВСЕ
	
	ВЫБРАТЬ
		Т.Ссылка,
		Т.Дата,
		П.Предмет
	ИЗ
		БизнесПроцесс.Рассмотрение КАК Т
			ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.me_ОбработанныеПраваДоступа КАК РГ
			ПО Т.Ссылка = РГ.Объект
			ВНУТРЕННЕЕ СОЕДИНЕНИЕ БизнесПроцесс.Рассмотрение.Предметы КАК П
			ПО Т.Ссылка = П.Ссылка
				И (ТИПЗНАЧЕНИЯ(П.Предмет) = ТИП(Справочник.ДокументыПредприятия))
	ГДЕ
		(РГ.Объект ЕСТЬ NULL
				ИЛИ НЕ РГ.Обработано)
		И П.Предмет ЕСТЬ НЕ NULL 
	
	ОБЪЕДИНИТЬ ВСЕ
	
	ВЫБРАТЬ
		Т.Ссылка,
		Т.Дата,
		П.Предмет
	ИЗ
		БизнесПроцесс.Регистрация КАК Т
			ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.me_ОбработанныеПраваДоступа КАК РГ
			ПО Т.Ссылка = РГ.Объект
			ВНУТРЕННЕЕ СОЕДИНЕНИЕ БизнесПроцесс.Регистрация.Предметы КАК П
			ПО Т.Ссылка = П.Ссылка
				И (ТИПЗНАЧЕНИЯ(П.Предмет) = ТИП(Справочник.ДокументыПредприятия))
	ГДЕ
		(РГ.Объект ЕСТЬ NULL
				ИЛИ НЕ РГ.Обработано)
		И П.Предмет ЕСТЬ НЕ NULL 
	
	ОБЪЕДИНИТЬ ВСЕ
	
	ВЫБРАТЬ
		Т.Ссылка,
		Т.Дата,
		П.Предмет
	ИЗ
		БизнесПроцесс.РешениеВопросовВыполненияЗадач КАК Т
			ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.me_ОбработанныеПраваДоступа КАК РГ
			ПО Т.Ссылка = РГ.Объект
			ВНУТРЕННЕЕ СОЕДИНЕНИЕ БизнесПроцесс.РешениеВопросовВыполненияЗадач.Предметы КАК П
			ПО Т.Ссылка = П.Ссылка
				И (ТИПЗНАЧЕНИЯ(П.Предмет) = ТИП(Справочник.ДокументыПредприятия))
	ГДЕ
		(РГ.Объект ЕСТЬ NULL
				ИЛИ НЕ РГ.Обработано)
		И П.Предмет ЕСТЬ НЕ NULL 
	
	ОБЪЕДИНИТЬ ВСЕ
	
	ВЫБРАТЬ
		Т.Ссылка,
		Т.Дата,
		П.Предмет
	ИЗ
		БизнесПроцесс.Согласование КАК Т
			ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.me_ОбработанныеПраваДоступа КАК РГ
			ПО Т.Ссылка = РГ.Объект
			ВНУТРЕННЕЕ СОЕДИНЕНИЕ БизнесПроцесс.Согласование.Предметы КАК П
			ПО Т.Ссылка = П.Ссылка
				И (ТИПЗНАЧЕНИЯ(П.Предмет) = ТИП(Справочник.ДокументыПредприятия))
	ГДЕ
		(РГ.Объект ЕСТЬ NULL
				ИЛИ НЕ РГ.Обработано)
		И П.Предмет ЕСТЬ НЕ NULL 
	
	ОБЪЕДИНИТЬ ВСЕ
	
	ВЫБРАТЬ
		Т.Ссылка,
		Т.Дата,
		П.Предмет
	ИЗ
		БизнесПроцесс.Утверждение КАК Т
			ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.me_ОбработанныеПраваДоступа КАК РГ
			ПО Т.Ссылка = РГ.Объект
			ВНУТРЕННЕЕ СОЕДИНЕНИЕ БизнесПроцесс.Утверждение.Предметы КАК П
			ПО Т.Ссылка = П.Ссылка
				И (ТИПЗНАЧЕНИЯ(П.Предмет) = ТИП(Справочник.ДокументыПредприятия))
	ГДЕ
		(РГ.Объект ЕСТЬ NULL
				ИЛИ НЕ РГ.Обработано)
		И П.Предмет ЕСТЬ НЕ NULL ) КАК Т
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	Процессы.Ссылка КАК Ссылка
ПОМЕСТИТЬ ПроцессыОбработать
ИЗ
	Процессы КАК Процессы
ГДЕ
	Процессы.ВидДокумента В
			(ВЫБРАТЬ
				Т.ВидДокумента
			ИЗ
				ВидыДок КАК Т)
 

При полной обработке во временных таблицах объектов очереди должны быть пустыми:

Консоль запроса для получения данных об объектах к обработке

Консоль запроса для получения данных об объектах к обработке

Что мы видим на картинке? Запрос возвращает список объектов, которые еще ждут своей очереди. Количество записей — это и есть «остаток работы».

Дополнительный контроль — очередь обновления прав. Помимо нашего регистра, мы следили и за штатной очередью обновления прав доступа. Она должна была быть пуста:

Типовая очередь обновления прав доступа

Типовая очередь обновления прав доступа

Шаг 4. Анализ результатов

Наконец, возвращаемся к нашему «подопытному» документу — «Счет на оплату 15». Открываем его карточку и переходим на вкладку «Доступ»:

Результаты заполнения (Восстановления) участников в рабочие группы

Результаты заполнения (Восстановления) участников в рабочие группы
  1. Появилась запись о роли исполнителя из шаблона. Это означает, что наша новая роль «Работа с документами Реализации ERP» успешно скопирована из шаблона документа в рабочую группу конкретного документа. Цель, поставленная на этапе 2, достигнута для существующих документов.
  2. Добавились участники бизнес-процессов. В списке теперь присутствуют исполнители, согласующие и контролеры, которые ранее были «потеряны» из-за отказа от переноса регистра «Рабочие группы для перехода». Механизм, разработанный на этапе 3, отработал штатно.

Шаг 5. Проверка прав доступа

Финальный аккорд — открываем окно прав доступа для того же документа. Выполняем команду «Еще» → «Документ» → «Права доступа»:

Результат восстановления участников по документу и пересчет прав по новым настройкам

Результат восстановления участников по документу и пересчет прав по новым настройкам

Перед нами конечный список пользователей, имеющих доступ к документу. Он включает:

  • Участников по реквизитам объекта — автор, ответственный.
  • Руководителей — согласно настройке «Добавлять руководителям доступ подчиненных».
  • Участников бизнес-процессов.
  • Представителей роли исполнителей из шаблона.

Итого считаем, что все участники, кому действительно нужен доступ к этому документу, восстановлены. «Лишних» сотрудников нет, что и соответствовало нашим целям.

Результаты реализации механизма переноса прав

Таким образом, на продуктивном контуре мы избежали переноса «лишних» данных объектов «Рабочих групп для перехода» из ДО2 и с помощью обработки пересчитали в ДО3 права доступа. Этот процесс занял примерно 36 часов, что вполне укладывалось в 2-х дневное технологическое окно. При этом во время миграции пользователи работали в привычном режиме в ДО2, а после перехода на ДО3 у них изменился только интерфейс, а доступ к необходимым объектам остался в полной мере.

Продуктивная миграция

Друзья, мы завершаем цикл статей по миграции Документооборота. К этому моменту мы разобрали четыре интересные задачи: нормализацию данных в ДО2 и завершение неактивных процессов, ускорение загрузки в ДО3 с продолжением бизнес-процессов, восстановление доступа к файлам из ERP и, наконец, решение проблемы прав доступа с её «машиной бесконечности».

Напоследок хотим поделиться деталями того, как проходила миграция в рабочем контуре.

Исходная ситуация

Перед стартом продуктивной миграции исходные данные выглядели так.

Объем данных к переносу:

  • Размер базы 74 ГБ, хранение файлов на дисках в томах.
  • 27 млн объектов — именно столько исторических данных показывал счетчик на начало миграции.
  • В среднем ~650 новых документов в день.

Релизы:

  • ДО2 2.1.32.6.
  • ДО3 3.0.10.20
  • Платформа 1С 8.3.25.1336.

Железо:

  • Сервер 1С: Intel Xeon Gold 6248R 3.00 ГГц (44 ядра), 288 ГБ ОЗУ.
  • Сервер MSSQL: Intel Xeon Gold 6248R 3.00 ГГц (44 ядра), 812 ГБ ОЗУ.

Подготовительные операции перед миграцией

Перед запуском миграции был проведен ряд работ в базе ДО2, которые мы уже описывали в первой части статьи Иконка открытия в новом окне. Подробно их описывать не будем, лишь напомним ключевые моменты:

  1. Удаление помеченных объектов.
    Было ~250 тысяч объектов.
    После обработки осталось ~2 тысячи.
  2. Завершение неактуальных активных задач.
    Инструмент: эскалация задач бизнес-процессов.
    Завершено: более 2,5 тысяч задач.
  3. Заполнение физических лиц.
    Заполнили поле «Физическое лицо» в справочнике «Пользователи».
  4. Извлечение текста из файлов.
    • Если текст нужен — извлекаем заранее.
    • Если не важен — отключаем регламентное задание и контролируем, чтобы его не включили.
      Именно с этим связан инцидент массовых лишних дельт в рабочем контуре. Подробнее — в отдельном разделе.
  5. Адаптация доработок из ДО2.
    Адаптация скриптов правил бесшовной интеграции, скрипты обработки бизнес-процессов для ДО3.

Эти работы выполнялись в рабочей базе параллельно с пробными миграциями. И к моменту старта в рабочем контуре все было готово.

Внимание Важно!
Стоит подготовить в достаточном объеме место на дисках на серверах СУБД ДО2, ДО3 и на диске, куда будут выгружаться файлы миграции.

Забегая вперед, по нашим результатам получились такие показатели:

  1. Размер базы ДО2 = вырос на 55%, с 74 до 114 ГБ.
  2. Размер базы ДО3:
    1. За время миграции разросся до 600 ГБ, то есть стал больше ДО2 в 8 раз.
    2. После сжатия осталась в районе 120 ГБ, то есть на 62% больше ДО2.
  3. Размер каталога миграции занял в итоге 97 ГБ.

Миграция

Плановое время для миграции включало в себя 2 недели, с двумя технологическими окнами в выходные по 2 дня каждое:

  • Первое окно — закладывалось под выгрузку исторических данных и старт миграции.
  • Второе окно (в конце) — на процесс завершения и полный переход на ДО3.

Календарный план миграции

Календарный план миграции

Обновление

Тут стоит упомянуть, что на второе технологическое окно также было запланировано обновление ДО3 с версии 3.0.10.20 до 3.0.14.31.

Почему сразу не взяли версию 3.0.14.31? Как мы писали в первой части, дело в том, что миграция возможна только с определенных релизов ДО2 на определенные релизы ДО3. И в нашем случае для версии ДО2 2.1.32.6 это был релиз ДО3 3.0.10.20. Обновлять ДО2 до более свежих версий — значит тратить время на тестирование всех механизмов в старой системе, которая все равно уходит из эксплуатации. Зачем?

Поэтому мы пошли путем миграции на доступный релиз ДО3, а затем обновление его до актуального. И последующее тестирование в той среде, где и будем работать.

Про эти особенности на ИТС: its.1c.ru/db/updinfo#content:2139:hdoc:issogl1_10

Первое технологическое окно выгрузки данных из ДО2

Первое технологическое окно выбрали на конец рабочей недели на 02.11.

Мы произвели соответствующие настройки в базе ДО2 согласно чек-листу, приведенному в разделе «Приступаем к миграции» Иконка открытия в новом окне в первой части статьи и стартовали выгрузку:

Миграция на новую версию

Выгрузка истории успешно завершилась и в нашем случае этот процесс длился ~6 часов.

После этого перед запуском загрузки в ДО3 мы сделали резервную копию файлов выгруженной истории для возможности анализа в случае нештатных ситуаций при загрузке в ДО3:

Момент окончания выгрузки истории

Момент окончания выгрузки истории

Старт миграции, мониторинг

Далее в рамках того же технологического окна настроили ДО3 на прием данных и уже на его стороне запустили загрузку данных выгруженных из ДО2:

Старт миграции

И затем отслеживали динамику загрузки по полосе «Загружено» и в журнале. В целом, миграция благодаря подготовительным действиям шла штатно, и всё же не обошлось без одного инцидента.

Проблема излишних дельт, анализ и решение проблемы на лету

Спустя чуть больше недели миграции мы заметили аномально большое количество загруженных дельт в ДО3. В каталоге выгрузки оставалось более 350 тысяч файлов дельт. В каталоге миграции было видно, что дельты были в основном для одного объекта «версии файлов»:

Пример выгруженных файлов изменений для Версий файлов

Пример выгруженных файлов изменений для Версий файлов

И что было примечательно — сами файлы выгружались неполными порциями, это было заметно по размерам <30кб. Обычно с полной порцией (100 объектов) файл имел размер более 500 КБ:

Пример размера файла с полной порцией для объектов Справочника Версии файлов

Пример размера файла с полной порцией для объектов Справочника Версии файлов

Анализ

Причиной оказалось регламентное задание «Извлечение текста», которое массово меняло реквизит «Статус извлечения текста» у версий файлов. Параллельно работавшая выгрузка изменений захватывала эти изменения «на лету», не дожидаясь накопления полной порции. В результате вместо одного файла с сотней записей генерировалось множество мелких.

Решение

Во-первых, мы устранили источник — отключили регламент «Извлечения текста».

Мы давали инструкцию о том как поступить с этим регламентом в первой части статьи в разделе «Обработка извлечения текста регламентным заданием» Иконка открытия в новом окне.

Дальше встал вопрос что делать с уже выгруженными дельтами. Загрузка такого большого количества файлов с минимальным набором объектов шла медленно, был риск срыва сроков миграции.

Первый вариант, который пришел в голову, просто удалить все изменения по версиям файлов из каталога миграции. Но, очевидно, это было чревато потерей реальных изменений, внесенных пользователями.

Тогда пришла идея об оптимизации «на лету». Удалять файлы безвозвратно нельзя, но можно уменьшить их количество, если найти способ заполнить файлы изменений полными порциями. Для этого всё же придётся удалить все текущие файлы с изменениями и выгрузить дельты заново.

Таким образом:

  1. Мы остановили на ДО2 регламентное задание «Миграция данных из внешних систем — выгрузка».
  2. Убедились, что все файлы истории загружены. В каталоге выгрузки оставались только файлы-указатели на папки изменений (формата «ХХХХ.0.tmp»). Удалили их:

    Пример указателей на папки изменений

    Пример указателей на папки изменений
  3. Перешли в каталог изменений «0», там хранятся файлы изменений, и удалили все подпапки с файлами:

    Папки с файлами изменений

    Папки с файлами изменений
  4. В ДО2 сдвинули константу «Переход. Граница изменений» на самое начало старта миграции. Тем самым мы «обманули» механизм миграции, чтобы он считал, что никакие дельты не были выгружены.

    Подробнее про границу — в первой части статьи, раздел «Обработка отметок времени» Иконка открытия в новом окне.

    Константа Границы изменений

    Константа Границы изменений
  5. И запустили выгрузку заново.

В результате общее количество файлов сократилось с 350 тысяч до 20 тысяч, и все изменения успешно загрузились за три дня (14–16 ноября). Но так или иначе мы захватили один день из планового технологического окна для полного перехода. Поэтому пришлось перенести его на выходные следующей недели.

Хронологию событий можно оценить по графику загрузки файлов:

График загрузки данных в ДО3

График загрузки данных в ДО3

03.11 — Запустили загрузку данных.

11.11 — Завершилась загрузка истории.

12.11 — Обнаружили аномально высокое количество файлов выгруженных дельт для объекта Справочник.Версии файлов. На графике видно снижение количества загружаемых файлов.

13.11 — Выявили источник генерации изменений — регламентное задание «Извлечение текста», выключили рег. задание.

14.11 — Приняли решение: остановить выгрузку изменений, удалить все файлы изменений, сдвинуть границу выгрузки на начало миграции и выгрузить все заново. Это дало полные порции и сократило количество файлов до 20 тысяч.

15.11 — 16.11 Загрузка всех изменений (включая ранее нагенерированные «лишние») ускорилась за счет сокращения числа файлов.

На графике виден скачок количества файлов с 14 числа, так загружались изменения в штатном режиме после решения проблемы. После 16-го дельты шли уже в штатном режиме без аномальных выбросов.

Второе технологическое окно — завершение миграции и полный переход на ДО3

Как мы указали выше из-за инцидента полный переход пришлось сдвинуть на следующую неделю.

Календарь миграции в рабочем контуре

Календарь миграции в рабочем контуре

Расскажем по порядку, что мы делали в этом технологическом окне.

Диаграмма работ финального технологического окна

Диаграмма работ финального технологического окна

1. Блокировка рабочей базы ДО2 и рег. заданий обмена в ERP

В первую очередь мы заблокировали доступ пользователей к рабочей базе ДО2, остановили регламентные задания обмена с ДО2 в ERP:

  • Обмен данными с 1С:Документооборот — типовое регламентное задание с 1С:Документооборот.
  • Отложенное создание объектов 1С:Документооборот — своя доработка у клиента по автоматического создания объектов в 1С:Документооборот.

На стороне ERP в очередях обмена будут копиться изменения для ДО, которые после завершения технологического окна поедут уже в ДО3.

2. Догрузка изменений из ДО2 — завершение миграции

После блокировки дождались полной загрузки всех изменений в ДО3 и завершили процедуру миграции. Подробности в первой части статьи Иконка открытия в новом окне.

3. Проверка мигрированных данных

Совместно с группой пользователей от заказчика произвели финальную проверку мигрированных данных. В частности, сверили количество выгруженных из ДО2 данных в регистре «Переход. Объекты выгрузки» и загруженных данных в ДО3 в регистре «Миграция данных из внешних систем журнал». А также воочию удостоверились, что загружены последние изменения в документах.

4. Обновление базы ДО3 на новый релиз, публикация сервисов интеграции

Сделана резервная копия мигрированной базы, затем обновили на релиз из хранилища (релиз 3.0.14.31), куда предварительно перенесли доработанные механизмы из ДО2. В целом в исходной базе ДО2 изменения конфигурации не касались метаданных, обычно при необходимости добавить новые поля делали это штатным механизмом дополнительных реквизитов, а они мигрировали штатно и не потребовали дополнительных действий.

Все обновление уложилось в 2 часа. Сразу после него опубликовали сервисы интеграции ДО3 с ERP.

5. Настройка обработок процессов, перезапуск активных процессов ДО3

За кадром, в процессе пробных миграции методологи заранее подготовили в тестовой базе ДО3 нужные настройки обработки бизнес-процессов, адаптировали скрипты обработок, событий и т.п. на основе ДО2. И теперь перенесли эти настройки в продуктивную ДО3. Также провели проверки маршуртизации бизнес-процессов по документам.

6. Перезапуск активных бизнес-процессов ДО3

Как мы упоминали в прошлых статьях штатный механизм миграции не предполагал продолжения бизнес-процессов. Поэтому был разработан собственный механизм. Мы писали об этом подробно во второй части статьи Иконка открытия в новом окне.

В результате было перезапущено 3 тысячи активных бизнес-процессов.

7. Настройка интеграции с ERP, восстановление отображение файлов

Параллельно с перезапуском активных процессов, произвели следующие операции:

  • Настроили бесшовную интеграцию ДО3 с ERP, применили заранее адаптированные скрипты заполнения полей, переключили обмен в ERP с ДО2 на ДО3.
  • Восстановили отображение файлов.

Подробнее об этом можно прочитать в третьей статьи цикла миграции Иконка открытия в новом окне.
Общее время заняло менее 1,5 часа.

8. Пересчет прав на стороне ДО3

Данную операцию производили после перезапуска процессов в 2 этапа:

  • Настройку прав доступа провели параллельно со всеми работами, которые начали сразу после обновления на новый релиз.
  • Запуск пересчета прав начали после операции перезапуска активных процессов.

За оставшееся время технологического окна права пересчитались на 70%, этого было достаточно для продолжения работы с текущими «Свежими» документами в рабочей базе. Полностью права пересчитались на утро следующего рабочего дня 25.11.

Но все же на подстраховке была группа сопровождения, и если у кого-нибудь из пользователей не было прав на старый документ, то была возможность сделать это вручную оперативно, не дожидаясь полного пересчета.

9. Завершение технологического окна

Далее силами заказчика у всех пользователей базы автоматически сменили путь с базы ДО2 на ДО3.

После проведенных работ технологического окна запустили ранее выключенные регламентные задания и сначала предоставили доступ ограниченной группе пользователей от заказчика, которые уже более детально в своих областях проверили интеграции и доступ к документам и файлам.

После проверки разблокировали доступ к ДО3 для всех пользователей.

Таким образом в пятницу пользователи жили ещё в 1С:Документооборот 2.1, а уже в понедельник благополучно продолжили работу в новом 1С:Документооборот 3.0.

Общие итоги

В результате продуктивной миграции достигнуто следующее.

Сроки: миграция выполнена за 3 недели. На одну неделю пришлось передвинуть завершающее окно из-за инцидента с лишними дельтами, но это не повлияло на конечный результат.

Объемы:

  • Суммарно перенесено порядка ~27,5 млн объектов.
  • Финальный размер базы ДО3 после сжатия 120 ГБ (исходный размер на пике миграции до сжатия составлял 600 ГБ).

Ключевые проблемы решены без остановки работы пользователей в ДО2:

  • Обеспечено продолжение бизнес-процессов в ДО3 после перехода.
  • Восстановлен доступ к файлам из ERP.
  • Устранена «машина бесконечности» прав доступа за счет отказа от переноса проблемного регистра и построения чистой модели прав в ДО3.

Результат для пользователей: пользователи не заметили перехода с точки зрения доступности данных. Все штатные операции — создание, согласование, подписание, просмотр файлов — остались также доступны в ДО3.

Командная работа: отдельно хотим отметить слаженную работу всех участников проекта. Высокий профессионализм сотрудников заказчика и исполнителей, оперативное принятие решений, готовность подстраиваться под меняющиеся обстоятельства — именно это позволило уложиться в сжатые сроки и решить нештатные инциденты на лету, без паники и без потери качества. Спасибо команде!

Послесловие

Уважаемые читатели, на этом цикл статей по миграции 1С:Документооборота завершен. Трудности приходят и уходят, а экспертные статьи для нас остаются «снимком на память» о решенных задачах. Надеемся, советы приведенные в статьях окажутся полезными, и история нашего пути поможет вам провести собственную миграцию без запинок.

Оставайтесь с нами!

Иллюстрации в статье подготовлены с использованием демонстрационной базы с вымышленными сведениями. Совпадения с реальными данными случайны.

Вы читаете статью из рубрики:
От экспертов «1С-Рарус»

Читайте первыми статьи от экспертов «1С‑Рарус»

Вы можете получать оповещения по электронной почте

Поле является обязательным

Или получайте уведомления в телеграм-боте

Есть вопросы по статье? Задайте их нам!

Рассылка «Новости компании»

Узнавайте первыми о новых статьях, мероприятиях и спецпредложениях.

Посмотреть все рассылки «1С‑Рарус»

Заинтересованы в сотрудничестве?
Нужна консультация?
Свяжитесь с нами!