Почему долго ищет номенклатуру в 1С и как ускорить поиск в файловой базе

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

Проблема медленного поиска в справочнике Номенклатура — одна из самых распространенных при использовании файлового варианта базы данных 1С. Особенно остро она проявляется, когда объем данных растет, а пользователей становится больше одного. В данной статье мы подробно разберем, почему «подвисает» поиск, как на это влияют сетевые механизмы Windows и как оптимизировать работу динамических списков.

Анализируем проблему: почему поиск занимает до 1 минуты?

Рассмотрим типичную ситуацию: база данных 1С является файловой (находится в общей сетевой папке), количество позиций номенклатуры составляет около 15 000. При попытке поиска программа «замирает», а сетевой трафик резко возрастает. Проанализируем основные причины такого поведения:

  1. Тяжелый запрос динамического списка: Если в форме списка используется запрос с левым соединением (например, для получения остатков), 1С вынуждена выполнять сложные вычисления для каждой строки.
  2. Сброс сетевого кэша (SMB): При изменении данных одним пользователем, операционная система сбрасывает кэш для всех остальных, заставляя их заново выкачивать данные из файла .1CD.
  3. Полнотекстовый поиск (ППД): Индексы поиска могут быть неактуальны или фрагментированы, что заставляет систему выполнять полный перебор таблиц.

Разбор неоптимального запроса динамического списка

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


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

Почему это работает медленно в файловой базе: В отличие от SQL-сервера, файловый движок 1С при выполнении ЛЕВОГО СОЕДИНЕНИЯ в динамическом списке может принять решение полностью вычитать обе таблицы во временные файлы в папку %TEMP% пользователя. Если поиск ведется по полю, которое не проиндексировано, или если включена сложная сортировка, система считывает все 15 000 записей по сети, что и вызывает ожидание в 30-60 секунд.

Механизм работы сетевого кэширования (Проблема второго пользователя)

Выясним причину, по которой поиск становится долгим именно после того, как кто-то другой изменил данные. Это связано с протоколом SMB (Server Message Block) и механизмом Opportunistic Locks (OpLocks).

Когда пользователь открывает список номенклатуры, Windows кэширует часть файла базы данных на локальном компьютере. Однако, как только другой пользователь (например, в терминальной сессии) записывает новый элемент номенклатуры, сервер отправляет уведомление всем сетевым клиентам: «Данные изменились, ваш кэш неактуален». При следующем поиске клиентская машина игнорирует локальный кэш и начинает заново скачивать блоки файла .1CD. Именно этот процесс пользователи воспринимают как «холодный старт» или зависание.

Оптимизация работы динамического списка

Чтобы ускорить поиск, проанализируем настройки динамического списка и внедрим следующие изменения:

Разберем подробнее схему с вспомогательным регистром. Создадим периодический или непериодический регистр сведений ОстаткиДляСписков, который будет содержать всего два поля: Номенклатура (Измерение) и Количество (Ресурс). Обновление этого регистра можно настроить при проведении документов по складу. В этом случае динамический список будет обращаться к простой плоской таблице регистра, что в разы быстрее, чем расчет остатков через виртуальные таблицы.

Настройка полнотекстового поиска (ППД)

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

  1. Перейдем в Администрирование — Поддержка и обслуживание — Полнотекстовый поиск.
  2. Выполним обновление индекса или его полную очистку и реиндексацию.
  3. В файловом режиме обновление индексов часто происходит в контексте клиентского сеанса. Если база большая, это может вызывать временные блокировки файла .1CD.

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

Технические рекомендации по настройке окружения

Иногда корень проблемы лежит за пределами кода 1С. Рассмотрим шаги по настройке сервера и рабочих станций:

Исключения антивируса: Это критически важный этап. На сервере и на всех клиентских машинах добавьте в исключения:

Проверка антивирусом каждого сетевого пакета при обращении к базе данных замедляет файловые операции в несколько раз.

Переход на веб-сервер (Apache или IIS): Это самый эффективный способ решения сетевых проблем файловой базы без покупки лицензий на SQL-сервер. При публикации базы на веб-сервере работа происходит по протоколу HTTP. В этом случае прямой доступ к файлу .1CD по сети (через «шару») прекращается. Веб-сервер сам обращается к файлу локально и передает клиенту только необходимые данные. Это полностью нивелирует проблему сброса кэша SMB и значительно ускоряет поиск для удаленных (сетевых) пользователей.

Подводим итоги

Мы проанализировали основные причины медленного поиска номенклатуры. Для решения задачи рекомендуем последовательно выполнить следующие действия:

  1. Упростить запрос динамического списка, исключив из него ЛЕВОЕ СОЕДИНЕНИЕ с виртуальными таблицами остатков.
  2. Убедиться, что в списке установлена Основная таблица и включено Динамическое считывание данных.
  3. Проверить и перестроить индекс полнотекстового поиска.
  4. Настроить антивирусную защиту.
  5. При сохранении задержек — опубликовать базу на веб-сервере (Apache или IIS).

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

← На главную