Самой величайшей ценностью в этом мире является велосипед.
Именно по этой причине все люди только тем и заняты,
что вновь и вновь его изобретают…
наверное, К. Прутков
Описание практической проблемы:
Как известно среднестатистическому пользователю почему-то легче ввести в базу новые данные (например, контрагента),
чем найти уже имеющиеся. Это приводит к проблеме накопления мусора в базах данных (который приходится разгребать администраторам).
Эта тема настолько актуальна и популярна, что имеется масса разработок, аналогичной предлагаемой к вашему вниманию:
//infostart.ru/public/19726/ (53)
//infostart.ru/public/15108/ (13)
//infostart.ru/public/16651/ (33) - аналог системной обработки
//infostart.ru/public/16026/ (57)
//infostart.ru/public/19666/ (30)
//infostart.ru/public/92894/ (12)
В круглых скобках указан рейтинг работ на момент изучения вопроса.
ВНИМАНИЕ!!! Предлагаемая обработка является потенциально опасной.
ИСПОЛЬЗОВАТЬ ЕЁ СЛЕДУЕТ С ОСТОРОЖНОСТЬЮ – особенно в автоматическом режиме!
Всю ответственность за возможную потерю данных несёт пользователь запустивший обработку.
Требования:
1) Обязательно - наличие предварительно загруженных (или лежащих в одном каталоге с ObjectsCleaner) внешних компонент 1СPP.dll (www.1cpp.ru) и FormEx.dll (www.dorex.pro).
2) Желательно, чтобы в конфигурации был класс определённый пользователем "Общие.Форма.Привязка" (www.dev.citykirov.ru ,автор Дмитрий Ощепков). Обсуждение класса на форуме 1СРР: http://www.1cpp.ru/forum/YaBB.pl?num=1200464076. При отсутствии класса обработка работать будет, но без привязок элементов в форме.
3) Желательно наличие сервисных обработок с именами:
а) обработки ПодборUChoice (улучшенная обработка УОПО), Консоль1CQA (консоль прямых запросов 1С++) - для удобства подбора объектов в список для поиска ссылок;
б) обработку EDITREKV ('Редактор Реквизитов' ,автор Цылёв Владислав vet7777@mail.ru) - для открытия объекта для редактирования из меню действий;
Эти обработки могут быть встроены в конфигурацию или лежать в одном каталоге с ObjectsCleaner.
Описание файлов поставки:
1) ObjectsCleaner.rar - обработка ObjectsCleaner;
2) FormEx1CPP.rar – библиотеки 1CPP.dll, FormEx.dll и класс "Общие.Форма.Привязка";
3) PlugIns.rar – вспомогательные обработки ПодборUChoice (улутшенная обработка УОПО), Консоль1CQA (консоль прямых запросов 1C++), ИзменениеВремениДокумента.
Последняя обработка используется в меню действий с объектом по двойному клику мыши (Рис.7) для изменения даты-времени документа.
4) Sample.rar –пример использования обработки ObjectsCleaner в автоматическом режиме. Архив содержит следующие файлы:
обработка !РасчисткаКонтрагентов.ert – исполняемая обработка, непосредственно запускающая ObjectsCleaner в автоматическом режиме;
командные файлы (*.bat) для запуска 1C из планировщика заданий Windows;
файлы (*.prm) с параметрами для запуска;
текстовый файл !Глобальник.txt с примером программного кода 1С, обеспечивающий при начале работы исполнение кода из внешних файлов.
5) ObjectsCleaner_ALL.rar – полный набор файлов поставки (все 4 архива);
Описание установки:
1) Обеспечить загрузку 1CPP.dll и FormEx.dll (обязательно):
Загружать библиотеки можно стандартным способом в процедуре ПриНачалеРаботыСистемы().
Если же ObjectsCleaner будет использоваться как внешня, то достаточно скопировать файлы dll в каталог обработки.
Подробнее о загрузке ВК смотрите в статье об обработке Консоль1CQA или в файле \..\ Sample.rar \!Глобальник.txt комплекта поставки.
При работе обработки в автоматическом режиме без открытия диалога формы загрузка ВК FormEx.dll - не обязательна.
2) Подключить класс "Общие.Форма.Привязка" (желательно):
Подробности подключения класса смотрите в статье об обработке Консоль1CQA.
3) Вспомогательные обработки (желательно):
Скопировать из каталога файла поставки \..\PlugIns.rar\PlugIns\ в каталог обработки или добавить в конфигурацию под теми же именами.
Описание возможностей:
1) Обработка совмещает в себе возможности двух системных обработок: “Поиск ссылок на объекты” и “Удаление помеченных объектов”.
2) Она имеет удобные инструменты для заполнения списка объектов для поиска ссылок:
- Выбор в поле выбора из формы списка с предварительной установкой типа объекта (Рис.1).
- Подбор списка объектов в обработке Консоль1CQA (консоль прямых запросов 1C++) (Рис.2).
- Подбор списка объектов в обработке ПодборUChoice (улучшенная обработка УОПО) (Рис.3).
- Заполнение списка всеми помеченными на удаление объектами в базе (Рис.4).
3) Обработка осуществляет рекурсивный поиск ссылок. В результате поиска строится дерево подчинённости объектов (таблица значений, имеющая колонку ‘тзПотомки’, в которой находится таблица идентичной структуры с подчинёнными по ссылкам объектами для объекта в текущей строке). Полученное дерево объектов отображается в диалоге с помощью объекта ‘Таблица + Дерево’, поставляемого ВК FormEx.dll (Рис.5).
4) При клике мышью в дереве подчинённости в колонке “Описания ссылок на объект” выводится описание ссылок на объект в текущей строке дерева (Рис.5). Также при клике мышью по объекту в списке поиска или в дереве подчинённости выводится контекстное меню (Рис.6, Рис.7), позволяющее выполнить с объектом различные действия:
- открыть для просмотра/редактирования в диалоге или в списке;
- пометить на удаление, снять пометку удаления;
- провести, отменить проведение;
- удалить непосредственно;
- изменить дату-время документа - требуется сервисная обработка ИзменениеВремениДокумента;
- Просмотреть движения документа или сформировать его структуру подчинённости;
- открыть объект для редактирования в обработке 'Редактор Реквизитов' (автор Цылёв Владислав vet7777@mail.ru);
В последнем случае используются встроенные в обработку отчёты, чтобы не зависеть от используемой конфигурации. Отчёт по движениям документа – полная версия (по регистрам, проводкам, записям ЖР и истории реквизитов). При построении структуры подчинённости документа для выборки подчинённых документов используются прямые запросы (в базе формата DBF - по возможности: если в монопольном режиме прямые запросы не работают, то используется стандартный выбор подчинённых документов).
5) Дерево подчинённости может быть большим (как в “глубину”, так и в “ширину”) и на его построение может уйти много времени. Поэтому в обработке предусмотрены ограничения максимального уровня в дереве (по умолчания – 5) и максимального числа ссылок на объект (по умолчанию – 100). Строки с объектами, для которых при поиске ссылок превышены эти ограничения, выделяются красным фоном в списке объектов и в дереве подчинённости (Рис.5, группа товаров “Шипы”).
6) Обработка предоставляет возможность удалять непосредственно объекты из списка поиска вместе со всеми подчинёнными объектами в дереве подчинённости.Перед удалением обработка требует выполнить процедуру проверки возможности удаления. Проверка возможности удаления осуществляется рекурсивно в дереве подчинённости по следующим принципам:
- Если при построении ветви дерева подчинённости превышены ограничения по уровню и числу ссылок (п. 4), то считается, что всю эту ветвь объектов удалять нельзя (поскольку она может оказаться не полной).
- Обязательным условием возможности удаления выше стоящего в дереве подчинённости объекта является возможность удаления всех ниже лежащих.
- Сама возможность удаления объекта определяется по его статусу: помечен он на удаление или нет, проведён или нет.
По умолчанию можно удалять только помеченные на удаление объекты. Но в обработке имеются флаги, снимающие это ограничение:
- - удалять не проведённые документы как помеченные объекты (Рис.8);
- - удалять все непомеченные объекты (Рис.9);
- - удалять все объекты (помеченные и не помеченные) кроме проведенных документов (Рис.13);
Этими флагами следует пользоваться осторожно. При их установке выводятся соответствующие предупреждения.
7) Удаление каждой ветви объектов в дереве подчинённости выполняется в отдельной транзакции. При неудаче удаления хоть одного объекта в ветви (из-за блокировок или при повторной проверке возможности удаления по его статусу) – откатывается удаление всей ветви. В обработке есть флаг, включающий режим удаления всех ветвей дерева объектов в единой транзакции (по соображениям безопасности устанавливается по умолчанию в разделённом режиме).
8) При клике в списке поиска в колонке со статусом объекта можно просмотреть причину, по которой нельзя удалить объект (Рис.10). Успешно удалённые объекты выделяются в списке и дереве красным шрифтом на светло-жёлтом фоне (Рис.11).
9) У обработки имеется «пакетный» режим исполнения (Рис.12), в котором после подтверждения последовательно выполняются все три этапа действий:
поиск ссылок, проверка возможности удаления и само непосредственное удаление.
10) Обработка предоставляет для других модулей сервис автоматического выполнения поиска ссылок и удаления объектов. При этом в обработку через параметр формы передаётся список объектов для поиска ссылок, параметры поиска ссылок и контроля возможности удаления.
Назад обработка через параметр формы возвращает статистику выполнения: время выполнения каждого из этапов, число удалённых и не удалённых по разным причинам объектов. Подробнее смотрите в примере использования.
Подробное описание возможностей обработки можно вывести в табличный документ, нажав на кнопку 'Описание' (что со знаком вопроса, Рис.7).
Назначение обработки:
1) Основное применение – расчистка мусора в базах данных, создаваемого пользователями.
2) Также обработка удобна для анализа того, где используется выбранный объект. Это бывает полезно при исправлении ошибок пользователей при вводе данных.
Пример использования в “автоматическом” режиме:
С помощью этой обработки успешно решена задача расчистки справочника “Контрагенты”, как говорится, в тяжёлом случае:
- Всего в справочнике было примерно 11500 элементов.
- Реально используемых контрагентов со статусом “Действующий” было около 4500.
- Все остальное – помеченный на удаление “мусор” со статусом “Удалённый” (двойники по ИНН и просто с незаполненными реквизитами).
- Некоторые из “удалённых” контрагентов “светились” в документах прошлых лет (в том числе в проведённых).
В результате выполнения очистки осталось около 200 “удалённых” контрагентов. Это как раз те контрагенты, на которых есть ссылки в проведённых документах.
Удаление в таких случая оказывается длительным процессом (несколько дней). Поэтому пришлось прибегнуть к особым средствам:
С помощью планировщика заданий Windows по расписанию запускалась 1С с особой строкой запуска.
Смотрите пример из файла \..\ Sample.rar \! 1C77clear_contr.bat.
В строке запуска наряду со стандартными параметрами указывался ещё один дополнительный - /S.
Через него в 1С передаётся имя файла со скриптом на языке 1С для исполнения при начале работы системы.
Пример кода – в файле \..\ Sample.rar \! 1C77clear_contr.prm.
В сеансе 1С при начале работы значение этого параметра считывается с помощью объекта “Сервис” (поставляется ВК FormEx.dll): КоманднаяСтрока1С = Сервис.КоманднаяСтрока();
Если существует файл с переданным через параметр /S именем, то 1С считывает из него текст кода и пытается выполнить его с помощью объекта “ВыполняемыйМодуль” (поставляется ВК 1CPP.dll).
Пример реализации этого механизма смотрите в файле \..\ Sample.rar \! Глобальник.txt.
Переданный на исполнение скрипт запускал обработку !РасчисткаКонтрагентов.ert (из архива Sample.rar ) с установкой параметров удаления через параметр формы.
Эта обработка в цикле выбирает из базы удалённых контрагентов прямым запросом, установленными порциями (например, по 100 штук за раз), и передаёт их для очистки обработке ObjectsCleaner в автоматическом режиме. Ход выполнения очистки записывается в файлы лога.
После каждого цикла очистки проверяется текущее время. И если оно превышает установленное ограничение, выполнение обработки прерывается с завершением работы 1С.
До и после такой масштабной чистки данных для копии базы в конфигураторе было проведено тестирование в пакетном режиме с записью лога
(командный файл TestIB.bat и файл с параметрами TestIB.prm из архива Sample.rar).
Результаты тестирования показали, что очистка справочника не внесла в базу новых ошибок в данные.
-----------------------------------------------------------------------------------------------------------------------------
Описанный здесь пример подойдёт для баз на основе ТК “Торговля+Склад, редакция 9.2” с небольшой доработкой справочника “Контрагенты”.
В нем должен быть числовой реквизит “Статус”. В этот реквизит обработка !РасчисткаКонтрагентов.ert прописывает особое значение (равное 4),
чтобы не выбирать повторно контрагентов, которых нельзя удалить.
Для баз формата DBF кроме этого придётся ещё адаптировать текст запроса выборки контрагентов:
в условиях запроса придётся заменить фрагменты “.ISMARK=1” на “ .ISMARK=’*’”.
-----------------------------------------------------------------------------------------------------------------------------
Авторские права и условия распространения:
Обработка предназначена для свободного, то есть, бесплатного распространения.
Пожертвования на добрые дела, как говорится, с благодарностью принимаются (номер Яндекс-кошелька: 4100-1111-6661-850).
Каждый заинтересованный член сообщества вправе вносить в обработку изменения при сохранении информации об авторстве в её описании.
Благодарности:
- Выражаю огромную благодарность всему сообществу 1CPP и родственным проектам. Их совместными усилиями смерть 1С-7.7 откладывается на неопределённое время.
- Также хочется сказать спасибо всем коллегам по своей (увы уже бывшей) компании за плодотворное сотрудничество, длившееся более четырёх лет.