При активной работе с файловыми базами данных 1С:Предприятие многие пользователи сталкиваются с внезапным аварийным завершением работы программы. Ошибка часто сопровождается сообщением о том, что превышен максимальный размер файла базы данных или одной из ее внутренних таблиц. Особенно остро эта проблема проявляется в конфигурациях, где активно ведется электронный документооборот, сканируются и прикрепляются договоры, первичные документы, сертификаты и другие тяжелые файлы.
В этой статье мы подробно разберем, почему возникает эта ошибка, как устроена файловая база данных 1С изнутри, и рассмотрим пошаговые методы решения проблемы — от быстрой реанимации базы до системного изменения архитектуры хранения файлов.
Рассмотрим стандартную ситуацию: общий размер файла 1Cv8.1CD на диске составляет около 9 Гбайт. Администратор проверяет размеры логических таблиц и видит, что самая крупная из них (например, таблица конфигурации Config) занимает чуть больше 1.2 Гб, а остальные таблицы — не более 200–500 Мб. Тем не менее, при попытке прикрепить очередной скан-копию договора в формате PDF база моментально «вылетает» с ошибкой СУБД.
Для того чтобы выяснить причину, нам необходимо заглянуть во внутреннюю структуру СУБД 1С. Файл 1Cv8.1CD — это не просто единый массив данных, а сложная страничная файловая система. Каждая логическая таблица конфигурации (справочники, документы, регистры) на физическом уровне состоит из трех отдельных потоков (внутренних файлов):
Ограничение на размер накладывается СУБД 1С не на весь файл базы данных в целом, а на каждый конкретный внутренний поток (файл) отдельно. В старом формате базы данных (версия 8.2.14) при стандартном размере страницы 4096 байт лимит адресации памяти жестко ограничивает максимальный размер любого из этих внутренних файлов величиной в 4 Гб. Как только таблица хранения присоединенных файлов (а точнее, ее BLOB-поток) достигает критической отметки в 4 Гб, любая попытка записать туда новый файл вызывает переполнение и аварийный останов системы.
Прежде чем приступать к лечению, нам необходимо точно локализовать виновника переполнения. Сделать это можно несколькими путями:
Использование встроенных механизмов 1С. Если база данных еще открывается в режиме Конфигуратора, мы можем написать простую внешнюю обработку или воспользоваться готовыми инструментами с аналитических порталов для оценки физического размера таблиц. Платформа 1С предоставляет для этого разработчикам специальную функцию ПолучитьСтруктуруХраненияБазыДанных().
Рассмотрим пример кода, который позволяет вывести структуру хранения и сопоставить имена физических таблиц СУБД с объектами метаданных конфигурации:
ТаблицаСтруктуры = ПолучитьСтруктуруХраненияБазыДанных( , Истина);
Для Каждого Строка Из ТаблицаСтруктуры Цикл
Если Строка.ИмяТаблицыХранения = "Справочник.ПрисоединенныеФайлы" Тогда
Сообщить("Имя таблицы в СУБД: " + Строка.ИмяТаблицы);
КонецЕсли;
КонецЦикла;
Временный перенос в SQL для анализа. Если база повреждена или не открывается, хорошим решением будет выгрузка базы в файл резервной копии .dt, развертывание ее на временном сервере MS SQL Server или PostgreSQL. С помощью стандартных инструментов СУБД (например, отчета "Disk Usage by Table" в SQL Server Management Studio) можно мгновенно увидеть реальный размер таблиц на диске и объем, занимаемый столбцами с типом VARBINARY(MAX) или BYTEA.
Если работу пользователей необходимо восстановить немедленно, самым быстрым способом является увеличение размера страницы базы данных. Начиная с формата версии 8.3.8, платформа 1С поддерживает страницы размером 8192, 16384, 32768 и 65536 байт. Увеличение размера страницы раздвигает границы адресации, позволяя внутренним таблицам вырастать до 6 Гб (на платформах ветки 8.3) и даже до 16 Гб (на современных версиях платформ).
Проанализируем процесс конвертации базы данных по шагам:
1Cv8.1CD в безопасное место. Проводить операции конвертации без бэкапа категорически запрещено!cnvdbfl.exe. Она находится в каталоге установленной платформы 1С, например: C:\Program Files\1cv8\8.3.12.xxxx\bin\.
"C:\Program Files\1cv8\8.3.12.xxxx\bin\cnvdbfl.exe" -c -f 8.3.8 -p 64k "D:\1C_Bases\Stroyka\1Cv8.1CD"
Параметры утилиты:
-c — запускает режим конвертации базы данных;-f 8.3.8 — устанавливает новую версию формата базы данных;-p 64k — задает размер страницы 64 Кб, что позволяет обойти старый лимит в 4 Гб.После успешного завершения утилиты лимит для каждой внутренней таблицы увеличится. Это даст вам временной запас для проведения полноценных архитектурных изменений.
Хранение тяжелых файлов (сканов документов, картинок, архивов) непосредственно внутри базы данных — крайне неэффективный подход для файлового режима работы. База быстро раздувается, становится неповоротливой, ее тяжело архивировать и восстанавливать в случае сбоев. Единственно верное стратегическое решение — вынести все файлы на жесткий диск сервера, оставив в базе данных только ссылки на них.
Рассмотрим, как настроить данный механизм на примере типовой конфигурации 1С:
D:\1C_File_Storage). Если доступ к базе осуществляется по сети, путь должен быть указан в формате UNC (например, \\Server-1C\1C_File_Storage), а у пользователей должны быть полные права операционной системы на чтение и запись в эту папку.1Cv8.1CD.Обратите внимание: включение настройки хранения файлов в томах влияет только на новые файлы. Ранее загруженные сканы договоров по-прежнему остаются «мертвым грузом» внутри вашей переполненной базы данных.
Чтобы перенести их на диск, выполните следующие действия:
После успешного завершения обработки по переносу файлов в тома многие администраторы замечают странную вещь: файлы на диске в томе появились, в программе они открываются, но сам файл 1Cv8.1CD ничуть не уменьшился в размерах!
Выясним причину этой ситуации. СУБД 1С при удалении записей из таблиц физически не уменьшает размер файла базы данных на диске. Она лишь помечает эти страницы памяти как «свободные» для последующей записи новых данных. Чтобы вернуть операционной системе освободившееся место и уменьшить физический размер файла базы данных, необходимо выполнить принудительное сжатие таблиц.
Разберем по шагам, как правильно выполнить сжатие:
В качестве альтернативного метода сжатия можно использовать цикл выгрузки и загрузки информационной базы через файл резервной копии:
.dt..dt файл.При загрузке из .dt файла вся структура таблиц пересоздается с нуля. Свободные ранее страницы отбрасываются, в результате чего база данных сжимается до своего реального минимального размера. На практике, после выноса сканов в тома и сжатия, база объемом в 9 Гб легко может «похудеть» до 1.5–2 Гб.
Если база данных разрослась не только из-за файлов, но и из-за огромного исторического объема документов за прошлые периоды (например, база ведется с 2016 года), отличным решением станет проведение процедуры свертки базы данных.
Свертка позволяет удалить документы прошлых лет, заменив их едиными документами ввода остатков на определенную дату (например, на начало текущего года). Это существенно сократит количество записей в таблицах движений документов и регистрах накопления. После проведения свертки также обязательно запустите операцию тестирования и исправления со сжатием таблиц, чтобы зафиксировать физическое уменьшение объема файла базы данных.