gifts2017

Обработка "Партионное удаление объектов" для 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
47
.rar 32,97Kb 47 Скачать
PacketBatches.rar
.rar 1,38Kb
14.02.12
9
.rar 1,38Kb 9 Скачать
SamplsDBF.rar
.rar 1,34Kb
14.02.12
7
.rar 1,34Kb 7 Скачать
SamplsSQL.rar
.rar 1,34Kb
14.02.12
9
.rar 1,34Kb 9 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

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

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