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