При передаче базы данных сторонним разработчикам, аудиторам или внедренцам часто возникает задача оставить в информационной базе данные только за конкретный период (например, за один квартал), удалив всю предшествующую и последующую историю. В среде 1С:Предприятие 7.7 эта задача осложняется тем, что база содержит не только документы, но и остатки регистров, периодические реквизиты (цены, курсы валют), а также жестко привязана к Точке Актуальности (ТА). Разберем доступные варианты решения этой задачи, выясним технические нюансы работы с таблицами базы данных и определим оптимальную последовательность действий.
Если внедренцам требуется рабочая база, в которой документы за выбранный квартал должны корректно проводиться, формировать движения и не вызывать ошибок нехватки остатков товаров или взаиморасчетов, наиболее правильный путь — классическая свертка с последующей подчисткой хвостов.
Разберем по шагам, как устроен этот процесс:
Проанализируем ситуацию, когда внедренцам не требуется перепроводить документы и контролировать остатки по регистрам, а нужно лишь изучить структуру метаданных, специфику печатных форм, алгоритмы заполнения или логику самописных документов. В таком случае тратить время на сложную свертку остатков не имеет смысла.
Посмотрим на последовательность действий:
Одной из главных проблем при подготовке базы является очистка лишней истории периодических реквизитов (например, цен номенклатуры). В архитектуре платформы 1С 7.7 значения всех периодических реквизитов независимо от справочника сохраняются в единой системной таблице 1SCONST (в SQL-версии — _1SCONST).
Рассмотрим штатный программный способ очистки истории периодических реквизитов с использованием встроенного объекта Периодический. Код обработки, очищающий значения вне требуемого диапазона дат, строится следующим образом:
Пери = СоздатьОбъект("Периодический");
СпрН = СоздатьОбъект("Справочник.Номенклатура");
СпрН.ВыбратьЭлементы();
Пока СпрН.ПолучитьЭлемент() = 1 Цикл
Если СпрН.ЭтоГруппа() = 1 Тогда
Продолжить;
КонецЕсли;
Пери.ИспользоватьОбъект("Цена", СпрН.ТекущийЭлемент());
Пери.ВыбратьЗначения();
Пока Пери.ПолучитьЗначение() = 1 Цикл
// Проверяем попадание в границы 4 квартала 2016 года
Если (Пери.ДатаЗнач < '01.10.2016') Или (Пери.ДатаЗнач > '31.12.2016') Тогда
Пери.Удалить();
КонецЕсли;
КонецЦикла;
КонецЦикла;
Для SQL-версии базы при наличии большого объема записей очистку таблицы _1SCONST можно выполнить на порядок быстрее с помощью прямого SQL-запроса через Query Analyzer или SQL Server Management Studio. Для этого в таблице удаляются строки, где поле DATE не попадает в нужный интервал (помня, что дата в таблицах 1С 7.7 хранится в строковом формате ГГГГММДД).
При выполнении масштабных операций очистки данных в среде 1С 7.7 важно учитывать аппаратные и платформенные ограничения:
1cv7s.exe является 32-разрядным приложением и ограничен адресным пространством в 2 ГБ. Если конфигурация содержит тяжелые регистры с миллионами записей, громоздкие внешние обработки свертки могут завершаться аварийно с ошибкой переполнения памяти. В этом случае очистку движений регистров надежнее производить порционно либо с помощью прямых запросов к СУБД.1SJOURN.dbf или RA*.dbf) не может превышать 2 ГБ. Превышение этого порога приводит к необратимому разрушению целостности базы.DELETE размер файла базы данных .mdf автоматически не уменьшается. Чтобы передать внедренцам компактный .bak-файл, администратору необходимо выполнить операции сжатия DBCC SHRINKDATABASE или DBCC SHRINKFILE.Зачастую вместо долгого и рискованного вырезания лишней информации из многогигабайтной базы эффективнее применить обратную стратегию — перенести только требуемые данные в чистую структуру:
1cv7.md.