При активной эксплуатации распределенных информационных баз (РИБ) администраторы и разработчики часто сталкиваются с критической ситуацией: периферийные файловые базы начинают «отваливаться» одна за другой с ошибкой «Превышен максимально допустимый размер внутреннего файла». Ситуация осложняется тем, что стандартные методы обслуживания (типа тестирования и исправления, сжатия таблиц или выгрузки-загрузки в .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-поле документа.
При такой вставке картинка автоматически преобразуется платформой в длинную текстовую строку формата Base64 и записывается непосредственно в тело 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 на диске не уменьшится автоматически после удаления данных. Запустите конфигуратор, перейдите в «Администрирование -> Тестирование и исправление» и выберите пункт «Сжатие таблиц информационной базы».
Для предотвращения повторного разрастания базы настроим систему хранения присоединенных файлов. Платформа 1С позволяет хранить файлы не в самой базе данных, а в специально выделенных сетевых папках (томах).
Выполним следующие шаги для настройки:
\\server-fs\1c_files) для операционных систем Windows или Unix-путь для Linux.При такой настройке все вновь добавляемые файлы, снимки и документы будут автоматически сохраняться на жестком диске сервера, минуя базу данных, что сохранит размер файла 1Cv8.1CD в пределах нормы.
Одной из главных ошибок архитекторов РИБ является избыточная синхронизация. Если у вас 25 филиалов (а в перспективе 80), периферийная база конкретной клиники абсолютно не нуждается в историях болезни, протоколах приемов и параметрах HTML пациентов других 79 филиалов. Без ограничений обмена базы на точках быстро переполнятся чужой информацией.
Проанализируем ситуацию и ограничим миграцию данных:
РегистрСведений.ЗначенияПараметровHTML настроим фильтрацию по подразделению (филиалу). На периферийный узел должны уходить только те записи, которые привязаны к документам этого конкретного узла.Рассмотрим вариант системного решения проблемы за счет обновления технологической платформы. Начиная с версии 8.5.1, фирма «1С» кардинально переработала формат файловой базы данных.
Основные изменения платформы 8.5.1:
1cv8.1cd увеличен до 16 Гбайт.Однако при переходе на платформу 8.5.1 в распределенной системе важно учитывать строгие правила синхронизации платформ:
Если интернет-канал на удаленных точках нестабилен, но нагрузка на базу высокая, а данные продолжают расти, оптимальным решением станет отказ от файлового режима на периферии в пользу полноценной клиент-серверной архитектуры на бесплатной СУБД PostgreSQL.
Покупка стандартной лицензии на сервер 1С:Предприятия для каждой из 80 точек экономически нецелесообразна. Специально для небольших филиалов фирма «1С» предлагает доступное решение — лицензию «1С:Предприятие 8. Сервер МИНИ».
Рассмотрим особенности использования «Сервера МИНИ»:
Для устранения проблемы превышения размера файла рекомендуем придерживаться следующего пошагового плана: