Обработка "Партионное удаление объектов" для 1С:Предприятие-7.7


Обработка выполняет в цикле удаление объектов частями (партиями), установленного размера. Предназначена для тех случаев, когда число удаляемых объектов велико (десятки-сотни тысяч) и их затруднительно удалить за раз имеющимся средствами. Обработка также удобна для организации регламентных сервисов очистки базы от мусора по расписанию. Имеется возможность запустить обработку на исполнение в указанном интервале времени и закрыть сеанс 1С по истечению времени завершения.

Курочка по зернышку клюет ...
... а цыплят по осени считает. 
народная каламбурность.

Данная обработка сделана на основе обработки !РасчисткаКонтрагентов.ert, описанной в статье
"Обработка ObjectsCleaner ("Поиск ссылок и удаление объектов") для 1С:Предприятие-77."
в примере использования в “автоматическом” режиме.

ВНИМАНИЕ!!! Предлагаемая обработка является потенциально опасной. 
ИСПОЛЬЗОВАТЬ ЕЁ СЛЕДУЕТ С ОСТОРОЖНОСТЬЮ!
Всю ответственность за возможную потерю данных несёт пользователь запустивший обработку. 

  

Требования:

  1. Желательно наличие внешних компонент:
    1. Внешняя компонента 1CPP.dll (http://www.1cpp.ru/index.php/Download).
      Без 1CPP.dll будут не доступны прямые запросы к базе данных для выборки объектов для удаления.
       Соответственно останется одна возможность формирования списка объектов для удаления (Рис.5):
      - Выбор всех помеченные на удаление объектов функцией НайтиПомеченныеНаУдаление(...);
    2. Внешняя компонента FormEx.dll (http://www.dorex.pro/?download), или ее ядро в составе 1CPP.dll.
      - В обработке для выборов из меню используется объект 'Сервис'. Если объект 'Сервис' создать не удается
      используются "запасной" вариант выбора из меню через 'СписокЗначений'.
      - Также используется объект "РасширениеФормы" для запуска обработчиков ожидания, выполняющих следующие функции:
      1. возврат назад фокуса ввода в поле ввода времени, если там введено не правильное значение;
      2. обновление (раз в 60 секунд) надписи с временем выполнения текущего цикла при выполнении обработки.
      3. обновление (раз в 60 секунд) надписи с текущим временем при выполнении обработки.
      Без FormEx.dll функции 1. и 2. не работают. Функция 3. работает не по таймеру, а при завершении очередного цикла обработки.

    Если обработка используется как внешняя, специально загружать ВК не требуется. Достаточно разместить файлы библиотек
    в одном каталоге с обработкой. При необходимости она загрузит их при открытии формы.
  2. Для красоты в интерфейсе обработки также желательно иметь в конфигурации КОП 'Общие.Форма.Привязка' -
    - класс определенный пользователем, управляющий привязками в диалоге формы обработки
    (Автор: Дмитрий Ощепков mailto:dmitro-75@mail.ru).
      Если экземпляр класса не удается создать, в форме обработки не работают привязки элементов диалога.
    Для работы класса обязательно требуется ВК FormEx.dll !!!

  3. Желательно наличие последней версии обработки 'ObjectsCleaner' (http://avprog.ru/public/100580/).
    Без нее будет недоступна возможность рекурсивного удаления объектов (вместе с подчиненными по ссылкам объектами) и
    Соответственно останется один способ удаления объектов - "Удалять процедурой УдалитьОбъекты(...)" (Рис.6), 
     имеющий более низкий "КПД", так как позволяет удалять только те объекты, на которые нет ссылок в базе.

  4. Желательно наличие подсистемы 'ViewValues' (http://avprog.ru/public/97707/)
     для удобного просмотра списка объектов для удаления и списка неудаляемых объектов (Рис.9 и Рис.13).
    Без этой подсистемы просмотр осуществляется методом :ВыбратьСтроку(...) объекта 'СписокЗначений';

 

Описание файлов поставки :

  1. ПартионноеУдалениеОбъектов.rar - предлагаемая вниманию читателя обработка;
  2. SamplsDBF.rar –архив с примерами настроек очистки объектов для базы в формате DBF, содержит файлы:
    • \..\SamplsDBF\dbf_настройки_очистки_документов.prm    - настройка очистки помеченных на удаление документов, определенных видов (универсальная);   
    • \..\SamplsDBF\dbf_настройки_очистки_контрагентов.prm  - настройка очистки помеченных на удаление контрагентов (для ТиС-7.7);
  3. SamplsSQL.rar –архив с примерами настроек очистки объектов для базы в формате SQL, содержит файлы:   
    • \..\SamplsSQL\sql_настройки_очистки_документов.prm    - настройка очистки помеченных на удаление документов, определенных видов (универсальная);
    • \..\SamplsSQL\sql_настройки_очистки_контрагентов.prm  - настройка очистки помеченных на удаление контрагентов (для ТиС-7.7); 
  4. SamplsSQL.rar –архив с примерами настроек очистки объектов для базы в формате SQL, содержит файлы: текстовый файл !Глобальник.txt с примером программного кода 1С, обеспечивающий при начале работы исполнение кода из внешних файлов.
  5. 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                 - настройки запуска конфигуратора в пакетном режиме;   

Возможности:

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) Поскольку параметры обработки могут быть довольно сложными
(могут содержать текст запроса и текст модуля для инициализации его параметров)
 в диалоге предусмотрены кнопки, для сохранения параметров во внешний файл и загрузки параметров из внешнего файла. 

Назначение:

  1. Расчистка базы данных от мусора, появляющегося в двух случаях:
  2.     - при работе пользователей (особенно в запущенной ситуации);

        - после "обрезания" базы данных при массовом удалении документов в обрезаемом периоде;

  3. Организация регламентных сервисов для регулярной очистки базы в автоматическом режиме.

Вариант реализации регламентного сервиса по очистке базы от помеченных объектов:

С помощью планировщика заданий 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 файлов поставки).  

Файлы обработки:

-