периодический независимый регистр сведений оставить только последние записи

1. eda76 06.04.22 21:36 Сейчас в теме
Подскажите как можно в периодическом независимом регистре сведений оставить только последние записи
По теме из базы знаний
Найденные решения
23. eda76 05.08.22 16:14 Сейчас в теме
всем спасибо за советы, наконец то дошли руки, так как мне надо было в результате работы убрать одно измерение сделал следующее:
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	МойРегистр .Период КАК Период,
		|	МойРегистр .Измерение1 КАК Измерение1 ,
		|	МойРегистр .Измерение2 КАК Измерение2 ,
		|	МойРегистр .Измерение3 КАК Измерение3 ,
		|	МойРегистр .Измерение4 КАК Измерение4 ,
		|	МойРегистр .Ресурс1 КАК Ресурс1 ,
		|	МойРегистр .Ресурс2 КАК Ресурс2
		|ИЗ
		|	РегистрСведений.МойРегистр КАК МойРегистр 
		|
		|УПОРЯДОЧИТЬ ПО
		|	Период";
	
	
	ТЗ = Запрос.Выполнить().Выгрузить();
	

	ЗаписьXML = Новый ЗаписьXML();
	ЗаписьXML.УстановитьСтроку();
	СериализаторXDTO.ЗаписатьXML(ЗаписьXML, ТЗ);
	СтрокаXML = ЗаписьXML.Закрыть();
	Текст = Новый ЗаписьТекста;
	Текст.Открыть("D:\tmp\TZ.rrr",КодировкаТекста.ANSI);
	Текст.ЗаписатьСтроку(СтрокаXML);
	Текст.Закрыть();
Показать


затем очищаю полностью регистр, через конфигуратор удаляю Измерение2 и загружаю обратно
	Текст = Новый ЧтениеТекста;
	Текст.Открыть("D:\tmp\TZ.rrr"); 
	СтрокаXML	= Текст.Прочитать();
	Текст.Закрыть();
	ЧтениеXML=новый ЧтениеXML;
	ЧтениеXML.УстановитьСтроку(СтрокаXML);
	список=СериализаторXDTO.прочитатьXML(ЧтениеXML,ФабрикаXDTO.Тип(ЧтениеXML.URIПространстваИмен,ЧтениеXML.Имя));
	Для Каждого Стр из список Цикл
		МенеджерЗаписи = РегистрыСведений.МойРегистр .СоздатьМенеджерЗаписи();
		МенеджерЗаписи.Период		= Стр.Период;
		МенеджерЗаписи.Измерение1	= Стр.Измерение1	;
		МенеджерЗаписи.Измерение3     = Стр.Измерение3     ;
		МенеджерЗаписи.Измерение4	= Стр.Измерение4;
		МенеджерЗаписи.Ресурс1 		= Стр.Ресурс1;
		МенеджерЗаписи.Ресурс2            = Стр.Ресурс2            ;
		МенеджерЗаписи.Записать();
	КонецЦикла;
Показать

в цикле делаю, потому что надо еще сделать какие то действия с каждой записью
Остальные ответы
Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. user1203706 13 06.04.22 22:07 Сейчас в теме
Взять срезПоследних, всё остальное удалить
3. user1203706 13 06.04.22 22:09 Сейчас в теме
Достаточно написать примитивный запрос в котором соединить все записи РС со срезом последних по всем измерениям, где записи РС не в записи из среза, обойти выборку этого набора, создавая наборЗаписей РС + установка отбора всех измерений с выборки и Запись.
Усё.
4. user1203706 13 06.04.22 22:20 Сейчас в теме
На вот, занимайся

ВЫБРАТЬ
	ТвойРегистрСведений.Период КАК Период,
	ТвойРегистрСведений.Измерение1 КАК Измерение1,
      ......................
	ТвойРегистрСведений.Измерение1 КАК ИзмерениеN 
ИЗ
	РегистрСведений.ТвойРегистрСведений КАК ТвойРегистрСведений
ГДЕ
	НЕ (ТвойРегистрСведений.Период, ТвойРегистрСведений.Измерение1,................... ИзмерениеN) В
				(ВЫБРАТЬ
					РегистрСведений.ТвойРегистрСведений.СрезПоследних.Период,
					РегистрСведений.ТвойРегистрСведений.СрезПоследних.Измерение1,
                                         ..........................................
					РегистрСведений.ТвойРегистрСведений.СрезПоследних.ИзмерениеN
 
				ИЗ
					РегистрСведений.ТвойРегистрСведений.СрезПоследних)
.......................
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
         НаборЗаписей = РегистрСведений.ТвойРегистр.СоздатьНаборЗаписей();
         НаборЗаписей.Отбор.Период.Установить(Выборка.Период);
         НаборЗаписей.Отбор.Измерение1.Установить(Выборка.Измерение1);
         .................
         НаборЗаписей.Отбор.ИзмерениеN.Установить(Выборка.ИзмерениеN);
         НаборЗаписей.Записать();
КонецЦикла;
Показать
5. PhoenixAOD 62 07.04.22 04:42 Сейчас в теме
(4)можно сделать еще проще, выгрузить результат запроса, занулить РС и загрузить в пустой РС результат запроса
tetraren; nomad_irk; +2 Ответить
6. nomad_irk 72 07.04.22 07:56 Сейчас в теме
(4)мало установить отбор в НЗ, нужно сам НЗ заполнить. Создавать НЗ в цикле по каждой записи......
Садись. Кол - в дневник!
8. eda76 13.04.22 00:32 Сейчас в теме
(4)
2 дня крутил запрос, надоело, убил процес.
7. user1203706 13 07.04.22 08:47 Сейчас в теме
(5) Да. Так скорее всего будет быстрее.
Для большого РС, еще быстрее будет выгрузить select-ом в файл нужные записи + truncate table + bulk insrt потом, ибо даже тупой delete медленный

(6) ты не в теме.
9. user1203706 13 13.04.22 07:50 Сейчас в теме
(8) какое количество записей в твоём РС ?
База файловая/скуль ?
10. eda76 13.04.22 10:56 Сейчас в теме
(9)
267 491
крутил в тестовой файловой
11. user1203706 13 13.04.22 11:28 Сейчас в теме
(10) странно, это не много совсем.
Ну пробуй рецепт из (5) - выгрузи срез последних в ТЗ, затем запиши пустой набор, чтоб удалить все записи РС сразу, потом загрузи в набор ТЗ и запиши.

Если памяти хватит, конечно..
12. booksfill 13.04.22 11:54 Сейчас в теме
(11)
Если памяти хватит, конечно..

А зачем выгружать в ТЗ?

1. Очищаем регистр.

2. Запрос.Текст = "ВЫБРАТЬ * ИЗ РегистрСведений.МойРегистр.СрезПоследних ИТОГИ
ПО
Измерение1";
(ну, или есть подозрение, что не нужны записи, скажем, за 3033 год, доп-о задаем период среза).

3. Обходим выборку по срезу последних (запрос с "итого" по измерениям), создаем нужный набор и записываем. Все обернуть в транзакцию - в зависимости от кол-ва записей или в одну, или отдельно по каждому набору.

Получаем экономию памяти в 2-а раза - не надо отводить память под ТЗ.

Но 267 491 записей это при самом кривом, но в принципе работающем коде, не должно привести к катастрофе и работать часами. Правда, автор не сказал структуру полей, может быть там здоровенные BLOBы.
13. user1203706 13 13.04.22 12:04 Сейчас в теме
(12) можно и так, можно и целиком набор вгрузить.

Но быстрее всего, для серверного варианта, через булку.
15. booksfill 13.04.22 17:12 Сейчас в теме
(14)
итоги не нужны в этом запросе

Почему ?
В выборке по итогам создаем набор записей и ставим отборы по выбранным измерениям.
По второй выборке заполняем набор записей
По выходу записываем.

(13)
Но быстрее всего, для серверного варианта, через булку.

Я не понял кто такая "булка", если имеется в виду bulk операции, то это надо лезть в SQL напрямую.
Даже не говоря про лицензионные ограничения, на таком кол-ве записей нафиг не надо.
17. tetraren 26 13.04.22 20:23 Сейчас в теме
(15) (12) При таком количестве можно вообще без итогов

1. Делаем запрос СрезПоследних
2. Создаем набор без оборов вообще
3. Загружаем в набор результат запроса п.1
4. Делаем Набор.Записать(Истина)
...
5. PROFIT
14. user1203706 13 13.04.22 12:05 Сейчас в теме
(12) и да, итоги не нужны в этом запросе
16. user1203706 13 13.04.22 18:47 Сейчас в теме
(15) запрос и так свёрнутый, смысл какой в итогах вообще ?
18. booksfill 14.04.22 09:29 Сейчас в теме
(17)
Загружаем в набор результат запроса п.1

Я чего-то не понимаю, вот есть регистр с одним строковым измерением и одним строковым ресурсом.
Запрос возвращает записи с разными измерениями.

По-вашему это будет работать, или вы имели в виду что-то иное?

нз = РегистрыСведений.РегистрСведений1.СоздатьНаборЗаписей();
запись = нз.Добавить();
запись.Измерение1 = "изм1";
запись.Ресурс1 = "рес1";
запись.Измерение1 = "изм2";
запись.Ресурс1 = "рес2222";
нз.Записать(Истина);


Без итогов можно, просто так удобней создавать отборы (код пишу сразу здесь, без периодов и т.п.
чтобы просто пояснить мысль)

  Пока ВыборкаИзм.Следующий() Цикл
  НачатьТранзакцию();

   нз = РегистрыСведений.РегистрСведений1.СоздатьНаборЗаписей();

   ВыборкаДет = ВыборкаИзм.Выбрать();
   Пока ВыборкаДет.Следующий() Цикл
      запись = нз.Добавить();
      запись.Измерение1 = ВыборкаИзм.Измерение;
      запись.Ресурс1    =   ВыборкаДет.Ресурс;
   КонецЦикла

   нз.Записать();

  ЗафиксироватьТранзакцию();
КонецЦикла
Показать


P.S.
Впрочем, автор вопроса, похоже больше ответами не интересуется. :)
19. tetraren 26 14.04.22 14:22 Сейчас в теме
(18)
нз = РегистрыСведений.РегистрСведений1.СоздатьНаборЗаписей();

запись = нз.Добавить();
запись.Измерение1 = "изм1";
запись.Ресурс1 = "рес1";

запись = нз.Добавить();
запись.Измерение1 = "изм2";
запись.Ресурс1 = "рес2222";

нз.Записать(Истина);
Показать


Вот так если. Получим регистр сведений, в котором только две записи, остальные удалятся. Вспомните, как мы очищаем регистр - РегистрыСведений.РегистрСведений1.СоздатьНаборЗаписей().Записать(Истина); - вы же не сомневаетесь, что это работает. Ну вот тут то же самое.
21. eda76 14.04.22 21:42 Сейчас в теме
(18)
интересуюсь )), просто читаю и учусь, а попробовать пока нет времени
22. booksfill 15.04.22 09:27 Сейчас в теме
(21)
Ну раз интересуетесь, то попробуйте с этих 3-х маленьких примеров:

Создаете непериодический независимый регистр сведений, с одним строковым измерением - Измерение1 и одним строковым ресурсом Ресурс1.

И пробуете сделать следующее - легкий аналог выгрузки среза последнего и попытки запихать его сразу весь в один набор записей, подумайте, почему так не работает:

Пример1:
нз = РегистрыСведений.РегистрСведений1.СоздатьНаборЗаписей();
 //очистили регистр, для чистоты эксперимента
нз.Записать();

запись = нз.Добавить();
запись.Измерение1 = "изм1";
запись.Ресурс1 = "рес1";

запись = нз.Добавить();
запись.Измерение1 = "изм2";
запись.Ресурс1 = "рес2222";

нз.Записать(Истина);
Показать


Пример2:
Делаем регистр периодическим, но Измерение1 не удаляем:
 
  нз = РегистрыСведений.РегистрСведений1.СоздатьНаборЗаписей();
 //очистили регистр, для чистоты эксперимента
  нз.Записать();

  нашПериод = Дата(2022, 1, 1);
  //создаем две записи с разными измерениями
  запись = нз.Добавить();
  Запись.Период = нашПериод;
  запись.Измерение1 = "изм1";
  запись.Ресурс1 = "рес1";

  запись.Ресурс1    = "рес1";
   Запись.Период = нашПериод; //т.е. период тот же
  запись.Измерение1 = "изм2";   //а вот измерения разные
  запись.Ресурс1    = "рес2222";

  //Пробуем записать ...
  нз.Записать(Истина);
Показать


А теперь удаляем Измерение1, не из кода!, из самого регистра! и повторяем код выше - О! Работает.
Так вот, те, кто советовали "просто выгрузить и сразу загрузить" про измерения, помимо периода не подумали
(или я элементарно не понял, что люди хотели сказать, со мной такое бывает, увы).

Но проверьте сами, вполне возможно меня переклинило и я что-то не то написал. :)
20. maraty 438 14.04.22 15:51 Сейчас в теме
в (17) правильно все написали

	
Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ
|	*
|ИЗ
|	РегистрСведений.ТестовыйРегистр.СрезПоследних КАК ТестовыйРегистрСрезПоследних";
НаборЗаписей = РегистрыСведений.ТестовыйРегистр.СоздатьНаборЗаписей();
НаборЗаписей.Загрузить(Запрос.Выполнить().Выгрузить());
НаборЗаписей.Записать();  
Показать


Если очень записей много и вызывает проблему при записи, упорядочиваем по измерениям в запросе, обходим через Выборка.СледующийПоЗначениюПоля("Измерение.."), устанавливаем отборы по текущим измерениям и пишем отдельными наборами.
23. eda76 05.08.22 16:14 Сейчас в теме
всем спасибо за советы, наконец то дошли руки, так как мне надо было в результате работы убрать одно измерение сделал следующее:
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	МойРегистр .Период КАК Период,
		|	МойРегистр .Измерение1 КАК Измерение1 ,
		|	МойРегистр .Измерение2 КАК Измерение2 ,
		|	МойРегистр .Измерение3 КАК Измерение3 ,
		|	МойРегистр .Измерение4 КАК Измерение4 ,
		|	МойРегистр .Ресурс1 КАК Ресурс1 ,
		|	МойРегистр .Ресурс2 КАК Ресурс2
		|ИЗ
		|	РегистрСведений.МойРегистр КАК МойРегистр 
		|
		|УПОРЯДОЧИТЬ ПО
		|	Период";
	
	
	ТЗ = Запрос.Выполнить().Выгрузить();
	

	ЗаписьXML = Новый ЗаписьXML();
	ЗаписьXML.УстановитьСтроку();
	СериализаторXDTO.ЗаписатьXML(ЗаписьXML, ТЗ);
	СтрокаXML = ЗаписьXML.Закрыть();
	Текст = Новый ЗаписьТекста;
	Текст.Открыть("D:\tmp\TZ.rrr",КодировкаТекста.ANSI);
	Текст.ЗаписатьСтроку(СтрокаXML);
	Текст.Закрыть();
Показать


затем очищаю полностью регистр, через конфигуратор удаляю Измерение2 и загружаю обратно
	Текст = Новый ЧтениеТекста;
	Текст.Открыть("D:\tmp\TZ.rrr"); 
	СтрокаXML	= Текст.Прочитать();
	Текст.Закрыть();
	ЧтениеXML=новый ЧтениеXML;
	ЧтениеXML.УстановитьСтроку(СтрокаXML);
	список=СериализаторXDTO.прочитатьXML(ЧтениеXML,ФабрикаXDTO.Тип(ЧтениеXML.URIПространстваИмен,ЧтениеXML.Имя));
	Для Каждого Стр из список Цикл
		МенеджерЗаписи = РегистрыСведений.МойРегистр .СоздатьМенеджерЗаписи();
		МенеджерЗаписи.Период		= Стр.Период;
		МенеджерЗаписи.Измерение1	= Стр.Измерение1	;
		МенеджерЗаписи.Измерение3     = Стр.Измерение3     ;
		МенеджерЗаписи.Измерение4	= Стр.Измерение4;
		МенеджерЗаписи.Ресурс1 		= Стр.Ресурс1;
		МенеджерЗаписи.Ресурс2            = Стр.Ресурс2            ;
		МенеджерЗаписи.Записать();
	КонецЦикла;
Показать

в цикле делаю, потому что надо еще сделать какие то действия с каждой записью
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот