Имя: Пароль:
1C
 
Как быстрее получить список незадействованных элементов Справочника?
0 ХолодныйМен
 
21.10.04
11:36
Как быстрее получить список незадействованных элементов Справочника, который использован в одном из измерений некоторого регистра? Сам написал код, но что-то он мне не очень нравиться. Есть идеи (или может готовые решения)?
 //Код:
 ТЗВсехИспользованныхСпр = СоздатьОбъект("ТаблицаЗначений");
 ТЗПустыхСпр = СоздатьОбъект("ТаблицаЗначений");
 ТЗПустыхСпр.НоваяКолонка("Номенклатура");
 Запрос1 = СоздатьОбъект("Запрос");
 ТекстЗапроса1 =
 "//{{ЗАПРОС(Сформировать)
 |Период с НачДата по КонДата;
 |Обрабатывать Все;
 |Спр = Регистр.НужныйРегистр.Номенклатура;
 |Группировка Спр Без Групп;
 |"
 ;
 ТекстЗапроса2 =
 "//{{ЗАПРОС(Сформировать)
 |СпрНом = Справочник.Номенклатура.ТекущийЭлемент;
 |Группировка СпрНом упорядочить по СпрНом.Код Без Групп;
 |"
 ;
 Если Запрос1.Выполнить(ТекстЗапроса1) = 0 Тогда
   Возврат;
 КонецЕсли;
 Запрос1.Выгрузить(ТЗВсехИспользованныхСпр);
 Если Запрос1.Выполнить(ТекстЗапроса2) = 0 Тогда
   Возврат;
 КонецЕсли;
 Пока Запрос1.Группировка(1) = 1 Цикл
   НайденнаяСтрока = 0;
   Если ТЗВсехИспользованныхСпр.НайтиЗначение(Запрос1.СпрНом,НайденнаяСтрока,"Спр") = 0 Тогда
     ТЗПустыхСпр.НоваяСтрока();
     ТЗПустыхСпр.Номенклатура = Запрос1.СпрНом;
   КонецЕсли;
 КонецЦикла;
 ТЗВсехИспользованныхСпр.Очистить();
1 Последний Будда
 
21.10.04
11:40
А чем найтиСссылки() не подходит?
2 big
 
21.10.04
11:42
ИМХО используй НайтиСсылки()

Инфа из ЖКК:

НайтиСсылки(<?>,);
Синтаксис:
НайтиСсылки(<Объекты>,<Ссылки>)
Назначение:
Находит ссылки на объекты, переданные в списке значений.
Параметры:
<Объекты> - конкретное значение искомого объекта или значение типа ''СписокЗначений'', в котором данной процедуре передаются объекты, по которым надо найти ссылки.
<Ссылки> - идентификатор объекта типа ''ТаблицаЗначений'', в который данная процедура помещает найденные ссылки на объекты. Таблица значений состоит из 3 колонок: 1. объект на который ссылаются; 2. объект, который содержит ссылку; 3. комментарий к ссылке.
3 ХолодныйМен
 
21.10.04
11:50
Не думаю что НайтиСсылки() - потому как необходимо найти не ссылки на объект, а все объекты на которые нет ссылок, причем нет ссылок только в определенном регистре.
4 big
 
21.10.04
12:15
Пардон - невнимательно прочитал.
Стоит ли через запрос делать обход справочника, чтобы его опять весь проити? При обычном переборе не сравнивал время работы?
5 Evgeniya
 
21.10.04
12:23
Есть "Универсальная обработка: Пометка на удаление неиспользуемых объектов"
OBJDEL.ert, может она тебе подойдет
6 ХолодныйМен
 
21.10.04
15:31
(5)Спасибо за предложение по использованию OBJDEL.ert, но как оказалось в ней опять же применен метод "НайтиСсылки()", что не лучшим образом сказывается на скорости поиска пустых объектов.
Протестил.
Параметры тестирования: 1С SQl 21, база DBF, справочник примерно из 5000 объектов, тестовая машина: АтлонМобайл1800+/512Mb.
Универсальная обработка от 23 до 26 секунд на поиск.
Моя обработка от 3 до 4 секунд.
Думаю не стоит говорить что варианты с "НайтиСсылки()" можно уже не предлагать.

(4)
Да действительно писал-писал и дописался... ведь действительно можно отказаться от второго запроса, а просто обойти справочник обычным способом. Пойду попробую...
7 ХолодныйМен
 
21.10.04
15:37
(5)Боюсь показался вам, через чур груб, поэтому еще раз скажу спасибо, - вы напоминили мне что есть на дисках итс всякие интересноти, про которые я уже стал забывать, спасибо.
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн