Как правильно обрезать базу данных 1С 7.7 за определенный квартал?

Программист 1С v7.7 1С:Управление торговлей Управленческий учет IT и автоматизация бизнеса
← На главную

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

Вариант 1. Свертка базы на начало периода и удаление последующих данных

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

Разберем по шагам, как устроен этот процесс:

  1. Создание резервной копии: перед любыми манипуляциями обязательно сохраняем полную копию информационной базы и проверяем ее работоспособность.
  2. Свертка остатков на дату начала квартала: запускается процедура свертки (штатная или специализированная внешняя обработка), которая фиксирует остатки по регистрам на начало периода (например, на 01.10.2016) в виде документов ввода остатков, а все предшествующие документы помечает на удаление.
  3. Физическое удаление документов до начала квартала: через стандартное меню «Операции» — «Удаление помеченных объектов» удаляем все документы, предшествующие 4-му кварталу.
  4. Пометка и удаление документов после окончания квартала: с помощью групповой обработки документов находим все документы с датой позже конца периода (например, с 01.01.2017) и помечаем их на удаление, после чего производим окончательное удаление.
  5. Пересчет итогов и перенос Точки Актуальности: открываем монопольно конфигурацию, заходим в меню «Операции» — «Управление итогами», перемещаем Точку Актуальности на дату последнего оставшегося документа и запускаем полный пересчет итогов. Без этого шага проведение документов и отчетность по регистрам будут работать некорректно.

Вариант 2. Быстрое удаление документов без формирования остатков

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

Посмотрим на последовательность действий:

  1. С помощью внешней обработки групповой обработки справочников и документов отбираем документы, дата которых строго меньше даты начала квартала либо строго больше даты окончания квартала.
  2. Помечаем эти документы на удаление и запускаем штатную процедуру удаления объектов.
  3. Учитываем, что при таком подходе регистры накопления будут содержать разорванные цепочки движений, а попытка провести любой расходный документ завершится ошибкой контроля остатков. Для демонстрации структуры данных этого достаточно, однако для тестирования сквозных бизнес-процессов база будет непригодна.

Очистка периодических реквизитов справочников (цены, курсы)

Одной из главных проблем при подготовке базы является очистка лишней истории периодических реквизитов (например, цен номенклатуры). В архитектуре платформы 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 важно учитывать аппаратные и платформенные ограничения:

  1. Лимит виртуальной памяти (32 бита): исполняемый файл 1cv7s.exe является 32-разрядным приложением и ограничен адресным пространством в 2 ГБ. Если конфигурация содержит тяжелые регистры с миллионами записей, громоздкие внешние обработки свертки могут завершаться аварийно с ошибкой переполнения памяти. В этом случае очистку движений регистров надежнее производить порционно либо с помощью прямых запросов к СУБД.
  2. Ограничение таблиц DBF: если база хранится в формате DBF, размер любого отдельного файла таблицы (например, 1SJOURN.dbf или RA*.dbf) не может превышать 2 ГБ. Превышение этого порога приводит к необратимому разрушению целостности базы.
  3. Упаковка файлов после удаления: простое удаление документов штатными средствами в DBF-версии физически не уменьшает размер файлов на диске, так как записи лишь помечаются байтом удаления. Чтобы освободить место и уменьшить базу перед передачей, необходимо запустить конфигуратор в монопольном режиме и выполнить пункт «Администрирование» — «Упаковка таблиц информационной базы» (или запустить «Тестирование и исправление»).
  4. Сжатие базы на MS SQL Server: в версии SQL после массового DELETE размер файла базы данных .mdf автоматически не уменьшается. Чтобы передать внедренцам компактный .bak-файл, администратору необходимо выполнить операции сжатия DBCC SHRINKDATABASE или DBCC SHRINKFILE.

Альтернативный вариант: перенос нужного квартала в пустую базу

Зачастую вместо долгого и рискованного вырезания лишней информации из многогигабайтной базы эффективнее применить обратную стратегию — перенести только требуемые данные в чистую структуру:

  1. Создаем новую пустую базу данных на основе исходного файла метаданных 1cv7.md.
  2. С помощью универсальной конфигурации «Конвертация данных» и обработки выгрузки для платформы 7.7 настраиваем правила обмена между одинаковыми структурами.
  3. В настройках выгрузки отключаем передачу всей истории периодических реквизитов (выгружая только срез на текущую дату) и накладываем строгий фильтр на период выгружаемых документов — с 01.10.2016 по 31.12.2016.
  4. Загружаем полученные данные в новую базу. Такой подход исключает зависания из-за переполнения памяти, гарантирует минимальный размер результирующего каталога и полностью исключает наличие мусорных или поврежденных ссылок.
← На главную