Имя: Пароль:
1C
1С v8
Отбор по периоду в периодическом регистре сведений
,
0 Numen
 
24.06.13
16:41
Есть периодический (в пределах секунды) регистр сведений.
Задача удалить все записи за период.
Например с 12.01.2005 12:45:00 по 14.01.2005 15:30:14

В интернете в FAQ нашел совсем уж дикий способ.

Вопрос Как в периодическом независимом регистре сведений «КурсыВалют» удалить все записи по валютам с наименованиями «EUR» и «USD», период которых меньше 01 января 2005 года
Ответ

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
|                  *
|ИЗ
|                  РегистрСведений.КурсыВалют КАК КурсыВалют
|ГДЕ
|                  (КурсыВалют.Период >= ДАТАВРЕМЯ(2005, 1, 1)
|                  ИЛИ
|                  НЕ(КурсыВалют.Валюта.Наименование ПОДОБНО ""USD"")
|                  И
|                  НЕ(КурсыВалют.Валюта.Наименование ПОДОБНО ""EUR""))";
ТаблицаОставляемыхЗаписей = Запрос.Выполнить().Выгрузить();

НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей();
НаборЗаписей.Загрузить(ТаблицаОставляемыхЗаписей);
НаборЗаписей.Записать();

А если в регистре больше миллиона записей? А если несколько миллионов?
Неужель для удаления 5-10 записей придется перезаписывать эти миллионы?
В отборах нет периода как я понял...
1 Maxus43
 
24.06.13
16:43
ну перезаписывай эти 5-10 записей, а не мильёны.
2 Maxus43
 
24.06.13
16:43
з.ы. запрос конечно жесть, и не потому что перезаписывает весь набор даже... ПОДОБНО там - это пять
3 Deon
 
24.06.13
16:45
(2) Скорее всего, это для курсов типа "USD+3%"
4 Allexe
 
24.06.13
16:45
(0) Вместо поднобно задай равенство параметру и в параметрах задай ссылки на валюты
5 Allexe
 
24.06.13
16:47
(0) И почему в отборах нет периода?
6 Deon
 
24.06.13
16:47
5-10 записей можно удалить руками, а не запросом )
7 Numen
 
24.06.13
16:48
Это пример страннокода с сайта. У меня совсем другой вопрос.
8 Numen
 
24.06.13
16:48
так как удалить то эти 5-10 записей попадающих в период?
9 Maxus43
 
24.06.13
16:50
(8) отбор поставить, на период + измерения. По одной записи удаляй. Набором сразу не получится так
10 de_aztec
 
24.06.13
16:50
Даже могу сказать из какой книжки этот код - 1С: Предприятие 8.1 "Простые примеры разработки" А.П.Габец, Д.И. Гончаров страница 119.
11 Deon
 
24.06.13
16:51
(8) выбери различные периоды из РС, попадающие в твой интервал и потом перебором суй их в отбор и записывай пустые наборы записей.
12 Maxus43
 
24.06.13
16:52
(10) не верю чтобы габец/гончаров так быдлокодили... если конечно там задача не стояла именно с ПОДОБНО
13 Maxus43
 
24.06.13
16:53
(12) + кстати там нет % в ПОДОБНО. Значит реально хреновый код
14 Deon
 
24.06.13
16:53
(13) Вроде в 8.1 можно было и без %
15 Maxus43
 
24.06.13
16:55
(14) да и в 8.2 можно без %, просто тогда это не (3), а реально только 2 элемента справочника
16 Numen
 
24.06.13
16:56
НаборЗаписей = РегистрыСведений.МойРегистр.СоздатьНаборЗаписей();
   НаборЗаписей.Отбор.Период.Установить();
   НаборЗаписей.Отбор.Период.ЗначениеС = НачалоДня(ДатаОтбора);
   НаборЗаписей.Отбор.Период.ЗначениеПо = КонецДня(ДатаОтбора);
   НаборЗаписей.Записать();

Вот такая конструкция не ругается но ничего не выбирается и не удаляется.
17 de_aztec
 
24.06.13
16:58
(12) Я назвала страницу потому что только что специально достала эту книжку и проверила. Проверяйте, если не верите.
18 Maxus43
 
24.06.13
17:01
НаборЗаписей.Отбор.Период = НужныйПериод;
НаборЗаписей.Отбор.Измерение = Измерение;
19 Maxus43
 
24.06.13
17:01
(17) верю верю, авторы книги упали в моих глазах
20 Numen
 
24.06.13
17:02
а переменную НужныйПериод как заполнить?)
21 mikecool
 
24.06.13
17:03
(2) вот такие примеры в инете еще и денег стоят оО
22 Maxus43
 
24.06.13
17:04
(20) используй запрос (0), только без ПОДОБНО... короче выбери запросом поля Период с валютами, которые Хочешь удалить, а не которые надо оставить
23 Numen
 
24.06.13
17:07
(22)
зря походу пример пример с валютами)
Вот так сказать мой код по мотивам)))

   // Делаем отбор из регистра по фильтру
   Запрос = Новый Запрос;
   Запрос.Текст = "ВЫБРАТЬ
                  |    МойРегистр.Период,
                  |    МойРегистр.КлючСессии,
                  |    МойРегистр.Код
                  |ИЗ
                  |    РегистрСведений.МойРегистр КАК МойРегистр
                  |ГДЕ
                  |    МойРегистр.Период НЕ МЕЖДУ &Начало И &Конец";
               
   Запрос.УстановитьПараметр("Начало", НачалоДня(ДатаОтбора));            
   Запрос.УстановитьПараметр("Конец", КонецДня(ДатаОтбора));
   Результат = Запрос.Выполнить();
   
   // Загружаем и удаляем записи
   НаборЗаписей = РегистрыСведений.МойРегистр.СоздатьНаборЗаписей();
   НаборЗаписей.Загрузить(Результат.Выгрузить());    
   НаборЗаписей.Записать();
24 Maxus43
 
24.06.13
17:11
Результат = Запрос.Выполнить();

Пока Результат.Следующий() Цикл
   НаборЗаписей = РегистрыСведений.МойРегистр.СоздатьНаборЗаписей();
   ЗаполнитьЗначенияСвойств(НаборЗаписей.Отбор, Результат);
КонецЦикла;

короче на тестовой проверь, может где чуток ошибся
25 Maxus43
 
24.06.13
17:11
+  НаборЗаписей.Записать();
конечно, тоже в цикле
26 Numen
 
25.06.13
09:15
Опять получается записывать тонну данных в регистр... и если регистр будет большой и загруженный то получим полный затык по производительности (
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн