Как организовать хранение и быстрый поиск архивных данных о продажах вне базы 1С

Программист 1С v8.3 (Обычные формы) Управленческий учет Торговля и дистрибуция
← На главную

При свертке информационных баз, таких как Альфа-Авто, часто возникает потребность в сохранении данных о продажах за прошлые периоды для целей планирования закупок. Однако хранение сотен тысяч записей в основной базе после свертки может казаться избыточным, если эти данные потребуются лишь временно (на год или полтора). Рассмотрим ситуацию, когда необходимо сохранить около 720 000 записей об оборотах товаров с возможностью быстрого произвольного доступа по конкретным позициям, не прибегая к полному сканированию файла.

Почему XML и JSON — не лучший выбор для больших массивов

Проанализируем стандартные механизмы работы 1С с форматами XML и JSON. Объекты ЧтениеXML и ЧтениеJSON работают по принципу потокового чтения. Это означает, что для поиска данных по одному товару, находящемуся в конце файла объемом в 700 000 строк, системе придется последовательно прочитать и обработать все предыдущие записи.

Разберем основные ограничения этих форматов:

  1. Отсутствие встроенной индексации: Ни XML, ни JSON не позволяют мгновенно перейти к нужной ветке данных без перебора (в контексте встроенных средств 1С).
  2. XPath в 1С: Хотя механизм XPath существует для XML, его использование часто требует полной загрузки DOM (объект ДокументHTML или аналоги), что при объеме в 720 000 записей приведет к колоссальному потреблению оперативной памяти и зависанию системы.
  3. Отсутствие аналога XPath для JSON: В платформе 1С нет штатной поддержки JSONPath, что делает произвольный поиск в больших JSON-файлах еще более трудоемким.

Вариант 1: Использование индексированных файлов DBF (XBase)

Если данные необходимо хранить именно в файле, проверенным временем и эффективным решением является формат DBF. В отличие от текстовых форматов, объект 1С XBase поддерживает работу с индексами, что обеспечивает мгновенный поиск.

Рассмотрим алгоритм реализации этого метода:

  1. Создаем структуру файла .dbf с полями: ID_TOVAR (строка для UUID), PERIOD (дата или число), QUANTITY (число).
  2. Создаем индексный файл .cdx по полю ID_TOVAR.

Посмотрим на пример кода для поиска данных в таком файле:


// Открываем файл и подключаем индекс
ФайлАрхива = Новый XBase;
ФайлАрхива.ОткрытьФайл("C:\Archive\Sales.dbf", "C:\Archive\Sales.cdx");

Если ФайлАрхива.Открыта() Тогда
    ФайлАрхива.ТекущийИндекс = ФайлАрхива.Индексы.ID_IDX;
    
    // Ищем конкретный товар по его уникальному идентификатору
    UUIDТовара = Строка(ТоварСсылка.УникальныйИдентификатор());
    Если ФайлАрхива.Найти(UUIDТовара, "=") Тогда
        // Данные найдены, можем перебирать записи, если их несколько
        Пока ФайлАрхива.ID_TOVAR = UUIDТовара Цикл
            // Обработка данных (например, суммирование по месяцам)
            Количество = ФайлАрхива.QUANTITY;
            Если Не ФайлАрхива.Следующая() Тогда
                Прервать;
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;
    
    ФайлАрхива.ЗакрытьФайл();
КонецЕсли;

Преимущества: Скорость поиска практически не зависит от размера файла, а работа ведется напрямую из 1С без внешних компонент.

Вариант 2: Внешняя база данных SQLite через ADO

Если требуется более сложная аналитика (например, запросы со сложными фильтрами), проанализируем использование SQLite. Это компактная база данных в одном файле, к которой можно обращаться через COM-объект ADODB.Connection.

Выясним преимущества этого подхода:

Для работы потребуется установленный в системе ODBC драйвер SQLite. Обращение из 1С будет выглядеть как работа с внешним источником данных, но на уровне программного кода через ADO.

Вариант 3: Регистр сведений — почему это эффективнее "костылей"

Несмотря на желание вынести данные из базы, разберем ситуацию с точки зрения производительности SQL-сервера, на котором работает 1С. 720 000 записей — это крайне малый объем для современной СУБД (Microsoft SQL Server или PostgreSQL). В среднем такая таблица будет занимать от 50 до 150 Мб дискового пространства.

Почему стоит выбрать Регистр Сведений (РС):

  1. Ссылочная целостность: При хранении в файле вы оперируете строками (UUID). Если товар будет удален или изменен в основной базе, связь в файле может "повиснуть". В РС 1С контролирует ссылки автоматически.
  2. Безопасность и бэкапы: Архивные данные будут попадать в общий бэкап базы. Вам не нужно заботиться о сохранности отдельных файлов на диске и правах доступа к ним.
  3. Удобство разработки: Вам доступны все механизмы системы: Запросы, Система Компоновки Данных (СКД), автоматические итоги (если использовать Регистр Накопления).

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

Критический нюанс: Идентификаторы (UUID)

При любом способе хранения (кроме внутреннего регистра) важно помнить, что после свертки базы ссылки на объекты могут физически исчезнуть. Поэтому при выгрузке данных в файл всегда сохраняйте текстовое представление Уникального Идентификатора (UUID).

Рассмотрим пример получения строкового ID для записи в файл:


ИдентификаторСтрокой = Строка(СсылкаНаТовар.УникальныйИдентификатор());
// Именно эту строку мы записываем в поле ID_TOVAR нашего DBF или SQLite файла

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

Резюме и рекомендации

Проанализировав все варианты, можно сделать следующие выводы:

← На главную