Как в 1С 8 быстро удалить все доки (непосредственно не хочу)
Для Инд=1 по Метаданные.Документы.Количество()-1 Цикл
Док=Метаданные.Документы.Получить(Инд);
Всего = 0;
//Сообщить(""+Док.Имя);
НачатьТранзакцию();
Счетчик=0;
Выборка = Документы[Док.Имя].Выбрать();
Пока Выборка.Следующий() Цикл
Всего = Всего + 1;
Счетчик=Счетчик+1;
ВыборкаОбъект = Выборка.ПолучитьОбъект();
ВыборкаОбъект.Удалить();
Состояние(""+Док.Имя+" - "+Всего);
Если Счетчик=300 Тогда
ЗафиксироватьТранзакцию();
НачатьТранзакцию();
Счетчик=0;
КонецЕсли;
КонецЦикла;
Если Всего <> 0 Тогда
Сообщить(""+Док.Имя+" - "+Всего);
КонецЕсли;
КонецЦикла;
ЗафиксироватьТранзакцию();
Показатьсейчас так пробую удалить вообще как долго удаляет один день
По теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
aspiid пишет:
Используйте групповую обработку объектов, не изобретайте велосипед!
Она на диске ИТС находится.
Используйте групповую обработку объектов, не изобретайте велосипед!
Она на диске ИТС находится.
Тоже соглашусь зачем что-то писать, если во всех типовых есть обработка Групповая обработка справочников и документов.
Да ну это ерунда. Если база большая гораздо быстрее будет развернуть чистую базу из cf-ника и перенести нужные объекты с помощью обработки ВыгрузкаЗагрузкаДанныхXML
(13) Нет! Однозначно. И на это несколько причин:
- в базе к сотне пользователей с настроенными правами, настройками своих отчетов и обработок;
- настройки учета;
И прочие "мелочи", типа настройки обменов, синхронизаций, торгового оборудования...
Способ удалять в режиме обмена данными, действительно самый быстрый. Не тратьте время на вывод состояний и сообщений, при нескольких миллионах документов это очень существенно. Выводите сообщения в журнал регистрации, чтоб наблюдать за ходом процесса по журналу. И!!! Не нужно забывать, что при таком удалении останутся движения в регистрах.
- в базе к сотне пользователей с настроенными правами, настройками своих отчетов и обработок;
- настройки учета;
И прочие "мелочи", типа настройки обменов, синхронизаций, торгового оборудования...
Способ удалять в режиме обмена данными, действительно самый быстрый. Не тратьте время на вывод состояний и сообщений, при нескольких миллионах документов это очень существенно. Выводите сообщения в журнал регистрации, чтоб наблюдать за ходом процесса по журналу. И!!! Не нужно забывать, что при таком удалении останутся движения в регистрах.
Для Инд=1 по Метаданные.Документы.Количество()-1 Цикл
Док=Метаданные.Документы.Получить(Инд);
Всего = 0;
//Сообщить(""+Док.Имя);
НачатьТранзакцию();
Счетчик=0;
Выборка = Документы[Док.Имя].Выбрать();
Пока Выборка.Следующий() Цикл
Всего = Всего + 1;
Счетчик=Счетчик+1;
ВыборкаОбъект = Выборка.ПолучитьОбъект();
ВыборкаОбъект.УстановитьПометкуУдаления(Истина);
Состояние(""+Док.Имя+" - "+Всего);
Если Счетчик=300 Тогда
ЗафиксироватьТранзакцию();
НачатьТранзакцию();
Счетчик=0;
КонецЕсли;
КонецЦикла;
Если Всего <> 0 Тогда
Сообщить(""+Док.Имя+" - "+Всего);
КонецЕсли;
КонецЦикла;
ЗафиксироватьТранзакцию(); Показать
Таки не мучайтесь с удалением документов. Воспользуйтесь советом из пятого поста и перегрузить все, что вам от этой базы надо в базу чистую. Выйдет гораздо быстрее
Все эти обработки с ИТС, как правило работают на типовых базах.
Стоит в базу внести свои 5 копеек и все становится сложным.
Обработка по переносу справочников и доков между идентичными базами уже не хочет загружать.
У меня уперлась в то, что у элемента справочника Родитель не проставлен, а этот родитель есть элемент другого справочника, где есть ссылка на элемент третьего, внутри которого первые в наборе. Вот и колечко получилось. Всё !!! обработка в ступоре. Загрузить не может.
Доки удаляю то же самописной обработкой, перебором методанных.
Тут подгялдел про транзакции. Возьму на заметку. А то у меня в натуре, запустил на сутки можно свалить по личнм делам.
База 3 года. Управление торговлей 10.3
в файловом варианте она занимает 10 гиг. в PostgreSQL 18 Гигов.
Большие обемы доков, сразу ломают механизм создание РИБ узла. При создании первоначального образа, база пытается все сразу запихнуть в первоначальный образ. А оперативы на компе не так много. Всего 3 гига. Вот и вылет происходит.
Выкручиваюсь созданием узла из копии с переделкой на узел.
в 77 было хорошо в DBF варианте. файлики чистые подсунул, переиндексировал и все в порядке.
И особо напрягает, что Пользователи созданные в базе, переносятся по узлам только справочные данные. А вот сами пользователи ИБ с паролями не хотят.
Хотя не искал решения.
Стоит в базу внести свои 5 копеек и все становится сложным.
Обработка по переносу справочников и доков между идентичными базами уже не хочет загружать.
У меня уперлась в то, что у элемента справочника Родитель не проставлен, а этот родитель есть элемент другого справочника, где есть ссылка на элемент третьего, внутри которого первые в наборе. Вот и колечко получилось. Всё !!! обработка в ступоре. Загрузить не может.
Доки удаляю то же самописной обработкой, перебором методанных.
Тут подгялдел про транзакции. Возьму на заметку. А то у меня в натуре, запустил на сутки можно свалить по личнм делам.
База 3 года. Управление торговлей 10.3
в файловом варианте она занимает 10 гиг. в PostgreSQL 18 Гигов.
Большие обемы доков, сразу ломают механизм создание РИБ узла. При создании первоначального образа, база пытается все сразу запихнуть в первоначальный образ. А оперативы на компе не так много. Всего 3 гига. Вот и вылет происходит.
Выкручиваюсь созданием узла из копии с переделкой на узел.
в 77 было хорошо в DBF варианте. файлики чистые подсунул, переиндексировал и все в порядке.
И особо напрягает, что Пользователи созданные в базе, переносятся по узлам только справочные данные. А вот сами пользователи ИБ с паролями не хотят.
Хотя не искал решения.
(1) Алгоритм удаления всех документов прост, но есть много нюансов.
Выполнение в транзакции ускоряет, но могут возникнуть межссылочные коллизии.
Часть документов можгут быть в принципе неудаляемые без установки параметра ОбменДанными
Так же ускорит обработка документов в обратной последовательности.
Писал я такую работающую обработку. В принципе можно было бы её тут опубликовать за 1$m но не знаю как это сделать и не понятно надо ли это кому нибудь...
Выполнение в транзакции ускоряет, но могут возникнуть межссылочные коллизии.
Часть документов можгут быть в принципе неудаляемые без установки параметра ОбменДанными
Объект.ОбменДанными.Загрузка = ФлЗагрузкаДанных;
//Действие
Объект.ОбменДанными.Загрузка = Ложь;Так же ускорит обработка документов в обратной последовательности.
Писал я такую работающую обработку. В принципе можно было бы её тут опубликовать за 1$m но не знаю как это сделать и не понятно надо ли это кому нибудь...
Друзья, почему вы указываете Инд=1? Надо Инд=0 , иначе выбор пропустит первый в списке вид документов...
Для Инд=1 по Метаданные.Документы.Количество()-1 Цикл
Док=Метаданные.Документы.Получить(Инд);
Всего = 0;
//Сообщить(""+Док.Имя);
Выборка = Документы[Док.Имя].Выбрать();
Пока Выборка.Следующий() Цикл
Всего = Всего + 1;
ВыборкаОбъект = Выборка.ПолучитьОбъект();
ВыборкаОбъект.УстановитьПометкуУдаления(Истина);
Состояние(""+Док.Имя+" - "+Всего);
КонецЦикла;
Если Всего <> 0 Тогда
Сообщить(""+Док.Имя+" - "+Всего);
КонецЕсли;
КонецЦикла;
Показатьтак метит второй день уже
fantasy2 пишет:
так метит второй день уже
Для Инд=1 по Метаданные.Документы.Количество()-1 Цикл
Док=Метаданные.Документы.Получить(Инд);
Всего = 0;
//Сообщить(""+Док.Имя);
Выборка = Документы[Док.Имя].Выбрать();
Пока Выборка.Следующий() Цикл
Всего = Всего + 1;
ВыборкаОбъект = Выборка.ПолучитьОбъект();
ВыборкаОбъект.УстановитьПометкуУдаления(Истина);
Состояние(""+Док.Имя+" - "+Всего);
КонецЦикла;
Если Всего <> 0 Тогда
Сообщить(""+Док.Имя+" - "+Всего);
КонецЕсли;
КонецЦикла;
Показатьтак метит второй день уже
У вас не используется транзакция, думаю будет намного быстрее, например вот так
Для Инд=1 по Метаданные.Документы.Количество()-1 Цикл
Док=Метаданные.Документы.Получить(Инд);
Всего = 0;
//Сообщить(""+Док.Имя);
НачатьТранзакцию();
Счетчик=0;
Выборка = Документы[Док.Имя].Выбрать();
Пока Выборка.Следующий() Цикл
Всего = Всего + 1;
Счетчик=Счетчик+1;
ВыборкаОбъект = Выборка.ПолучитьОбъект();
ВыборкаОбъект.УстановитьПометкуУдаления(Истина);
Состояние(""+Док.Имя+" - "+Всего);
Если Счетчик=300 Тогда
ЗафиксироватьТранзакцию();
НачатьТранзакцию();
Счетчик=0;
КонецЕсли;
КонецЦикла;
Если Всего <> 0 Тогда
Сообщить(""+Док.Имя+" - "+Всего);
КонецЕсли;
КонецЦикла;
ЗафиксироватьТранзакцию(); Показатьfantasy2 пишет:
Как в 1с 8 быстро удалить все доки (непостредственно не хочу)
если не хочешь, тогда жди...
Как в 1с 8 быстро удалить все доки (непостредственно не хочу)
если документов много, тогда быстрее перенести справочники в новую базу, чем удалять все документы. Например поможет эта обработка ВыгрузкаЗагрузкаДанныхXML81.epf
Все уже написано за нас: в Торговле: сервис\ГрупповаяОбработкаСправочниковИДокументов - установить пометку удаления, долее удалить через Операции
Очень актуальная идея. Помогла для управляемого приложения, так как в обработке "Групповое изменение реквизитов" в отборе список объектов смешан (справочники, документы и др. и отфильтрован по имени), выбирать, что есть документ, что не документ - муторно. Подредактировал для управляемого приложения, добавив реквизиты "НачПериода" и "КонПериода" и сообщение в конце о выполнении.
&НаКлиенте
Процедура ПометитьНаУдалениеДокументы(Команда)
ПометитьНаУдалениеДокументыНаСервере();
КонецПроцедуры
&НаСервере
Процедура ПометитьНаУдалениеДокументыНаСервере()
Для Инд = 1 по Метаданные.Документы.Количество()-1 Цикл
Док = Метаданные.Документы.Получить(Инд);
Всего = 0;
НачатьТранзакцию();
Счетчик = 0;
Выборка = Документы[Док.Имя].Выбрать(Объект.НачПериода, КонецДня(Объект.КонПериода));
Пока Выборка.Следующий() Цикл
Всего = Всего + 1;
Счетчик = Счетчик+1;
ВыборкаОбъект = Выборка.ПолучитьОбъект();
ВыборкаОбъект.УстановитьПометкуУдаления(Истина);
Если Счетчик = 300 Тогда
ЗафиксироватьТранзакцию();
НачатьТранзакцию();
Счетчик = 0;
КонецЕсли;
КонецЦикла;
Если Всего <> 0 Тогда
Сообщить(""+Док.Имя+" - "+Всего);
КонецЕсли;
КонецЦикла;
ЗафиксироватьТранзакцию();
Сообщить("Выполено!");
КонецПроцедуры Показать
Не знаю как и где применить))) думаю стоило-бы для людей не слишком хорошо знающих описать что то типа что надо создать обработку так то так, и пошагово описать все процессы для проверки работы данного кода!
(29) Ну как бы правильно так сказать что бы было понятно, смысла в написании кода без уточнение как и где его вставить тоже наверное не будет хорошим решением!
Если у меня ручки кривые то я наверное этот код добавлю в какой то модуль например общий конфигурации и будет огромный бубин для работы конфы в дальнейшем! Может Вы от части и правы но так Вы дали код механизм которого понятен но не понятно куда его вставлять))) и какой то умник если его вставит или пропишет там где не надо без вазелина уже точно будет не справится)))
Если у меня ручки кривые то я наверное этот код добавлю в какой то модуль например общий конфигурации и будет огромный бубин для работы конфы в дальнейшем! Может Вы от части и правы но так Вы дали код механизм которого понятен но не понятно куда его вставлять))) и какой то умник если его вставит или пропишет там где не надо без вазелина уже точно будет не справится)))
(30)Любой код вставляется в то место, из которого его удобно будет вызывать согласно поставленной задачи.
Изначально же, в данной теме, вопрос стоял об опитимизации операции удаления. Вы предлагает требовать готового под ключ решения от людей, которые бесплатно дают рекомендации на форуме и ничем, собственно, даже не подтверждают свою квалификацию? Рыть решения в интернете на форуме для разработчиков - подразумевает, что либо человек достаточно хорошо владеет предметом, чтобы не просто скопипастить, но и оценить предложенный листинг на предмет рисков и соответствия. Либо достаточно глуп, чтобы запустить первое попавшееся решение в первом попавшемся месте на боевой базе. И вот тут, простите, гранатой может стать что угодно.
Изначально же, в данной теме, вопрос стоял об опитимизации операции удаления. Вы предлагает требовать готового под ключ решения от людей, которые бесплатно дают рекомендации на форуме и ничем, собственно, даже не подтверждают свою квалификацию? Рыть решения в интернете на форуме для разработчиков - подразумевает, что либо человек достаточно хорошо владеет предметом, чтобы не просто скопипастить, но и оценить предложенный листинг на предмет рисков и соответствия. Либо достаточно глуп, чтобы запустить первое попавшееся решение в первом попавшемся месте на боевой базе. И вот тут, простите, гранатой может стать что угодно.
&НаКлиенте
Процедура УдалитьДокументы(Команда)
лДата = ДатаНачинаяСКоторойУдалитьДокументы;
текстЗапроса = ПолучитьТекстЗапросаПовсемДкоументам();
Пока лДата <= КонецМесяца(ТекущаяДата()) Цикл
Состояние("",,лДата);
УдалитьДокументыНаСервере(текстЗапроса,лДата);
лДата = КонецДня(лДата) +1;
КонецЦикла;
КонецПроцедуры
&НаСервереБезКонтекста
Процедура УдалитьДокументыНаСервере(текстЗапроса,дата)
// Вставить содержимое обработчика.
Запрос = Новый Запрос;
Запрос.Текст = текстЗапроса;
Запрос.УстановитьПараметр("ДатаН", НачалоДня(дата));
Запрос.УстановитьПараметр("ДатаК", КонецДня(дата));
рез = Запрос.Выполнить().Выбрать();
Пока рез.Следующий() Цикл
оДок = рез.Ссылка.ПолучитьОбъект();
Если ЛОЖЬ Тогда оДок = Документы.АвансовыйОтчет.СоздатьДокумент(); КонецЕсли;
оДок.ОбменДанными.Загрузка = Истина;
оДок.Удалить();
КонецЦикла;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьТекстЗапросаПоВсемДкоументам()
мИсключения = Новый Массив;
мИсключения.Добавить("УстановкаЦенНоменклатуры");
ТекстЗапроса = "ВЫБРАТЬ * ИЗ (";
ТекстЗапроса = ТекстЗапроса + Символы.ПС + "ВЫБРАТЬ TOP 0 null КАК Ссылка, null КАК Дата";
Для Каждого Док из Метаданные.Документы Цикл
Если мИсключения.Найти(Док.Имя) <> НЕОПРЕДЕЛЕНО Тогда
Продолжить;
КонецЕсли;
ТекстЗапроса = ТекстЗапроса + Символы.ПС
+ "UNION ALL"
+ Символы.ПС
+ "ВЫБРАТЬ Ссылка, Ссылка.Дата ИЗ Документ."+Док.Имя+" ГДЕ Дата >= &ДатаН И Дата <= &ДатаК";
конецЦикла;
ТекстЗапроса = ТекстЗапроса + Символы.ПС
+ ") Т"
+ Символы.ПС
+ "ORDER BY Т.Дата"
;
Возврат ТекстЗапроса;
конецФункции ПоказатьВ функе "ПолучитьТекстЗапросаПоВсемДкоументам" добавляем любые кондиции (по организации или чему угодно)
Если спец знает архитектуру конфигурации - то проще напрямую в СУБД грохнуть таблицы журналов, документов, регистров етц. И скриптом в той же СУБД "почистить" ссылки и прочее, относящееся к удаленным докам. Проблема в том, что у нас спецов не осталось почти, только умеющие пришивать лдевый рукав...
Давайте поделюсь опытом, ни раз уже чистил базы, и с большим количеством документов то же. Вот прямо сейчас чистится база на 700.000 доков. Если мы отметаем какие либо переносы, и нам нужно удалить именно ВСЕ документы по крайней мере ОПРЕДЕЛЕННОГО типа, то:
1) Идете в кофу, сохраняете cf, у нужных видов документов в конфе на вкладке "Движения" все чистите, сохраняете конфу. Далее идете в БД и удаляете любым доступным способом непосредственно доки.
Поверьте, удаляться они будут как ветром вынесло в сравнении с доками с проводками.
2) Конечно же, удалять нужно самописной обработкой, которая удаляет доки непосредственно из базы сразу, без каких либо пометок на удаление.
3) Удалять нужно в обратном порядке, хотя, это скорее актуально при наличии проводок, т.к. чем дальше документ от расчитанных ТА, тем дольше будет происходить удаление, даже непосредственное.
4) Если могете, делайте в обработке пересчет итогов, например каждый месяц. Удалился месяц, итоги пересчитались на конец следующего, и так далее. Либо делайте это ручками: удалили месяц доков, пересчитали все итоги на конец следующего, в котором будете удалять документы и так далее.
Ну и в общем то все. Единственное, тестирование потом может занять продолжительное время, но там если что можно поставить максимальное время выполнения, ставьте на ночь, выставляйте 8-10 часов и вперед, потом если что, продолжите на след. ночь. И да, перед полным тестирование в начале выполням тестирование на сжатие таблиц, потом в SQL, если он есть прогоняем вакуум, а уже потом делаем тестирование полное.
5) Ну и конечно же, SQL все это ускорит, ну или хотя бы положите каталог БД на максимально быстрый диск.
Вот вся моя практика за много лет не первой чистки баз, в том числе и с сотнями тысяч документов.
А, ну и не забудте потом cf обратно залить, а то документы проводок давать не будут :)
Кстати, для наглядности, вот только только: "Время выполнения: 2 505 сек. (мин.: 41,75) ДОКУМЕНТОВ УДАЛЕНО: 61 901". Это без пересчета итогов, несколько типов разом за 2 года. Если прям заморочиться, и удалять помесячно или поквартально с пересчетом, будет быстрее, но надо кнопки тыкать. Мне лень, скорость в целом устраивает, к утру 700.000 уже не будет в базе.
1) Идете в кофу, сохраняете cf, у нужных видов документов в конфе на вкладке "Движения" все чистите, сохраняете конфу. Далее идете в БД и удаляете любым доступным способом непосредственно доки.
Поверьте, удаляться они будут как ветром вынесло в сравнении с доками с проводками.
2) Конечно же, удалять нужно самописной обработкой, которая удаляет доки непосредственно из базы сразу, без каких либо пометок на удаление.
3) Удалять нужно в обратном порядке, хотя, это скорее актуально при наличии проводок, т.к. чем дальше документ от расчитанных ТА, тем дольше будет происходить удаление, даже непосредственное.
4) Если могете, делайте в обработке пересчет итогов, например каждый месяц. Удалился месяц, итоги пересчитались на конец следующего, и так далее. Либо делайте это ручками: удалили месяц доков, пересчитали все итоги на конец следующего, в котором будете удалять документы и так далее.
Ну и в общем то все. Единственное, тестирование потом может занять продолжительное время, но там если что можно поставить максимальное время выполнения, ставьте на ночь, выставляйте 8-10 часов и вперед, потом если что, продолжите на след. ночь. И да, перед полным тестирование в начале выполням тестирование на сжатие таблиц, потом в SQL, если он есть прогоняем вакуум, а уже потом делаем тестирование полное.
5) Ну и конечно же, SQL все это ускорит, ну или хотя бы положите каталог БД на максимально быстрый диск.
Вот вся моя практика за много лет не первой чистки баз, в том числе и с сотнями тысяч документов.
А, ну и не забудте потом cf обратно залить, а то документы проводок давать не будут :)
Кстати, для наглядности, вот только только: "Время выполнения: 2 505 сек. (мин.: 41,75) ДОКУМЕНТОВ УДАЛЕНО: 61 901". Это без пересчета итогов, несколько типов разом за 2 года. Если прям заморочиться, и удалять помесячно или поквартально с пересчетом, будет быстрее, но надо кнопки тыкать. Мне лень, скорость в целом устраивает, к утру 700.000 уже не будет в базе.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот
