При работе с валютными операциями в 1С:Бухгалтерия 3.0 пользователи часто сталкиваются с необходимостью выгрузки данных в формате SWIFT (например, сообщения форматов MT102 или MT103). Одной из наиболее специфических проблем является ошибка прав доступа: «Право Удаление не применимо для регистр.сведений АдресныйКлассификатор». Данная ситуация особенно характерна для серверных баз и определенных релизов конфигурации (например, 3.0.25 и смежных), когда система пытается выполнить очистку или обновление адресных сведений в процессе валидации платежного поручения.
В этой статье мы подробно разберем, почему возникает эта ошибка, как она связана с архитектурой 1С и какими способами можно восстановить работоспособность выгрузки.
Разберем ситуацию: при нажатии кнопки «Сформировать файл» программа инициирует сложный алгоритм проверки данных контрагента и банка. SWIFT-стандарты требуют строгого соответствия адресов международным правилам. В процессе этой проверки код конфигурации может обращаться к объекту РегистрСведений.АдресныйКлассификатор.
Проанализируем основные причины сбоя:
Очистить() для набора записей регистра или метод Удалить() для конкретной записи. В некоторых версиях платформы и типовых конфигураций права на удаление в системных классификаторах жестко ограничены на уровне метаданных даже для роли ПолныеПрава.Как показывает практика, наиболее эффективным и быстрым способом решения проблемы является использование внешней или дополнительной обработки формирования SWIFT-файла вместо встроенного механизма. Рассмотрим, почему это помогает.
В коде типовых внешних обработок для формата MT102 разработчики часто используют переход в привилегированный режим. Это позволяет коду игнорировать проверку прав доступа при работе с системными регистрами, такими как АдресныйКлассификатор.
Чтобы воспользоваться этим решением, выполним следующие шаги:
МТ102), полученную из официальных источников или обновлений банка.ПлатежноеПоручение.Проанализируем, какой фрагмент кода внутри такой обработки позволяет обойти ошибку:
// Пример использования привилегированного режима в коде выгрузки
УстановитьПривилегированныйРежим(Истина);
// Здесь выполняется код, который ранее вызывал ошибку прав
НаборЗаписей = РегистрыСведений.АдресныйКлассификатор.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.КлючСегмента.Установить(ЗначениеСегмента);
НаборЗаписей.Записать(Истина); // Очистка набора записей
УстановитьПривилегированныйРежим(Ложь;
Использование функции УстановитьПривилегированныйРежим(Истина) отключает проверку прав для текущего потока выполнения, что полностью устраняет проблему с «правом на удаление».
Если использование внешних обработок невозможно, проанализируем настройки прав пользователя. Важно понимать, что название роли ПолныеПрава не всегда означает абсолютный доступ ко всем операциям во всех объектах.
Разберем алгоритм проверки прав:
РегистрСведений.АдресныйКлассификатор.Важный момент: Прямое изменение прав в типовой конфигурации может привести к трудностям при последующем обновлении. Поэтому метод с внешней обработкой (Решение 1) является более предпочтительным.
Иногда ошибка вызывается некорректными данными в самом регистре, которые алгоритм выгрузки пытается исправить «на лету». Мы можем попробовать решить проблему превентивно.
Выясним причину через обслуживание данных:
Рассмотрим, как программно проверить наличие проблемных записей в АдресныйКлассификатор, используя консоль запросов:
ВЫБРАТЬ
АдресныйКлассификатор.ТипОбъекта,
АдресныйКлассификатор.Наименование,
АдресныйКлассификатор.Код
ИЗ
РегистрСведений.АдресныйКлассификатор КАК АдресныйКлассификатор
ГДЕ
АдресныйКлассификатор.Наименование ПОДОБНО "%Ошибка%"
Если запрос возвращает странные или пустые записи, это подтверждает необходимость пересоздания классификатора.
В сообщениях форума упоминалось, что ТИИ (Тестирование и исправление) не помогло. Это логично, так как ТИИ исправляет ссылочную целостность и структуру таблиц БД, но не логику проверки прав доступа. Тем не менее, при работе в серверном режиме (MS SQL Server или PostgreSQL), рекомендуется выполнить следующие действия:
8.3 совместима с версией конфигурации 3.0.25. В старых версиях платформы работа с правами в привилегированных модулях имела ряд ограничений.Таким образом, если вы столкнулись с ошибкой прав на удаление в адресном классификаторе при формировании SWIFT, самым надежным путем будет подключение актуальной внешней обработки выгрузки, которая корректно использует привилегированный режим исполнения кода.