периодический независимый регистр сведений оставить только последние записи
По теме из базы знаний
Найденные решения
всем спасибо за советы, наконец то дошли руки, так как мне надо было в результате работы убрать одно измерение сделал следующее:
затем очищаю полностью регистр, через конфигуратор удаляю Измерение2 и загружаю обратно
в цикле делаю, потому что надо еще сделать какие то действия с каждой записью
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| МойРегистр .Период КАК Период,
| МойРегистр .Измерение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,
......................
ТвойРегистрСведений.Измерение1 КАК ИзмерениеN
ИЗ
РегистрСведений.ТвойРегистрСведений КАК ТвойРегистрСведений
ГДЕ
НЕ (ТвойРегистрСведений.Период, ТвойРегистрСведений.Измерение1,................... ИзмерениеN) В
(ВЫБРАТЬ
РегистрСведений.ТвойРегистрСведений.СрезПоследних.Период,
РегистрСведений.ТвойРегистрСведений.СрезПоследних.Измерение1,
..........................................
РегистрСведений.ТвойРегистрСведений.СрезПоследних.ИзмерениеN
ИЗ
РегистрСведений.ТвойРегистрСведений.СрезПоследних)
.......................
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
НаборЗаписей = РегистрСведений.ТвойРегистр.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Период.Установить(Выборка.Период);
НаборЗаписей.Отбор.Измерение1.Установить(Выборка.Измерение1);
.................
НаборЗаписей.Отбор.ИзмерениеN.Установить(Выборка.ИзмерениеN);
НаборЗаписей.Записать();
КонецЦикла;
Показать
(11)
А зачем выгружать в ТЗ?
1. Очищаем регистр.
2. Запрос.Текст = "ВЫБРАТЬ * ИЗ РегистрСведений.МойРегистр.СрезПоследних ИТОГИ
ПО
Измерение1";
(ну, или есть подозрение, что не нужны записи, скажем, за 3033 год, доп-о задаем период среза).
3. Обходим выборку по срезу последних (запрос с "итого" по измерениям), создаем нужный набор и записываем. Все обернуть в транзакцию - в зависимости от кол-ва записей или в одну, или отдельно по каждому набору.
Получаем экономию памяти в 2-а раза - не надо отводить память под ТЗ.
Но 267 491 записей это при самом кривом, но в принципе работающем коде, не должно привести к катастрофе и работать часами. Правда, автор не сказал структуру полей, может быть там здоровенные BLOBы.
Если памяти хватит, конечно..
А зачем выгружать в ТЗ?
1. Очищаем регистр.
2. Запрос.Текст = "ВЫБРАТЬ * ИЗ РегистрСведений.МойРегистр.СрезПоследних ИТОГИ
ПО
Измерение1";
(ну, или есть подозрение, что не нужны записи, скажем, за 3033 год, доп-о задаем период среза).
3. Обходим выборку по срезу последних (запрос с "итого" по измерениям), создаем нужный набор и записываем. Все обернуть в транзакцию - в зависимости от кол-ва записей или в одну, или отдельно по каждому набору.
Получаем экономию памяти в 2-а раза - не надо отводить память под ТЗ.
Но 267 491 записей это при самом кривом, но в принципе работающем коде, не должно привести к катастрофе и работать часами. Правда, автор не сказал структуру полей, может быть там здоровенные BLOBы.
(14)
Почему ?
В выборке по итогам создаем набор записей и ставим отборы по выбранным измерениям.
По второй выборке заполняем набор записей
По выходу записываем.
(13)
Я не понял кто такая "булка", если имеется в виду bulk операции, то это надо лезть в SQL напрямую.
Даже не говоря про лицензионные ограничения, на таком кол-ве записей нафиг не надо.
итоги не нужны в этом запросе
Почему ?
В выборке по итогам создаем набор записей и ставим отборы по выбранным измерениям.
По второй выборке заполняем набор записей
По выходу записываем.
(13)
Но быстрее всего, для серверного варианта, через булку.
Я не понял кто такая "булка", если имеется в виду bulk операции, то это надо лезть в SQL напрямую.
Даже не говоря про лицензионные ограничения, на таком кол-ве записей нафиг не надо.
(17)
Я чего-то не понимаю, вот есть регистр с одним строковым измерением и одним строковым ресурсом.
Запрос возвращает записи с разными измерениями.
По-вашему это будет работать, или вы имели в виду что-то иное?
нз = РегистрыСведений.РегистрСведений1.СоздатьНаборЗаписей();
запись = нз.Добавить();
запись.Измерение1 = "изм1";
запись.Ресурс1 = "рес1";
запись.Измерение1 = "изм2";
запись.Ресурс1 = "рес2222";
нз.Записать(Истина);
Без итогов можно, просто так удобней создавать отборы (код пишу сразу здесь, без периодов и т.п.
чтобы просто пояснить мысль)
P.S.
Впрочем, автор вопроса, похоже больше ответами не интересуется. :)
Загружаем в набор результат запроса п.1
Я чего-то не понимаю, вот есть регистр с одним строковым измерением и одним строковым ресурсом.
Запрос возвращает записи с разными измерениями.
По-вашему это будет работать, или вы имели в виду что-то иное?
нз = РегистрыСведений.РегистрСведений1.СоздатьНаборЗаписей();
запись = нз.Добавить();
запись.Измерение1 = "изм1";
запись.Ресурс1 = "рес1";
запись.Измерение1 = "изм2";
запись.Ресурс1 = "рес2222";
нз.Записать(Истина);
Без итогов можно, просто так удобней создавать отборы (код пишу сразу здесь, без периодов и т.п.
чтобы просто пояснить мысль)
Пока ВыборкаИзм.Следующий() Цикл
НачатьТранзакцию();
нз = РегистрыСведений.РегистрСведений1.СоздатьНаборЗаписей();
ВыборкаДет = ВыборкаИзм.Выбрать();
Пока ВыборкаДет.Следующий() Цикл
запись = нз.Добавить();
запись.Измерение1 = ВыборкаИзм.Измерение;
запись.Ресурс1 = ВыборкаДет.Ресурс;
КонецЦикла
нз.Записать();
ЗафиксироватьТранзакцию();
КонецЦикла
ПоказатьP.S.
Впрочем, автор вопроса, похоже больше ответами не интересуется. :)
(18)
Вот так если. Получим регистр сведений, в котором только две записи, остальные удалятся. Вспомните, как мы очищаем регистр - РегистрыСведений.РегистрСведений1.СоздатьНаборЗаписей().Записать(Истина); - вы же не сомневаетесь, что это работает. Ну вот тут то же самое.
нз = РегистрыСведений.РегистрСведений1.СоздатьНаборЗаписей();
запись = нз.Добавить();
запись.Измерение1 = "изм1";
запись.Ресурс1 = "рес1";
запись = нз.Добавить();
запись.Измерение1 = "изм2";
запись.Ресурс1 = "рес2222";
нз.Записать(Истина);
ПоказатьВот так если. Получим регистр сведений, в котором только две записи, остальные удалятся. Вспомните, как мы очищаем регистр - РегистрыСведений.РегистрСведений1.СоздатьНаборЗаписей().Записать(Истина); - вы же не сомневаетесь, что это работает. Ну вот тут то же самое.
(21)
Ну раз интересуетесь, то попробуйте с этих 3-х маленьких примеров:
Создаете непериодический независимый регистр сведений, с одним строковым измерением - Измерение1 и одним строковым ресурсом Ресурс1.
И пробуете сделать следующее - легкий аналог выгрузки среза последнего и попытки запихать его сразу весь в один набор записей, подумайте, почему так не работает:
Пример1:
Пример2:
Делаем регистр периодическим, но Измерение1 не удаляем:
А теперь удаляем Измерение1, не из кода!, из самого регистра! и повторяем код выше - О! Работает.
Так вот, те, кто советовали "просто выгрузить и сразу загрузить" про измерения, помимо периода не подумали
(или я элементарно не понял, что люди хотели сказать, со мной такое бывает, увы).
Но проверьте сами, вполне возможно меня переклинило и я что-то не то написал. :)
Ну раз интересуетесь, то попробуйте с этих 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, не из кода!, из самого регистра! и повторяем код выше - О! Работает.
Так вот, те, кто советовали "просто выгрузить и сразу загрузить" про измерения, помимо периода не подумали
(или я элементарно не понял, что люди хотели сказать, со мной такое бывает, увы).
Но проверьте сами, вполне возможно меня переклинило и я что-то не то написал. :)
в (17) правильно все написали
Если очень записей много и вызывает проблему при записи, упорядочиваем по измерениям в запросе, обходим через Выборка.СледующийПоЗначениюПоля("Измерение.."), устанавливаем отборы по текущим измерениям и пишем отдельными наборами.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| *
|ИЗ
| РегистрСведений.ТестовыйРегистр.СрезПоследних КАК ТестовыйРегистрСрезПоследних";
НаборЗаписей = РегистрыСведений.ТестовыйРегистр.СоздатьНаборЗаписей();
НаборЗаписей.Загрузить(Запрос.Выполнить().Выгрузить());
НаборЗаписей.Записать();
ПоказатьЕсли очень записей много и вызывает проблему при записи, упорядочиваем по измерениям в запросе, обходим через Выборка.СледующийПоЗначениюПоля("Измерение.."), устанавливаем отборы по текущим измерениям и пишем отдельными наборами.
всем спасибо за советы, наконец то дошли руки, так как мне надо было в результате работы убрать одно измерение сделал следующее:
затем очищаю полностью регистр, через конфигуратор удаляю Измерение2 и загружаю обратно
в цикле делаю, потому что надо еще сделать какие то действия с каждой записью
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| МойРегистр .Период КАК Период,
| МойРегистр .Измерение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 ;
МенеджерЗаписи.Записать();
КонецЦикла;
Показатьв цикле делаю, потому что надо еще сделать какие то действия с каждой записью
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот