Как в 1С 8 быстро удалить все доки (непосредственно не хочу)
Для Инд=1 по Метаданные.Документы.Количество()-1 Цикл
Док=Метаданные.Документы.Получить(Инд);
Всего = 0;
//Сообщить(""+Док.Имя);
НачатьТранзакцию();
Счетчик=0;
Выборка = Документы[Док.Имя].Выбрать();
Пока Выборка.Следующий() Цикл
Всего = Всего + 1;
Счетчик=Счетчик+1;
ВыборкаОбъект = Выборка.ПолучитьОбъект();
ВыборкаОбъект.Удалить();
Состояние(""+Док.Имя+" - "+Всего);
Если Счетчик=300 Тогда
ЗафиксироватьТранзакцию();
НачатьТранзакцию();
Счетчик=0;
КонецЕсли;
КонецЦикла;
Если Всего <> 0 Тогда
Сообщить(""+Док.Имя+" - "+Всего);
КонецЕсли;
КонецЦикла;
ЗафиксироватьТранзакцию();
Показатьсейчас так пробую удалить вообще как долго удаляет один день
По теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
aspiid пишет:
Используйте групповую обработку объектов, не изобретайте велосипед!
Она на диске ИТС находится.
Используйте групповую обработку объектов, не изобретайте велосипед!
Она на диске ИТС находится.
Тоже соглашусь зачем что-то писать, если во всех типовых есть обработка Групповая обработка справочников и документов.
Для Инд=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 по Метаданные.Документы.Количество()-1 Цикл
Док=Метаданные.Документы.Получить(Инд);
Всего = 0;
//Сообщить(""+Док.Имя);
Выборка = Документы[Док.Имя].Выбрать();
Пока Выборка.Следующий() Цикл
Всего = Всего + 1;
ВыборкаОбъект = Выборка.ПолучитьОбъект();
ВыборкаОбъект.УстановитьПометкуУдаления(Истина);
Состояние(""+Док.Имя+" - "+Всего);
КонецЦикла;
Если Всего <> 0 Тогда
Сообщить(""+Док.Имя+" - "+Всего);
КонецЕсли;
КонецЦикла;
Показатьтак метит второй день уже
fantasy2 пишет:
так метит второй день уже
Для Инд=1 по Метаданные.Документы.Количество()-1 Цикл
Док=Метаданные.Документы.Получить(Инд);
Всего = 0;
//Сообщить(""+Док.Имя);
Выборка = Документы[Док.Имя].Выбрать();
Пока Выборка.Следующий() Цикл
Всего = Всего + 1;
ВыборкаОбъект = Выборка.ПолучитьОбъект();
ВыборкаОбъект.УстановитьПометкуУдаления(Истина);
Состояние(""+Док.Имя+" - "+Всего);
КонецЦикла;
Если Всего <> 0 Тогда
Сообщить(""+Док.Имя+" - "+Всего);
КонецЕсли;
КонецЦикла;
Показатьтак метит второй день уже
У вас не используется транзакция, думаю будет намного быстрее, например вот так
Для Инд=1 по Метаданные.Документы.Количество()-1 Цикл
Док=Метаданные.Документы.Получить(Инд);
Всего = 0;
//Сообщить(""+Док.Имя);
НачатьТранзакцию();
Счетчик=0;
Выборка = Документы[Док.Имя].Выбрать();
Пока Выборка.Следующий() Цикл
Всего = Всего + 1;
Счетчик=Счетчик+1;
ВыборкаОбъект = Выборка.ПолучитьОбъект();
ВыборкаОбъект.УстановитьПометкуУдаления(Истина);
Состояние(""+Док.Имя+" - "+Всего);
Если Счетчик=300 Тогда
ЗафиксироватьТранзакцию();
НачатьТранзакцию();
Счетчик=0;
КонецЕсли;
КонецЦикла;
Если Всего <> 0 Тогда
Сообщить(""+Док.Имя+" - "+Всего);
КонецЕсли;
КонецЦикла;
ЗафиксироватьТранзакцию();
Показать
Очень актуальная идея. Помогла для управляемого приложения, так как в обработке "Групповое изменение реквизитов" в отборе список объектов смешан (справочники, документы и др. и отфильтрован по имени), выбирать, что есть документ, что не документ - муторно. Подредактировал для управляемого приложения, добавив реквизиты "НачПериода" и "КонПериода" и сообщение в конце о выполнении.
&НаКлиенте
Процедура ПометитьНаУдалениеДокументы(Команда)
ПометитьНаУдалениеДокументыНаСервере();
КонецПроцедуры
&НаСервере
Процедура ПометитьНаУдалениеДокументыНаСервере()
Для Инд = 1 по Метаданные.Документы.Количество()-1 Цикл
Док = Метаданные.Документы.Получить(Инд);
Всего = 0;
НачатьТранзакцию();
Счетчик = 0;
Выборка = Документы[Док.Имя].Выбрать(Объект.НачПериода, КонецДня(Объект.КонПериода));
Пока Выборка.Следующий() Цикл
Всего = Всего + 1;
Счетчик = Счетчик+1;
ВыборкаОбъект = Выборка.ПолучитьОбъект();
ВыборкаОбъект.УстановитьПометкуУдаления(Истина);
Если Счетчик = 300 Тогда
ЗафиксироватьТранзакцию();
НачатьТранзакцию();
Счетчик = 0;
КонецЕсли;
КонецЦикла;
Если Всего <> 0 Тогда
Сообщить(""+Док.Имя+" - "+Всего);
КонецЕсли;
КонецЦикла;
ЗафиксироватьТранзакцию();
Сообщить("Выполено!");
КонецПроцедуры
Показать
(29) Ну как бы правильно так сказать что бы было понятно, смысла в написании кода без уточнение как и где его вставить тоже наверное не будет хорошим решением!
Если у меня ручки кривые то я наверное этот код добавлю в какой то модуль например общий конфигурации и будет огромный бубин для работы конфы в дальнейшем! Может Вы от части и правы но так Вы дали код механизм которого понятен но не понятно куда его вставлять))) и какой то умник если его вставит или пропишет там где не надо без вазелина уже точно будет не справится)))
Если у меня ручки кривые то я наверное этот код добавлю в какой то модуль например общий конфигурации и будет огромный бубин для работы конфы в дальнейшем! Может Вы от части и правы но так Вы дали код механизм которого понятен но не понятно куда его вставлять))) и какой то умник если его вставит или пропишет там где не надо без вазелина уже точно будет не справится)))
(30)Любой код вставляется в то место, из которого его удобно будет вызывать согласно поставленной задачи.
Изначально же, в данной теме, вопрос стоял об опитимизации операции удаления. Вы предлагает требовать готового под ключ решения от людей, которые бесплатно дают рекомендации на форуме и ничем, собственно, даже не подтверждают свою квалификацию? Рыть решения в интернете на форуме для разработчиков - подразумевает, что либо человек достаточно хорошо владеет предметом, чтобы не просто скопипастить, но и оценить предложенный листинг на предмет рисков и соответствия. Либо достаточно глуп, чтобы запустить первое попавшееся решение в первом попавшемся месте на боевой базе. И вот тут, простите, гранатой может стать что угодно.
Изначально же, в данной теме, вопрос стоял об опитимизации операции удаления. Вы предлагает требовать готового под ключ решения от людей, которые бесплатно дают рекомендации на форуме и ничем, собственно, даже не подтверждают свою квалификацию? Рыть решения в интернете на форуме для разработчиков - подразумевает, что либо человек достаточно хорошо владеет предметом, чтобы не просто скопипастить, но и оценить предложенный листинг на предмет рисков и соответствия. Либо достаточно глуп, чтобы запустить первое попавшееся решение в первом попавшемся месте на боевой базе. И вот тут, простите, гранатой может стать что угодно.
&НаКлиенте
Процедура УдалитьДокументы(Команда)
лДата = ДатаНачинаяСКоторойУдалитьДокументы;
текстЗапроса = ПолучитьТекстЗапросаПовсемДкоументам();
Пока лДата <= КонецМесяца(ТекущаяДата()) Цикл
Состояние("",,лДата);
УдалитьДокументыНаСервере(текстЗапроса,лДата);
лДата = КонецДня(лДата) +1;
КонецЦикла;
КонецПроцедуры
&НаСервереБезКонтекста
Процедура УдалитьДокументыНаСервере(текстЗапроса,дата)
// Вставить содержимое обработчика.
Запрос = Новый Запрос;
Запрос.Текст = текстЗапроса;
Запрос.УстановитьПараметр("ДатаН", НачалоДня(дата));
Запрос.УстановитьПараметр("ДатаК", КонецДня(дата));
рез = Запрос.Выполнить().Выбрать();
Пока рез.Следующий() Цикл
оДок = рез.Ссылка.ПолучитьОбъект();
Если ЛОЖЬ Тогда оДок = Документы.АвансовыйОтчет.СоздатьДокумент(); КонецЕсли;
оДок.ОбменДанными.Загрузка = Истина;
оДок.Удалить();
КонецЦикла;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьТекстЗапросаПоВсемДкоументам()
мИсключения = Новый Массив;
мИсключения.Добавить("УстановкаЦенНоменклатуры");
ТекстЗапроса = "ВЫБРАТЬ * ИЗ (";
ТекстЗапроса = ТекстЗапроса + Символы.ПС + "ВЫБРАТЬ TOP 0 null КАК Ссылка, null КАК Дата";
Для Каждого Док из Метаданные.Документы Цикл
Если мИсключения.Найти(Док.Имя) <> НЕОПРЕДЕЛЕНО Тогда
Продолжить;
КонецЕсли;
ТекстЗапроса = ТекстЗапроса + Символы.ПС
+ "UNION ALL"
+ Символы.ПС
+ "ВЫБРАТЬ Ссылка, Ссылка.Дата ИЗ Документ."+Док.Имя+" ГДЕ Дата >= &ДатаН И Дата <= &ДатаК";
конецЦикла;
ТекстЗапроса = ТекстЗапроса + Символы.ПС
+ ") Т"
+ Символы.ПС
+ "ORDER BY Т.Дата"
;
Возврат ТекстЗапроса;
конецФункции
ПоказатьВ функе "ПолучитьТекстЗапросаПоВсемДкоументам" добавляем любые кондиции (по организации или чему угодно)
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот