Курочка по зернышку клюет ...
... а цыплят по осени считает.
народная каламбурность.
Данная обработка сделана на основе обработки !РасчисткаКонтрагентов.ert, описанной в статье
"Обработка ObjectsCleaner ("Поиск ссылок и удаление объектов") для 1С:Предприятие-77."
в примере использования в “автоматическом” режиме.
ВНИМАНИЕ!!! Предлагаемая обработка является потенциально опасной.
ИСПОЛЬЗОВАТЬ ЕЁ СЛЕДУЕТ С ОСТОРОЖНОСТЬЮ!
Всю ответственность за возможную потерю данных несёт пользователь запустивший обработку.
Требования:
- Желательно наличие внешних компонент:
-
Внешняя компонента 1CPP.dll (http://www.1cpp.ru/index.php/Download).
Без 1CPP.dll будут не доступны прямые запросы к базе данных для выборки объектов для удаления.
Соответственно останется одна возможность формирования списка объектов для удаления (Рис.5):
- Выбор всех помеченные на удаление объектов функцией НайтиПомеченныеНаУдаление(...); - Внешняя компонента FormEx.dll (http://www.dorex.pro/?download), или ее ядро в составе 1CPP.dll.
- В обработке для выборов из меню используется объект 'Сервис'. Если объект 'Сервис' создать не удается
используются "запасной" вариант выбора из меню через 'СписокЗначений'.
- Также используется объект "РасширениеФормы" для запуска обработчиков ожидания, выполняющих следующие функции:
- возврат назад фокуса ввода в поле ввода времени, если там введено не правильное значение;
- обновление (раз в 60 секунд) надписи с временем выполнения текущего цикла при выполнении обработки.
- обновление (раз в 60 секунд) надписи с текущим временем при выполнении обработки.
- Для красоты в интерфейсе обработки также желательно иметь в конфигурации КОП 'Общие.Форма.Привязка' -
- класс определенный пользователем, управляющий привязками в диалоге формы обработки
(Автор: Дмитрий Ощепков mailto:dmitro-75@mail.ru).
Если экземпляр класса не удается создать, в форме обработки не работают привязки элементов диалога.
Для работы класса обязательно требуется ВК FormEx.dll !!!
- Желательно наличие последней версии обработки 'ObjectsCleaner' (//infostart.ru/public/100580/).
Без нее будет недоступна возможность рекурсивного удаления объектов (вместе с подчиненными по ссылкам объектами) и
Соответственно останется один способ удаления объектов - "Удалять процедурой УдалитьОбъекты(...)" (Рис.6),
имеющий более низкий "КПД", так как позволяет удалять только те объекты, на которые нет ссылок в базе.
- Желательно наличие подсистемы 'ViewValues' (//infostart.ru/public/97707/)
для удобного просмотра списка объектов для удаления и списка неудаляемых объектов (Рис.9 и Рис.13).
Без этой подсистемы просмотр осуществляется методом :ВыбратьСтроку(...) объекта 'СписокЗначений';
в одном каталоге с обработкой. При необходимости она загрузит их при открытии формы.
Описание файлов поставки :
- ПартионноеУдалениеОбъектов.rar - предлагаемая вниманию читателя обработка;
- SamplsDBF.rar –архив с примерами настроек очистки объектов для базы в формате DBF, содержит файлы:
- \..\SamplsDBF\dbf_настройки_очистки_документов.prm - настройка очистки помеченных на удаление документов, определенных видов (универсальная);
- \..\SamplsDBF\dbf_настройки_очистки_контрагентов.prm - настройка очистки помеченных на удаление контрагентов (для ТиС-7.7);
- SamplsSQL.rar –архив с примерами настроек очистки объектов для базы в формате SQL, содержит файлы:
- \..\SamplsSQL\sql_настройки_очистки_документов.prm - настройка очистки помеченных на удаление документов, определенных видов (универсальная);
- \..\SamplsSQL\sql_настройки_очистки_контрагентов.prm - настройка очистки помеченных на удаление контрагентов (для ТиС-7.7);
- SamplsSQL.rar –архив с примерами настроек очистки объектов для базы в формате SQL, содержит файлы: текстовый файл !Глобальник.txt с примером программного кода 1С, обеспечивающий при начале работы исполнение кода из внешних файлов.
- PacketBatches.rar – примеры пакетных файлов для запуска 1С для тестирования базы в конфигураторе и для автоматического запуска предлагаемой обработки при начале работы системы, содержит файлы:
- \..\PacketBatches\1C77clear_objects.bat - запуск 1С:Предприятие-7.7 с передачей на исполнение при начале работы имени файла со скриптом на встроенном языке 1С;
- \..\PacketBatches\ScriptOnStart.prm - пример скрипта для расчистки справочника "Контрагенты" (для ТиС-7.7), с использованием предлагаемой обработки;
- \..\PacketBatches\!Глобальник.txt - пример реализации выполнения скрипта на языке 1С из внешнего файла при начале работы системы;
- \..\PacketBatches\TestIB.bat - запуск 1С:Конфигуратора-7.7 в пакетном режиме для выполнения тестирования базы;
- \..\PacketBatches\TestIB.prm - настройки запуска конфигуратора в пакетном режиме;
- \..\PacketBatches\1C77clear_objects.bat - запуск 1С:Предприятие-7.7 с передачей на исполнение при начале работы имени файла со скриптом на встроенном языке 1С;
Возможности:
1) Обработка осуществляет удаление объектов из списка порциями, установленного размера (в штуках) .
Удаление осуществляется с контролем ссылочной целостности.2) Имеется две возможность ограничения продолжительности циклов обработки объектов:
- по времени (может использоваться в регламентных сервисах);
- по числу циклов (может использоваться для подбора оптимального размера порции удаления);после прерывания обработки, есть возможность продолжения обработки текущего списка объектов без его перезаполнения (Рис.10).
3) Список объектов для удаления может быть сформирован двумя способами:
- Выборкой всех помеченных на удаление объектов в базе функцией НайтиПомеченныеНаУдаление(...) (Рис.3 и Рис.4);
- Прямым запросом, при их доступности (Рис.1 и Рис.2):
Для этого требуется задать текст запроса на языке SQL. Если в тексте запроса используются параметры,
то еще задать текст модуля для инициализации параметров на встроенном языке 1С
(объект для выполнения запроса доступен через переменную под именем 'Запрос',
фрагмент кода в конце обязательно должен возвращать число > 0 - признак успешного завершения);
НАПРИМЕР:
Текст запроса (для базы формата SQL):
/*-------------------------------------------*/
SELECT
Жур.DATE_TIME_IDDOC
, Жур.IDDOC as [Объект$Документ]
, Жур.IDDOCDEF as Объект_вид
FROM _1SJOURN AS Жур (NOLOCK)
WHERE (1=1)
AND (Жур.ISMARK=1)
AND (Жур.DATE_TIME_IDDOC<=:ВыбДата~)
AND (Жур.$ОбщийРеквизит.Фирма=:ВыбФирма)
AND (Жур.IDDOCDEF IN (
$ВидДокумента.Реализация
, $ВидДокумента.РеализацияРозница
, $ВидДокумента.СчетФактураВыданный
, $ВидДокумента.ПКО
, $ВидДокумента.РКО
))
ORDER BY Жур.DATE_TIME_IDDOC
Текст для инициализации параметров запроса:
//---------------------------------------------
СпрФирмы=СоздатьОбъект("Справочник.Фирмы");
СпрФирмы.НайтиПоКоду("00001",2);
Запрос.УстановитьТекстовыйПараметр("ВыбФирма",СпрФирмы.ТекущийЭлемент());
Запрос.УстановитьТекстовыйПараметр("ВыбДата",'31.12.2011');Возврат 1;
4) В обработке есть два способа удаления объектов:
- "Удалять процедурой УдалитьОбъекты(...)" (Рис.2, Рис.4 и Рис.12);
Удаляются только те объекты, на которые в базе нет ссылок. Рекурсивное удаление подчиненных объектов не поддерживается.
- Удалять объекты обработкой 'ObjectsCleaner', если последняя имеется в наличии (Рис.1, Рис.3 и Рис.11).
Объекты удаляются рекурсивно (включая подчиненные по ссылкам объекты), если не превышены установленные ограничения
для дерева подчиненности на число уровней и количество ссылок на один объект и все объекты удовлетворяют установленному
флагами "Удалять непроведенные" и "Удалять не помеченные ?" режиму контроля возможности удаления.
По умолчанию можно удалять только помеченные на удаление объекты.
5) Ссылки объекты, которые не удалось удалить из-за контроля ссылочной целосности, помещаются в список "неудаляемых" объектов, для исключения их повторной обработки.
При добавлении значений в этот список, он одновременно сохраняется во внешнем файле и считывается оттуда при открытии.
Таким образом обеспечивается использование одного общего списка "неудаляемых" объектов в нескольких сеансах обработки.
6) По ходу выполнения обработка выводит в диалоге статистику выполнения удаления объектов (Рис.11 и Рис.12), а также пишет флаги логов (Рис.8):
- CleanObj1_Common.log (общая информация);
- CleanObj2_Delete.log (информация об удаленных объектах);
- CleanObj3_NotDel.log (информация о неудаленных объектах);
- CleanObj4_Blockd.log (информация о заблокированных объектах);
7) Обработка может быть открыта для исполнения в автоматическом режиме с передачей необходимых параметров
через параметр формы в двух вариантах:
- без показа диалога обработки (параметр ВыполнятьПриОткрытии>0);
- с показом диалога и его закрытием по завершении (параметр ВыполнятьПриОткрытии<0);
Последний вариант доступен при наличии ВК FormEx.dll, так как используется событие ПослеОткрытия(), обеспечиваемое этой ВК.
В диалоге обработки имеется кнопка (Рис.7), при нажатии на которую в текстовом документе формируется
фрагмент кода на встроенном языке 1С, открывающий обработку для автоматического выполнения
с выбранными на текущий момент в диалоге параметрами.
8) Поскольку параметры обработки могут быть довольно сложными
(могут содержать текст запроса и текст модуля для инициализации его параметров)
в диалоге предусмотрены кнопки, для сохранения параметров во внешний файл и загрузки параметров из внешнего файла.
Назначение:
- Расчистка базы данных от мусора, появляющегося в двух случаях:
- Организация регламентных сервисов для регулярной очистки базы в автоматическом режиме.
- при работе пользователей (особенно в запущенной ситуации);
- после "обрезания" базы данных при массовом удалении документов в обрезаемом периоде;
Вариант реализации регламентного сервиса по очистке базы от помеченных объектов:
С помощью планировщика заданий Windows по расписанию запускать 1С с особой строкой запуска.
Смотрите пример из файла \..\PacketBatches\1C77clear_objects.bat (расчистка справочника "Контрагенты" для конфигурации ТиС-7.7).
В строке запуска наряду со стандартными параметрами указывался ещё один дополнительный - /S.
Через него в 1С передаётся имя файла со скриптом на языке 1С для исполнения при начале работы системы.
Код скрипта можно сформировать в обработке кнопкой "Сгенерить скрипт" (Рис.7).
Пример кода в файле \..\PacketBatches\ScriptOnStart.prm.
В сеансе 1С при начале работы значение этого параметра можно считать с помощью объектов:
- "Сервис" (поставляется ВК FormEx.dll): КоманднаяСтрока1С = Сервис.КоманднаяСтрока();
- "Информатор" (поставляется ВК 1CPP.dll): КоманднаяСтрока1С = Информатор.КоманднаяСтрока();
Если существует файл с переданным через параметр /S именем, то код скрипта из него можно считать объектом "Текст" и выполнить с помощью объекта “ВыполняемыйМодуль” (поставляется ВК 1CPP.dll).
Пример реализации этого механизма смотрите в файле \..\PacketBatches.rar \! Глобальник.txt.
До и после масштабных чисток данных для копии базы в конфигураторе следует
выполнить тестирование в пакетном режиме с записью лога
(командный файл TestIB.bat и файл с параметрами TestIB.prm из архива PacketBatches.rar файлов поставки).