Как всегда, Новый Год приносит всем, кто связан с бухгалтерией, сюрпризы. И не все они приятные.
Учет по 3 - м юридическим лицам ведется в одной базе бухгалтерия предприятия ред. 3.0. Учет, как говорится, "без особенностей", лица как лица. Конфигурация - почти типовая. Документов не очень много, база на сервере приложений, быстродействие всех устраивает... 5 гигабайт за 2 года, менее 100 тыс. документов (правда крупненьких) - сущие пустяки. А обновлять одну базу вместо трех - намного приятнее. И вот от руководства в начале декабря поступает команда: Разделить, т.е. для каждого юридического лица должна быть отдельная база. И обязательно - никаких следов присутствия ранее других организаций в каждой из баз. Обсуждению, естественно, такие приказы не подлежат...
Пришлось экспериментировать. Первый вариант - шальная идея использовать конвертацию данных. Шальная идея кончилась, "в лоб" и быстро решить вопрос не удалось. Описание танцев с бубном на граблях заслуживает отдельной статьи, которую когда - нибудь, возможно, и напишу. Основные причины бросить это занятие - быстродействие выгрузки. Кроме того, необходимо было перенести не только справочники и документы, но много "Мусора" типа пачек ПФР, налоговой отчетности, регистров сведений с настройками и т.п.
Следующая идея оказалась более продуктивной. С рабочей базы были сняты 3 копии, и в каждой из них начался процесс "выпиливания" 2-х лишних в этой базе юридических лиц. Опять - таки "сейчас сделаем" с использованием функции НайтиПоСсылкам() тоже вело в тупик. Во первых, искать надо рекурсивно, во - вторых, не все найденное можно удалять сразу, не разбираясь, в - третьих, не всегда можно дождаться результатов. В результате экспериментов была найдена следующая методика удаления данных по организации:
- Разбираемся (руками!) с планами обмена. Предварительно надо довести все обмены до состояния, что все данные приняты и выгружены.
- Тестирование и исправление базы - обязательный этап. Обязательно с параметром при наличии ссылок на несуществующие объекты - создавать ссылки. "Битые" ссылки, которые непременно есть в базе - не дадут удалить что - ни будь в режиме контроля ссылочной целостности. На пропуске этого этапа мне "удалось" потерять пару лишних дней - берегитесь!
- Выгружаем в файловый режим, если возможно. Мне это удалось - ускорение всех последующих манипуляций как минимум в полтора раза.
- Перепроводим базу, сверяем с первоисточником. При наличии "косяков" показываем их бухгалтеру, и как минимум, заручаемся его поддержкой. Этот пункт по желанию.
- Удаляем даты запрета изменения данных. Тоже можно "наступить". Внимательно смотрим, чтобы у текущего пользователя были полные права на удаление объектов - проще всего проверить, открыв стандартную обработку "Удаление помеченных объектов".
- Запускаем обработку "ОчисткаРегистровОтБитыхСсылок". Код подсмотрен здесь - http://kb.mista.ru/article.php?id=21, я просто засунул данный код в управляемую форму. Смысл проводимой процедуры - при работе стандартных процедур обмена, в регистрах, отвечающих за учет НДС со временем накапливаются записи, регистратор которых - счет фактура, уже удалена, а одно из измерений либо реквизитов = организация. Тестирование ИБ в конфигураторе с параметром при наличии ссылок на несуществующие объекты - создавать ссылки помогает не всегда. В моем случае таких записей было около 10 в 7 регистрах. Пока они есть - удалить организацию не получится.
- Запускаем обработку "ПоискИУдаление". Выбираем организацию которая удаляется (Организация удаляем) и которая остается (Организация оставляем). Нажимаем кнопку "Заменить договор". В результате в поле основной договор каждого контрагента прописывается договор Организации оставляем (если такая есть), или в договоре меняется организация (если такой нет). Конечно, это не совсем правильно с точки зрения документооборота, однако в данном конкретном случае необходимо было сохранить хоть один договор по каждому контрагенту. Чистка справочника Контрагенты в рамки поставленной задачи не входила.
- Нажимаем кнопку "Найти и удалить по организации". Данная процедура обходит по метаданым все справочники, документы, и независимые регистры сведений, где есть ссылки на справочник Организации, а затем помечает объекты на удаление а записи - удаляет. Поиск не учитывает табличных частей, соответственно - выполняется быстро. При пометке удаления пришлось "Обмануть" примерно таким образом:
Если ТипСсылки = "Документ" Тогда Для каждого НаборЗаписей Из ТекОбъект.Движения Цикл НаборЗаписей.ОбменДанными.Загрузка = Истина; НаборЗаписей.Очистить(); НаборЗаписей.Записать(Истина); КонецЦикла; ТекОбъект.ОбменДанными.Загрузка = Истина; ТекОбъект.ПометкаУдаления = Истина; ТекОбъект.Проведен = Ложь; ТекОбъект.Записать(РежимЗаписиДокумента.Запись); ИначеЕсли ТипСсылки = "Справочник" Тогда ТекОбъект.ПометкаУдаления = Истина; ТекОбъект.ОбменДанными.Загрузка = Истина; ТекОбъект.Записать(); КонецЕсли;
- поскольку проверки бизнес - логики не давали пометить на удаление часть объектов без предварительного удаления подчиненных. Это в первую очередь такие устойчивые консолидации документов, как ведомость по выплате зарплаты и РКО, пачки ПФР, счет - фактуры и корректировочные фактуры, документы комиссионеров и т.п.
- Если необходимо удалить несколько организаций, повторяем шаги с "Запускаем обработку "ПоискИУдаление" для каждой следующей.
- Нажимаем кнопку "Открыть удаление объектов" и попадаем в стандартную обработку "Удаление помеченных объектов". Автоматическое удаление всех отмеченных - удалить. Ждем. В моем случае это самая длительная операция, на win 7 x64 - i5 3.1 Ghz - SSD Intel - 8 Gb RAM удаление около 35 тыс. объектов занимает около 3 часов.
- Следующее действие - Поиск по ссылкам. Выполняется из обработки "ПоискИУдаление" кнопка поиск по ссылкам. Результат - дерево связей объектов на закладке. Поиск рекурсивный, с использованием функции НайтиПоСсылкам(МассивСсылок), но поскольку к данному моменту ссылок в базе осталось не так много, поиск происходит быстро. Часть флажков при необходимости снимаем, т.е. разбираемся вручную. Потом нажимаем кнопку "Удаление по ссылкам", ждем. Последовательность, описанную в данном абзаце, повторяем по каждой удаляемой организации.
- Снова нажимаем кнопку "Открыть удаление объектов" на нашей обработке и попадаем в стандартную обработку "Удаление помеченных объектов". Автоматическое удаление всех отмеченных - удалить. Ждем. На этот раз не долго. Руками разбираемся с не удаленными объектами - у меня это было несколько ГТД, пара фактур, с десяток пачек ПФР перенесенных еще из БП 2.0.
- Удаление успешно завершилось, переходим к следующему этапу - перепроведение документов, сверка с "непиленой" базой, поиск ошибок. У меня все кончилось благополучно, т.к. до "Распила" база регулярно перепроводилась, и почти все операции отражались документами в соответствии с рекомендациями ИТС.
- Конфигуратор - Тестирование исправление - ставим галку "Сжатие таблиц информационной базы". Ждем, когда все ранее удаленные записи физически удалятся.
- Всё!