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

RSS подписка

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

Статьи - Компьютерное

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

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

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

 

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

 

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

 

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

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

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

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

 

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

 

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

 

 

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

 

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

 

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

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

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

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

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

  КонецЕсли;

 КонецЕсли; 

 

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

 

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

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

 

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

 

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

 

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

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

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

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

  Попытка

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

  Исключение

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

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

 

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

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

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

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

  КонецЕсли;

 

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

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

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

 

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

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

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

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

 

  КонецЕсли;

 

 КонецЦикла;

 

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

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

 

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

 

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

 

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

 

 

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

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

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

 

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

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

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

 

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

 

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

 

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

 

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

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

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

   КонецЕсли;

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

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

   КонецЕсли;

 

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

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

 

    Попытка

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

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

 

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

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

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

 

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

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

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

      КонецЕсли;

     КонецЦикла;

    Исключение

 

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

 

   КонецЕсли; 

 

  КонецЦикла;

 КонецЦикла;

 

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

 

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

 

 

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

 



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

Поделиться этой страницей



Внимание!


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

 

База Xintrea (стр. 1)

База Rarrugas (стр. 1)

База Balas

База YellowRaven

База Yurons

База Lesnik757

База Shandor

База Sirrichar

База Anatolean (стр. 1)

База Аrmagedec

База SorokinRed

База Deadelf79

База Adgaver (стр. 1)

База Pipitos1983

База Soxsten (стр. 1)

База Silenn (стр. 1)

База Shlyapnikova - херомантия и ригидность

База Svoynickname (стр. 1)

База Larson227 (стр. 1)

База Velonski (стр. 1)

База BrokeRU (стр. 1)

База Mcold (стр. 1)

База Alensav (стр. 1)

База Consp11 (стр. 1)

База Kozlov-AE (стр. 1)

База Wwwlir (стр. 1)

База Duwaz (стр. 1)

 

Требуют доработки:

 

База Tairesh

База Ivnglkv

База Kolyag87

База Andyk101

База Garik456456

База Harpokrat

База SalexIzyh

База RuDennn (Bunny-Hop)

База Manakaden

База Vitvrn

База Fanrok

База Grimar

База_Juryak

База Nicolasomsk

База Azatserikbaev

База Shut913

 

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

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