Как выполнить свертку доработанной базы 1С 7.7 и исправить ошибку «Деление на 0»?

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

Работа с устаревшими, но критически важными системами на платформе 1С:Предприятие 7.7 часто преподносит сюрпризы, связанные с техническими ограничениями формата DBF. Одной из самых острых проблем является достижение файлом базы данных размера 2 ГБ. В этой статье мы подробно разберем, как правильно подойти к свертке сильно измененной конфигурации, как исправить последствия некорректного вмешательства в файлы базы и устранить ошибку «Деление на 0» в глобальном модуле.

Проблема лимита 2 ГБ и «вандальная» обрезка базы

Рассмотрим ситуацию: база данных формата DBF (например, «Торговля и Склад 7.7») перестает работать, так как файл индексов или регистров (RG*, RA*) превысил физический предел в 2 гигабайта. Часто системные администраторы или неопытные фрилансеры пытаются «оживить» систему, просто удаляя часть записей из .DBF файлов или очищая их физически.

Проанализируем последствия такого подхода. После подобной «обрезки» программа может запуститься, но при попытке поиска товара или формирования отчета возникают критические ошибки. Это происходит из-за нарушения ссылочной целостности и повреждения итогов. Выясним причину конкретной ошибки Деление на 0, возникающей в строке:


НайденныйОстаток = ТаблОстатков.Количество / Коэфф; 
// {Глобальный модуль(1519)}: Деление на 0

Ошибка указывает на то, что переменная Коэфф (коэффициент единицы измерения) равна нулю или не определена. Это прямое следствие того, что при «ручной» чистке базы были повреждены записи в справочнике Единицы или нарушены связи между номенклатурой и её базовыми единицами измерения.

Решение 1: Программное исправление ошибки деления на 0

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

Найдем проблемный участок кода и заменим его на безопасный вариант:


// Было:
// НайденныйОстаток = ТаблОстатков.Количество / Коэфф;

// Стало (вариант с проверкой):
КоэффДляДеления = ?(Коэфф = 0, 1, Коэфф);
НайденныйОстаток = ТаблОстатков.Количество / КоэффДляДеления;

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

Решение 2: Восстановление целостности данных в справочниках

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

  1. Создадим внешнюю обработку, которая переберет справочник Единицы.
  2. Проверим значение реквизита Коэффициент для каждого элемента.
  3. Если Коэффициент равен 0, установим его равным 1 (или другому корректному значению согласно логике учета).
  4. Дополнительно проверим справочник Номенклатура на наличие незаполненных ссылок на базовые и основные единицы измерения.

После исправления данных обязательно запустим Тестирование и исправление ИБ в конфигураторе с выбранными пунктами «Проверка ссылочной целостности» и «Пересчет итогов». Это критически важно после любой механической «обрезки» файлов DBF.

Решение 3: Правильная свертка сильно доработанной базы

Теперь разберем, как выполнить полноценную свертку, если типовая обработка Wrap.ert не справляется из-за большого количества кастомных (самописных) регистров и документов. Посмотрим на два основных подхода:

Метод А: Индивидуальная свертка через «Ввод остатков»

Для «переписанной» семерки лучше всего написать собственную процедуру свертки. Она должна работать по следующему алгоритму:

  1. Определяем дату свертки (например, 31.12.2016).
  2. Создаем специальные документы «Ввод остатков» для каждого регистра (и типового, и кастомного).
  3. Программно обходим все остатки на дату свертки и записываем их в новые документы.
  4. Проводим документы ввода остатков 01.01.2017 00:00:00.
  5. Удаляем (или помечаем на удаление) все документы до даты свертки.
  6. Выполняем физическую очистку базы через удаление помеченных объектов.

Метод Б: Свертка через «Конвертацию данных» (КД)

Рассмотрим более надежный, хотя и трудоемкий способ — перенос данных в чистую базу. Это позволяет полностью избавиться от «мусора», накопленного годами, и битых ссылок.

Технические хитрости при работе с 1С 7.7

Если ваша база часто вылетает с ошибками чтения или при поиске по коду, проанализируем состояние индексных файлов. В 1С 7.7 индексы хранятся в файлах с расширением .CDX. Рассмотрим процедуру их «лечения»:

  1. Завершим работу всех пользователей.
  2. В каталоге базы данных удалим все файлы с расширением .CDX.
  3. Запустим 1С в монопольном режиме. Система автоматически пересоздаст все индексы.

Это часто помогает устранить странные вылеты программы, которые не лечатся обычным исправлением кода. Также помните, что для баз объемом более 2 ГБ единственным стабильным решением в долгосрочной перспективе является переход на версию 1С 7.7 для SQL, где ограничения файловой системы не действуют.

Подведем итог: никогда не доверяйте «быстрой обрезке» файлов без пересчета итогов. Всегда начинайте с восстановления справочников и пересчета итогов, а для серьезной оптимизации объема используйте методику переноса остатков в чистую информационную базу.

← На главную