КЛАДР постепенно отживает своё, ему на смену приходит , да и сама 1с всё больше и больше выходит в интернет за разными данными.
В общем - посмотрел я, и увидел в одной из своих баз полностью загруженный ранее в БП 3.0 КЛАДР (все регионы). Данные из него находятся в регистре сведений "УдалитьАдресныйКлассифиркатор".
И решил я его очистить.
Стандартные методы не сработали (Администрирование - Поддержка и Обслуживание - Адресный классификатор - Очистить адресные сведения). Говорю - "загружать классификатор в программу" (иначе - при "Использовать веб-сервис 1С для ввода и проверки адресов" - кнопка "Очистить" неактивна), нажимаю "Очистить адресные сведения", выбираю любой регион (или все - без разницы), ОК, смотрю на регистр - а он как был, так и остался полон данными.
Ладно, вернул "Использовать веб-сервис 1С для ввода и проверки адресов", попробовал руками поудалять. В общем - так себе занятие.
Ладно, написал обработку, которая считает - сколько записей в этом регистре (у меня получилось более 3.5 миллионов), и очищает его указанными порциями.
Собственно, весь текст обработки - вот он: скрытое
Код:
&НаСервереБезКонтекста
Процедура УдалитьЗаписиНаСервере(УдаляемЗаписей)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 00100
| УдалитьАдресныйКлассификатор.Код
|ИЗ
| РегистрСведений.УдалитьАдресныйКлассификатор КАК УдалитьАдресныйКлассификатор";
СтрокаЗамены = "ВЫБРАТЬ ПЕРВЫЕ "+Формат(УдаляемЗаписей,"ЧЦ=5; ЧДЦ=; ЧВН=; ЧГ=0");
Запрос.Текст = СтрЗаменить(Запрос.Текст,"ВЫБРАТЬ ПЕРВЫЕ 00100",СтрокаЗамены);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
НоваяЗапись = РегистрыСведений.УдалитьАдресныйКлассификатор.СоздатьНаборЗаписей();
НоваяЗапись.Отбор.Код.Установить(ВыборкаДетальныеЗаписи.Код);
НоваяЗапись.Записать();
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура УдалитьЗаписи(Команда)
Если СчетчикЦиклаМаксимум > 0 и УдаляемЗаписей > 0 Тогда
ВремяБыстрое = 0;
СчетчикБыстрый = 0;
ВремяМедленное = 0;
СчетчикМедленный = 0;
ВремяСреднееДо = 0;
ВремяНачала = ТекущаяДата();
Для СчетчикЦикла = 1 по СчетчикЦиклаМаксимум Цикл
ВремяНачалаЦикла = ТекущаяДата();
УдалитьЗаписиНаСервере(УдаляемЗаписей);
ВремяЗавершенияЦикла = ТекущаяДата();
ВремяЦикла = РазностьВремени(ВремяЗавершенияЦикла,ВремяНачалаЦикла);
ВремяСреднееДо = (ВремяЗавершенияЦикла-ВремяНачала)/СчетчикЦикла;
Часов = Цел(ВремяСреднееДо / 3600);
Минут = Цел((ВремяСреднееДо - Часов * 3600) / 60);
Секунд = ВремяСреднееДо - Часов * 3600 - Минут*60;
ВремяСреднее = РазностьВремени(Дата(1,1,1,Часов,Минут,Секунд),Дата(1,1,1,0,0,0));
Если ВремяМедленное = 0 Тогда
ВремяМедленное = ВремяЦикла;
СчетчикМедленный = СчетчикЦикла;
ИначеЕсли ВремяМедленное < ВремяЦикла Тогда
ВремяМедленное = ВремяЦикла;
СчетчикМедленный = СчетчикЦикла;
КонецЕсли;
Если СчетчикЦикла = 1 Тогда
ВремяБыстрое = ВремяЦикла;
СчетчикБыстрый = СчетчикЦикла;
ИначеЕсли ВремяБыстрое > ВремяЦикла Тогда
ВремяБыстрое = ВремяЦикла;
СчетчикБыстрый = СчетчикЦикла;
КонецЕсли;
ВремяЗавершения = ВремяЗавершенияЦикла+((ВремяЗавершенияЦикла-ВремяНачала)/СчетчикЦикла)*(СчетчикЦиклаМаксимум-СчетчикЦикла);
ЭтаФорма.ОбновитьОтображениеДанных();
КонецЦикла;
Иначе
Сообщить("Не заданы параметры");
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПосчитатьЗаписиНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| КОЛИЧЕСТВО(УдалитьАдресныйКлассификатор.Код) КАК Код
|ИЗ
| РегистрСведений.УдалитьАдресныйКлассификатор КАК УдалитьАдресныйКлассификатор";
ВсегоЗаписей = Запрос.Выполнить().Выгрузить()[0][0];
УдаляемЗаписей = 20000;
СчетчикЦиклаМаксимум = Цел(ВсегоЗаписей/УдаляемЗаписей);
Если СчетчикЦиклаМаксимум*УдаляемЗаписей < ВсегоЗаписей Тогда
СчетчикЦиклаМаксимум = СчетчикЦиклаМаксимум+1;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПосчитатьЗаписи(Команда)
ПосчитатьЗаписиНаСервере();
КонецПроцедуры
Функция РазностьВремени(Время1, Время2);
Разность = Время1 - Время2;
Если Разность > 0 Тогда
Часов = Цел(Разность / 3600);
Минут = Цел((Разность - Часов * 3600) / 60);
Секунд = Разность - Часов * 3600 - Минут*60;
Возврат Дата(1, 1, 1, Часов, Минут, Секунд);
Иначе
Возврат Дата(1,1,1,0,0,0);
КонецЕсли;
КонецФункции
Время работы - примерно 2 часа при удаляемой порции в 20'000 записей.
После этого - в конфигураторе обязательно тестирование и исправление с флажком "Сжатие таблиц информационной базы" (я так же ставил "Проверка логической целостоности" и "Проверка ссылочной целостности", что бы убедиться, что не удалил лишнего).
Результат - база "похудела" на 2.3Гб
Сама обработка - во вложении.
И да, я знаю, что здесь, скорее всего надо было использовать механизм "Длительных операций" - но я с ним пока не разбирался.
Вот... А в семерке достаточно было просто файлы из папки ExtDB удалить, если это бухгалтерия, или в случае ЗиК в dd-шнике найти имя dbf-ок, и грохнуть их... Классификатор, тем и отличается от просто справочника, что ссылок на него нет. Данные адресов хранятся просто в строковых полях, а классификаторы используются только для их заполнеия. Потом, можнохоть удалять его, хоть перезаполнять, ссылочная целостность не нарушается.
Конечно, удобно когда вся база в виде одного файла, но, возможностей работы "ломом" значительно меньше... Хотя, есть альтернативные утилиты распаковки/упаковки файла 1CD, но, как-то стремно...
MWWRuza➤ Вот... А в семерке достаточно было просто файлы из папки ExtDB удалить, если это бухгалтерия, или в случае ЗиК в dd-шнике найти имя dbf-ок, и грохнуть их... Классификатор, тем и отличается от просто справочника, что ссылок на него нет. Данные адресов хранятся просто в строковых полях, а классификаторы используются только для их заполнеия. Потом, можнохоть удалять его, хоть перезаполнять, ссылочная целостность не нарушается.
Конечно, удобно когда вся база в виде одного файла, но, возможностей работы "ломом" значительно меньше... Хотя, есть альтернативные утилиты распаковки/упаковки файла 1CD, но, как-то стремно...
Ну да, в SQL-базе тоже всё было бы проще.
Вероятно, можно было бы использовать .
Спасибо за подсказку о сохранении индексной целостности при удалении классификаторов!
Сейчас ещё раз проверил, и увидел такую забавную вещь - да, конечно, база сократилась, но практически и на столько же вырос журнал регистрации (журнал регистрации переведён на новый формат - SQLLite, регистрируется всё - "ошибки, предупреждения, информация, примечания").