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