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

```1c
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | МойРегистр .Период КАК Период,
    | МойРегистр .Измерение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 и загружаю обратно

```1c
    Текст = Новый ЧтениеТекста;
    Текст.Открыть("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 ;
    МенеджерЗаписи.Записать();
    КонецЦикла;
```

в цикле делаю, потому что надо еще сделать какие то действия с каждой записью
---
Взять срезПоследних, всё остальное удалить
---
Достаточно написать примитивный запрос в котором соединить все записи РС со срезом последних по всем измерениям, где записи РС не в записи из среза, обойти выборку этого набора, создавая наборЗаписей РС + установка отбора всех измерений с выборки и Запись.
Усё.
---
На вот, занимайся

```1c
    ВЫБРАТЬ
    ТвойРегистрСведений.Период КАК Период,
    ТвойРегистрСведений.Измерение1 КАК Измерение1,
    ......................
    ТвойРегистрСведений.Измерение1 КАК ИзмерениеN
    ИЗ
    РегистрСведений.ТвойРегистрСведений КАК ТвойРегистрСведений
    ГДЕ
    НЕ (ТвойРегистрСведений.Период, ТвойРегистрСведений.Измерение1,................... ИзмерениеN) В
    (ВЫБРАТЬ
    РегистрСведений.ТвойРегистрСведений.СрезПоследних.Период,
    РегистрСведений.ТвойРегистрСведений.СрезПоследних.Измерение1,
    ..........................................
    РегистрСведений.ТвойРегистрСведений.СрезПоследних.ИзмерениеN

    ИЗ
    РегистрСведений.ТвойРегистрСведений.СрезПоследних)
    .......................
    Выборка = Запрос.Выполнить().Выбрать();
    Пока Выборка.Следующий() Цикл
    НаборЗаписей = РегистрСведений.ТвойРегистр.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Период.Установить(Выборка.Период);
    НаборЗаписей.Отбор.Измерение1.Установить(Выборка.Измерение1);
    .................
    НаборЗаписей.Отбор.ИзмерениеN.Установить(Выборка.ИзмерениеN);
    НаборЗаписей.Записать();
    КонецЦикла;
```
---
можно сделать еще проще, выгрузить результат запроса, занулить РС и загрузить в пустой РС результат запроса
---
мало установить отбор в НЗ, нужно сам НЗ заполнить. Создавать НЗ в цикле по каждой записи......
Садись. Кол - в дневник!
---
2 дня крутил запрос, надоело, убил процес.
---
Да. Так скорее всего будет быстрее.
Для большого РС, еще быстрее будет выгрузить select-ом в файл нужные записи + truncate table + bulk insrt потом, ибо даже тупой delete медленный

(6) ты не в теме.
---
какое количество записей в твоём РС ?
База файловая/скуль ?
---
267 491
крутил в тестовой файловой
---
странно, это не много совсем.
Ну пробуй рецепт из (5) - выгрузи срез последних в ТЗ, затем запиши пустой набор, чтоб удалить все записи РС сразу, потом загрузи в набор ТЗ и запиши.

Если памяти хватит, конечно..
---
Если памяти хватит, конечно..
А зачем выгружать в ТЗ?

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

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

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

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

Но 267 491 записей это при самом кривом, но в принципе работающем коде, не должно привести к катастрофе и работать часами. Правда, автор не сказал структуру полей, может быть там здоровенные BLOBы.
---
можно и так, можно и целиком набор вгрузить.

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

(13) Но быстрее всего, для серверного варианта, через булку.
Я не понял кто такая "булка", если имеется в виду bulk операции, то это надо лезть в SQL напрямую.
Даже не говоря про лицензионные ограничения, на таком кол-ве записей нафиг не надо.
---
(12) При таком количестве можно вообще без итогов

1. Делаем запрос СрезПоследних
2. Создаем набор без оборов вообще
3. Загружаем в набор результат запроса п.1
4. Делаем Набор.Записать(Истина)
...
5. PROFIT
---
и да, итоги не нужны в этом запросе
---
запрос и так свёрнутый, смысл какой в итогах вообще ?
---
Загружаем в набор результат запроса п.1
Я чего-то не понимаю, вот есть регистр с одним строковым измерением и одним строковым ресурсом.
Запрос возвращает записи с разными измерениями.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Пример1:

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

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

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

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

Пример2:
Делаем регистр периодическим, но Измерение1 не удаляем:

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

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

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

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

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

Но проверьте сами, вполне возможно меня переклинило и я что-то не то написал. :)
---
в (17) правильно все написали

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

Если очень записей много и вызывает проблему при записи, упорядочиваем по измерениям в запросе, обходим через Выборка.СледующийПоЗначениюПоля("Измерение.."), устанавливаем отборы по текущим измерениям и пишем отдельными наборами.
---
всем спасибо за советы, наконец то дошли руки, так как мне надо было в результате работы убрать одно измерение сделал следующее:

```1c
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | МойРегистр .Период КАК Период,
    | МойРегистр .Измерение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 и загружаю обратно

```1c
    Текст = Новый ЧтениеТекста;
    Текст.Открыть("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 ;
    МенеджерЗаписи.Записать();
    КонецЦикла;
```

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