Как лучше настроить односторонний обмен двоичными файлами (изображениями) между базами 1С?

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

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

Постановка задачи и варианты решений

Рассмотрим ситуацию: есть база-источник (УТ), где хранятся эталонные фотографии номенклатуры, и база-приемник (Розница), где эти фото нужны для интерфейса кассира или прайс-чекеров. Автор вопроса изначально предложил использовать самописный механизм через COM-соединение. Давайте проанализируем этот и другие варианты, которые мы можем применить.

В ходе анализа мы выделим четыре основных стратегии:

  1. Использование COM-соединения (прямое подключение).
  2. Типовой механизм обмена (планы обмена, EnterpriseData).
  3. Общая файловая папка (SMB/DFS).
  4. Гибридный подход: Веб-сервер + Тома хранения файлов.

Вариант 1. COM-соединение: почему стоит отказаться?

Изначально предложенный вариант с использованием V83.COMConnector выглядит так:


// Пример логики, которую хотел реализовать автор
Коннектор = Новый COMОбъект("V83.COMConnector");
Соединение = Коннектор.Connect("File=""C:\BaseRetail"";Usr=""Admin"";");
// Далее выборка и передача данных

Хотя этот метод кажется простым для программиста, мы настоятельно не рекомендуем использовать его для передачи двоичных данных по следующим причинам:

  1. Зависимость от версий платформы: Для корректной работы COM-коннектора необходимо, чтобы версии comcntr.dll на клиенте и сервере совпадали бит в бит. При автоматическом обновлении одной из баз обмен неминуемо "упадет" с ошибкой "Class not registered".
  2. Управление памятью: Передача больших объемов двоичных данных (BLOB) через COM-интерфейс часто приводит к утечкам памяти процесса rphost или клиентского приложения, так как 1С не всегда корректно освобождает ресурсы после разрыва соединения.
  3. Блокировки: Прямое соединение может вызывать избыточные блокировки таблиц в базе-приемнике.

Вариант 2. Типовой обмен (EnterpriseData)

Давайте посмотрим на стандартные возможности платформы. Механизм синхронизации данных (КД 3.0, формат EnterpriseData) умеет передавать присоединенные файлы "из коробки".

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

Недостатки и нюансы:

При передаче файлов через XML или JSON (EnterpriseData) двоичные данные кодируются в формат Base64. Это увеличивает объем передаваемого трафика примерно на 33%. Если у вас база объемом в сотни гигабайт картинок, файл выгрузки сообщения обмена может стать гигантским, что приведет к ошибке Недостаточно памяти при попытке его прочитать.

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

Вариант 3. Использование томов на диске (Файловая система)

Более грамотным подходом с точки зрения производительности базы данных является хранение файлов не внутри базы (в таблицах SQL), а в томах на диске. Давайте разберем, как это работает.

В настройках "Работа с файлами" мы создаем том (путь к папке на сервере). 1С автоматически раскладывает файлы по подпапкам, используя дату или хэш, чтобы избежать переполнения одной директории (проблема производительности NTFS/ext4 при наличии >100 000 файлов в одной папке).

Если базы находятся в одной локальной сети, мы можем настроить обе базы на работу с одним и тем же сетевым каталогом (UNC-путь, например \\Server\Images).

Риски общего доступа:

Как справедливо заметили участники обсуждения, предоставление прямого доступа двум базам к одним и тем же файлам может привести к "бардаку":

Вариант 4. Оптимальное архитектурное решение (Веб-сервер + Ссылки)

Давайте проанализируем наиболее современный и масштабируемый подход, который решает проблемы производительности и объемов данных. Идея заключается в разделении слоя хранения данных и слоя метаданных.

Алгоритм реализации:

  1. Хранение: В базе-источнике (УТ) настраиваем хранение файлов в томах на диске.
  2. Публикация: Настраиваем веб-сервер (IIS, Apache, Nginx) так, чтобы он "смотрел" в папку с томами и отдавал файлы как статический контент.
  3. Обмен: Между базами передаем только ссылки (URL) на изображения или относительные пути, а не сами двоичные данные.

В этом случае база-приемник (Розница) получает строку вида http://server-ut/images/tovar123.jpg. Когда кассиру нужно увидеть фото, 1С просто скачивает его по HTTP или отображает в поле HTML-документа.

Это дает колоссальный выигрыш:

Практические рекомендации по реализации

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

Очистка регистрации изменений

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


// Пример кода в обработчике "ПередВыгрузкой" или во внешней обработке
ПланыОбмена.УдалитьРегистрациюИзменений(УзелОбмена, Метаданные.Справочники.НоменклатураПрисоединенныеФайлы);

Однако будьте осторожны: если в узле-приемнике разрешено редактирование, данные могут разойтись.

Оптимизация изображений

Прежде чем сохранять фото в хранилище, мы рекомендуем их обрабатывать. Фотографии со современных смартфонов могут весить 5-10 Мб и иметь разрешение 4000x3000, что избыточно для учетной системы.

Используйте средства платформы или внешние компоненты для:

Синхронизация по ID

Чтобы избежать дублей, полезно при загрузке вычислять хэш файла (MD5) и хранить его. В базе-приемнике мы будем искать картинку не по наименованию, а по уникальному идентификатору (GUID) или хэшу.

Итог

Давайте подведем итоги. Для настройки одностороннего обмена фотографиями:

  1. Избегайте COM-соединений и хранения файлов непосредственно в ХранилищеЗначения внутри базы данных при больших объемах.
  2. Если объемы небольшие — используйте типовой обмен (EnterpriseData).
  3. Если объемы значительные (гигабайты) — переведите хранение файлов в Тома на диске.
  4. Для максимальной производительности — опубликуйте папку с томами через Веб-сервер и передавайте в филиалы только URL-ссылки на изображения.
← На главную