Как исправить ошибку -120 при записи в файл RG328.DBF в 1С:Предприятии 7.7

Программист 1С v7.7 Управленческий учет Торговля и дистрибуция
← На главную

При работе с базами данных формата 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 (таблица итогов регистра «ПартииНаличие») приближается к этому размеру, любая попытка записи вызывает аварийное завершение операции.

Разберем структуру регистров: файлы RG и RA

Для эффективного решения задачи нам необходимо понимать, что именно хранится в проблемном файле. В системе 1С 7.7 регистры накопления разделены на две основные таблицы:

  1. Файлы RA (движения): Здесь хранятся все записи, которые создают документы (приход, расход).
  2. Файлы RG (итоги): Здесь хранятся рассчитанные остатки в разрезе всех измерений на начало каждого месяца.

Если файл RG328.DBF раздулся до 2 Гб, это сигнализирует о серьезной проблеме в учете: регистр «ПартииНаличие» перестал «схлопываться». Это значит, что в системе накопилось огромное количество записей, где остаток по ресурсам (количество, сумма) равен нулю, но из-за различий в измерениях (разные партии, статусы или склады) записи продолжают храниться в таблице итогов как активные.

Метод 1: Тестирование и исправление с упаковкой таблиц

Рассмотрим самый простой, «штатный» способ, который помогает в случае наличия в базе большого количества записей, помеченных на удаление. В формате DBF при удалении записи она не стирается физически, а лишь помечается специальным байтом. Чтобы очистить этот «мусор», выполним следующие действия:

  1. Создадим полную резервную копию базы данных.
  2. Запустим 1С в режиме Конфигуратора монопольно.
  3. Перейдем в меню «Администрирование» — «Тестирование и исправление ИБ».
  4. Установим флажок «Упаковка таблиц».
  5. Нажмем «Выполнить».

Проанализируем результат: если размер файла уменьшился незначительно, значит, проблема не в удаленных записях, а в актуальных данных итогов. При необходимости можно воспользоваться внешней обработкой для физического сжатия DBF-файлов.

Метод 2: Поиск и устранение «фантомных» остатков

Посмотрим на ситуацию глазами системы. Регистр «ПартииНаличие» имеет множество измерений: Номенклатура, МХ (склад), Партия, Статус. Если товар пришел на статус «Купленный», а списался со статусом «На реализации», то в таблице итогов навсегда останутся две строки: +1 по одному статусу и -1 по другому. Для отчета остаток будет нулевым, но для файла базы данных это две полноценные строки.

Чтобы выявить такие хвосты, сформируем отчет «Ведомость по партиям» со следующими настройками:

Если мы обнаружим такие расхождения, необходимо перепровести документы или воспользоваться обработкой исправления движений, чтобы закрыть измерения в ноль. После исправления движений (файла RA) потребуется полный пересчет итогов в Конфигураторе, что позволит «схлопнуть» записи в файле RG.

Метод 3: Оптимизация структуры регистра

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

Внимание: изменение структуры регистра приведет к полной реструктуризации таблиц. Это длительный процесс, требующий обязательного бэкапа.

Разберем пример программного отключения использования измерения через код в модуле проведения:


// Вместо записи конкретного значения, записываем пустое
Регистр.ПартииНаличие.Статус = ПолучитьПустоеЗначение("Перечисление.СтатусыПартий");
Регистр.ПартииНаличие.Фирма = ПолучитьПустоеЗначение("Справочник.Фирмы");

Если все документы будут записывать в измерение пустое значение, количество уникальных строк в RG328 сократится в разы.

Метод 4: Прямая очистка нулевых итогов (XBase)

Если база должна работать «здесь и сейчас», а времени на перепроведение лет учета нет, можно прибегнуть к хирургическому вмешательству. Мы можем программно перебрать файл RG328.DBF и физически удалить из него строки, где все ресурсы (количество, суммы) равны нулю. Для этой задачи можно использовать готовую обработку для удаления нулевых итогов регистров.

Рассмотрим пример логики такой обработки (используем объект XBase):


ДБФ = СоздатьОбъект("XBase");
ДБФ.ОткрытьФайл(КаталогИБ() + "RG328.DBF");
Если ДБФ.Открыта() = 1 Тогда
    ДБФ.Первая();
    Пока ДБФ.В Конце() = 0 Цикл
        // Допустим, SP331 - это Количество, SP332 - Сумма
        Если (ДБФ.SP331 = 0) И (ДБФ.SP332 = 0) Тогда
            ДБФ.Удалить();
        КонецЕсли;
        ДБФ.Следующая();
    КонецЦикла;
    ДБФ.Сжать();
    ДБФ.ЗакрытьФайл();
КонецЕсли;

Важное правило: после любых манипуляций с файлами DBF из сторонних программ или через XBase, необходимо обязательно удалить индексные файлы *.CDX в каталоге базы и запустить 1С для их автоматического пересоздания.

Метод 5: Переход на SQL-версию 1С 7.7

Если ваша база достигла размера 5 Гб, а один файл итогов занимает 2 Гб, это явный признак того, что вы переросли формат DBF. Переход на MS SQL Server снимет ограничение в 2 Гб на таблицу. В SQL-версии размер таблиц ограничен только дисковым пространством и возможностями самой СУБД.

Процесс перехода выглядит так:

  1. Выгрузка данных в .dat файл через «Выгрузить данные».
  2. Создание пустой базы на SQL Server.
  3. Запуск 1С в режиме Конфигуратора, настройка параметров связи с SQL.
  4. Загрузка данных из .dat файла.

Итоги и рекомендации

Мы рассмотрели основные способы борьбы с ошибкой записи в RG328.DBF. Подведем итоги:

Помните, что работа с файлами напрямую (через DBF Commander или XBase) — это крайняя мера. Всегда начинайте с анализа корректности ведения учета в самой программе.

← На главную