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