уаукаука

Свертка базы ERP. Основные принципы

Содержание:

Свертка базы – прежде, чем приступить к этой непростой задаче, необходимо выявить у заказчика конечную цель свертки. Если цель начать с чистого листа и свертка будет на самую последнюю дату, то возможно окажется более подходящий способ – перенос данных по организации в новую базу с вводом остатков. Если же решили все же сворачивать, то рассчитывать на типовые механизмы не приходится, так они работают при большом количестве данных непозволительно долго. Поэтому, основываясь на своем опыте, предлагаю рассмотреть следующий алгоритм действий.

1. Этап первый: оценка трудозатрат

Для начала надо запросами по всем метаданным определить количество данных в базе для приближенной оценки времени удаления.

Определяем какие механизмы используются в базе:

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

            Ведется ли учет по нескольким организациям (возможны документы с перекрестными ссылками на другие организации)

            Ведется ли хранение версий объектов (если ведется, то отдельно уточним, на какую глубину необходимо хранить историю объектов)

            Существует ли обмен с другими базами (необходимо будет более пристально смотреть регистры по обмену данными)

            Ведется ли регламентированный учет на Хозрасчетном плане счетов

            Ведется ли учет по МСФО (международный план счетов)

            Если ведется учет по нескольким организациям, есть ли между ними взаиморасчеты

            Хранятся ли присоединенные файлы в базе

            Используется ли Электронный документооборот

            Оцениваем, насколько «плотно» используется механизм дополнительных сведений, т. к. там могут хранится ссылки на документы.

            Обязательно оцениваем доработки, которые есть в базе:

            – в расширении они или в самой конфигурации

            – пожелания заказчика к их удалению или обязательному сохранению

            – выясняем, как и для чего сделаны доработки, чтобы не удалить что-то, что на первый взгляд подходит к удалению, но без этих данных некорректно работают доработки заказчика.

            Обязательно оцениваем мощность серверов продуктив и тестовый, так как бывает, что на продуктиве достаточно памяти и мощности, а вот на тестовом, на котором будет происходить свертка, может быть гораздо хуже, что усложнит разработку.

            Проверяем систему лицензирования. В ERP могут использоваться расширения или сама конфигурация построена на базе ERP, но имеет лицензированную нестандартную 1С, необходимо учесть это, так как, возможно, в служебных регистрах, которые попадут под очистку, хранятся данные, необходимые для лицензирования (идентификаторы, сертификаты, ключи и т. п.).

            Выясняем, как устроена система поддержки. Кто в компании заказчика отвечает за обслуживание баз (бэкапирование, администрирование), выдачу доступов. Если система сильно забюрократизирована, то это может значительно замедлить процесс работы.

Для начала надо запросами по всем метаданным определить количество данных в базе для приближенной оценки времени удаления.

Определяем какие механизмы используются в базе:

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

            Ведется ли учет по нескольким организациям (возможны документы с перекрестными ссылками на другие организации)

            Ведется ли хранение версий объектов (если ведется, то отдельно уточним, на какую глубину необходимо хранить историю объектов)

            Существует ли обмен с другими базами (необходимо будет более пристально смотреть регистры по обмену данными)

            Ведется ли регламентированный учет на Хозрасчетном плане счетов

            Ведется ли учет по МСФО (международный план счетов)

            Если ведется учет по нескольким организациям, есть ли между ними взаиморасчеты

            Хранятся ли присоединенные файлы в базе

            Используется ли Электронный документооборот

            Оцениваем, насколько «плотно» используется механизм дополнительных сведений, т. к. там могут хранится ссылки на документы.

            Обязательно оцениваем доработки, которые есть в базе:

            – в расширении они или в самой конфигурации

            – пожелания заказчика к их удалению или обязательному сохранению

            – выясняем, как и для чего сделаны доработки, чтобы не удалить что-то, что на первый взгляд подходит к удалению, но без этих данных некорректно работают доработки заказчика.

            Обязательно оцениваем мощность серверов продуктив и тестовый, так как бывает, что на продуктиве достаточно памяти и мощности, а вот на тестовом, на котором будет происходить свертка, может быть гораздо хуже, что усложнит разработку.

            Проверяем систему лицензирования. В ERP могут использоваться расширения или сама конфигурация построена на базе ERP, но имеет лицензированную нестандартную 1С, необходимо учесть это, так как, возможно, в служебных регистрах, которые попадут под очистку, хранятся данные, необходимые для лицензирования (идентификаторы, сертификаты, ключи и т. п.).

            Выясняем, как устроена система поддержки. Кто в компании заказчика отвечает за обслуживание баз (бэкапирование, администрирование), выдачу доступов. Если система сильно забюрократизирована, то это может значительно замедлить процесс работы.

Функция ТекстЗапросаРегистраНакоплений(имяРегистра, ДобавитьОрганизациюВЗапрос) 

            ТекстЗапроса = “ВЫБРАТЬ

            |           КОЛИЧЕСТВО(рн.Регистратор) КАК КолвоЗаписей

            |ИЗ

            |           РегистрНакопления.” + имяРегистра + ” КАК рн

            |

            |ГДЕ

            |           рн.Период < &ДатаСреза

            |           И 1=1″;  

            Если ДобавитьОрганизациюВЗапрос Тогда

                        ТекстЗапроса = СтрЗаменить(ТекстЗапроса, “1=1”, “рн.Организация = &Организация”);

            КонецЕсли;

            Возврат ТекстЗапроса;       

КонецФункции

Дополнительная информация

2. Этап второй: подготовка к удалению данных в 1С:ERP

На этом этапе необходимо выделить служебные регистры, которые мы очистим полностью без отборов по дате и организации (КатегорииНовостейПростые, ЗамерыВремени, ЗамерыСтатистики и т.п.)

Выделяем регистры, которые не будем очищать (АдресныеОбъекты, ИерархияПартнеров, ПраваРолей и т. п.).

Обработку удаления лучше делать в отдельном расширении, так как это позволяет сделать удаление в фоновом режиме в несколько потоков, что значительно сокращает время удаления.

            Данные будем очищать в следующей последовательности:

Сначала очищаем по дате оборотные регистры накопления. Просто удаляем записи по регистратору с периодом меньшим, чем дата среза.

            Создаем документы ввода остатков. Используем документы «Корректировка регистров», так как документы ввода остатков не позволят полностью покрыть наши потребности, и от версии к версии меняются алгоритмы создания движений, порождаемые этими документами. Для регистров, используемых в учете зарплаты и кадров, у которых в регистраторах нет документа «КорректировкаРегистров» используем документ «Перенос Данных».

На одну организацию и один регистр делаем один документ корректировки регистров. Если проводок в документе большое количество (зависит от мощности сервера, но ориентировочно больше 50 тысяч записей), то лучше разбить на несколько документов, для возможности редактирования этих документов в будущем без зависаний интерфейса при открытии и проведении документа.

Для регистра бухгалтерии используем документ «Операция». Делаем срез по всем субконто и создаем проводки в корреспонденции с вспомогательным счетом 000, активные счета по дебету, пассивные по кредиту, активно-пассивные в зависимости от знака суммы, положительные суммы по дебету, отрицательные по кредиту, а для остатков по забалансовым счетам корреспондирующий счет не указываем.

            Для регистров накопления датой среза будет считаться поле «Период», выбираем все различные регистраторы с более ранним периодом, и циклом обходим по каждому регистратору и очищаем данные.

Для регистров сведений необходимо учитывать свойство «Периодичность» и «Режим записи регистра». Для Периодических регистров сведений или с режимом записи – «Подчинение регистратору» условия очистки аналогичны регистрам накопления (выбираем регистраторы, по полю Период должен быть меньше даты среза). Для непериодических регистров поле, которое необходимо сравнивать с датой среза определяем, анализируя хранимые данные.

Имя регистра сведений

Поле отбора (тип Дата)

ДополнительныеФайлыРегламентированныхОтчетов

РегламентированныйОтчет.Дата

ЗаданияКЗакрытиюМесяца

Месяц

ТоварыКДоставке

ЗаданиеНаПеревозку.Дата

ЖурналДействийПоЭДО

ЭлектронныйДокумент.Дата

ГрафикПлатежей

ДатаПлатежа

СтатистикаСделокСКлиентами

ДатаОкончания

            После того, как определились с полем даты и выбрав записи, удовлетворяющие отбору, необходимо в цикле обходить полученную выборку и создавать набор записей для регистра, где в поля отбора указать все измерения, у которых стоят флаги Ведущее или ОсновнойОтбор или Индексирование, и в цикле заполнять их данными из выбранных записей и очищать Набор записей.

стрПоляОтбораДляОчистки = “”;

                        Для Каждого Измерение Из Метаданные.РегистрыСведений[ПараметрыПроцедуры.ИмяМетаданных].Измерения Цикл

                                   Если Измерение.Ведущее ИЛИ Измерение.ОсновнойОтбор ИЛИ Измерение.Индексирование = Метаданные.СвойстваОбъектов.Индексирование.Индексировать ИЛИ Измерение.Индексирование = Метаданные.СвойстваОбъектов.Индексирование.ИндексироватьСДопУпорядочиванием Тогда

                                               стрПоляОтбораДляОчистки = стрПоляОтбораДляОчистки + “,” + Измерение.Имя;

                                   КонецЕсли;  

                        КонецЦикла;

 

            Следующим этапом переходим к очистке Бизнес процессов и Задач. Их отбираем по реквизиту Дата, получаем объект и удаляем.

            Последним этапом выбираем документы, удовлетворяющие условию по дате, и в цикле получаем объект и удаляем. Перед удалением документов необходимо сформировать список документов исключений, не попадающих под удаление, несмотря на дату — это документы, ссылки, на которые имеются в записях регистров, которые сформированы нашими документами «Корректировка регистров», «ПереносДанных» и документами «Операция» по регистру бухгалтерии, так как, если в остатках существуют ссылки на эти документы, то удалить мы их не можем.

Функция ПолучитьМассивДокументовИзДокументовОстатков(ПараметрыПроцедуры) Экспорт

            Запрос = Новый Запрос;

            Запрос.Текст =           “ВЫБРАТЬ

            |           1 КАК ВидДок,

            |           КорректировкаРегистров.Ссылка КАК Ссылка,

            |           КорректировкаРегистров.Комментарий КАК Комментарий

            |ИЗ

            |           Документ.КорректировкаРегистров КАК КорректировкаРегистров

            |ГДЕ

            |           1 = 1

            |           И КорректировкаРегистров.Дата = &ДатаСреза

            |           И КорректировкаРегистров.Комментарий ПОДОБНО &Комментарий

            |    И НЕ КорректировкаРегистров.ПометкаУдаления

            |ОБЪЕДИНИТЬ ВСЕ          

            |ВЫБРАТЬ  

            |   2,

            |           ОперацияБух.Ссылка,

            |           ОперацияБух.Комментарий

            |ИЗ

            |           Документ.ОперацияБух КАК ОперацияБух

            |ГДЕ

            |           2 = 2

            |           И ОперацияБух.Дата = &ДатаСреза

            |           И ОперацияБух.Комментарий ПОДОБНО &Комментарий 

            |           И НЕ ОперацияБух.ПометкаУдаления”;

           

            Если ЗначениеЗаполнено(ПараметрыПроцедуры.Организация) Тогда

                        Запрос.Текст = СтрЗаменить(Запрос.Текст, “1 = 1”, “КорректировкаРегистров.Организация = &Организация” );

                        Запрос.Текст = СтрЗаменить(Запрос.Текст, “2 = 2”, “ОперацияБух.Организация = &Организация” );

 

                        Запрос.УстановитьПараметр(“Организация”, ПараметрыПроцедуры.Организация);

            КонецЕсли;

            Запрос.УстановитьПараметр(“ДатаСреза”, ПараметрыПроцедуры.ДатаСреза-1);

            Запрос.УстановитьПараметр(“Комментарий”, “КЛН/СверткаОстатков/%”);

            ВыборкаДокументов = Запрос.Выполнить().Выбрать();

           

            ДокументыИсключения = Новый Массив;

            ТипДокументы = Документы.ТипВсеСсылки();

            Пока ВыборкаДокументов.Следующий() Цикл

                        ДокументыИсключения.Добавить(ВыборкаДокументов.Ссылка);

                        Док = ВыборкаДокументов.Ссылка.ПолучитьОбъект();

                        ИмяРегистра = СтрРазделить(Док.Комментарий, “/”,)[2];

                        Движение = Док.Движения[ИмяРегистра];

                        Движение.Прочитать();

                        Сообщить(” ” + Док + ИмяРегистра + ”  ”  + Док.Движения[ИмяРегистра].Количество());

                        Если ВыборкаДокументов.ВидДок = 1 Тогда

                                   мИзмеренийСодержащихТипДокумент = Новый Массив;

                                   Для Каждого Измерение Из Движение.Метаданные().Измерения Цикл

                                               Для Каждого Подтип Из Измерение.Тип.Типы() Цикл

                                                           Если ТипДокументы.СодержитТип(Подтип) Тогда                                                                      

                                                                       мИзмеренийСодержащихТипДокумент.Добавить(Измерение.Имя);

                                                              Прервать;

                                                         КонецЕсли;

                                               КонецЦикла;

                                   КонецЦикла;

                                   Для Каждого Измерение Из Движение.Метаданные().Реквизиты Цикл

                                               Для Каждого Подтип Из Измерение.Тип.Типы() Цикл

                                                           Если ТипДокументы.СодержитТип(Подтип) Тогда                                                                      

                                                                       мИзмстрПоляОтбораДляОчистки = “”;

                        Для Каждого Измерение Из Метаданные.РегистрыСведений[ПараметрыПроцедуры.ИмяМетаданных].Измерения Цикл

                                   Если Измерение.Ведущее ИЛИ Измерение.ОсновнойОтбор ИЛИ Измерение.Индексирование = Метаданные.СвойстваОбъектов.Индексирование.Индексировать ИЛИ Измерение.Индексирование = Метаданные.СвойстваОбъектов.Индексирование.ИндексироватьСДопУпорядочиванием Тогда

                                               стрПоляОтбораДляОчистки = стрПоляОтбораДляОчистки + “,” + Измерение.Имя;

                                   КонецЕсли;  

                        КонецЦикла; еренийСодержащихТипДокумент.Добавить(Измерение.Имя);

                                                                       Прервать;

                                                           КонецЕсли;

                                               КонецЦикла;

                                   КонецЦикла;

                                   Для Каждого Запись Из Движение Цикл

                                               Для Каждого ИмяРеквизита Из мИзмеренийСодержащихТипДокумент Цикл

                                                           Если ЗначениеЗаполнено(Запись[ИмяРеквизита]) И ТипДокументы.СодержитТип(ТипЗнч(Запись[ИмяРеквизита])) Тогда

                                                                       ДокументыИсключения.Добавить(Запись[ИмяРеквизита]);    

                                                           КонецЕсли;  

                                               КонецЦикла;

                                   КонецЦикла;                                   

                                  

                        Иначе

                                   Для Каждого стр Из Движение      Цикл

                                               Для Каждого Элем Из стр.СубконтоДт Цикл

                                                           Если ЗначениеЗаполнено(Элем.Значение) И ТипДокументы.СодержитТип(ТипЗнч(Элем.Значение)) Тогда 

                                                                       ДокументыИсключения.Добавить(Элем.Значение);

                                                           КонецЕсли;  

                                               КонецЦикла;

                                               Для Каждого Элем Из стр.СубконтоКт Цикл

                                                           Если ЗначениеЗаполнено(Элем.Значение) И ТипДокументы.СодержитТип(ТипЗнч(Элем.Значение)) Тогда 

                                                                       ДокументыИсключения.Добавить(Элем.Значение);

                                                           КонецЕсли;  

                                               КонецЦикла;

                                   КонецЦикла;

                        КонецЕсли;

            КонецЦикла;

            Возврат ДокументыИсключения;

           

КонецФункции        

 

            Если в базе ведется несколько организаций и необходимо некоторые организации удалить полностью, а некоторые свернуть до определенной даты или оставить все данные по определенной организации, то обязательно при очистке в отборы регистров сведений, накоплений, задач, бизнес процессов и документов добавляем отбор по Организации, если такой реквизит (для документов, задач, бизнес процессов) или измерение (для регистров) существует в очищаемых данных. Реквизит/Измерение организации необходимо определять не по имени, а по типу метаданных, равному справочникам «Организация», так как реквизит может называться ГоловнаяОрганизация, а в документе Транспортное сообщение, например, необходимо смотреть на поля Отправитель и Получатель.

            Если какие-то организации необходимо удалить полностью, то необходимо еще пройтись по справочникам, содержащим реквизит с типом Организация, и удалить их (например, ОтправкиФСС, ПерепискаСКонтролирующимиОрганами, СканированныеДокументыДляПередачиВЭлектронномВиде  и т. п.).

После всех этих этапов организации, по которым надо провести полную очистку, помечаем на удаление и удаляем типовым механизмом, чтобы доудалять те записи и справочники, которые мы не могли удалять раньше, пока на них были ссылки в документах (Договоры, Соглашения, Банковские счета, Регистрации в ИФНС и т. п.).

            На тестовой базе обязательно проверяем удаление. Очищаем регистр — смотрим, что всё удалилось только по нужной организации и только за указанный период записи. По регистру бухгалтерии сверяем ОСВ на ближайшую закрытую для редактирования дату с ОСВ на базе продуктива. Перед удалением документов проверяем выборочно, что документ на момент удаления в статусе проведен, но не содержит проводок — так как все регистры мы к этому моменту уже свернули, и проводок быть не должно.

Бывает, что в отдельных регистрах несоразмерно большее количество записей по сравнению с другими, очистку таких регистров можно вынести в отдельный поток или разбить очистку на несколько потоков, разделяя потоки по подходящим измерениям, чтобы не было конфликта блокировок.

3. Этап 3: Свертка базы 1С:ERP

            После тестирования и отладки расширения для очистки сохраняем расширение и раскатываем свежую копию базы, зафиксировав дату, на которую совершили срез. Желательно это делать после рабочего дня перед выходными, чтобы за время свертки базы как можно меньше было заведено документов в базу продуктива.

Обязательно проверяем, что копия базы развернута с флагом «Блокировка регламентных заданий включена».

В меню НСИ и Администрирование отключаем настройку «Синхронизация данных».

Отключаем для своего пользователя Дату запрета редактирования.

Запускаем свертку.

При многопоточном запуске необходимо следить за расходуемой памятью и загрузкой процессора на сервере, при необходимости запускать очистку партиями.

Отдаем заказчику на тестирование. До заказчика необходимо донести, что данные сворачиваются как есть, без проверки корректности учета. Что не все документы будут удалены за указанный период, те документы, что есть в записях движений документов «ввода остатков» останутся в базе. И среди этих документов могут оказаться документы, которые бухгалтерам, на первый взгляд, надо будет очевидно удалить, но такие записи с этими документам могли появиться из-за того, что в прошлом кто-то, исправляя отчетность, поправил один регистр, но не поправил сопутствующие служебные регистры, и его отчет стал показывать корректно, но записи в служебных регистрах остались «висеть». И разбор таких кейсов – это отдельная большая работа в плотной связке с сотрудниками заказчика.

            После проверки переносим созданные за время свертки базы документы из базы продуктива в свернутую базу стандартной обработкой «Выгрузка и загрузка данных XML». Этой же обработкой можно перенести данные, которые удалились, но должны были остаться в базе.

Маркин Константин,

Специалист компании ООО “Кодерлайн”