При разработке собственных объектов в типовых конфигурациях 1С (таких как Комплексная автоматизация 2, ERP 2.5 или Бухгалтерия предприятия 3.0) программисты часто сталкиваются с особенностью платформы: любая новая сущность автоматически получает полный набор прав в роли ПолныеПрава. Одной из самых критичных настроек является Интерактивное удаление. По стандартам разработки 1С, непосредственное удаление объектов пользователем (минуя пометку на удаление) крайне нежелательно, так как это нарушает ссылочную целостность базы данных.
Рассмотрим подробнее, почему так происходит, и разберем несколько эффективных способов решения задачи, которые позволят нам сохранить типовую конфигурацию на поддержке и избежать сложностей при последующих обновлениях.
Проанализируем механику работы платформы 1С:Предприятие 8.3. У каждой роли есть свойство Устанавливать права для новых объектов (Set rights for new objects). В типовой роли ПолныеПрава эта галка всегда включена. Это сделано для того, чтобы при добавлении новых объектов поставщиком (фирмой 1С) администратор системы сразу получал к ним доступ без ручной настройки.
Однако, когда мы добавляем свой документ в основную конфигурацию, платформа применяет то же правило: она дает роли ПолныеПрава все полномочия на этот документ, включая Интерактивное удаление. Если мы просто снимем эту галку в основной конфигурации, нам придется снять роль с поддержки, что неминуемо приведет к конфликтам при обновлении системы. Выясним, как обойти это ограничение.
Начиная с современных версий платформы 8.3, механизм расширений позволяет гибко управлять правами доступа. Это самый «чистый» и архитектурно верный способ. Разберем его по шагам:
ПолныеПрава в расширение. Важно понимать, что в расширении роли работают по принципу аддитивности, но для конкретных прав на конкретные объекты мы можем задать уточняющие настройки.ПолныеПрава, найдем наш документ и снимем галочку Интерактивное удаление.В этом случае при обновлении основной конфигурации роль ПолныеПрава будет обновляться стандартно, а ваше расширение будет «накладывать» запрет именно для вашего документа поверх типовых настроек. Это позволяет не трогать типовые объекты и сохранять конфигурацию на полной поддержке.
Если по каким-то причинам использование расширений для прав кажется избыточным или вы хотите реализовать более сложную логику проверки, можно прибегнуть к программному методу. Мы создадим ПодпискаНаСобытие, которая будет перехватывать попытку удаления объекта на уровне сервера.
Проанализируем ситуацию: нам нужно запретить только интерактивное удаление, но при этом оставить возможность программного удаления (например, для обменов данными или регламентных обработок). Посмотрим на пример кода, который нужно разместить в общем модуле:
Процедура ЗапретитьИнтерактивноеУдалениеПередУдалением(Источник, Отказ) Экспорт
// Если включен режим загрузки данных (например, при обмене), удаление разрешено
Если Источник.ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
// Блокируем удаление
ТекстСообщения = "Интерактивное удаление документа '" + Источник + "' запрещено. Используйте пометку на удаление.";
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения);
Отказ = Истина;
КонецПроцедуры
Для реализации этого метода:
ОбщийМодуль (например, СерверныеСобытия) с установленными флажками Сервер и Внешнее соединение.ПодпискаНаСобытие.Источник выберем наш документ (или ДокументОбъект, если хотим применить ко всем).Событие выберем ПередУдалением.Обработчик укажем созданную нами процедуру.Важный нюанс: использование Отказ = Истина полностью блокирует удаление объекта. Даже если администратор попытается выполнить «Удаление помеченных объектов», этот код сработает. Чтобы разрешить удаление через стандартную обработку «Удаление помеченных объектов», потребуется дополнительная проверка контекста выполнения (например, анализ текущих ролей или параметров сеанса), но базово этот код надежно защищает данные от случайного нажатия Shift+Del.
Этот метод мы назовем «защитой от дурака» или, как выразились на форуме, «ширмой». Он не запрещает удаление на уровне базы данных, но убирает саму техническую возможность вызвать команду из формы. Рассмотрим, как это сделать:
Удалить (которая обычно скрыта под кнопкой «Еще») снимем флажок видимости.Однако помните, что продвинутый пользователь все равно может попытаться вызвать стандартные команды платформы через горячие клавиши или внешние обработки. Поэтому данный метод рекомендуется использовать только как дополнение к Способу 1 или Способу 2.
Если вы все же решили изменить роль ПолныеПрава непосредственно в основной конфигурации, нужно сделать это так, чтобы не создать себе проблем в будущем. Проанализируем процесс обновления:
При обновлении конфигурации через Поддержка — Обновить конфигурацию, на этапе сопоставления объектов вы можете настроить правила объединения. Для роли ПолныеПрава установите режим Объединить с приоритетом основной конфигурации. Таким образом, ваши снятые галочки Интерактивное удаление сохранятся, а новые объекты от 1С будут добавляться в роль автоматически. Но будьте осторожны: этот метод требует повышенного внимания при каждом обновлении релиза.
Мы рассмотрели различные подходы к ограничению прав. Подведем итоги нашего анализа:
Выбор конкретного метода зависит от принятых в вашей компании стандартов разработки, но сочетание расширения прав и подписки на событие дает максимальную уверенность в сохранности данных вашего документа.