Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Превышен максимальный размер файла 1сv8.1cd
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Базы данных
Meest
Добрый день!


Столкнулся с такой проблемой как "Превышен максимальный размер файла 1сv8.1cd", размер файла на данный момент 39 201 968 КВ, проблема возникла в процессе удаления документов.
Конфигурация не типовая, удаляется больше 8 миллионов документов, удаляю их обработкой с таким кодом


    // Удаляем справочники
    Для ид=0 По СписокСпр.Количество()-1 Цикл
        Если СписокСпр.Получить(ид).Пометка = Истина Тогда
            Спр = Справочники[СписокСпр.Получить(ид).Значение.Имя].Выбрать();
            Пока Спр.Следующий() Цикл
                Объект = Спр.ПолучитьОбъект();
                Объект.Удалить();
                Сообщить(Спр);
            КонецЦикла;
        КонецЕсли;
    КонецЦикла;
    //Удаляем документы
    Для ид=0 По СписокДок.Количество()-1 Цикл
        Если СписокДок.Получить(ид).Пометка = Истина Тогда
            Док = Документы[СписокДок.Получить(ид).Значение.Имя].Выбрать();
            Пока Док.Следующий() Цикл
                Объект = Док.ПолучитьОбъект();
                 Дата = Док.Дата;
                 Если Дата>НачалоДня(ДатаС) тогда
                     Если Дата<КонецДня(ДатаПо) тогда
                         Сообщить(Док);
                         Объект.Удалить();
                     КонецЕсли;    
                    КонецЕсли;
            КонецЦикла;
        КонецЕсли;
    КонецЦикла;
    //Удаляем регистр сведений
    Для ид=0 По СписокРег.Количество()-1 Цикл
        Если СписокРег.Получить(ид).Пометка = Истина Тогда
            Рег = РегистрыСведений[СписокРег.Получить(ид).Значение.Имя].СоздатьНаборЗаписей();
            Рег.Записать();
        КонецЕсли;
    КонецЦикла;



Поставил базу на чек еще вчера утром но он еще идет, не смотря на то что железо не слабое Intel® Xeon® CPU E5420 @ 2.50GHz 16GB of RAM.

Помогите советом, может я что-то не так делаю, или есть другой вариант быстрой очистки базы?
Pepe
Попробуйте через конфигуратор уплотнить базу, может уменьшиться размер. На диске необходимо наличие свободного места. Возможно придется сделать за несколько этапов. Почистить, например, справочники, упаковать базу. Потом регистры, документы (возможно не все сразу, а по частям). Может не надо удалять сразу все, а частями по интервалу дат с последующей упаковкой...
Altair777
Мне кажется что так делать нехорошо - выборка может нарушиться в процессе удаления.
Имхо, лучше было бы сначала запросом получить ссылки, а потом уже обрабатывать его результат.

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


Объект = Док.ПолучитьОбъект();

Насколько я помню, это длительная операция. Лучше сначала проверить условия даты а потом уже получать объект.

Вот есть у меня такой кусок кода.

ТекстЗапроса = "";
Запрос = Новый Запрос;
Запрос.Параметры.Вставить("ДатаНач", НачалоПериода);
Запрос.Параметры.Вставить("ДатаКон", КонецПериода);
Для каждого Строка Из ВидыДокументов Цикл
    Если Строка.Пометка Тогда
        ТекстЗапроса = ТекстЗапроса + "
            |ОБЪЕДИНИТЬ ВСЕ
            |ВЫБРАТЬ Ссылка ИЗ Документ." + Строка.ВидДокумента + " ГДЕ Дата > &ДатаНач И Дата < &ДатаКон";
    КонецЕсли;
КонецЦикла;
Найдено = Найти(ТекстЗапроса, "Ссылка");
ТекстЗапроса = "ВЫБРАТЬ РАЗРЕШЕННЫЕ " + Сред(ТекстЗапроса, Найдено);
Запрос.Текст = ТекстЗапроса;
ТабличнаяЧастьСсылки.Загрузить(Запрос.Выполнить().Выгрузить());


ВидыДокументов = ТабличнаяЧасть с реквизитами: Пометка (булево), ВидДокумента(Строка)
Заполняется так:
Процедура ПриОткрытии()
    ВидыДокументов.Очистить();
    Для каждого Док Из Метаданные.Документы Цикл
        НоваяСтрока = ВидыДокументов.Добавить();
        НоваяСтрока.ВидДокумента = Док.Имя;
    КонецЦикла;
КонецПроцедуры

AnryMc
Цитата(Altair777 @ 20.12.12, 13:52) необходимо зарегистрироваться для просмотра ссылки


На Инфостарте скучно....


Цитата(Meest @ 20.12.12, 10:35) необходимо зарегистрироваться для просмотра ссылки


А при такой "глобальной чистке", не проще ли перенести нужное в чистую базу?

Цитата(Meest @ 20.12.12, 10:35) необходимо зарегистрироваться для просмотра ссылки


Вы этот код выполняете в транзакции? (лично я бы без транзакции не рискнул). Может стоит "побить" транзакцию на "пачки"...
Meest
Цитата(AnryMc @ 20.12.12, 14:11) необходимо зарегистрироваться для просмотра ссылки
Цитата(Meest @ 20.12.12, 10:35)


А при такой "глобальной чистке", не проще ли перенести нужное в чистую базу?.




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

Цитата(AnryMc @ 20.12.12, 14:11) необходимо зарегистрироваться для просмотра ссылки
Цитата(Meest @ 20.12.12, 10:35)


Вы этот код выполняете в транзакции? (лично я бы без транзакции не рескнул). Может стоит "побить" транзакцию на "пачки"...

С транзакцией обязательно попробую
Altair777
Цитата(AnryMc @ 20.12.12, 14:11) необходимо зарегистрироваться для просмотра ссылки
На Инфостарте скучно....

Мне он уже надоел. Тут веселее. Чего стоит только тема необходимо зарегистрироваться для просмотра ссылки
Почитал, прослезился haha.gif

И смайлики тут веселее.
Zaval
1. Если база растет при удалении объектов, то, скорее всего, включено версионирование объектов или какое-то логирование их судьбы.
2. Отключите на время чистки(только потом включить не забудьте) подписки на события, которые могут срабатывать.
3. Уберите нафиг "Сообщить()" или перестаньте жаловаться на "тормоза".
4. Удалите вначале документы. Нафига нарываться на ситуацию с туевой кучей битых ссылок?


Meest
Цитата(Zaval @ 20.12.12, 14:52) необходимо зарегистрироваться для просмотра ссылки
1. Если база растет при удалении объектов, то, скорее всего, включено версионирование объектов или какое-то логирование их судьбы.
2. Отключите на время чистки(только потом включить не забудьте) подписки на события, которые могут срабатывать.
3. Уберите нафиг "Сообщить()" или перестаньте жаловаться на "тормоза".
4. Удалите вначале документы. Нафига нарываться на ситуацию с туевой кучей битых ссылок?



1. "Версионирование объектов или какое-то логирование их судьбы." Такого нет.
2. Подписок тоже нет.
3. Тормозов процессе нет, все удаляется очень быстро.
4. Я сначала и удаляю документы.
Altair777
Документы каждого вида нужно удалять за период?
Если бы полностью, можно было бы попробовать удалять их на уровне объектов конфигурации, а потом снова сделать объединение с заранее сохраненной конфигурацией.

Я когда-то давно-давно так семерочные базы "свертывал"
Zaval
В приведенном фрагменте кода вначале чистятся какие-то справочники.

А в ПланахОбмена ничего не регистрируется?
Meest
Цитата(Zaval @ 20.12.12, 16:38) необходимо зарегистрироваться для просмотра ссылки
В приведенном фрагменте кода вначале чистятся какие-то справочники.

А в ПланахОбмена ничего не регистрируется?




На форме выбираю документы сначала

// Вставить содержимое обработчика.
    Для Каждого Объект из Метаданные.Справочники  Цикл
        СписокСпр.Добавить(Объект, Объект.Представление(),Ложь);
    КонецЦикла;
    Для Каждого Объект из Метаданные.Документы Цикл
        СписокДок.Добавить(Объект, Объект.Представление(),Ложь);
    КонецЦикла;
    Для Каждого Объект из Метаданные.РегистрыСведений Цикл
        СписокРег.Добавить(Объект, Объект.Представление(),Ложь);
    КонецЦикла;


В планах обмена идет регистрация объектов при получении данных и отправки подчиненному узлу, не думаю что это как-то может повлиять на рост базы.
Ardi
!!! Есть программы которые показывают размер таблиц в базе.
Meest
Цитата(Altair777 @ 20.12.12, 16:36) необходимо зарегистрироваться для просмотра ссылки
Документы каждого вида нужно удалять за период?
Если бы полностью, можно было бы попробовать удалять их на уровне объектов конфигурации, а потом снова сделать объединение с заранее сохраненной конфигурацией.

Я когда-то давно-давно так семерочные базы "свертывал"


Документы все нужно удалить, думаю не правильно будет удалить объекты конфигурации а потом восстановить их.
Ardi
Цитата(Meest @ 20.12.12, 18:22) необходимо зарегистрироваться для просмотра ссылки
думаю не правильно будет удалить объекты конфигурации

Скорее это очень сложно в 8-ке.
Meest
Цитата(Ardi @ 20.12.12, 17:31) необходимо зарегистрироваться для просмотра ссылки
Скорее это очень сложно в 8-ке.


Нет, не сложно. Просто много движений делать нужно, и какая целесообразность такого "удаления"?
Zaval
Цитата(Meest @ 20.12.12, 17:06) необходимо зарегистрироваться для просмотра ссылки
На форме выбираю документы сначала

Перечитайте оба выложенных Вами фрагмента кода. Обратите внимание на взаимное расположение "Справочники" и "Документы".
ЗЫ. Код выполняется сверху вниз.

Цитата(Meest @ 20.12.12, 17:06) необходимо зарегистрироваться для просмотра ссылки
В планах обмена идет регистрация объектов при получении данных и отправки подчиненному узлу, не думаю что это как-то может повлиять на рост базы.


Там регистрируются измененные объекты(в момент изменения!) для передачи этих изменений в другие узлы, причем, запись не одна, а по одной на каждый узел, в который должны быть переданы изменения.
Altair777
Цитата(Meest @ 20.12.12, 17:52) необходимо зарегистрироваться для просмотра ссылки
Нет, не сложно. Просто много движений делать нужно, и какая целесообразность такого "удаления"?


По идее, это должно происходить в разы быстрее. Удаление всей таблицы, а не каждой записи по отдельности.

Кстати, сразу и регистры нужно. Вообще, все удаляемые объекты одним махом, чтобы не было визгов о том, что объект используется.
Ardi
Цитата(Altair777 @ 20.12.12, 19:16) необходимо зарегистрироваться для просмотра ссылки
Кстати, сразу и регистры нужно

Данные бух регистра по документу вроде автоматом почистились.
Meest
Цитата(Zaval @ 20.12.12, 18:04) необходимо зарегистрироваться для просмотра ссылки
Перечитайте оба выложенных Вами фрагмента кода. Обратите внимание на взаимное расположение "Справочники" и "Документы".
ЗЫ. Код выполняется сверху вниз.


Перед открытие получаем список метаданных справочников, документов, регистров. На форме кроме списка наименования есть реквизит типа булева.

Я понимаю что с фрагмента кода видно что сначала берет справочник и по каждому "ид" проверяет, но так как признака истина нет справочники пропускаются.

Цитата(Zaval @ 20.12.12, 18:04) необходимо зарегистрироваться для просмотра ссылки
Там регистрируются измененные объекты(в момент изменения!) для передачи этих изменений в другие узлы, причем, запись не одна, а по одной на каждый узел, в который должны быть переданы изменения.




Попробую отключить регистрацию объектов.
MATEVI
Цитата(Meest @ 20.12.12, 14:23) необходимо зарегистрироваться для просмотра ссылки
База должна быть чистой от документов, справочники и регистры нужны

Сделать свой план обмена - распределенный, в составе указать справочники и регистры сведений (я так понимаю нужны) с учетом ссылок на подчиненные документы. Создать начальный образ.
Отключить главный узел.
Meest
Цитата(MATEVI @ 20.12.12, 22:44) необходимо зарегистрироваться для просмотра ссылки
Сделать свой план обмена - распределенный, в составе указать справочники и регистры сведений (я так понимаю нужны) с учетом ссылок на подчиненные документы. Создать начальный образ.
Отключить главный узел.


У меня она и распределенная, 98 узла. Создание начального образа вещь хорошая, но очень долгая.

Как говорил Zaval отключил регистрацию объектов которые удаляю, удаление поставил в транзакцию, убрал
 Сообщить();
и база перестала "толстеть", за 12 часов удалилось порядком 50 % документов.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.