При администрировании и разработке в крупных корпоративных системах на базе «1С:Предприятие 8» часто возникает необходимость массового удаления документов. При попытке выполнить непосредственное удаление программным путем разработчики нередко сталкиваются с ошибками блокировки со стороны бизнес-логики конфигурации. Особенно часто это происходит при попытке удалить документы прошлых периодов. Типичный пример — ошибка вида «У пользователя отсутствует дополнительное право на удаление документов закрытого периода!», которая возникает даже в том случае, если у учетной записи администратора в конфигураторе назначена роль «Полные права».
В этой статье мы подробно разберем, почему возникает эта ошибка в конфигурациях со встроенным модулем «БИТ.ФИНАНС», как настроить права для ее обхода, а также рассмотрим универсальные и безопасные программные способы быстрого удаления документов в обход любых проверок бизнес-логики.
Многие начинающие специалисты ошибочно полагают, что роль «Полные права», назначенная в конфигураторе, отключает любые ограничения на запись и удаление данных. Однако это не так. Полные права дают максимальный уровень доступа на уровне платформы СУБД — то есть платформа разрешает выполнять операции над таблицами. Но прикладной код конфигурации, написанный разработчиками, выполняется в любом случае.
Во многих тиражных решениях (особенно в подсистемах казначейства, бюджетирования и управленческого учета, таких как «БИТ.ФИНАНС») реализована собственная независимая подсистема разграничения прав и контроля периодов. Она работает поверх ролевой модели платформы:
Удалить() или Записать() управление передается в модули объектов и подписки на события (например, ПередЗаписью, ПередУдалением).Отказ = Истина или функции ВызватьИсключение, в результате чего транзакция удаления прерывается, даже если у пользователя есть полные права в конфигураторе.Если вам необходимо решить проблему штатными средствами системы БИТ.ФИНАНС, не прибегая к изменению программного кода, нужно предоставить пользователю специализированное право. Настройки ограничений в данной конфигурации хранятся в специальном регистре сведений.
Разберем по шагам, как выдать необходимое разрешение:
бит_НастройкиДополнительныхПравПользователей (его можно найти через меню «Все функции» / «Функции для технического специалиста» или через соответствующий интерфейс настроек БИТ.ФИНАНС).После выполнения этих действий встроенный программный код БИТ.ФИНАНС перестанет блокировать операцию, и вы сможете беспрепятственно удалять документы за любой период.
Если перед вами стоит задача быстро очистить базу данных или удалить огромное количество документов программным скриптом, настраивать права для каждого пользователя может быть нецелесообразно. В платформе «1С:Предприятие» предусмотрен стандартный механизм обхода любых прикладных проверок (включая подписки на события, проверки дат запрета редактирования и контроли прав).
Этот механизм базируется на использовании свойства ОбменДанными.Загрузка. Рассмотрим пример кода, который выполняет быстрое и безусловное удаление конкретного документа:
ВыборкаДокументов = Документы.РеализацияТоваровУслуг.Выбрать();
Пока ВыборкаДокументов.Следующий() Цикл
// Получаем объект документа для редактирования
ДокОбъект = ВыборкаДокументов.ПолучитьОбъект();
// Включаем режим загрузки данных
ДокОбъект.ОбменДанными.Загрузка = Истина;
Попытка
// Непосредственное удаление из базы данных
ДокОбъект.Удалить();
Исключение
ЗаписьЖурналаРегистрации("УдалениеДокументов",
УровеньЖурналаРегистрации.Ошибка,,,
"Не удалось удалить документ: " + ДокОбъект.Ссылка + ". Ошибка: " + ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
Выясним причину, почему этот способ работает. Согласно стандартам разработки фирмы «1С», в начале каждого обработчика событий (таких как ПередЗаписью, ПриЗаписи, ПередУдалением) в модуле объекта и в модулях подписок на события должна быть размещена следующая проверка:
Если ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
Установка свойства ОбменДанными.Загрузка = Истина сообщает платформе и конфигурации, что данные переносятся в рамках обмена (например, при синхронизации распределенной базы данных) и их нужно записать или удалить «как есть», без выполнения каких-либо бизнес-проверок. В результате весь тяжелый и ограничивающий код проверок БИТ.ФИНАНС или типовой конфигурации просто игнорируется.
Обратите внимание на важное различие между физическим удалением и установкой пометки на удаление в режиме загрузки данных:
Удалить() полностью стирает запись из таблицы базы данных. В режиме ОбменДанными.Загрузка = Истина это происходит мгновенно. При этом платформа автоматически очищает движения удаляемого документа по всем регистрам, где данный документ выступает регистратором.УстановитьПометкуУдаления(Истина) совместно с установкой свойства ОбменДанными.Загрузка = Истина, платформа вызовет ошибку: «Действие не может выполняться в режиме загрузки данных».Если вам нужно не физически удалить документ, а именно пометить его на удаление в обход всех проверок, используйте прямую запись реквизита объекта следующим образом:
ДокОбъект = СсылкаНаДокумент.ПолучитьОбъект();
// Напрямую меняем значение реквизита ПометкаУдаления
ДокОбъект.ПометкаУдаления = Истина;
// Включаем обход проверок
ДокОбъект.ОбменДанными.Загрузка = Истина;
// Записываем объект в режиме обычной записи
ДокОбъект.Записать(РежимЗаписиДокумента.Запись);
Этот код успешно установит пометку на удаление, проигнорировав любые проверки дат запрета редактирования и ограничения закрытого периода.
Если вы не хотите писать собственный программный код, можно воспользоваться проверенным и надежным административным инструментом — встроенной обработкой «Универсальный обмен данными в формате XML».
Рассмотрим, как использовать ее для нашей задачи:
Эта обработка производит непосредственное удаление объектов встроенным методом платформы с автоматическим включением режима загрузки данных. Это гарантирует, что никакие прикладные ограничения конфигурации БИТ.ФИНАНС не помешают процессу очистки.
В процессе обсуждений на форумах часто предлагают «радикальные» методы очистки, такие как выполнение SQL-запросов DELETE FROM или TRUNCATE TABLE напрямую в базе данных SQL Server или PostgreSQL.
Проанализируем риски этого подхода:
<Объект не найден>.Использование программного удаления средствами встроенного языка 1С с флагом ОбменДанными.Загрузка = Истина работает значительно быстрее и безопаснее, так как сама платформа на уровне ядра корректно обрабатывает очистку движений документа в связанных регистрах и сохраняет логическую структуру базы данных.