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

1. 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 06.04.22 22:07 Сейчас в теме
Взять срезПоследних, всё остальное удалить
3. user1203706 06.04.22 22:09 Сейчас в теме
Достаточно написать примитивный запрос в котором соединить все записи РС со срезом последних по всем измерениям, где записи РС не в записи из среза, обойти выборку этого набора, создавая наборЗаписей РС + установка отбора всех измерений с выборки и Запись.
Усё.
4. user1203706 06.04.22 22:20 Сейчас в теме
На вот, занимайся

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

(6) ты не в теме.
9. user1203706 13.04.22 07:50 Сейчас в теме
(8) какое количество записей в твоём РС ?
База файловая/скуль ?
10. eda76 13.04.22 10:56 Сейчас в теме
(9)
267 491
крутил в тестовой файловой
11. user1203706 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.04.22 12:04 Сейчас в теме
(12) можно и так, можно и целиком набор вгрузить.

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

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

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

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

1. Делаем запрос СрезПоследних
2. Создаем набор без оборов вообще
3. Загружаем в набор результат запроса п.1
4. Делаем Набор.Записать(Истина)
...
5. PROFIT
14. user1203706 13.04.22 12:05 Сейчас в теме
(12) и да, итоги не нужны в этом запросе
16. user1203706 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 11 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 305 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            ;
		МенеджерЗаписи.Записать();
	КонецЦикла;
Показать

в цикле делаю, потому что надо еще сделать какие то действия с каждой записью
Оставьте свое сообщение
Вакансии
Программист, аналитик, эксперт 1С
Санкт-Петербург
По совместительству

Архитектор 1С
Москва
зарплата от 260 000 руб.
Полный день

Начальник отдела архитектуры
Москва
зарплата от 300 000 руб.
Полный день

Эксперт по технологическим вопросам
Москва
зарплата от 250 000 руб.
Полный день

Ведущий разработчик 1С
Ростов-на-Дону
зарплата от 200 000 руб.
Полный день