Курочка по зернышку клюет …
… а цыплят по осени считает.
народная каламбурность.
Данная обработка сделана на основе обработки !РасчисткаКонтрагентов.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 секунд) надписи с текущим временем при выполнении обработки.
Без FormEx.dll функции 1. и 2. не работают. Функция 3. работает не по таймеру, а при завершении очередного цикла обработки.
- Для красоты в интерфейсе обработки также желательно иметь в конфигурации КОП ‘Общие.Форма.Привязка’ —
— класс определенный пользователем, управляющий привязками в диалоге формы обработки
(Автор: Дмитрий Ощепков mailto:dmitro-75@mail.ru).
Если экземпляр класса не удается создать, в форме обработки не работают привязки элементов диалога.
Для работы класса обязательно требуется ВК FormEx.dll !!! - Желательно наличие последней версии обработки ‘ObjectsCleaner’ (//infostart.ru/public/100580/).
Без нее будет недоступна возможность рекурсивного удаления объектов (вместе с подчиненными по ссылкам объектами) и
Соответственно останется один способ удаления объектов — «Удалять процедурой УдалитьОбъекты(…)» (Рис.6),
имеющий более низкий «КПД», так как позволяет удалять только те объекты, на которые нет ссылок в базе. - Желательно наличие подсистемы ‘ViewValues’ (//infostart.ru/public/97707/)
для удобного просмотра списка объектов для удаления и списка неудаляемых объектов (Рис.9 и Рис.13).
Без этой подсистемы просмотр осуществляется методом :ВыбратьСтроку(…) объекта ‘СписокЗначений’;
Если обработка используется как внешняя, специально загружать ВК не требуется. Достаточно разместить файлы библиотек
в одном каталоге с обработкой. При необходимости она загрузит их при открытии формы.
Описание файлов поставки :
- ПартионноеУдалениеОбъектов.rar — предлагаемая вниманию читателя обработка;
- SamplsDBF.rar –архив с примерами настроек очистки объектов для базы в формате DBF, содержит файлы:
- ..SamplsDBFdbf_настройки_очистки_документов.prm — настройка очистки помеченных на удаление документов, определенных видов (универсальная);
- ..SamplsDBFdbf_настройки_очистки_контрагентов.prm — настройка очистки помеченных на удаление контрагентов (для ТиС-7.7);
- SamplsSQL.rar –архив с примерами настроек очистки объектов для базы в формате SQL, содержит файлы:
- ..SamplsSQLsql_настройки_очистки_документов.prm — настройка очистки помеченных на удаление документов, определенных видов (универсальная);
- ..SamplsSQLsql_настройки_очистки_контрагентов.prm — настройка очистки помеченных на удаление контрагентов (для ТиС-7.7);
- SamplsSQL.rar –архив с примерами настроек очистки объектов для базы в формате SQL, содержит файлы: текстовый файл !Глобальник.txt с примером программного кода 1С, обеспечивающий при начале работы исполнение кода из внешних файлов.
- 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) Поскольку параметры обработки могут быть довольно сложными
(могут содержать текст запроса и текст модуля для инициализации его параметров)
в диалоге предусмотрены кнопки, для сохранения параметров во внешний файл и загрузки параметров из внешнего файла.
Назначение:
- Расчистка базы данных от мусора, появляющегося в двух случаях:
- Организация регламентных сервисов для регулярной очистки базы в автоматическом режиме.
— при работе пользователей (особенно в запущенной ситуации);
— после «обрезания» базы данных при массовом удалении документов в обрезаемом периоде;
Вариант реализации регламентного сервиса по очистке базы от помеченных объектов:
С помощью планировщика заданий 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 файлов поставки).
Если меня спросят,
зачем я это делаю, для чего это надо и где тут логика?
Я отвечу так,
Логика бывет: математической, женской и прикладной
(буду настаивать именно на таком порядке перечисления).
И жизнь как то все больше следует последней.
😉
Ты просто используешь функцию «Удалить()», она работает жёстко и бесконтрольно. А о ссылках на «обречённый» элемент ты подумал? Минус не ставлю, сам разберись.
P.S.: Я подобной гадости ахапку написал, а здесь выкладывать стыдно. Хотя: я подобные бяки стараюсь делать с учётом подчинённости (для спрвочников) и оснований (для документов). При наличии ссылок на объект полагается сообщить о ссылках и спросить: КАЗНИТЬ НЕЛЬЗЯ ПОМИЛОВАТЬ, пусть пользователь имеет возможность поставить запятую! А то потом единственное средство — FoxPro или его аналоги.
(2) vladimir_makarov, читай внимательней!
1) В обработке удаление выполняется с контролем ссылочной целостности.
2) В одном из режимов используется не метод объекта Удалить(), например:
а системная процедура УдалитьОбъекты(сзОбъекты,ПроверятьСсылки,тзСсылки) со значением параметра ПроверятьСсылки=1.
———————————
Описание из синтакс-помошника:
Синтаксис:
УдалитьОбъекты(<Объекты>,<Проверять>,<Ссылки>)
Назначение:
Удаляет объекты, переданные в списке значений.
Параметры:
<Объекты> — конкретное значение объекта или значение типа »СписокЗначений», в котором данной процедуре передаются объекты, которые надо удалить.
<Проверять> — необязательный параметр. Число: 1 — перед удалением проверяется, нет ли ссылок на удаляемый объект. Если есть, то объект не удаляется, а ссылки помещаются в таблицу значений <Ссылки>. Любое другое число — проверку не выполнять. Значение по умолчанию: 0.
<Ссылки> — Необязательный параметр. Идентификатор объекта типа »ТаблицаЗначений», в который данная процедура помещает найденные ссылки на объекты. Таблица значений состоит из 3 колонок: 1. объект на который ссылаются; 2. объект, который содержит ссылку; 3. комментарий к ссылке.
3) В другом режиме используется обработкаObjectsCleaner , которая жестко проверяет возможность удаления по всему дереву подчиненных по ссылкам объектов.
ObjectsCleaner (не в автоматическом режиме).
4) Данная обработка предназначена для удаления БОЛЬШОГО количества мусора в базе, который однозначно требуется вычистить (например после обрезания базы). Если нужно пользователя спрашивать «КАЗНИТЬ или МИЛОВАТЬ«, то на этот случай есть та же обработка
—-
ЗЫ
минус тебе тоже не ставлю.
😉
нормальная вещь, помогает когда оперативки мало