Уменьшить количество записей в регистре сведений версии объектов.
В регистре сведений версии объектов более 746 тыс. записей. Тестирование и исправление на платформе 8.3.11.2899 умирает на проверке этого регистра несколько дней идёт. Пробовал уменьшить количество записей (все убивать не хочу): отбор запросом для последующей выгрузки в таблицу значений и загрузку её в регистр сведений вываливается в ошибку недостаточно памяти. Как это можно сделать?
По теме из базы знаний
- Быстрый поиск дублей в 1С с четким/нечетким поиском по любому сочетанию реквизитов/реквизитов таб. частей с отбором и быстрой заменой значений в ЛЮБЫХ базах 8.1-8.3 (УТ 10.3, БП 2, ЗУП 2.5, КА 1.1, УТ 11, БП 3, УНФ 1.6/3.0, КА 2, ЗУП 3 и т.д.)
- Удаление данных с отбором и построением дерева ссылок в базах 1С 8.1-8.3 УТ 10.3./11, БП 2/3, ЗУП 2.5/3, КА 1.1/2, УНФ 1.6/3.0
- 1С Характеристики номенклатуры. Переход на учёт по характеристикам для УТ, УНФ, Розница, КА
- Удаление помеченных объектов, замена ссылок. Обычное и управляемое приложение. Не монопольно, включая рекурсивные ссылки, с отбором по метаданным и произвольным запросом
- Передача большого количества объектов через Web-сервисы
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(2)Определил критерий:
Выдаётся ошибка: недостаточно памяти.
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| версииобъектов.Объект КАК Объект,
| версииобъектов.НомерВерсии КАК НомерВерсии,
| версииобъектов.ВерсияОбъекта КАК ВерсияОбъекта,
| версииобъектов.АвторВерсии КАК АвторВерсии,
| версииобъектов.ДатаВерсии КАК ДатаВерсии,
| версииобъектов.Комментарий КАК Комментарий,
| версииобъектов.ТипВерсииОбъекта КАК ТипВерсииОбъекта,
| версииобъектов.ВерсияПроигнорирована КАК ВерсияПроигнорирована,
| версииобъектов.РазмерДанных КАК РазмерДанных,
| версииобъектов.КонтрольнаяСумма КАК КонтрольнаяСумма,
| версииобъектов.ЕстьДанныеВерсии КАК ЕстьДанныеВерсии,
| версииобъектов.ВерсияВладелец КАК ВерсияВладелец,
| версииобъектов.Узел КАК Узел,
| версииобъектов.Синхронизируется КАК Синхронизируется,
| версииобъектов.Смещение КАК Смещение
|ИЗ
| РегистрСведений.ВерсииОбъектов КАК версииобъектов
|ГДЕ
| версииобъектов.ДатаВерсии < &ДатаВерсии";
Запрос.УстановитьПараметр("ДатаВерсии", Объект.ДатаВерсии);
Выборка = Запрос.Выполнить().Выгрузить();
Набор = РегистрыСведений.ВерсииОбъектов.СоздатьНаборЗаписей();
Набор.Загрузить(Выборка);
ПоказатьВыдаётся ошибка: недостаточно памяти.
(15)например
и устанавливать дату с (СамаяМеньшаяДата) по (СамаяМеньшаяДата) + 1месяц, удалять.
Цикл повторять до достижения нужного
Запрос.Текст = "ВЫБРАТЬ
| версииобъектов.Объект КАК Объект,
| версииобъектов.НомерВерсии КАК НомерВерсии,
| версииобъектов.ВерсияОбъекта КАК ВерсияОбъекта,
| версииобъектов.АвторВерсии КАК АвторВерсии,
| версииобъектов.ДатаВерсии КАК ДатаВерсии,
| версииобъектов.Комментарий КАК Комментарий,
| версииобъектов.ТипВерсииОбъекта КАК ТипВерсииОбъекта,
| версииобъектов.ВерсияПроигнорирована КАК ВерсияПроигнорирована,
| версииобъектов.РазмерДанных КАК РазмерДанных,
| версииобъектов.КонтрольнаяСумма КАК КонтрольнаяСумма,
| версииобъектов.ЕстьДанныеВерсии КАК ЕстьДанныеВерсии,
| версииобъектов.ВерсияВладелец КАК ВерсияВладелец,
| версииобъектов.Узел КАК Узел,
| версииобъектов.Синхронизируется КАК Синхронизируется,
| версииобъектов.Смещение КАК Смещение
|ИЗ
| РегистрСведений.ВерсииОбъектов КАК версииобъектов
|ГДЕ
| версииобъектов.ДатаВерсии < &ДатаВерсии";
Показатьи устанавливать дату с (СамаяМеньшаяДата) по (СамаяМеньшаяДата) + 1месяц, удалять.
Цикл повторять до достижения нужного
Если "DELETE FROM" выполняется слишком долго, есть вариант через "TRUNCATE" - создать временную таблицу в SQL, скопировать туда записи по условию, почистить основную таблицу регистра сведений(выполняется мгновенно) и скопировать сохраненные записи назад.
(8)База файловая.
Был вариант:
Тоже вываливался с ошибкой: недостаточно памяти.
Был вариант:
Набор = РегистрыСведений.ВерсииОбъектов.СоздатьНаборЗаписей();
Набор.Прочитать();
Индекс = 0;
Пока Индекс <= Набор.Количество()-1 Цикл
Запись = Набор.Получить(Индекс);
Если Запись.ДатаВерсии < Объект.ДатаВерсии Тогда
Набор.Удалить(Индекс);
КонецЕсли;
Индекс = Индекс + 1;
КонецЦикла;
Набор.Записать();
ПоказатьТоже вываливался с ошибкой: недостаточно памяти.
(13) загрузи SQL, почти один миллион записей, тяжеловато для файловой.
либо получай записей из регистра запросом порциями по 5000
ВЫБРАТЬ ПЕРВЫЕ 5000
только условие добавь за период
и в цикл загони ПОКА Выборка .Количество>0
примерно так
(14) да это для MS SQL
либо получай записей из регистра запросом порциями по 5000
ВЫБРАТЬ ПЕРВЫЕ 5000
только условие добавь за период
и в цикл загони ПОКА Выборка .Количество>0
примерно так
//Выберем всех регистраторов регистра
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
| УчетНоменклатуры.Регистратор
|ИЗ
| РегистрНакопления.УчетНоменклатуры КАК УчетНоменклатуры";
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
//Обойдем регистраторов
Пока Выборка.Следующий() Цикл
Сообщить("Изменение записей по регистратору: " + Выборка.Регистратор);
//Для каждого регистратора выполним изменение набора записей
НаборЗаписей = РегистрыНакопления.УчетНоменклатуры.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Значение = Выборка.Регистратор;
НаборЗаписей.Прочитать();
Для каждого Запись Из НаборЗаписей Цикл
Запись.Реквизит1 = "Тест";
КонецЦикла;
НаборЗаписей.Записать();
КонецЦикла;
Показать(14) да это для MS SQL
Сделал так:
Всем спасибо!
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 30000
| ВерсииОбъектов.ДатаВерсии КАК ДатаВерсии
|ИЗ
| РегистрСведений.ВерсииОбъектов КАК ВерсииОбъектов
|ГДЕ
| ВерсииОбъектов.ДатаВерсии < &ДатаВерсии
|
|УПОРЯДОЧИТЬ ПО
| ДатаВерсии";
Запрос.УстановитьПараметр("ДатаВерсии", Объект.ДатаВерсии);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ОтборРС = Новый Структура("ДатаВерсии");
ОтборРС.ДатаВерсии = Выборка.ДатаВерсии;
ВыборкаРС = РегистрыСведений.ВерсииОбъектов.Выбрать(ОтборРС, );
Пока ВыборкаРС.Следующий() Цикл
ВыборкаРС.ПолучитьМенеджерЗаписи().Удалить();
КонецЦикла;
КонецЦикла;
ПоказатьВсем спасибо!
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот