При работе с базами данных формата DBF в среде 1С:Предприятие 7.7 системные администраторы и программисты часто сталкиваются с критической ошибкой «-120. Writing to file .../RG328.DBF». Эта проблема обычно возникает в конфигурации «Торговля и Склад» при попытке переноса итогов на новый месяц или при проведении документов. Рассмотрим подробно причины возникновения этой ситуации и разберем по шагам методы её решения.
Первым делом проанализируем техническую сторону вопроса. Ошибка «-120» при записи в файл напрямую указывает на то, что файловый движок 1С не может добавить новые данные в таблицу. В 99% случаев это связано с достижением физического лимита размера файла DBF, который составляет 2 Гб.
Почему именно 2 Гб? Платформа 1С 7.7 использует 32-битные смещения для адресации внутри файлов данных. Даже если ваша операционная система установлена на файловой системе NTFS, которая поддерживает файлы огромных размеров, внутренние механизмы 1С «спотыкаются» о границу в 2 147 483 648 байт. Как только файл RG328.DBF (таблица итогов регистра «ПартииНаличие») приближается к этому размеру, любая попытка записи вызывает аварийное завершение операции.
Для эффективного решения задачи нам необходимо понимать, что именно хранится в проблемном файле. В системе 1С 7.7 регистры накопления разделены на две основные таблицы:
Если файл RG328.DBF раздулся до 2 Гб, это сигнализирует о серьезной проблеме в учете: регистр «ПартииНаличие» перестал «схлопываться». Это значит, что в системе накопилось огромное количество записей, где остаток по ресурсам (количество, сумма) равен нулю, но из-за различий в измерениях (разные партии, статусы или склады) записи продолжают храниться в таблице итогов как активные.
Рассмотрим самый простой, «штатный» способ, который помогает в случае наличия в базе большого количества записей, помеченных на удаление. В формате DBF при удалении записи она не стирается физически, а лишь помечается специальным байтом. Чтобы очистить этот «мусор», выполним следующие действия:
Проанализируем результат: если размер файла уменьшился незначительно, значит, проблема не в удаленных записях, а в актуальных данных итогов. При необходимости можно воспользоваться внешней обработкой для физического сжатия DBF-файлов.
Посмотрим на ситуацию глазами системы. Регистр «ПартииНаличие» имеет множество измерений: Номенклатура, МХ (склад), Партия, Статус. Если товар пришел на статус «Купленный», а списался со статусом «На реализации», то в таблице итогов навсегда останутся две строки: +1 по одному статусу и -1 по другому. Для отчета остаток будет нулевым, но для файла базы данных это две полноценные строки.
Чтобы выявить такие хвосты, сформируем отчет «Ведомость по партиям» со следующими настройками:
Если мы обнаружим такие расхождения, необходимо перепровести документы или воспользоваться обработкой исправления движений, чтобы закрыть измерения в ноль. После исправления движений (файла RA) потребуется полный пересчет итогов в Конфигураторе, что позволит «схлопнуть» записи в файле RG.
Проанализируем конфигурацию. Иногда разработчики добавляют в регистр партии лишние измерения, которые не несут практической пользы, но увеличивают количество комбинаций записей. Например, если в вашей организации не используется учет по разным фирмам или не важен «Статус партии», эти измерения можно отключить или сделать их невыбираемыми.
Внимание: изменение структуры регистра приведет к полной реструктуризации таблиц. Это длительный процесс, требующий обязательного бэкапа.
Разберем пример программного отключения использования измерения через код в модуле проведения:
// Вместо записи конкретного значения, записываем пустое
Регистр.ПартииНаличие.Статус = ПолучитьПустоеЗначение("Перечисление.СтатусыПартий");
Регистр.ПартииНаличие.Фирма = ПолучитьПустоеЗначение("Справочник.Фирмы");
Если все документы будут записывать в измерение пустое значение, количество уникальных строк в RG328 сократится в разы.
Если база должна работать «здесь и сейчас», а времени на перепроведение лет учета нет, можно прибегнуть к хирургическому вмешательству. Мы можем программно перебрать файл RG328.DBF и физически удалить из него строки, где все ресурсы (количество, суммы) равны нулю. Для этой задачи можно использовать готовую обработку для удаления нулевых итогов регистров.
Рассмотрим пример логики такой обработки (используем объект XBase):
ДБФ = СоздатьОбъект("XBase");
ДБФ.ОткрытьФайл(КаталогИБ() + "RG328.DBF");
Если ДБФ.Открыта() = 1 Тогда
ДБФ.Первая();
Пока ДБФ.В Конце() = 0 Цикл
// Допустим, SP331 - это Количество, SP332 - Сумма
Если (ДБФ.SP331 = 0) И (ДБФ.SP332 = 0) Тогда
ДБФ.Удалить();
КонецЕсли;
ДБФ.Следующая();
КонецЦикла;
ДБФ.Сжать();
ДБФ.ЗакрытьФайл();
КонецЕсли;
Важное правило: после любых манипуляций с файлами DBF из сторонних программ или через XBase, необходимо обязательно удалить индексные файлы *.CDX в каталоге базы и запустить 1С для их автоматического пересоздания.
Если ваша база достигла размера 5 Гб, а один файл итогов занимает 2 Гб, это явный признак того, что вы переросли формат DBF. Переход на MS SQL Server снимет ограничение в 2 Гб на таблицу. В SQL-версии размер таблиц ограничен только дисковым пространством и возможностями самой СУБД.
Процесс перехода выглядит так:
.dat файл через «Выгрузить данные»..dat файла.Мы рассмотрели основные способы борьбы с ошибкой записи в RG328.DBF. Подведем итоги:
XBase.Помните, что работа с файлами напрямую (через DBF Commander или XBase) — это крайняя мера. Всегда начинайте с анализа корректности ведения учета в самой программе.