Почему зависает «1С:Торговля и склад 7.7» при подключении второго пользователя и как это исправить?

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

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

Причина 1. Системный механизм сетевых блокировок Oplocks и протокол SMB

Для того чтобы понять природу зависаний, проанализируем поведение операционной системы Windows при работе с файловыми базами данных по сети:

  1. Монопольный режим (один пользователь): Когда в базе работает только один человек, операционная система использует механизм Oplocks (Opportunistic Locks). Она разрешает компьютеру пользователя кэшировать файлы базы данных (таблицы .dbf и индексы .cdx) в своей оперативной памяти. Все операции поиска, чтения и записи происходят практически мгновенно на локальной машине, а на сетевой диск данные отправляются в фоновом асинхронном режиме. В результате программа работает очень быстро.
  2. Многопользовательский режим (два и более пользователей): Как только к базе подключается второй компьютер, сервер отключает кэширование файлов для обоих клиентов, чтобы избежать рассинхронизации и повреждения базы данных. С этого момента каждое действие в программе (открытие формы, проведение документа, выбор номенклатуры) преобразуется в тысячи мелких прямых запросов к файлам на сервере по сети. Любая задержка сети или дисковой подсистемы сервера приводит к зависанию интерфейса «1С».

Причина 2. Ошибки в доработанном коде конфигурации

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

А. Постоянная перезапись констант или периодических реквизитов.
Все константы в «1С 7.7» хранятся в одной физической таблице — файле 1SCONST.DBF. Если в доработанной конфигурации при открытии форм, при проведении документов или во встроенных обработчиках ожидания происходит постоянное обновление какой-либо константы, этот файл блокируется. В результате все остальные пользователи ждут своей очереди на чтение или запись, что проявляется как глухое зависание программы. Пример неоптимального кода:


// Пример кода, который блокирует файл констант для всех пользователей
Процедура ПриОткрытии()
    Константа.ПоследнийАктивныйПользователь.Установить(ИмяПользователя());
КонецПроцедуры

Б. Использование неиндексированных отборов.
В файловой версии «1С 7.7» при поиске или установке фильтров по реквизитам справочника (например, по справочнику «Номенклатура», который в нашем случае весит 32 Мб) система обязана использовать индексные файлы .cdx. Если программист наложил отбор методом УстановитьОтбор() по реквизиту, у которого в Конфигураторе не включен флаг «Сортировка» или «Отбор», то «1С» физически не может использовать индекс. Ей приходится скачивать все 32 Мб данных по сети на компьютер пользователя для локальной фильтрации. Разберем пример:


// Неоптимальный код без индексации реквизита "Производитель"
Спр = СоздатьОбъект("Справочник.Номенклатура");
Спр.УстановитьОтбор("Производитель", ВыбПроизводитель); // Вызовет тормоза, если у реквизита выключена "Сортировка"

В. Использование ресурсоемких функций в обработчиках ожидания.
Часто в глобальный модуль добавляют фоновые задачи через функцию ОбработкаОжидания(). Если эта процедура запускается каждые несколько секунд и обращается к базе данных по сети для проверки новых сообщений или обновления остатков, это парализует работу остальных пользователей.

Шаг 1. Диагностика и замер производительности

Для того чтобы локализовать проблему, выполним замер производительности штатными средствами платформы «1С 7.7»:

  1. Запустим «1С:Предприятие 7.7» в режиме Отладчик.
  2. В меню выберем пункт «Отладка» — «Замер производительности».
  3. Выполним на компьютере пользователя действия, вызывающие зависания (например, откроем справочник «Номенклатура» или проведем документ).
  4. Остановим замер производительности и проанализируем открывшуюся таблицу. Обратим внимание на колонки «Время» и «Число вызовов». Строки кода с наибольшим временем выполнения укажут на узкие места в доработках конфигурации.
  5. Проверим Глобальный модуль на наличие вызовов ОбработкаОжидания. Проанализируем вызываемые ими процедуры.

Шаг 2. Оптимизация сетевых настроек операционной системы

Если отказаться от сетевого доступа в пользу терминального режима на первом этапе невозможно, выполним оптимизацию сетевых настроек на сервере и клиентских ПК:

А. Отключение сетевого кэширования метаданных SMB2/SMB3.
Современные ОС Windows пытаются кэшировать информацию о файлах, что приводит к задержкам синхронизации в старых СУБД DBF. Для отключения кэша на клиентских машинах внесем изменения в системный реестр. Перейдем по пути:

HKLM\System\CurrentControlSet\Services\LanmanWorkstation\Parameters

Создадим три параметра типа DWORD (32 бита) со значением 0:

Б. Настройка сетевых карт и автотюнинга TCP.
На сервере и клиентских станциях в свойствах сетевого адаптера отключим функции энергосбережения («Разрешить отключение этого устройства для экономии энергии») и выгрузку больших пакетов (LSO/Large Send Offload), которая часто дробит трафик «1С» на мелкие пакеты с задержками. Дополнительно отключим автоподстройку TCP, выполнив в командной строке от имени администратора команду:

netsh int tcp set global autotuninglevel=disabled

В. Исключения антивируса.
Антивирусное ПО блокирует файлы при каждом обращении к таблицам базы данных. Обязательно добавим в исключения антивируса на всех ПК папку с информационной базой «1С», а также маски файлов: *.dbf, *.cdx, *.md, *.usr.

Шаг 3. Настройка индивидуальных рабочих каталогов пользователей

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

  1. Откроем базу в режиме Конфигуратор.
  2. Перейдем в меню «Администрирование» — «Пользователи».
  3. Для каждого пользователя в поле «Рабочий каталог» пропишем путь к его индивидуальной папке на сервере (например, \\server\1c_base\users\user1). Папки должны быть физически созданы на диске.

Шаг 4. Кардинальное решение — переход в RDP-режим (терминальный сервер)

Если база данных сильно доработана, содержит большие объемы данных, а оптимизация кода требует слишком много времени, единственным и полностью гарантированным решением проблемы медленной работы по сети является перенос работы пользователей в терминальный режим (RDP).

При использовании RDP-сервера:

Для реализации этого подхода настроим службу удаленных рабочих столов (Remote Desktop Services) на сервере, установим платформу «1С» локально на сервере и перенаправим ярлыки запуска пользователей на терминальное подключение.

← На главную