Как удалить записи из регистра сведений за определенный период?
По теме из базы знаний
- Выгрузка-загрузка любых данных из 1С (и измененных) в XML между похожими конфигурациями (ФАЙЛ, HTTP, COM) ЛЮБЫХ баз 1С 8.1-8.3 с обработкой и поиском данных по произвольным полям поиска
- Регистры сведений 1С. Как это устроено.
- Свертка базы - или как свернуть базу УТ 10.3
- Как сдать экзамен 1С:Специалист по платформе?
- Оптимизированная свертка информационной базы 1С 8.3 Бухгалтерии 3.0
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) выбрать запросом набор ключевых полей(период и все измерения) в цикле обрабатывать выборку
Запись = регистрысведений[твойрегистр].создатьменеджерзаписи();
Заполнитьзнначениясвойств(запись, выборка);
Запись.причитать();
Запись.удалить();
НаборЗаписей = РегистрыСведений.ИмяРегистра.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Период.ВидСравнения = ВидСравнения.ИнтервалВключаяГраницы;
НаборЗаписей.Отбор.Период.ЗначениеС = НачалоПериода;
НаборЗаписей.Отбор.Период.ЗначениеПо = КонецПериода;
НаборЗаписей.Отбор.Использование = Истина;
НаборЗаписей.Прочитать();
НаборЗаписей.Очистить();
НаборЗаписей.Записать(Истина);
(3) peterxx, НаборЗаписей.Отбор.Период.ВидСравнения = ВидСравнения.ИнтервалВключаяГраницы; для набора записей недоступен к сожалению.. только на равно
(4) Умочка, Нужно сделать вот так: запросом выбираешь все записи которые нужно удалить за период, ну а потом сделать то же самое что и в (3) но только обходить циклом результат выборки по каждой записи и удалять их по одной (или по дням)
(4) Умочка, Нужно сделать вот так: запросом выбираешь все записи которые нужно удалить за период, ну а потом сделать то же самое что и в (3) но только обходить циклом результат выборки по каждой записи и удалять их по одной (или по дням)
В (3) дан почти верный ответ - корректный код будет выглядеть так:
НаборЗаписей = РегистрыСведений.ИмяРегистра.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Период.ЗначениеС = НачалоПериода;
НаборЗаписей.Отбор.Период.ЗначениеПо = КонецПериода;
НаборЗаписей.Прочитать();
НаборЗаписей.Очистить();
НаборЗаписей.Записать(Истина);
(16)
Данный код стирает ВСЕ записи РС. Представляю, что будет, если этим кодом кто-то на рабочей базе попробует воспользоваться.
Да даже и на копии - копию придётся заново делать.
А всё дело в том, что вы забыли установить применение отбора
НаборЗаписей.Отбор.Период.Использование = Истина;
Данный код стирает ВСЕ записи РС. Представляю, что будет, если этим кодом кто-то на рабочей базе попробует воспользоваться.
Да даже и на копии - копию придётся заново делать.
А всё дело в том, что вы забыли установить применение отбора
НаборЗаписей.Отбор.Период.Использование = Истина;
(17) Б-ть, ну почему я сперва запустил этот код на проде, и только потом прочитал этот комментарий...
DoReMu; user1284311; thornhiven; olezhe; Aleksandr_prof; user1637258; Dezor; NicolasCage; Root Of Life; olexi2012; user2018771; freeek; SLukin; user2022329; Andreyka888; tokmakov1904; Дамир1; maxtomsk; user598655_ilia-bers; dimisa; user990914; user785225; SP2000; MrBukas; Mechanik21; leonidol; shatohin_uttist; slitov; Drivingblind; user1145086; IgorArhangel; Kolobash95; корум; Power_0N;
+34
–
Ответить
У меня (3) и (16) не работает.
Мой рабочий код, который удаляет в независимом периодическом (период год) регистре сведений отдельно по годам:
НаборЗаписей = РегистрыСведений.НазваниеРегистра.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Период.Установить(НачалоГода(ТекущаяДата()));
НаборЗаписей.Записать(Истина);
Мой рабочий код, который удаляет в независимом периодическом (период год) регистре сведений отдельно по годам:
НаборЗаписей = РегистрыСведений.НазваниеРегистра.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Период.Установить(НачалоГода(ТекущаяДата()));
НаборЗаписей.Записать(Истина);
Пардон, не та ссылка
Процедура ПойматьРезидента(ДатаНаКотруюВсеБылоНормально)
Запрос=Новый Запрос();
Запрос.Текст="ВЫБРАТЬ
| СтатусФизЛицКакНалогоплательщиковНДФЛСрезПоследних.Период,
| СтатусФизЛицКакНалогоплательщиковНДФЛСрезПоследних.ФизЛицо,
| СтатусФизЛицКакНалогоплательщиковНДФЛСрезПоследних.Статус
|ИЗ
| РегистрСведений.СтатусФизЛицКакНалогоплательщиковНДФЛ.СрезПоследних(&ДатаНаКотруюВсеБылоНормально, ) КАК СтатусФизЛицКакНалогоплательщиковНДФЛСрезПоследних";
Запрос.УстановитьПараметр("ДатаНаКотруюВсеБылоНормально",ДатаНаКотруюВсеБылоНормально);
НормальныеЗаписи=Запрос.Выполнить().Выгрузить();
НаборЗаписейРегистра=РегистрыСведений.СтатусФизЛицКакНалогоплательщиковНДФЛ.СоздатьНаборЗаписей();
//почистим регистр на всякий случай хотя можно и без этого
//записать сразу
НаборЗаписейРегистра.Прочитать();
НаборЗаписейРегистра.Очистить();
НаборЗаписейРегистра.Записать(Истина);
//запишем нормальные
НаборЗаписейРегистра.Загрузить(НормальныеЗаписи);
НаборЗаписейРегистра.Записать();
КонецПроцедуры
Показать
Удалить все записи в регистре сведений можно с помощью двух строчек кода:
НаборЗаписей = РегистрыСведений[ИмяРегистра].СоздатьНаборЗаписей(); // ИмяРегистра например "УчетнаяПолитика", "ЦеныНоменклатуры" и т.д
НаборЗаписей.Записать();
НаборЗаписей = РегистрыСведений[ИмяРегистра].СоздатьНаборЗаписей(); // ИмяРегистра например "УчетнаяПолитика", "ЦеныНоменклатуры" и т.д
НаборЗаписей.Записать();
Я делал так:
ДатаДо = <Дата конца периода>;
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
| РС.Период
|ИЗ
| РегистрСведений.<Имя регистра> КАК РС
|ГДЕ
| РС.Период <= &Период";
Запрос.УстановитьПараметр("Период",ДатаДо);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
ОбработкаПрерыванияПользователя();
ДатаРаб = Выборка.Период;
Пока Истина Цикл
Попытка //На случай блокировки.
НаборЗаписей = РегистрыСведений.<Имя регистра>.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Период.Значение = ДатаРаб;
НаборЗаписей.Отбор.Период.Использование = Истина;
НаборЗаписей.Записать(ИСТИНА);
Прервать;
Исключение
//Можно добавить прерывание по количеству попыток
КонецПопытки;
КонецЦикла;
КонецЦикла;
Показать
Может вопрос не в теме и слишком туп, но все таки. как и где написать запрос чтобы его выполнить? нужно удалить все записи из РС.ОбъектыДоступаДокументов, а гугл на вопрос по написанию запросов отправляет меня в конструктор запросов.
(19) Тогда я чего-то не понимаю. Куда нужно написать эти две строчки кода?
11. Надежда (user_2010) 221 31.03.17 11:12
Удалить все записи в регистре сведений можно с помощью двух строчек кода:
НаборЗаписей = РегистрыСведений[ИмяРегистра].СоздатьНаборЗаписей(); // ИмяРегистра например "УчетнаяПолитика", "ЦеныНоменклатуры" и т.д
НаборЗаписей.Записать();
Удалить все записи в регистре сведений можно с помощью двух строчек кода:
НаборЗаписей = РегистрыСведений[ИмяРегистра].СоздатьНаборЗаписей(); // ИмяРегистра например "УчетнаяПолитика", "ЦеныНоменклатуры" и т.д
НаборЗаписей.Записать();
У меня вот такой код работает:
Выборка = РегистрыСведений.Цены.Выбрать(НачПериода, КонПериода);
Пока Выборка.Следующий() Цикл
Выборка.ПолучитьМенеджерЗаписи().Удалить();
КонецЦикла;
Скорее всего проблема уже не актуальна. Но может кому-то и понадобится.
НаборЗаписей=РегистрыСведений.ПредварительныеНачисления.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.ФизическоеЛицо.Установить(СсылкаНаФизЛицо);
НаборЗаписей.Отбор.Должность.Установить(ДолжностьСсылка);
НаборЗаписей.Отбор.Подразделение.Установить(ПодразделениеСсылка);
НаборЗаписей.Отбор.Начисление.Установить(СсылкаНаНачисление);
НаборЗаписей.Прочитать();
Для каждого запись из НаборЗаписей ЦИкл
Если запись.Период>=Дата(периодС) и запись.Период<=Дата(периодПо) Тогда
НаборЗаписей.Удалить(запись);
КонецЕсли;
КонецЦикла;
НаборЗаписей.Записать(Истина);
Показать
(31) ну я вот так сделал:
Для каждого запись из НаборЗаписей Цикл
Если запись.Дата<=Дата(ПериодПо) Тогда
МассивЗаписейНаУдаление.Добавить(Запись);
КонецЕсли;
КонецЦикла;
Для каждого текЗап Из МассивЗаписейНаУдаление Цикл
НаборЗаписей.Удалить(текЗап);
КонецЦикла;
Показать
Для одной записи
Для набора записей:
НаборЗаписей=РегистрыСведений.Заявки.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.id_заявки.Использование=Истина;
НаборЗаписей.Отбор.id_заявки.Значение=ЗначениеПоиска;
НаборЗаписей.Прочитать();
НаборЗаписей.Очистить();
НаборЗаписей.Записать(Истина);
Для набора записей:
Для каждого ЭлементМассива Из МассивЗаявокНаУдаление Цикл
НаборЗаписей=РегистрыСведений.Заявки.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.id_заявки.Использование=Истина;
НаборЗаписей.Отбор.id_заявки.Значение=ЭлементМассива;
НаборЗаписей.Прочитать();
НаборЗаписей.Очистить();
НаборЗаписей.Записать(Истина);
КонецЦикла;
Показать
(28) Не стоит делать таких безаппеляционных заявлений. Да - если документ создается и записывается разово - то вы правы.
Но если документобъект запрашивается по ссылке, а заполнение движений идёт накопительное, то без чтения набора записей, вы будете просто перезаписывать содержимое. Так-же, при внесении накопительных изменений - не стоит забывать записать движение, перед записью документа.
Но если документобъект запрашивается по ссылке, а заполнение движений идёт накопительное, то без чтения набора записей, вы будете просто перезаписывать содержимое. Так-же, при внесении накопительных изменений - не стоит забывать записать движение, перед записью документа.
(44)
(44)
Не стоит делать таких безаппеляционных заявлений. Да - если документ создается и записывается разово - то вы правы.
В данном топике речь идет не о создании документа и записи его движений, а об удалении записей некоего регистра. Непосредственном перед записью пустого набора (т.е. перед удалением) читать записи нет необходимости.
(44)
Так-же, при внесении накопительных изменений - не стоит забывать записать движение, перед записью документа.
Движения будут записаны вместе с документом, если у нужных наборов записей взвести флаг "Записывать". Если не требуется что-нибудь вроде контроля записанных движений, то такой подход даже будет более корректным.
Можно упростить:
Для каждого ЭлементМассива Из МассивЗаявокНаУдаление Цикл
НаборЗаписей=РегистрыСведений.Заявки.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.id_заявки.Установить(ЭлементМассива);
НаборЗаписей.Очистить();
НаборЗаписей.Записать(Истина);
КонецЦикла;
Для каждого ЭлементМассива Из МассивЗаявокНаУдаление Цикл
НаборЗаписей=РегистрыСведений.Заявки.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.id_заявки.Установить(ЭлементМассива);
НаборЗаписей.Очистить();
НаборЗаписей.Записать(Истина);
КонецЦикла;
Выборка = РегистрыСведений.ИмяРегистра.Выбрать();
Пока Выборка.Следующий() Цикл
Если Выборка.Период < Дата Тогда
Запись = Выборка.ПолучитьМенеджерЗаписи();
Запись.Удалить();
КонецЕсли;
КонецЦикла;
ПоказатьЗапрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| *
|ИЗ
| РегистрСведений."+ИмяРегистра+" КАК КР_ОстаткиТТ
|ГДЕ
| КР_ОстаткиТТ.Период > &КонецПериода";
Запрос.УстановитьПараметр("КонецПериода", ДатаОкончания);
ЗапросВып = Запрос.Выполнить();
Если ЗапросВып.Пустой() тогда Возврат КонецЕсли;
РезультатЗапроса = ЗапросВып.Выгрузить();
НаборЗаписейУд = РегистрыСведений[ИмяРегистра].СоздатьНаборЗаписей();
НаборЗаписейУд.Записать(Истина);
НаборЗаписейЗап = РегистрыСведений[ИмяРегистра].СоздатьНаборЗаписей();
НаборЗаписейЗап.Загрузить(РезультатЗапроса);
НаборЗаписейЗап.Записать(Истина);
ПоказатьПроцедура УдалитьЗаписиЗаПериод1(ИмяРегистра, дНачало, дКонец, Интервал=86400)
Дата1 = НачалоДня(дНачало);
Пока Дата1 <= дКонец Цикл
НаборЗаписей = РегистрыСведений[ИмяРегистра].СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Период.Установить(Дата1);
НаборЗаписей.Записать();
Дата1 = Дата1 + Интервал;
КонецЦикла;
КонецПроцедуры
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот