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

Опубликовал Юрий Осипов (yuraos) в раздел Администрирование - Чистка базы

Обработка выполняет в цикле удаление объектов частями (партиями), установленного размера. Предназначена для тех случаев, когда число удаляемых объектов велико (десятки-сотни тысяч) и их затруднительно удалить за раз имеющимся средствами. Обработка также удобна для организации регламентных сервисов очистки базы от мусора по расписанию. Имеется возможность запустить обработку на исполнение в указанном интервале времени и закрыть сеанс 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://infostart.ru/public/100580/).
    Без нее будет недоступна возможность рекурсивного удаления объектов (вместе с подчиненными по ссылкам объектами) и
    Соответственно останется один способ удаления объектов - "Удалять процедурой УдалитьОбъекты(...)" (Рис.6), 
     имеющий более низкий "КПД", так как позволяет удалять только те объекты, на которые нет ссылок в базе.

  4. Желательно наличие подсистемы 'ViewValues' (http://infostart.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 файлов поставки).  

Скачать файлы

Наименование Файл Версия Размер
ПартионноеУдалениеОбъектов.rar
.rar 32,97Kb
14.02.12
48
.rar 32,97Kb 48 Скачать
PacketBatches.rar
.rar 1,38Kb
14.02.12
10
.rar 1,38Kb 10 Скачать
SamplsDBF.rar
.rar 1,34Kb
14.02.12
8
.rar 1,34Kb 8 Скачать
SamplsSQL.rar
.rar 1,34Kb
14.02.12
10
.rar 1,34Kb 10 Скачать

См. также

Добавить вознаграждение
Комментарии
1. Юрий Осипов (yuraos) 844 02.02.12 20:09 Сейчас в теме
Если меня спросят,
зачем я это делаю, для чего это надо и где тут логика?

Я отвечу так,
Логика бывет: математической, женской и прикладной
(буду настаивать именно на таком порядке перечисления).
И жизнь как то все больше следует последней.
;)
2. Владимир Макаров (vladimir_makarov) 114 03.02.12 07:47 Сейчас в теме
Ты просто используешь функцию "Удалить()", она работает жёстко и бесконтрольно. А о ссылках на "обречённый" элемент ты подумал? Минус не ставлю, сам разберись.
P.S.: Я подобной гадости ахапку написал, а здесь выкладывать стыдно. Хотя: я подобные бяки стараюсь делать с учётом подчинённости (для спрвочников) и оснований (для документов). При наличии ссылок на объект полагается сообщить о ссылках и спросить: КАЗНИТЬ НЕЛЬЗЯ ПОМИЛОВАТЬ, пусть пользователь имеет возможность поставить запятую! А то потом единственное средство - FoxPro или его аналоги.
3. Юрий Осипов (yuraos) 844 03.02.12 09:07 Сейчас в теме
(2) vladimir_makarov, читай внимательней!
1) В обработке удаление выполняется с контролем ссылочной целостности.
2) В одном из режимов используется не метод объекта Удалить(), например:
Объект.Удалить() 
а системная процедура УдалитьОбъекты(сзОбъекты,ПроверятьСсылки,тзСсылки) со значением параметра ПроверятьСсылки=1.
--------------------------------
Описание из синтакс-помошника:
УдалитьОбъекты(<?>,,);
Синтаксис:
УдалитьОбъекты(<Объекты>,<Проверять>,<Ссылки>)
Назначение:
Удаляет объекты, переданные в списке значений.
Параметры:
<Объекты> - конкретное значение объекта или значение типа ''СписокЗначений'', в котором данной процедуре передаются объекты, которые надо удалить.
<Проверять> - необязательный параметр. Число: 1 - перед удалением проверяется, нет ли ссылок на удаляемый объект. Если есть, то объект не удаляется, а ссылки помещаются в таблицу значений <Ссылки>. Любое другое число - проверку не выполнять. Значение по умолчанию: 0.
<Ссылки> - Необязательный параметр. Идентификатор объекта типа ''ТаблицаЗначений'', в который данная процедура помещает найденные ссылки на объекты. Таблица значений состоит из 3 колонок: 1. объект на который ссылаются; 2. объект, который содержит ссылку; 3. комментарий к ссылке.

3) В другом режиме используется обработка ObjectsCleaner, которая жестко проверяет возможность удаления по всему дереву подчиненных по ссылкам объектов.
4) Данная обработка предназначена для удаления БОЛЬШОГО количества мусора в базе, который однозначно требуется вычистить (например после обрезания базы). Если нужно пользователя спрашивать "КАЗНИТЬ или МИЛОВАТЬ", то на этот случай есть та же обработка ObjectsCleaner(не в автоматическом режиме).
----
ЗЫ
минус тебе тоже не ставлю.
;)
4. Igor (balgarin) 09.03.12 21:42 Сейчас в теме
нормальная вещь, помогает когда оперативки мало