Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
24 ноя 2024, 17:16

Регистр сведений Объекты доступа документов (удаление записей)

Автор Iwan, 18 июн 2014, 15:37

0 Пользователей и 1 гость просматривают эту тему.

Iwan

Добрый день, столкнулся с проблемой удаления записей из регистра сведений.
получается долгий алгоритм.
сейчас так:


выборка = РегистрыСведений.ОбъектыДоступаДокументов.Выбрать();
Состояние("Идет очистка регистра Объектов прав доступа");
пока  выборка.Следующий() цикл
попытка
если выборка.ДокументСсылка.Организация = Организация тогда
выборка.ПолучитьМенеджерЗаписи().Удалить();
КонецЕсли;
Исключение
    // видать нет реквизита
КонецПопытки;
КонецЦикла;


нужно проверять у документа организацию, если условие истина то нужно удалить запись регистра.
Возможно ли оптимизировать?

upd:
регистр имеет 2 измерения: ДокументСсылка и ОбъектДоступа
в данном случае ОбъектДоступа - сотрудник.
Резим записи: Независимый

Iwan

Переписал так:
предпологаю что должно быть быстрее:
Сообщить("начало Набор_тест" + ТекущаяДата());
Набор_тест = РегистрыСведений.ОбъектыДоступаДокументов.СоздатьНаборЗаписей();
Набор_тест.Прочитать();
йй = Набор_тест.Количество()-1;

пока йй >= 0 цикл
если Набор_тест[йй].ДокументСсылка.Организация = Организация тогда
Набор_тест.Удалить(Набор_тест[йй]);
КонецЕсли;
состояние(йй);
йй = йй-1;

КонецЦикла;
Сообщить("конец Набор_тест" + ТекущаяДата());


по возможности сравню производительность

cska-fanat-kz

Пока в теории, не проверял.

НаборЗаписей = РегистрыСведений.ОбъектыДоступаДокументов.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Организация.Установить(Организация);
НаборЗаписей.Прочитать();

Для каждого Запись Из НаборЗаписей Цикл
    НаборЗаписей.Удалить(Запись);
КонецЦикла;
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

Iwan

Цитата: cska-fanat-kz от 18 июн 2014, 15:56
Пока в теории, не проверял.

НаборЗаписей = РегистрыСведений.ОбъектыДоступаДокументов.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Организация.Установить(Организация);
НаборЗаписей.Прочитать();

Для каждого Запись Из НаборЗаписей Цикл
    НаборЗаписей.Удалить(Запись);
КонецЦикла;

Из синтаксис помощника:
Цитировать<Отбор> (необязательный)

Тип: Структура.
Задает поле и значение отбора открываемой выборки. Ключ структуры описывает имя поля, а значение структуры - значение отбора по этому полю. В качестве полей для отбора могут задаваться измерения или реквизиты, для которых в конфигураторе признак индексирования установлен в значение "Индексировать" или установлен признак "Ведущее".
если бы было поле организация то вопроса не задавал бы. :-)
Добавлено: 18 июн 2014, 16:26


Придумал Еще быстрее:
// вариант 3
Набор_тест = РегистрыСведений.ОбъектыДоступаДокументов.СоздатьНаборЗаписей();
Набор_тест.Прочитать();
ТЗ = Набор_тест.Выгрузить();

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТЗ.ДокументСсылка КАК ДокументСсылка,
| ТЗ.ОбъектДоступа
|ПОМЕСТИТЬ ВТ_ТЗ
|ИЗ
| &ТЗ КАК ТЗ
|
|ИНДЕКСИРОВАТЬ ПО
| ДокументСсылка
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТ_ТЗ.ДокументСсылка,
| ВТ_ТЗ.ОбъектДоступа,
| ВТ_ТЗ.ДокументСсылка.Организация КАК Организация
|ИЗ
| ВТ_ТЗ КАК ВТ_ТЗ
| Где
|  ВТ_ТЗ.ДокументСсылка.Организация <> &Организация ";
Запрос.УстановитьПараметр("Организация", Организация);
Запрос.УстановитьПараметр("ТЗ", ТЗ);
Сообщить("До "+ Набор_тест.Количество());
Набор_тест.Загрузить(Запрос.Выполнить().Выгрузить());
Сообщить("После "+ Набор_тест.Количество());
ТЗ = Неопределено;
Набор_тест.Записать(Истина);


данный вариант может отвалиться с нехваткой памяти, но в моеё случае отработало. скорость меня устраивает ~3-5мин

надеюсь кому нибудь это пригодится!:zebzdr:

cska-fanat-kz

А почему в запросе сразу не использовать таблицу регистра сведений?
Зачем создавать набор, выгружать и подкидывать в запрос как параметр?
Думается что лишнее движение, исключив которое выиграете еще немного времени.
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

Iwan

Цитата: cska-fanat-kz от 19 июн 2014, 06:06
А почему в запросе сразу не использовать таблицу регистра сведений?
Зачем создавать набор, выгружать и подкидывать в запрос как параметр?
Думается что лишнее движение, исключив которое выиграете еще немного времени.
Видимо вчера уже "глаз замылился", действительно еще проще сразу из регистра выбирать.

Добавлено: 19 июн 2014, 07:57


UPD запроса:

"ВЫБРАТЬ
| ОбъектыДоступаДокументов.ДокументСсылка,
| ОбъектыДоступаДокументов.ОбъектДоступа,
| ОбъектыДоступаДокументов.ДокументСсылка.Организация КАК Организация
|ИЗ
| РегистрСведений.ОбъектыДоступаДокументов КАК ОбъектыДоступаДокументов
|ГДЕ
| ОбъектыДоступаДокументов.ДокументСсылка.Организация <> &Организация";


эти строки становятся не актуальны:

Набор_тест.Прочитать();
ТЗ = Набор_тест.Выгрузить();

DmitriyF

Цитата: Iwan от 19 июн 2014, 07:50
Цитата: cska-fanat-kz от 19 июн 2014, 06:06
А почему в запросе сразу не использовать таблицу регистра сведений?
Зачем создавать набор, выгружать и подкидывать в запрос как параметр?
Думается что лишнее движение, исключив которое выиграете еще немного времени.
Видимо вчера уже "глаз замылился", действительно еще проще сразу из регистра выбирать.

Добавлено: 19 июн 2014, 07:57


UPD запроса:

"ВЫБРАТЬ
| ОбъектыДоступаДокументов.ДокументСсылка,
| ОбъектыДоступаДокументов.ОбъектДоступа,
| ОбъектыДоступаДокументов.ДокументСсылка.Организация КАК Организация
|ИЗ
| РегистрСведений.ОбъектыДоступаДокументов КАК ОбъектыДоступаДокументов
|ГДЕ
| ОбъектыДоступаДокументов.ДокументСсылка.Организация <> &Организация";


эти строки становятся не актуальны:

Набор_тест.Прочитать();
ТЗ = Набор_тест.Выгрузить();

Для более рационального использования ресурсов наверно надо сделать так
"ВЫБРАТЬ
|   ОбъектыДоступаДокументов.ДокументСсылка,
|   ОбъектыДоступаДокументов.ОбъектДоступа,
//|   ОбъектыДоступаДокументов.ДокументСсылка.Организация КАК Организация
|ИЗ
|   РегистрСведений.ОбъектыДоступаДокументов КАК ОбъектыДоступаДокументов
|ГДЕ
|   ОбъектыДоступаДокументов.ДокументСсылка.Организация <> &Организация";

LexaK

еще более рациональнее
попробуйте, должно сработать.
слева внизу в углу формы будут отображаться проценты выполнения обработки
обработку можно будет в любой момент прервать по <Ctrl/Break>



"ВЫБРАТЬ
|   ОбъектыДоступаДокументов.ДокументСсылка
//|   ОбъектыДоступаДокументов.ОбъектДоступа,
//|   ОбъектыДоступаДокументов.ДокументСсылка.Организация КАК Организация
|ИЗ
|   РегистрСведений.ОбъектыДоступаДокументов КАК ОбъектыДоступаДокументов
|ГДЕ
|   ОбъектыДоступаДокументов.ДокументСсылка.Организация <> &Организация";

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

лкКоличество = лкРезультат.Количество();

Если лкКоличество  = 0 Тогда
    Сообщить("Нет данны для удаления.");
    Возврат;
КонецЕсли;

лкНаборЗаписей = РегистрыСведений.ОбъектыДоступаДокументов.СоздатьНаборЗаписей();

лкПоз = 0;
Пока лкРезультат.Следующий() Цикл
    лкПоз  = лкПоз  + 1;
    ОбработкаПрерыванияПользователя();
    Состояние("Выполнено " + Окр(лкПоз / лкКоличество * 100, 2) + "%");

    лкНаборЗаписей.Отбор.ДокументСсылка.Установить(лкРезультат.ДокументСсылка);
    Попытка
        лкНаборЗаписей.Записать();
    Исключение
        лкСообщение = ОписаниеОшибки();
        Сообщить(лкСообщение);
        Прервать;
    КонецПопытки;

КонецЦикла;
если помогло нажмите: Спасибо!

Iwan

Цитата: LexaK от 19 июн 2014, 11:53
еще более рациональнее
попробуйте, должно сработать.
слева внизу в углу формы будут отображаться проценты выполнения обработки
обработку можно будет в любой момент прервать по <Ctrl/Break>



"ВЫБРАТЬ
|   ОбъектыДоступаДокументов.ДокументСсылка
//|   ОбъектыДоступаДокументов.ОбъектДоступа,
//|   ОбъектыДоступаДокументов.ДокументСсылка.Организация КАК Организация
|ИЗ
|   РегистрСведений.ОбъектыДоступаДокументов КАК ОбъектыДоступаДокументов
|ГДЕ
|   ОбъектыДоступаДокументов.ДокументСсылка.Организация <> &Организация";

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

лкКоличество = лкРезультат.Количество();

Если лкКоличество  = 0 Тогда
    Сообщить("Нет данны для удаления.");
    Возврат;
КонецЕсли;

лкНаборЗаписей = РегистрыСведений.ОбъектыДоступаДокументов.СоздатьНаборЗаписей();

лкПоз = 0;
Пока лкРезультат.Следующий() Цикл
    лкПоз  = лкПоз  + 1;
    ОбработкаПрерыванияПользователя();
    Состояние("Выполнено " + Окр(лкПоз / лкКоличество * 100, 2) + "%");

    лкНаборЗаписей.Отбор.ДокументСсылка.Установить(лкРезультат.ДокументСсылка);
    Попытка
        лкНаборЗаписей.Записать();
    Исключение
        лкСообщение = ОписаниеОшибки();
        Сообщить(лкСообщение);
        Прервать;
    КонецПопытки;

КонецЦикла;

если я верно понял вашу мысль: записывается пустой набор для установленного документа - в таком случае в запросе условие отбора по организации смениться <> на = .
Спасибо за вариант!

LexaK

ну да, все зависит от условия с которым вы хотите выполнитоь чистку
если оставить в регистре ТОЛЬКО ОДНУ Организацию то "<>"
если удалить данные только по одной Организации то "="
если помогло нажмите: Спасибо!

Похожие темы (5)

Рейтинг@Mail.ru

Поиск