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

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

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

Почему документы не видны сразу? Разбираемся в механизме дескрипторов

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

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

Решение 1: Принудительное программное обновление прав (Синхронно)

Если ваша задача требует, чтобы пользователь увидел документ сразу после того, как код завершил свою работу, мы должны использовать метод принудительного пересчета. В 1С:ДО 2.1 за это отвечает специализированный общий модуль. Рассмотрим, как это реализовать в коде.

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


// Создание документа
НовыйДокумент = Справочники.ВнутренниеДокументы.СоздатьЭлемент();
// ... заполнение реквизитов ...
НовыйДокумент.Записать();

// Принудительное обновление прав для конкретного объекта
ДокументооборотПраваДоступа.ОбновитьПраваОбъекта(НовыйДокумент.Ссылка);

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

Решение 2: Использование очереди обновления прав (Асинхронно)

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

Для этого проанализируем возможности модуля РаботаСПравамиПользователей. Вместо прямой команды на расчет мы добавим ссылку в очередь:


// Добавление объекта в очередь для регламентного задания
РаботаСПравамиПользователей.ЗапланироватьОбновлениеПравОбъекта(НовыйДокумент.Ссылка);

После выполнения этого кода документ попадет в список задач для регламентного задания «Обновление прав доступа». Чтобы пользователи увидели документы максимально быстро, мы рекомендуем настроить расписание этого задания на выполнение каждые 1–2 минуты.

Решение 3: Проверка настроек рабочей группы

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

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


НоваяСтрока = Объект.РабочаяГруппа.Добавить();
НоваяСтрока.Участник = СсылкаНаПользователя;
НоваяСтрока.Чтение = Истина;
НоваяСтрока.Изменение = Истина; // если требуется
НоваяСтрока.Иконка = 0; // системный реквизит для отображения

Если вы забудете установить НоваяСтрока.Чтение = Истина, то даже после полного пересчета прав пользователь не увидит документ, так как система будет считать, что в рабочей группе он присутствует «номинально» без фактических прав на просмотр.

Настройка системы для автоматического расчета

Проанализируем настройки самой программы, которые влияют на этот процесс. Перейдите в раздел Настройка и администрирование — Настройки программы — Права доступа. Здесь нас интересует флаг «Использовать отложенное обновление прав».

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

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

Заключение и рекомендации

Подводя итог, мы можем выделить оптимальный алгоритм действий при программном создании внутренних документов в 1С:ДО 2.1:

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

← На главную