Перенос данных между различными конфигурациями или редакциями — это всегда ответственный процесс, требующий глубокого понимания внутренних механизмов работы целевой базы. Типичным примером сложной миграции является переход с конфигурации «1С:Документооборот» редакции 1.3 на редакцию 2.1 с использованием правил конвертации данных (XML).
В процессе такой выгрузки технические специалисты часто сталкиваются со странным поведением системы: выгрузка из базы-источника проходит успешно, файл XML формируется без ошибок, а при импорте в базу-приемник все сопутствующие справочники успешно загружаются. Более того, Журнал регистрации фиксирует успешную запись целевых документов (например, справочника ИсходящиеДокументы), и их даже можно открыть по прямой ссылке из журнала. Однако в самом списке документов в интерфейсе пользователя абсолютно пусто. Но стоит открыть карточку документа вручную, нажать кнопку «Записать и закрыть», как документ мгновенно появляется в списке.
В этой статье мы подробно разберем причины такого поведения платформы и конфигурации, выясним, как устроена система разграничения прав доступа в «1С:Документообороте», и рассмотрим три эффективных способа решения этой проблемы без ручного пересохранения сотен или тысяч документов.
Главная причина, по которой загруженные объекты остаются «невидимками» в списках программы — это специфическая архитектура системы разграничения прав доступа (RLS) и механизм дескрипторов доступа в «1С:Документообороте» версий 2.0 и 2.1.
В большинстве типовых решений фирмы 1С права доступа рассчитываются динамически («на лету») в момент обращения пользователя к базе данных (при выполнении запросов к таблицам). В «1С:Документообороте» из-за огромного объема данных и сложных матриц прав такой подход приводил бы к критическому снижению производительности. Поэтому разработчики применили механизм предварительного расчета прав:
ДескрипторыДоступаДляОбъектов, ПраваПользователейПоДескрипторамДоступа и другие.При импорте данных через специализированные обработки (например, «Универсальный обмен данными XML») платформа 1С принудительно устанавливает свойство загружаемых объектов ОбменДанными.Загрузка = Истина. Это стандартное поведение, предназначенное для быстрой и бесконфликтной загрузки исторических данных.
Когда этот флаг установлен:
Именно из-за отключения подписок на события при загрузке документов из XML-файла расчет дескрипторов прав доступа не происходит. Объекты физически записываются в таблицы базы данных, но записи в служебных регистрах прав остаются пустыми. Как только мы открываем документ интерактивно и пересохраняем его, запись происходит с параметром ОбменДанными.Загрузка = Ложь. Все подписки срабатывают, права рассчитываются, и документ появляется в интерфейсе.
---
Существует три основных метода решения данной проблемы. Выбор конкретного подхода зависит от объема загружаемых данных и архитектуры вашей информационной системы. В качестве альтернативного варианта для автоматического исправления ошибок в служебных регистрах можно использовать готовую обработку для устранения проблем с правами доступа.
В составе конфигурации «1С:Документооборот» уже есть готовый административный инструмент, позволяющий пересчитать права для объектов, которые были загружены из внешних источников.
Выполним следующие шаги для исправления ситуации:
Исходящие документы (или любой другой переносимый объект, который не отображается в списках).После завершения этого процесса все загруженные документы станут видны пользователям в соответствии с настроенными политиками доступа.
В крупных базах данных полный перерасчет прав «здесь и сейчас» может вызвать длительные блокировки таблиц и парализовать работу пользователей. Для предотвращения этого в конфигурации предусмотрен механизм отложенного расчета прав в фоновом режиме через очередь.
Проанализируем настройки этого механизма в нашей системе:
Обновление прав доступа (оперативное) — обрабатывает текущую оперативную очередь изменений.Обновление прав доступа (долгое) — выполняет пакетную обработку крупных массивов данных.Если документов при переносе было загружено слишком много, а выполнять полное обновление прав для всего справочника нецелесообразно (это может занять часы), мы можем точечно зарегистрировать в очереди на обновление только те объекты, которые были импортированы. Это позволит минимизировать нагрузку на сервер.
Для реализации этого метода напишем небольшую внешнюю обработку или запустим код в групповой обработке объектов. Рассмотрим пример кода на языке 1С:
// Создаем запрос для выборки только что загруженных документов
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ИсходящиеДокументы.Ссылка КАК Ссылка
|ИЗ
| Справочник.ИсходящиеДокументы КАК ИсходящиеДокументы
|ГДЕ
| ИсходящиеДокументы.Дата МЕЖДУ &НачалоПериода И &КонецПериода
| И ИсходящиеДокументы.ПометкаУдаления = ЛОЖЬ";
// Задаем период, за который производилась загрузка документов
Запрос.УстановитьПараметр("НачалоПериода", '20190101000000'); // Январь 2019 года
Запрос.УстановитьПараметр("КонецПериода", '20190131235959');
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
КоличествоЗаписей = Выборка.Количество();
Сообщить("Найдено документов для обработки: " + КоличествоЗаписей);
НачатьТранзакцию();
Попытка
Пока Выборка.Следующий() Цикл
// Используем встроенный программный интерфейс 1С:Документооборота
// для добавления конкретной ссылки в очередь обновления прав
ПраваДоступа.ЗарегистрироватьИзменениеОбъекта(Выборка.Ссылка);
КонецЦикла;
ЗафиксироватьТранзакцию();
Сообщить("Все документы успешно зарегистрированы в очереди обновления прав!");
Исключение
ОтменитьТранзакцию();
Сообщить("Произошла ошибка при регистрации объектов: " + ОписаниеОшибки());
КонецПопытки;
Важное примечание: Этот программный код работает чрезвычайно быстро, так как он не производит ресурсоемких математических расчетов прав непосредственно в цикле, а лишь записывает ссылки в регистр сведений ОчередьОбновленияПравДоступа. Сами же права будут рассчитаны штатными регламентными заданиями в фоновом режиме, не мешая активной работе пользователей в базе данных.
Мы выяснили, что невидимость документов после XML-переноса в «1С:Документооборот 2.1» — это не ошибка выгрузки и не дефект конфигурации, а следствие работы оптимизированной системы RLS и флага ОбменДанными.Загрузка. Понимая эти механизмы, вы легко сможете восстановить видимость документов с помощью штатных обработок обновления прав доступа или используя программную регистрацию измененных объектов в очереди обновления.