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

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

 

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

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

В строке запуска наряду со стандартными параметрами указывался ещё один дополнительный — /S.
Через него в 1С передаётся имя файла со скриптом на языке 1С для исполнения при начале работы системы.
Код скрипта можно сформировать в обработке кнопкой «Сгенерить скрипт» (Рис.7).
Пример кода в файле ..PacketBatchesScriptOnStart.prm.

В сеансе 1С при начале работы значение этого параметра можно считать с помощью объектов:
     — «Сервис» (поставляется ВК FormEx.dll):       КоманднаяСтрока1С = Сервис.КоманднаяСтрока();
     — «Информатор» (поставляется ВК 1CPP.dll):   КоманднаяСтрока1С = Информатор.КоманднаяСтрока();
Если существует файл с переданным через параметр /S именем, то код скрипта из него можно считать объектом «Текст» и выполнить с помощью объекта “ВыполняемыйМодуль” (поставляется ВК 1CPP.dll).
Пример реализации этого механизма смотрите в файле ..PacketBatches.rar ! Глобальник.txt.

До и после масштабных чисток данных для копии базы в конфигураторе следует
выполнить тестирование в пакетном режиме с записью лога
(командный файл TestIB.bat и файл с параметрами TestIB.prm из архива PacketBatches.rar файлов поставки).  

4 Comments

  1. yuraos

    Если меня спросят,

    зачем я это делаю, для чего это надо и где тут логика?

    Я отвечу так,

    Логика бывет: математической, женской и прикладной

    (буду настаивать именно на таком порядке перечисления).

    И жизнь как то все больше следует последней.

    😉

    Reply
  2. vladimir_makarov

    Ты просто используешь функцию «Удалить()», она работает жёстко и бесконтрольно. А о ссылках на «обречённый» элемент ты подумал? Минус не ставлю, сам разберись.

    P.S.: Я подобной гадости ахапку написал, а здесь выкладывать стыдно. Хотя: я подобные бяки стараюсь делать с учётом подчинённости (для спрвочников) и оснований (для документов). При наличии ссылок на объект полагается сообщить о ссылках и спросить: КАЗНИТЬ НЕЛЬЗЯ ПОМИЛОВАТЬ, пусть пользователь имеет возможность поставить запятую! А то потом единственное средство — FoxPro или его аналоги.

    Reply
  3. yuraos

    (2) vladimir_makarov, читай внимательней!

    1) В обработке удаление выполняется с контролем ссылочной целостности.

    2) В одном из режимов используется не метод объекта Удалить(), например:

    Объект.Удалить() 

    а системная процедура УдалитьОбъекты(сзОбъекты,ПроверятьСсылки,тзСсылки) со значением параметра ПроверятьСсылки=1.

    ———————————

    Описание из синтакс-помошника:

    УдалитьОбъекты(<?>,,);

    Синтаксис:

    УдалитьОбъекты(<Объекты>,<Проверять>,<Ссылки>)

    Назначение:

    Удаляет объекты, переданные в списке значений.

    Параметры:

    <Объекты> — конкретное значение объекта или значение типа »СписокЗначений», в котором данной процедуре передаются объекты, которые надо удалить.

    <Проверять> — необязательный параметр. Число: 1 — перед удалением проверяется, нет ли ссылок на удаляемый объект. Если есть, то объект не удаляется, а ссылки помещаются в таблицу значений <Ссылки>. Любое другое число — проверку не выполнять. Значение по умолчанию: 0.

    <Ссылки> — Необязательный параметр. Идентификатор объекта типа »ТаблицаЗначений», в который данная процедура помещает найденные ссылки на объекты. Таблица значений состоит из 3 колонок: 1. объект на который ссылаются; 2. объект, который содержит ссылку; 3. комментарий к ссылке.

    3) В другом режиме используется обработка ObjectsCleaner, которая жестко проверяет возможность удаления по всему дереву подчиненных по ссылкам объектов.

    4) Данная обработка предназначена для удаления БОЛЬШОГО количества мусора в базе, который однозначно требуется вычистить (например после обрезания базы). Если нужно пользователя спрашивать «КАЗНИТЬ или МИЛОВАТЬ«, то на этот случай есть та же обработка ObjectsCleaner(не в автоматическом режиме).

    —-

    ЗЫ

    минус тебе тоже не ставлю.

    😉

    Reply
  4. balgarin

    нормальная вещь, помогает когда оперативки мало

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *