В процессе коллективной разработки на платформе 1С:Предприятие 8.3 программисты часто сталкиваются с неприятной ситуацией: после завершения процесса передачи изменений («помещения») объектов, Конфигуратор намертво зависает. Это происходит в тот момент, когда прогресс-бар уже дошел до конца, и система должна вернуть управление пользователю. Особенно часто данная проблема проявлялась на релизах ветки 8.3.17, в частности 8.3.17.1496.
Давайте разберем по шагам, почему это происходит и какие действия помогут нам восстановить стабильную работу хранилища конфигурации.
Первым делом проанализируем ситуацию с локальными данными разработчика. Зависание в конце процесса часто связано с тем, что после успешной записи данных в файл хранилища, Конфигуратор пытается обновить локальный индекс и кэш конфигурации. Если эти файлы повреждены или имеют огромный размер, процесс может затянуться на десятки минут.
Выполним следующие действия:
configcfg — именно там хранятся вспомогательные данные конфигуратора, очистка которых часто решает проблему «бесконечного» ожидания.1cv8ddb.1cd.Если хранилище эксплуатируется много лет без пересоздания, в нем могут накопиться логические ошибки таблиц истории. Рассмотрим ситуацию, когда обычная оптимизация не помогает. В этом случае нам потребуется утилита для проверки физической целостности баз данных 1С.
Разберем алгоритм проверки:
bin) утилиту chdbfl.exe.1cv8ddb.1cd, который находится в корневом каталоге вашего хранилища.Важно помнить, что зависание на этапе фиксации транзакции часто сигнализирует о невозможности корректно закрыть запись в таблицу History из-за фрагментации или битых ссылок внутри файла.
Проанализируем способ подключения к хранилищу. Если вы используете прямой путь к сетевой папке (например, \\Server\1c_repo), то вы работаете через протокол SMB. Этот протокол крайне чувствителен к задержкам сети и блокировкам со стороны антивирусов. При помещении объектов 1С блокирует файл целиком, и если в этот момент сеть «моргнет», Конфигуратор может уйти в бесконечное ожидание ответа от файловой системы.
Рассмотрим переход на сервер хранилища конфигурации:
crserver.exe (входит в стандартную поставку платформы).tcp://ИмяСервера/ПутьКХранилищу.Использование сервера хранилища снимает проблему файловых блокировок и значительно ускоряет финализацию помещения объектов, так как сервер берет на себя всю работу по записи данных в файл.
Выясним причину, связанную с версией 8.3.17.1496. В данной ветке был зафиксирован ряд багов, связанных с утечкой памяти и некорректной десериализацией метаданных при работе с хранилищем. Если несколько разработчиков используют разные минорные версии платформы (например, один 8.3.16, а другой 8.3.17), формат записываемых данных может конфликтовать.
В такой ситуации мы рекомендуем:
.cf, создайте абсолютно новое пустое хранилище и загрузите конфигурацию туда. Это «обнулит» историю и устранит накопленные ошибки формата метаданных.Если ни один из способов не помог, нам необходимо «заглянуть под капот» процесса. Для этого настроим сбор Технологического журнала (ТЖ). Нам интересны события исключительных ситуаций и блокировок.
Создадим файл logcfg.xml в папке conf со следующим содержанием:
<config xmlns="http://v8.1c.ru/7.4/config/logcfg">
<log location="C:\LOGS\1C" history="24">
<event>
<eq property="name" value="EXCP"/>
</event>
<event>
<eq property="name" value="LOCK"/>
</event>
<event>
<eq property="name" value="SDBL"/>
</event>
<property name="all"/>
</log>
</config>
После воспроизведения зависания проанализируем логи. Если мы увидим записи WaitConnections или длительные события SDBL, это будет прямым подтверждением проблем на уровне взаимодействия с СУБД (в случае файлового хранилища — с файлом базы данных) или сетевых ожиданий.
Подводя итог, можно сказать, что зависание в конце помещения объектов — это комплексная проблема. Чаще всего она лечится очисткой кэша и оптимизацией файла хранилища. Однако для профессиональной командной разработки наиболее надежным решением будет переход на протокол TCP/HTTP через сервер хранилища и регулярный контроль целостности базы хранилища утилитой chdbfl.exe.