Работа с распределенными информационными базами (УРБД) на платформе «1С:Предприниматель 7.7» (в частности, в конфигурации «Торговля и Склад») со временем может преподносить неприятные сюрпризы. Один из наиболее распространенных сценариев — зависание процесса обмена при попытке загрузить «тяжелый» пакет данных (например, файл обмена объемом более 20–25 МБ в сжатом виде). В распакованном состоянии такой объем транзакций превращается в сотни мегабайт плоских таблиц, обработка которых штатными средствами DBF-движка может занимать долгие часы или вовсе приводить к кажущемуся «зависанию» системы.
В этой статье мы подробно разберем, почему возникают подобные проблемы, как оптимизировать систему для быстрой обработки больших пакетов обмена и какими техническими способами можно вручную «пропустить» проблемную посылку, если база данных намертво заблокировалась.
Для современных систем 25 МБ — крошечный объем данных, однако для файловой архитектуры 1С 7.7 это колоссальная нагрузка. Давайте проанализируем основные причины медленной работы:
*.dbf и *.cdx для каждой записываемой строки. Это снижает скорость записи в десятки раз.Ниже мы рассмотрим последовательные варианты решения проблемы: от простых административных мер до прямого вмешательства в структуру базы данных и файлы обмена.
Прежде чем приступать к опасным манипуляциям с таблицами базы данных, настоятельно рекомендуется дать системе возможность завершить обмен штатными средствами, но в максимально комфортных для нее условиях. Как показывает практика, высвобождение ресурсов позволяет успешно завершить даже самые безнадежные обмены.
Выполним следующие шаги по оптимизации процесса:
При таком подходе пакет обмена, который ранее «вешал» систему на сутки, гарантированно загрузится за несколько часов (или даже десятков минут).
Если пакет данных по какой-то причине поврежден, содержит логические ошибки или вам экстренно необходимо возобновить обмен, пропустив текущую тяжелую транзакцию, можно скорректировать состояние регистрации пакетов непосредственно в базе-приемнике. Для этого нам понадобится редактор таблиц DBF (например, DBF Navigator или любой аналогичный инструмент).
Давайте разберем внутреннюю структуру служебных таблиц УРБД, отвечающих за этот процесс:
1SDBSET — содержит список всех баз, участвующих в распределенной сети. Поле DBSIGN хранит трехсимвольный код базы, а поле DBSTATUS определяет ее статус (например, M — центральная, P — периферийная).1SDWNLDS — системная таблица, в которой фиксируются загруженные пакеты обмена.Чтобы заставить центральную базу (ЦБ) «поверить», что пакет от периферийной базы уже был успешно загружен, выполним следующие действия:
1sdwnlds.dbf в каталоге центральной базы данных с помощью DBF-редактора.acknowl (статус подтверждения пакета) для всех входящих пакетов этой базы установим значение A (что означает Acknowledged — принято/подтверждено).dwnldid.После сохранения изменений система посчитает, что пакет уже обработан, и при следующем сеансе автообмена потребует уже следующий по порядку номер транзакции.
Важное предупреждение: Использование данного метода неизбежно приведет к рассинхронизации данных между базами, так как сами документы и справочники из пропущенного пакета физически не запишутся в базу-приемник. Используйте этот метод только в крайнем случае, с последующей ручной перегрузкой измененных объектов или полной переинициализацией!
Еще один способ «обмануть» систему контроля последовательности пакетов без прямого редактирования таблиц базы данных — это корректировка служебного заголовка самого файла обмена. Файлы переноса данных в 1С 7.7 представляют собой текстовые файлы со специфической разметкой.
Рассмотрим этот процесс по шагам:
CP0.zip или PC0.zip). Распакуем этот архив в отдельный каталог. Внутри мы обнаружим файл данных 1cv77.dat (или 1cv77chs.dat) и служебный файл описания 1cv77dld.id.1cv77.dat с помощью любого продвинутого текстового редактора (например, Notepad++).
{"Каталог",
{"Версия","7.70"},
{"Отправитель","ПБ"},
{"Получатель","ЦБ"},
{"НомерПакета","105"},
{"ПодтвержденныйНомер","104"}
}
НомерПакета на то число, которое в данный момент ожидает база-приемник (то есть текущий ожидаемый номер транзакции). В некоторых случаях достаточно просто увеличить номер текущей посылки на единицу (сделать +1 к ожидаемому значению).1cv77.dat.PC0.zip) и поместим в каталог обмена. При запуске импорта 1С считает измененный заголовок, сопоставит номера и безболезненно примет пакет.Если рассинхронизация данных зашла слишком далеко, пакеты заблокированы «намертво», а ручные правки вызывают опасения, наиболее чистым решением будет проведение полной переинициализации проблемного узла.
Для этого выполним следующую последовательность действий:
1SDBSET.DBSTATUS с значения P (Peripheral) на значение N (неинициализированная периферийная база).При работе с действительно огромными базами данных администраторы часто сталкиваются со следующей проблемой: когда объем распакованного файла 1cv77.dat превышает 2 ГБ, штатный ZIP-архиватор платформы 1С 7.7 аварийно завершает работу с ошибкой переполнения памяти.
Для обхода этого ограничения рекомендуется отказаться от штатного сжатия средствами 1С. Вместо этого в настройках автообмена отключают архивацию и настраивают выгрузку «чистого» XML/DAT-текста, а процесс сжатия и передачи делегируют внешним скриптам на базе современных консольных архиваторов (например, 7-Zip или WinRAR), запускаемых через планировщик задач операционной системы.