Как решить проблему превышения максимально допустимого размера файловой базы 1С в РИБ

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

При активной эксплуатации распределенных информационных баз (РИБ) администраторы и разработчики часто сталкиваются с критической ситуацией: периферийные файловые базы начинают «отваливаться» одна за другой с ошибкой «Превышен максимально допустимый размер внутреннего файла». Ситуация осложняется тем, что стандартные методы обслуживания (типа тестирования и исправления, сжатия таблиц или выгрузки-загрузки в .dt) перестают помогать, а увеличение размера страницы базы данных до 64 Кб (которое сдвигает лимит таблицы до 6 Гб) дает лишь временную отсрочку.

В этой статье мы подробно разберем, почему возникает эта проблема (на примере отраслевого медицинского решения БИТ.УМЦ), как локализовать «виновника» разрастания базы данных без использования сторонних утилит, и рассмотрим 5 эффективных способов решения проблемы — от программной оптимизации до перехода на клиент-серверную архитектуру.

Выясняем причину: как узнать, какая таблица переполнилась

Прежде чем приступать к лечению, необходимо поставить точный диагноз. Ошибка превышения размера файла означает, что одна из внутренних таблиц формата .1CD (база данных файловой 1С состоит из множества таких таблиц, упакованных в один файл) превысила физический лимит. В платформе 1С версии 8.3 при стандартном размере страницы 8 Кб этот лимит составляет 4 Гб на одну таблицу (не на всю базу!). При размере страницы 64 Кб лимит увеличивается до 6 Гб.

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

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


ВыборкаТаблиц = ПолучитьСтруктуруХраненияБазыДанных(, Истина);
Для Каждого СтрокаТаблицы Из ВыборкаТаблиц Цикл
    Если СтрокаТаблицы.ИмяТаблицыХранения = "РегистрСведений.ЗначенияПараметровHTML" Тогда
        Сообщить("Найдена целевая таблица: " + СтрокаТаблицы.ИмяТаблицыХранения);
        // Здесь можно вывести информацию о полях таблицы
    КонецЕсли;
КонецЦикла;

В случае использования SQL-сервера для анализа центральной базы данных мы можем запустить стандартный отчет по дисковому пространству таблиц (Standard Reports -> Disk Usage by Table) в SQL Server Management Studio (SSMS). Как показывает практика работы с конфигурацией БИТ.УМЦ, главным виновником переполнения практически всегда оказывается регистр сведений РегистрСведений.ЗначенияПараметровHTML. На его долю может приходиться до 80-90% всего объема базы данных.

Почему раздувается регистр ЗначенияПараметровHTML

Проанализируем специфику работы этого регистра. В медицинских конфигурациях врачи ведут электронные медицинские карты (ЭМК), используя HTML-шаблоны приемов. Основная проблема кроется в действиях пользователей: доктора часто копируют изображения (снимки УЗИ, рентгенограммы, фотографии пациентов) непосредственно в буфер обмена и вставляют их прямо в текстовое HTML-поле документа.

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

Рассмотрим детально методы борьбы с этой проблемой.

Решение №1: Программное «сжатие» HTML и очистка от картинок

Если данные уже накоплены, их необходимо почистить. Мы не можем просто очистить регистр, так как в нем хранится важная текстовая информация приемов пациентов. Нам нужно разработать скрипт, который найдет в HTML-коде внедренные картинки Base64, выгрузит их во внешние файлы (или в стандартные тома хранения файлов 1С), а в самом HTML заменит тяжелый бинарный код на относительные ссылки.

Посмотрим на пример обработки, которая обходит записи регистра и выполняет очистку:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ЗначенияПараметровHTML.Объект,
    |	ЗначенияПараметровHTML.Параметр,
    |	ЗначенияПараметровHTML.ЗначениеHTML
    |ИЗ
    |	РегистрСведений.ЗначенияПараметровHTML КАК ЗначенияПараметровHTML
    |ГДЕ
    |	ЗначенияПараметровHTML.ЗначениеHTML ПОДОБНО ""%data:image/%""";

РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    ИсходныйHTML = ВыборкаДетальныеЗаписи.ЗначениеHTML;
    
    // Проводим анализ строки на наличие Base64 данных
    // Реализуем регулярное выражение или поиск подстрок для выделения картинок
    // Выгружаем бинарные данные в тома хранения файлов
    // Заменяем блок "data:image/jpeg;base64,..." на ссылку на файл
    
    ОчищенныйHTML = ОчиститьСтрокуHTMLОтBase64(ИсходныйHTML);
    
    // Перезаписываем менеджер записи регистра
    МенеджерЗаписи = РегистрыСведений.ЗначенияПараметровHTML.СоздатьМенеджерЗаписи();
    ЗаполнитьЗначенияСвойств(МенеджерЗаписи, ВыборкаДетальныеЗаписи);
    МенеджерЗаписи.Прочитать();
    Если МенеджерЗаписи.Выбран() Тогда
        МенеджерЗаписи.ЗначениеHTML = ОчищенныйHTML;
        МенеджерЗаписи.Записать(Истина);
    КонецЕсли;
КонецЦикла;

После выполнения такой очистки в обязательном порядке необходимо выполнить процедуру **сжатия таблиц**. Физический размер файла базы данных 1Cv8.1CD на диске не уменьшится автоматически после удаления данных. Запустите конфигуратор, перейдите в «Администрирование -> Тестирование и исправление» и выберите пункт «Сжатие таблиц информационной базы».

Решение №2: Использование томов хранения файлов

Для предотвращения повторного разрастания базы настроим систему хранения присоединенных файлов. Платформа 1С позволяет хранить файлы не в самой базе данных, а в специально выделенных сетевых папках (томах).

Выполним следующие шаги для настройки:

  1. Перейдем в раздел Администрирование -> Настройки работы с файлами.
  2. Установим флаг Хранить файлы в томах на диске.
  3. Перейдем по гиперссылке Тома хранения файлов и создадим новый том, указав к нему сетевой путь в формате UNC (например, \\server-fs\1c_files) для операционных систем Windows или Unix-путь для Linux.
  4. Настроим права доступа к этой папке для учетной записи, под которой запускается служба сервера 1С или под которой работают пользователи файловых баз.

При такой настройке все вновь добавляемые файлы, снимки и документы будут автоматически сохраняться на жестком диске сервера, минуя базу данных, что сохранит размер файла 1Cv8.1CD в пределах нормы.

Решение №3: Настройка правил миграции в планах обмена РИБ

Одной из главных ошибок архитекторов РИБ является избыточная синхронизация. Если у вас 25 филиалов (а в перспективе 80), периферийная база конкретной клиники абсолютно не нуждается в историях болезни, протоколах приемов и параметрах HTML пациентов других 79 филиалов. Без ограничений обмена базы на точках быстро переполнятся чужой информацией.

Проанализируем ситуацию и ограничим миграцию данных:

Решение №4: Переход на платформу 1С 8.5.1

Рассмотрим вариант системного решения проблемы за счет обновления технологической платформы. Начиная с версии 8.5.1, фирма «1С» кардинально переработала формат файловой базы данных.

Основные изменения платформы 8.5.1:

Однако при переходе на платформу 8.5.1 в распределенной системе важно учитывать строгие правила синхронизации платформ:

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

Решение №5: Переход на PostgreSQL с лицензией «Сервер МИНИ»

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

Покупка стандартной лицензии на сервер 1С:Предприятия для каждой из 80 точек экономически нецелесообразна. Специально для небольших филиалов фирма «1С» предлагает доступное решение — лицензию «1С:Предприятие 8. Сервер МИНИ».

Рассмотрим особенности использования «Сервера МИНИ»:

Резюме и план действий

Для устранения проблемы превышения размера файла рекомендуем придерживаться следующего пошагового плана:

  1. Выполнить программный анализ базы, выявить наиболее раздутые таблицы и регистры сведений.
  2. Если это регистр с HTML/файлами — разработать обработку очистки, перенести хранение всех медиафайлов во внешние тома на диске и провести регламентное сжатие таблиц.
  3. Настроить правила регистрации объектов в плане обмена РИБ, исключив миграцию избыточных данных документов между филиалами.
  4. При наличии технической возможности обновить платформу на версию 8.5.1 на всех узлах для расширения лимитов таблиц до 16 Гб.
  5. Для наиболее нагруженных филиалов запланировать постепенный перевод баз на СУБД PostgreSQL с использованием бюджетных лицензий «1С:Сервер МИНИ».
← На главную