Почему документы не видны в списке после загрузки в 1С:Документооборот 2.1 из XML и как это исправить

Программист 1С v8.3 (Управляемые формы) 1С:Документооборот IT и автоматизация бизнеса
← На главную

Перенос данных между различными конфигурациями или редакциями — это всегда ответственный процесс, требующий глубокого понимания внутренних механизмов работы целевой базы. Типичным примером сложной миграции является переход с конфигурации «1С:Документооборот» редакции 1.3 на редакцию 2.1 с использованием правил конвертации данных (XML).

В процессе такой выгрузки технические специалисты часто сталкиваются со странным поведением системы: выгрузка из базы-источника проходит успешно, файл XML формируется без ошибок, а при импорте в базу-приемник все сопутствующие справочники успешно загружаются. Более того, Журнал регистрации фиксирует успешную запись целевых документов (например, справочника ИсходящиеДокументы), и их даже можно открыть по прямой ссылке из журнала. Однако в самом списке документов в интерфейсе пользователя абсолютно пусто. Но стоит открыть карточку документа вручную, нажать кнопку «Записать и закрыть», как документ мгновенно появляется в списке.

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

В чем кроется причина проблемы? Разбираем механизмы RLS

Главная причина, по которой загруженные объекты остаются «невидимками» в списках программы — это специфическая архитектура системы разграничения прав доступа (RLS) и механизм дескрипторов доступа в «1С:Документообороте» версий 2.0 и 2.1.

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

  1. При интерактивной записи любого документа система анализирует его ключевые реквизиты (организацию, вид документа, гриф доступа, рабочую группу, проект и т.д.).
  2. На основании этих данных программа вычисляет так называемый дескриптор доступа — специальный служебный объект, который хранит настройки прав для конкретной комбинации реквизитов.
  3. Связи между документами, дескрипторами и правами пользователей записываются в специализированные регистры сведений, такие как ДескрипторыДоступаДляОбъектов, ПраваПользователейПоДескрипторамДоступа и другие.
  4. Динамические списки документов в интерфейсе программы выводятся пользователям со строгим отбором по этим служебным регистрам. Если записей по конкретному документу в этих таблицах нет, то система считает, что у пользователя нет прав на этот документ, и он просто не отображается в списке, даже если текущий пользователь обладает полными правами (Администратор).

Влияние XML-загрузки и флага ОбменДанными.Загрузка

При импорте данных через специализированные обработки (например, «Универсальный обмен данными XML») платформа 1С принудительно устанавливает свойство загружаемых объектов ОбменДанными.Загрузка = Истина. Это стандартное поведение, предназначенное для быстрой и бесконфликтной загрузки исторических данных.

Когда этот флаг установлен:

Именно из-за отключения подписок на события при загрузке документов из XML-файла расчет дескрипторов прав доступа не происходит. Объекты физически записываются в таблицы базы данных, но записи в служебных регистрах прав остаются пустыми. Как только мы открываем документ интерактивно и пересохраняем его, запись происходит с параметром ОбменДанными.Загрузка = Ложь. Все подписки срабатывают, права рассчитываются, и документ появляется в интерфейсе.

---

Как решить проблему невидимости документов?

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

Способ 1. Использование стандартной обработки обновления прав

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

Выполним следующие шаги для исправления ситуации:

  1. Авторизуемся в программе под пользователем с правами Администратора.
  2. Перейдем в раздел меню Настройка и администрирование, далее выберем пункт Поддержка и обслуживание.
  3. Найдем подраздел Управление расчетом прав (в некоторых релизах данный функционал вынесен в раздел «Управление доступом»).
  4. Перейдем по ссылке Обновление прав доступа.
  5. В открывшейся форме выберем справочник Исходящие документы (или любой другой переносимый объект, который не отображается в списках).
  6. Запустим процедуру обновления прав. Система последовательно пересчитает дескрипторы для всех элементов справочника и заполнит необходимые регистры сведений.

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

Способ 2. Настройка очереди отложенного обновления прав

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

Проанализируем настройки этого механизма в нашей системе:

  1. Перейдем в раздел Настройки программы -> Права доступа.
  2. Убедимся, что установлена галочка Отложенное обновление прав доступа.
  3. Откроем консоль регламентных заданий и проверим активность следующих заданий:
    • Обновление прав доступа (оперативное) — обрабатывает текущую оперативную очередь изменений.
    • Обновление прав доступа (долгое) — выполняет пакетную обработку крупных массивов данных.
  4. Если данные задания были выключены или зависли, запустим их выполнение принудительно. Система начнет постепенно пересчитывать права для загруженных объектов в фоновом режиме.

Способ 3. Программная регистрация объектов в очереди обновлений (рекомендуемый для разработчиков)

Если документов при переносе было загружено слишком много, а выполнять полное обновление прав для всего справочника нецелесообразно (это может занять часы), мы можем точечно зарегистрировать в очереди на обновление только те объекты, которые были импортированы. Это позволит минимизировать нагрузку на сервер.

Для реализации этого метода напишем небольшую внешнюю обработку или запустим код в групповой обработке объектов. Рассмотрим пример кода на языке 1С:


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

// Задаем период, за который производилась загрузка документов
Запрос.УстановитьПараметр("НачалоПериода", '20190101000000'); // Январь 2019 года
Запрос.УстановитьПараметр("КонецПериода", '20190131235959');

РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();

КоличествоЗаписей = Выборка.Количество();
Сообщить("Найдено документов для обработки: " + КоличествоЗаписей);

НачатьТранзакцию();
Попытка
    Пока Выборка.Следующий() Цикл
        // Используем встроенный программный интерфейс 1С:Документооборота
        // для добавления конкретной ссылки в очередь обновления прав
        ПраваДоступа.ЗарегистрироватьИзменениеОбъекта(Выборка.Ссылка);
    КонецЦикла;
    ЗафиксироватьТранзакцию();
    Сообщить("Все документы успешно зарегистрированы в очереди обновления прав!");
Исключение
    ОтменитьТранзакцию();
    Сообщить("Произошла ошибка при регистрации объектов: " + ОписаниеОшибки());
КонецПопытки;

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

Заключение

Мы выяснили, что невидимость документов после XML-переноса в «1С:Документооборот 2.1» — это не ошибка выгрузки и не дефект конфигурации, а следствие работы оптимизированной системы RLS и флага ОбменДанными.Загрузка. Понимая эти механизмы, вы легко сможете восстановить видимость документов с помощью штатных обработок обновления прав доступа или используя программную регистрацию измененных объектов в очереди обновления.

← На главную