Собираем
информацию
по крупицам

Платформа 1C:Предприятие

1С 8.2: Как сделать удаление объектов от пользователя в пределах его прав
14-12-2012
14:27:52

В системе 1С удаление помеченных на удаление объектов традиционно разрешается делать только привелигерованным пользователям. Часто удаление объектов доступно только Администратору, у которого есть доступ ко всем объектам конфигурации. Проблема в том, что системная функция НайтиПомеченныеНаУдаление() пытается перебрать ВСЕ объекты конфигурации. Если какой-то объект недоступен пользователю, из-под которого запущена функция, функция завершится с ошибкой. И никакого списка помеченных на удаление объектов получено не будет.

 

В этой статье я покажу функции, с помощью которых можно проводить удаление от обычного пользователя. У пользователей, обычно, строго ограничен доступ к некоторым объектам конфигурации. Поэтому удаление будет происходить в пределах прав доступа. Например, не будут удалены объекты подсистем, к которым пользователь не имеет доступа.

 

Следует помнить, что если нам нужно сделать удаление с контролем целостности базы данных, необходимо предварительно перевести систему в монопольный режим. Перевод в монопольный режим доступен обычному пользователю. Главное, чтобы в момент перехода в монопольный режим пользователь был один в системе.

 

Ниже приведен код двух функций:

  • УдалениеПомеченныхОбъектов()

  • НайтиПомеченныеНаУдалениеВПределахПрав()

Функция УдалениеПомеченныхОбъектов() сначала пытается перевести систему в монопольлный режим. Если ей это удается, она вызывает функцию НайтиПомеченныеНаУдалениеВПределахПрав() для получения списка объектов, подлежащих удалению. Далее происходит перебор списка удаляемых объектов, т.е. удаление объектов происходит по одному. При удалении выполняются различные проверки на возможность удаления объекта. Ведется подробный лог.

 

Функция НайтиПомеченныеНаУдалениеВПределахПрав() является аналогом системной функции  НайтиПомеченныеНаУдаление(). Она выдает список объектов, подлежащих удалению в пределах прав доступа пользователя. Поиск происходит только в объекта типа Справочник и Документ. Если необходимо удалять и другие объекты, их нужно добавить в код функции по аналогии.

 

Функции размещаются в модуле управляемого приложения. Он, как известно, выполняется на сервере. 

 

 

Функция УдалениеПомеченныхОбъектов() Экспорт

 

 ПервичноеСостояниеМонопольногоРежима=МонопольныйРежим();

 

 Если ПервичноеСостояниеМонопольногоРежима=Ложь Тогда

  Сообщить("Для удаления помеченных на удаление объектов необходимо

            | установить монопольный режим информационной базы."+Символы.ПС);

  Если ПереключитьсяВМонопольныйРежим()=Ложь Тогда

   Возврат Ложь;

  КонецЕсли;

 КонецЕсли; 

 

 Помеченные = НайтиПомеченныеНаУдалениеВПределахПрав(); 

 

 // Перебираются объекты, помеченные на удаление

 Для каждого ТекущийПомеченныйОбъект из Помеченные Цикл 

 

  Сообщить("Удаляется объект ["+ТекущийПомеченныйОбъект+"]");

 

  Найденные=0;

 

  // Удаляется объект

  УдаляемыеОбъекты=Новый Массив; // Массив будет состоять из одного элемента

  УдаляемыеОбъекты.Добавить(ТекущийПомеченныйОбъект);

  ОбъектУдален=Истина;

  Попытка

   УдалитьОбъекты(УдаляемыеОбъекты, Истина, Найденные); 

  Исключение

   ОбъектУдален=Ложь;

  КонецПопытки;

 

  // Если при удалении возникла ошибка, значит пользователь 

  // может только читать данный объект

  Если Не ОбъектУдален Тогда

   Сообщить("Удаление объекта ["+ТекущийПомеченныйОбъект+"] невозможно. Права доступа не позволяют удалить данный объект.");

  КонецЕсли;

 

  // Если объект оказался неудаляемым

  Если Найденные<>0 И

       Найденные.Количество()>0 Тогда

 

   НеудаляемыйОбъект=Найденные[0][0];

   ИспользуетсяВОбъекте=Найденные[0][1];

   МетаданныеИспользуетсяВОбъекте=Найденные[0][2];

   Сообщить("Внимание! Объект не удален: [" + СокрЛП(НеудаляемыйОбъект)+"]"+Символы.ПС+"т. к. используется в ["+ИспользуетсяВОбъекте+"]");

 

  КонецЕсли;

 

 КонецЦикла;

 

 // Состояние монопольного режима выставляется таким же, каким было до запуска функции

 УстановитьМонопольныйРежим( ПервичноеСостояниеМонопольногоРежима );

 

 Сообщить("Удаление закончено.");

 

 Возврат Истина;

 

КонецФункции

 

 

// Поиск объектов, помеченных на удаление, в пределах прав доступа текущего пользователя

Функция НайтиПомеченныеНаУдалениеВПределахПрав()

 ПомеченныеОбъекты = Новый Массив;

 

 МассивКлассовМетаданных = Новый Массив;

 МассивКлассовМетаданных.Добавить("Справочники");

 МассивКлассовМетаданных.Добавить("Документы");

 

 Для каждого КлассМетаданных Из МассивКлассовМетаданных Цикл 

 

  Для Каждого ОбъектМетаданных Из Метаданные[КлассМетаданных] Цикл

 

   // Сообщить(ОбъектМетаданных.Имя);

 

   ТипОбъекта="";

   Если КлассМетаданных="Справочники" тогда 

    ТипОбъекта="Справочник" 

   КонецЕсли;

   Если КлассМетаданных="Документы" тогда 

    ТипОбъекта="Документ" 

   КонецЕсли;

 

   ТекущийОбъектМетаданных=Метаданные.НайтиПоПолномуИмени(ТипОбъекта+"."+ОбъектМетаданных.Имя);

   Если ПравоДоступа("Чтение", ТекущийОбъектМетаданных)=Истина Тогда

 

    Попытка

     Запрос = Новый Запрос("ВЫБРАТЬ Ссылка

                            |ИЗ "+ТипОбъекта+"."+ОбъектМетаданных.Имя);

 

     Результат = Запрос.Выполнить().Выбрать();

     Пока Результат.Следующий() Цикл 

      Ссылка = Результат.Ссылка; 

 

      Если Ссылка.ПометкаУдаления=Истина Тогда

       ПомеченныеОбъекты.Добавить(Ссылка);

       // Сообщить("Обнаружен объект: "+Ссылка);

      КонецЕсли;

     КонецЦикла;

    Исключение

 

    КонецПопытки;

 

   КонецЕсли; 

 

  КонецЦикла;

 КонецЦикла;

 

 Возврат ПомеченныеОбъекты;

 

КонецФункции

 

 

Я такие функции искал очень долго, ведь вопрос весьма актуален. Но, почему-то, нигде в сети не обнаружил подобного. Поэтому пришлось написать самому. Пользуйтесь на здоровье.

 


К списку "Компьютерное"

Интересное на сайте


Интерфейс и юзабилити » Оформление кода: Почему я выбрал для себя отступ в 2 пробела?

В мире программирования существует достаточно холиварная тема: "Каким должен быть отступ в коде"?   Оставим за бортом споры по теме "Форматироват...


Flash-анимация » Клип клуба "Сакура"

Оборудование: Pentium-200MMX, RAM 32Мб Среда: Flash MX Год: 2002   Этот клип я создавал, преследуя две цели.   Первая цель - разобраться с ...


Игры под Windows » Shareholder (Акционер)

Игра, написанная вместе с Сергеем Шпаковым. Разработка застыла на этапе глубокой беты. Шпаков сделал интерфейс и хотсид, я писал искуственный интеллек...

RSS подписка

Подпишитесь на новости сайта по RSS


Цена на демонтаж дома "СК "СтройДемонтаж"".

Внимание!

На этом сайте разрабатывается программа MyTetra и её родственные проекты.

Доступны к просмотру следующие базы знаний:

База Xintrea (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18)

База Rarrugas (1, 2)

База Balas

База YellowRaven

База Yurons

База Lesnik757

База Shandor

База Sirrichar

 

Подробности на странице MyTetra Share.

 WebHamster.Ru
 Домик любопытного хомячка
Яндекс индекс цитирования
Почтовый ящик