Почему виснет подбор товаров в 1С:КА при редактировании заказов прошлых дат?

Программист 1С v8.3 (Управляемые формы) 1С:Комплексная автоматизация Управленческий учет Торговля и дистрибуция
← На главную

Ситуация, когда менеджер открывает Заказ клиента, созданный день или два назад, и при попытке подобрать товары программа «зависает наглухо», является довольно распространенной в крупных базах 1С:Комплексная автоматизация 2 и 1С:ERP. Особенно примечателен тот факт, что если передвинуть дату заказа на текущую, проблема исчезает. Это явный маркер того, что причина кроется в механизмах работы платформы с виртуальными таблицами и правами доступа на определенную «точку времени».

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

Причина №1: Расчет виртуальных таблиц на «точку времени»

Разберем фундаментальное различие в том, как 1С получает данные об остатках. Когда документ датирован сегодняшним числом (текущим моментом), система обращается к таблицам итогов регистров накопления. Эти данные уже рассчитаны и хранятся в базе в готовом виде, поэтому запрос выполняется мгновенно.

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

  1. Взять актуальные итоги на текущий момент.
  2. «Открутить» назад все движения (приходы и расходы), совершенные с момента создания документа до текущей секунды.
  3. Если база высоконагруженная (как в нашем случае — 88 пользователей), количество таких движений за 1–2 дня может исчисляться десятками тысяч.

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

Причина №2: Влияние RLS и режима его работы

Как было отмечено в обсуждении, в базе включен RLS. Ограничение прав на уровне записей существенно усложняет SQL-запросы, которые генерирует платформа. Когда форма подбора пытается отобразить остатки на прошлую дату, 1С формирует запрос к виртуальной таблице ОстаткиИОбороты или Остатки с параметром Период.

Если используется «старый» (непроизводительный) режим RLS, то условия прав вставляются прямо в подзапросы. При работе с динамическими списками, которыми является форма подбора, это может приводить к созданию неоптимальных планов запросов в SQL-сервере. В итоге сервер тратит колоссальное время на расчет прав для каждой строки номенклатуры, что пользователь видит как «глухое зависание» интерфейса.

Причина №3: Расширения и модификация формы подбора

В рассматриваемой ситуации используется расширение, которое добавляет «таблицу остатков и цен» в подбор товаров. Это критический момент. Зачастую разработчики расширений добавляют в динамический список формы подбора дополнительные соединения (JOIN) с другими таблицами или вложенные запросы для вычисления цен.

Рассмотрим пример кода, который часто встречается в таких расширениях и может вызывать тормоза:


// Пример неудачного запроса в динамическом списке
ВЫБРАТЬ
    Номенклатура.Ссылка,
    ЕСТЬNULL(Цены.Цена, 0) КАК Цена,
    ЕСТЬNULL(Остатки.ВНаличииОстаток, 0) КАК Остаток
ИЗ
    Справочник.Номенклатура КАК Номенклатура
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, ) КАК Цены
        ПО Номенклатура.Ссылка = Цены.Номенклатура
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, ) КАК Остаток
        ПО Номенклатура.Ссылка = Остатки.Номенклатура

Если &Период в данном запросе не совпадает с текущим временем, SQL-серверу приходится выполнять тяжелую работу по расчету среза последних и остатков на историческую дату для каждой позиции в списке, что и вызывает фриз.

Причина №4: Документы будущих дат

Стоит обратить внимание на совет из обсуждения: проверить документы, проведенные будущей датой. Если в системе есть документ УстановкаЦенНоменклатуры или складской документ, датированный, к примеру, 2030 годом, механизм расчета итогов в 1С может начать работать некорректно. Система будет пытаться рассчитать остатки, учитывая этот «будущий» период, что приводит к непредсказуемым задержкам при расчете итогов на любую дату, отличную от «сейчас».

Как решить проблему: пошаговый алгоритм

Шаг 1: Замер производительности

Первым делом необходимо выполнить Замер производительности. Для этого:

  1. Включите режим отладки на сервере.
  2. Запустите замер в конфигураторе перед нажатием кнопки «Подобрать товары».
  3. Дождитесь (если возможно) окончания процесса или прервите его через некоторое время.
  4. Проанализируйте, какая именно функция или запрос занимает 99% времени. Скорее всего, это будет метод ОткрытьФорму или получение данных динамического списка.

Шаг 2: Проверка режима RLS

Проверьте настройки программы (НСИ и администрирование -> Настройки пользователей и прав). Если активен режим «Стандартный», рассмотрите возможность перехода на «Производительный» режим RLS. Он использует заранее рассчитанные таблицы прав доступа, что значительно ускоряет работу динамических списков в документах и подборах.

Шаг 3: Оптимизация расширения

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

Шаг 4: Анализ индекса полнотекстового поиска

Иногда подбор виснет из-за попытки системы обновить индекс полнотекстового поиска при открытии формы. Попробуйте выполнить следующие действия в разделе «Обслуживание»:

Шаг 5: Очистка серверного кэша

Поскольку проблема специфична для клиент-серверного варианта и большого числа пользователей, «залипшие» планы запросов в кэше сервера 1С или SQL-сервера могут усугублять ситуацию. Рекомендуется выполнить перезапуск службы 1C:Enterprise Server Administration и очистку процедурного кэша SQL-сервера.

Резюме

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

← На главную