Рассмотрим типичную, но крайне неприятную ситуацию: после планового обновления конфигурации 1С:Бухгалтерия предприятия 3.0 (начиная с версий 3.0.80 и выше) пользователи начинают жаловаться на «жуткие тормоза». Операции, которые раньше занимали доли секунды — запись карточки товара, выставление счета или реализация — теперь длятся по 30–90 секунд. При этом серверные мощности (процессор, оперативная память) практически не загружены, а база данных является файловой и расположена на быстром SSD.
В этой статье мы подробно разберем, почему это происходит, проанализируем внутренние механизмы программы и найдем несколько способов решения проблемы: от административных до программных.
Первым делом нам необходимо понять, на каком именно этапе происходит задержка. Для этого воспользуемся встроенным инструментом отладчика. Запустим конфигурацию в режиме «Отладка», откроем карточку номенклатуры и включим «Замер производительности» непосредственно перед нажатием кнопки «Записать».
Проанализировав результат замера, мы увидим, что основное время (более 90%) тратится не на запись данных в таблицу справочника, а на выполнение запросов в общих модулях, связанных с подсистемой БЭД (Библиотека электронного документооборота). Конкретно внимание стоит обратить на функции в модуле ОбменСКонтрагентамиСлужебный (в более новых версиях — СопоставлениеНоменклатурыКонтрагентовСлужебный).
Задержка происходит в функции ИсключитьИзТаблицыСловНезначимые. Внутри этой функции программа пытается выполнить запрос к регистру сведений СловарьСопоставленияНоменклатурыБЭД. Выясним причину такого поведения.
Начиная с версии 3.0.80, разработчики 1С внедрили механизм автоматического индексирования слов в наименованиях товаров. Это сделано для облегчения работы с ЭДО (Электронным документооборотом). Когда вы записываете номенклатуру, система:
СловарьСопоставленияНоменклатурыБЭД).Проблема заключается в том, что в файловом варианте работы 1С (особенно на больших справочниках номенклатуры) пакетные запросы к этому регистру выполняются крайне неэффективно. Регистр может содержать сотни тысяч записей, и попытка найти в нем соответствия через конструкцию ГДЕ ... В (ВЫБРАТЬ ПЕРВЫЕ 1 ...) заставляет файловый движок базы данных «задумываться» на десятки секунд.
Если вы имеете навыки программирования или возможность вносить изменения в конфигурацию (или создавать расширения), наиболее эффективным способом будет оптимизация проблемного запроса. В функции ИсключитьИзТаблицыСловНезначимые формируется динамический текст запроса. Разберем, как его изменить, чтобы ускорить работу.
Найдем фрагмент кода, где формируется текст запроса через функцию ТекстЗапросаПроверкиСловПоСтатистикиИспользованияВСловаре. Проблема кроется в использовании подзапроса внутри условия ГДЕ. Перепишем этот фрагмент, заменив неоптимальную конструкцию на более простую для файлового движка.
Было (неэффективно):
| И ИСТИНА В
| (ВЫБРАТЬ ПЕРВЫЕ 1
| ИСТИНА
| ИЗ
| ТаблицаОтобранныхСлов КАК ТаблицаОтобранныхСлов
| ГДЕ
| ТаблицаОтобранныхСлов.СсылкаНаОбъект = СловарьСопоставленияНоменклатурыБЭД.СсылкаНаОбъект)
Стало (оптимизировано):
| И СловарьСопоставленияНоменклатурыБЭД.СсылкаНаОбъект В
| (ВЫБРАТЬ
| ТаблицаОтобранныхСлов.СсылкаНаОбъект
| ИЗ
| ТаблицаОтобранныхСлов КАК ТаблицаОтобранныхСлов)
Такая замена позволяет 1С гораздо быстрее сопоставить данные временной таблицы и физической таблицы регистра в файловом режиме. После внесения этих изменений скорость записи номенклатуры возвращается к нормальным показателям.
Если вы не хотите менять код конфигурации, рассмотрим другие методы борьбы с тормозами:
СловарьСопоставленияНоменклатурыБЭД. Это можно сделать с помощью обработки «Групповое изменение реквизитов» (выбрав этот регистр) или написав простую внешнюю обработку для удаления записей. После очистки «тормоза» пропадут до тех пор, пока регистр снова не наполнится данными.Администрирование -> Обслуживание -> Полнотекстовый поиск снижает общую нагрузку на файловую систему при записи объектов, что может дать небольшой прирост скорости.Иногда проблема усугубляется некорректной работой платформы с временными таблицами. Посмотрим на версию платформы: для конфигураций ветки 3.0.83+ рекомендуется использовать версию не ниже 8.3.17.1851 или 8.3.18.1201. Более старые сборки платформы 8.3.17 имели внутренние дефекты обработки тяжелых запросов в файловом режиме.
Также не забудем про очистку кэша. Проанализируем ситуацию: если «перекладывание» файла базы данных 1Cv8.1CD в другой каталог (с созданием нового подключения в списке баз) не помогает — значит, дело не в локальном кэше пользователя, а именно в структуре данных и алгоритмах конфигурации, что подтверждает теорию о проблеме в подсистеме БЭД.
Подведем итог. Если после обновления ваша файловая «Бухгалтерия» начала виснуть при записи номенклатуры:
СловарьСопоставленияНоменклатурыБЭД.ОбменСКонтрагентамиСлужебный, как мы рассмотрели выше.Выполнение этих шагов позволит восстановить комфортную работу пользователей и избавит программу от лишних задержек при выполнении базовых операций.