В практике администрирования и разработки на платформе 1С:Предприятие иногда возникают аварийные ситуации, когда база данных файлового формата не открывается стандартными средствами, повреждена или требует тонкого низкоуровневого вмешательства (например, для сброса забытого пароля администратора или восстановления поврежденной таблицы). В таких случаях незаменимым инструментом становится утилита Tool_1cd. Однако современные версии баз данных используют формат хранения 8.3.8, который накладывает жесткие ограничения на возможности изменения данных извне.
В этой статье мы подробно разберем, как обойти ограничение режима "только чтение" в новых версиях Tool_1cd, как правильно перевести базу данных в доступный для редактирования формат и что делать, если в процессе конвертации возникает критическая ошибка превышения размера внутреннего файла.
Для начала проанализируем, почему возникает сложность с редактированием современных баз. Утилита Tool_1cd развивалась параллельно с платформой 1С, и ее версии делятся на две принципиальные категории:
Выясним причину, почему версия 0.3.0 выдает ошибку о неподдерживаемой версии базы, если мы пытаемся открыть современный файл 1cv8.1cd. Дело в несовместимости структуры заголовков файлов. Чтобы убедиться в этом, мы можем открыть файл базы данных в любом HEX-редакторе и посмотреть первые 11 байт:
08 03 08 — это новый формат 8.3.8. Если записано 08 02 0E — перед нами старый формат 8.2.14.Таким образом, чтобы получить возможность редактирования, нам необходимо временно выполнить даунгрейд структуры базы данных (ее конвертацию) в формат 8.2.14, внести изменения утилитой Tool_1cd 0.3.0, а затем вернуть базу в исходный формат 8.3.8.
Для изменения структуры файла базы данных используется штатная консольная утилита платформы 1С — cnvdbfl.exe. Она находится в каталоге установленной платформы (папка bin). Проанализируем процесс ее использования по шагам.
Рассмотрим синтаксис команды конвертации базы в старый формат:
"C:\Program Files\1cv8\8.3.X.XXXX\bin\cnvdbfl.exe" -c -f 8.2.14 "Путь_к_файлу\1cv8.1cd"
Где:
На практике пользователи часто сталкиваются с тем, что утилита не запускается или выдает ошибки работы с путями. Разберем основные правила успешного выполнения команды:
1cv8.1cd в простой каталог, например, создайте папку C:\UUU\.1Cv8.1cl, 1Cv8.cdn). Утилите требуется монопольный доступ к файлу базы. Наличие "замочка" (база находится на поддержке поставщика) никак не влияет на процесс конвертации — меняется лишь физическая структура размещения страниц, конфигурация при этом остается нетронутой.Пример корректной команды для выполнения в командной строке:
"C:\Program Files\1cv8\8.3.15.1778\bin\cnvdbfl.exe" -c -f 8.2.14 "C:\UUU\1cv8.1cd"
После завершения работы утилиты мы можем запустить Tool_1cd 0.3.0 и без проблем отредактировать необходимые таблицы. По завершении манипуляций базу рекомендуется вернуть в современный формат обратной командой:
"C:\Program Files\1cv8\8.3.15.1778\bin\cnvdbfl.exe" -c -f 8.3.8 "C:\UUU\1cv8.1cd"
Самая сложная проблема возникает, когда при попытке конвертации базы в формат 8.2.14 утилита cnvdbfl.exe завершает работу аварийно с ошибкой: "Превышен максимально допустимый размер внутреннего файла".
Выясним причину этой ошибки. В старом формате 8.2.14 размер внутренней страницы жестко равен 4 Кб. Из-за этого адресация внутри файла ограничивает максимальный размер любой одной внутренней таблицы (данных, индексов или полей неограниченной длины BLOB) лимитом в 4 Гигабайта (точнее 4 294 967 296 байт). В новом формате 8.3.8 страницы могут иметь размер до 64 Кб, что позволяет таблицам разрастаться до терабайтных значений. Если в вашей рабочей базе формата 8.3.8 размер хотя бы одной таблицы превышает 4 Гб (например, таблица присоединенных файлов или версий объектов занимает 6 Гб), конвертатор физически не сможет "ужать" ее в старый формат.
Рассмотрим по шагам методы решения этой проблемы для успешного даунгрейда базы.
Чтобы понять, какую именно таблицу необходимо уменьшить, нам нужно узнать структуру хранения базы данных и размеры физических таблиц. Для этого запустим базу в режиме "1С:Предприятие" (если она открывается) и выполним следующий код во внешней обработке:
ТаблицаРазмеров = ПолучитьРазмерДанныхБазыДанных();
Для Каждого СтрокаТаблицы Из ТаблицаРазмеров Цикл
РазмерВГб = СтрокаТаблицы.Размер / (1024 * 1024 * 1024);
Если РазмерВГб > 3.5 Тогда
Сообщить("Критический размер таблицы: " + СтрокаТаблицы.ИмяТаблицы + " - " + СтрокаТаблицы.Имя + " (" + Окр(РазмерВГб, 2) + " Гб)");
КонецЕсли;
КонецЦикла;
Встроенная функция ПолучитьРазмерДанныхБазыДанных() вернет нам коллекцию с реальными физическими размерами таблиц на диске. Также можно воспользоваться готовой обработкой "Размер таблиц базы данных" (DBStorageStructureInfo.epf).
После того как проблемная таблица найдена, применим методы ее оптимизации:
_InfoRg... (регистры сведений), хранящие историю изменений объектов (версионирование). Если это ваш случай, зайдите в раздел Администрирование -> Поддержка и обслуживание -> Версионирование объектов и очистите устаревшие версии документов и справочников за предыдущие годы.1cv8.1cd..dt). Создайте пустую папку, добавьте ее как новую базу и выполните загрузку сохраненного файла .dt обратно. При этом процессе файлы таблиц перестраиваются с нуля, отбрасывая весь накопленный "мусор", что существенно уменьшает их объем..dt и вернитесь к файловому варианту, который теперь гарантированно уложится в рамки ограничений формата 8.2.14.После того как размер самой крупной таблицы опустится ниже отметки в 4 Гб, повторно запустите утилиту cnvdbfl.exe. Конвертация пройдет успешно, и вы сможете полноценно работать с вашей базой данных в режиме редактирования через Tool_1cd 0.3.0.