Реклама на этом месте
Форум 1С
Форум 1С
Программистам. Бухгалтерам. Администраторам. Пользователям
Задай вопрос - получи решение проблемы. Без троллинга и флуда.
19 Дек 2017, 01:31
МультиВход
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?
 
collapse

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

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

Оффлайн Iwan

  • *
  • Сообщений: 26
  • РЕПУТАЦИЯ: 1
  • КПД: 4%
  • Регистрация: 2012-03-14
  • Сайт: 
  • Профессия: Программист 1С
Добрый день, столкнулся с проблемой удаления записей из регистра сведений.
получается долгий алгоритм.
сейчас так:

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

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

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


Оффлайн Iwan

  • *
  • Сообщений: 26
  • РЕПУТАЦИЯ: 1
  • КПД: 4%
  • Регистрация: 2012-03-14
  • Сайт: 
  • Профессия: Программист 1С
Переписал так:
предпологаю что должно быть быстрее:
Сообщить("начало Набор_тест" + ТекущаяДата());
Набор_тест = РегистрыСведений.ОбъектыДоступаДокументов.СоздатьНаборЗаписей();
Набор_тест.Прочитать();
йй = Набор_тест.Количество()-1;

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

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

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

Оффлайн cska-fanat-kz

  • 1С:Специалист
  • Глобальный модератор
  • *****
  • Сообщений: 5745
  • РЕПУТАЦИЯ: 1099
  • КПД: 19%
  • Красная армия всех сильней!
  • Регистрация: 2010-11-06
    • Skype: cska-fanat-kz81
  • Сайт: cska-fanat-kz.ucoz.kz
  • Профессия: Разработчик 1С
Пока в теории, не проверял.

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

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

Оффлайн Iwan

  • *
  • Сообщений: 26
  • РЕПУТАЦИЯ: 1
  • КПД: 4%
  • Регистрация: 2012-03-14
  • Сайт: 
  • Профессия: Программист 1С
Пока в теории, не проверял.

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

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

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

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

если бы было поле организация то вопроса не задавал бы. :-)
Добавлено: 18 Июн 2014, 16:26

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

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

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

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

Последний раз редактировалось: Iwan; 18 Июн 2014, 16:26. Причина: Объединение сообщений

Оффлайн cska-fanat-kz

  • 1С:Специалист
  • Глобальный модератор
  • *****
  • Сообщений: 5745
  • РЕПУТАЦИЯ: 1099
  • КПД: 19%
  • Красная армия всех сильней!
  • Регистрация: 2010-11-06
    • Skype: cska-fanat-kz81
  • Сайт: cska-fanat-kz.ucoz.kz
  • Профессия: Разработчик 1С
А почему в запросе сразу не использовать таблицу регистра сведений?
Зачем создавать набор, выгружать и подкидывать в запрос как параметр?
Думается что лишнее движение, исключив которое выиграете еще немного времени.
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

Оффлайн Iwan

  • *
  • Сообщений: 26
  • РЕПУТАЦИЯ: 1
  • КПД: 4%
  • Регистрация: 2012-03-14
  • Сайт: 
  • Профессия: Программист 1С
А почему в запросе сразу не использовать таблицу регистра сведений?
Зачем создавать набор, выгружать и подкидывать в запрос как параметр?
Думается что лишнее движение, исключив которое выиграете еще немного времени.
Видимо вчера уже "глаз замылился", действительно еще проще сразу из регистра выбирать.

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

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

эти строки становятся не актуальны:
Набор_тест.Прочитать();
ТЗ = Набор_тест.Выгрузить();

Оффлайн DmitriyF

  • *****
  • Сообщений: 730
  • РЕПУТАЦИЯ: 48
  • КПД: 7%
  • Регистрация: 2013-03-18
  • Сайт: 
  • Профессия: Разработчик 1С
А почему в запросе сразу не использовать таблицу регистра сведений?
Зачем создавать набор, выгружать и подкидывать в запрос как параметр?
Думается что лишнее движение, исключив которое выиграете еще немного времени.
Видимо вчера уже "глаз замылился", действительно еще проще сразу из регистра выбирать.

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

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

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

Оффлайн LexaK

  • *****
  • Сообщений: 1268
  • РЕПУТАЦИЯ: 347
  • КПД: 27%
  • Регистрация: 2012-05-16
  • Сайт: 
  • Профессия: Программист 1С
еще более рациональнее
попробуйте, должно сработать.
слева внизу в углу формы будут отображаться проценты выполнения обработки
обработку можно будет в любой момент прервать по <Ctrl/Break>



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

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

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

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

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

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

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

КонецЦикла;
Помогло? - Нажми СПАСИБО!!!
                       :)

Оффлайн Iwan

  • *
  • Сообщений: 26
  • РЕПУТАЦИЯ: 1
  • КПД: 4%
  • Регистрация: 2012-03-14
  • Сайт: 
  • Профессия: Программист 1С
еще более рациональнее
попробуйте, должно сработать.
слева внизу в углу формы будут отображаться проценты выполнения обработки
обработку можно будет в любой момент прервать по <Ctrl/Break>



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

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

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

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

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

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

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

КонецЦикла;

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

Оффлайн LexaK

  • *****
  • Сообщений: 1268
  • РЕПУТАЦИЯ: 347
  • КПД: 27%
  • Регистрация: 2012-05-16
  • Сайт: 
  • Профессия: Программист 1С
ну да, все зависит от условия с которым вы хотите выполнитоь чистку
если оставить в регистре ТОЛЬКО ОДНУ Организацию то "<>"
если удалить данные только по одной Организации то "="
Помогло? - Нажми СПАСИБО!!!
                       :)


 

Как создать нескольких документов "расчет при увольнении" на основании кадрового документа "увольнение" как Отпуска

Автор cozuРаздел Пользователям "1С - Предприятие 8"

Ответов: 3
Просмотров: 3212
Последний ответ 21 Мар 2015, 20:24
от дфтын
Не работает структура подчиненности документов "Требование-накладная" и "Передач

Автор sv_stas_svРаздел Конфигурирование, программирование в "1С - Предприятие 8"

Ответов: 0
Просмотров: 4107
Последний ответ 10 Мар 2011, 07:36
от sv_stas_sv
Отличие проводки по регистру сведений от проводки по регистру накопления?

Автор DirecTwiXРаздел Конфигурирование, программирование в "1С - Предприятие 8"

Ответов: 2
Просмотров: 4859
Последний ответ 18 Апр 2012, 02:19
от Dethmontt
готовая компонента сканирования/загрузки / распознавания бумажных документов (счетов, налоговых накладных, приходных накладных) из бумажного документа в 1с

Автор Св ЧРаздел Конфигурирование, программирование в "1С - Предприятие 8"

Ответов: 1
Просмотров: 185
Последний ответ 14 Ноя 2017, 10:43
от oleg-x
Реквизит "Ссылка" у справочников и документов

Автор leklerkРаздел Конфигурирование, программирование в "1С - Предприятие 8"

Ответов: 3
Просмотров: 3041
Последний ответ 29 Май 2013, 16:24
от leklerk

* Живое общение

Не устроил ответ?

Зарегистрируйся и задай свой вопрос. Живое общение приносит результат намного быстрее.


Зарегистрироваться

* Реклама

* Поиск

* Последние задачи на разработку (фриланс)

* Реклама

* Последние вакансии

* Топ 10 авторов за месяц

Геннадий ОбьГЭС Геннадий ОбьГЭС
133 Сообщений
AIFrame
73 Сообщений
alex0402
52 Сообщений
ilyay ilyay
51 Сообщений
andron81_81
44 Сообщений
oleg-x
35 Сообщений
MuI_I_Ika MuI_I_Ika
31 Сообщений
BuhRust
30 Сообщений
Golickoff Golickoff
27 Сообщений
alexandr_ll
23 Сообщений

* Кто онлайн

  • Точка Гостей: 219
  • Точка Скрытых: 0
  • Точка Пользователей: 5
  • Точка Сейчас на форуме:

* Облако тэгов

* Форум 1С с мобильного

* Инструменты

* Дополнительно

Поиск

 
SimplePortal 2.3.5 © 2008-2012, SimplePortal