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