В каком формате лучше хранить внешние данные в 1С, если нельзя изменять конфигурацию?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

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

Использование формата DBF через объект XBase

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

Разберем, почему это важно. Если данных станет «много», поиск нужной записи в обычном текстовом файле потребует его полного прочтения в память. Объект XBase позволяет работать с файлом порционно и мгновенно находить записи по индексу (файлы .cdx).

Проанализируем пример создания и записи данных в DBF:


// Создание структуры файла
НовыйФайл = Новый XBase;
НовыйФайл.Поля.Добавить("ID", "S", 36); // УИД объекта
НовыйФайл.Поля.Добавить("NAME", "S", 150);
НовыйФайл.Поля.Добавить("PRICE", "N", 15, 2);
НовыйФайл.СоздатьФайл("C:\ExternalData\ExtraCatalog.dbf");
НовыйФайл.Индексы.Добавить("ID_IDX", "ID");
НовыйФайл.СоздатьИндексныйФайл("C:\ExternalData\ExtraCatalog.cdx");

// Запись данных
НовыйФайл.Добавить();
НовыйФайл.ID = "550e8400-e29b-41d4-a716-446655440000";
НовыйФайл.NAME = "Внешний товар №1";
НовыйФайл.PRICE = 1250.50;
НовыйФайл.Записать();
НовыйФайл.ЗакрытьФайл();

Для поиска данных мы будем использовать метод Найти(), который работает практически мгновенно даже при десятках тысяч записей, если поле проиндексировано. Это значительно эффективнее, чем механизмы ЗначениеВФайл.

Внешние источники данных (ВИД)

Начиная с версии платформы 8.2.14, у нас появилась возможность использовать объект метаданных Внешние источники данных. Это наиболее «цивилизованный» способ работы со сторонними базами данных (SQL Server, PostgreSQL, SQLite). Несмотря на ограничение «конфигурацию менять нельзя», в некоторых случаях разрешается добавлять объекты, которые не затрагивают существующие связи (например, через расширения или если разрешено минимальное вмешательство в дерево метаданных).

Основные преимущества использования ВИД:

  1. Возможность работы с данными через объектную модель 1С (почти как со справочниками).
  2. Использование внешних таблиц в запросах и отчетах на базе СКД.
  3. Высокая скорость работы при больших объемах данных за счет ресурсов СУБД.

Важное ограничение для версии 8.2: помним, что в одном запросе нельзя одновременно обращаться к таблицам базы 1С и к таблицам внешнего источника. Данные придется объединять программно на стороне 1С в таблице значений.

Использование SQLite через ADO

Если нам нужно хранить сложные структурированные данные, но мы не хотим разворачивать полноценный SQL-сервер, отличным вариантом будет SQLite. Это легковесная база данных в одном файле. Для работы с ней в 1С 8.2 мы можем использовать технологию ADO.

Рассмотрим ситуацию: нам нужно быстро выбрать данные из внешней таблицы. Для этого потребуется установленный в системе драйвер SQLite3 ODBC Driver. Посмотрим на пример подключения:


Соединение = Новый COMОбъект("ADODB.Connection");
ConnectionString = "Driver={SQLite3 ODBC Driver};Database=C:\ExternalData\myData.db;";
Соединение.Open(ConnectionString);

ЗапросSQL = "SELECT * FROM ExtraData WHERE Status = 'Active'";
RecordSet = Соединение.Execute(ЗапросSQL);

Пока НЕ RecordSet.EOF Цикл
    Сообщить(RecordSet.Fields("Name").Value);
    RecordSet.MoveNext();
КонецЦикла;
Соединение.Close();

Этот метод гарантирует целостность данных благодаря поддержке транзакций. В отличие от файлов .txt или .xml, база данных SQLite не повредится, если в момент записи произойдет аварийное завершение сеанса 1С.

Почему не стоит использовать ЗначениеВФайл и ЗначениеИзФайла

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

Этот механизм подходит только для хранения настроек или очень маленьких списков (до 1000 записей).

Использование штатных механизмов: Дополнительные сведения

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

Преимущества:

Создание базы-спутника

В сложных случаях, когда объем внешних данных сопоставим с основной базой, рассмотрим вариант создания отдельной легкой конфигурации на 1С (так называемой «базы-спутника»). Связь между основной базой и спутником можно организовать через:

  1. COM-соединение: Просто в реализации, но медленно при инициализации.
  2. HTTP-сервисы: Современный и быстрый способ. База-спутник публикуется на веб-сервере, и основная конфигурация обращается к ней короткими запросами.

Этот подход идеален для распределенных систем (РИБ), так как позволяет узлам работать автономно, обращаясь к локальным копиям данных, и синхронизировать их централизованно.

Выводы и рекомендации

Выясним, какой формат выбрать в зависимости от условий:

  1. Если нужно простое хранение в файлах и важна скорость поиска — выбираем DBF (XBase).
  2. Если важна надежность, транзакции и возможность сложных SQL-запросов — используем SQLite через ADO.
  3. Если есть возможность минимально доработать конфигурацию — используем Внешние источники данных.
  4. Если конфигурация на БСП и данных немного — используем Дополнительные сведения.

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

← На главную