Проблема низкой производительности при работе с документом Регистрация цен поставщиков в конфигурациях «Управление торговлей 11», «ERP Управление предприятием» или «Комплексная автоматизация» — это классическая ситуация, с которой сталкиваются многие специалисты. Когда документ, содержащий всего 500 строк, открывается несколько часов, становится очевидно, что проблема не в объеме данных как таковом, а в алгоритмах обработки информации на сервере и клиенте. В этой статье мы детально разберем, почему это происходит, и рассмотрим эффективные методы решения этой задачи.
Прежде чем приступать к исправлению, давайте разберем внутреннюю механику работы документа. Основная причина задержек кроется в том, что система 1С выполняет огромное количество операций при чтении данных. Проанализируем основные факторы:
ЦеныНоменклатурыПоставщиков.Первым шагом в решении проблемы должен стать замер производительности. Рассмотрим, как это сделать правильно. Откройте конфигуратор, запустите отладку и перейдите в меню «Отладка — Замер производительности». После этого откройте проблемный документ в пользовательском режиме и дождитесь его загрузки. Остановив замер, мы увидим, какие именно функции модуля формы или общих модулей занимают больше всего времени.
Как правило, «виновниками» оказываются процедуры ПриЧтенииНаСервере или вызовы в модуле менеджера, отвечающие за заполнение цен. Если мы видим тысячи вызовов одной и той же функции, значит, мы столкнулись с проблемой запроса в цикле.
Методология разработки 1С предполагает, что основным инструментом для регистрации цен должен быть не сам документ напрямую, а специализированное рабочее место. Проанализируем, почему этот вариант предпочтительнее:
В рабочем месте «Цены поставщиков (прайс-листы)» реализована оптимизированная загрузка данных. Система сначала собирает данные во временные таблицы, обрабатывает их пакетно и только в самом конце формирует документ регистрации. Это избавляет пользователя от необходимости ждать, пока «тяжелая» форма документа выполнит все расчеты при открытии. Рекомендуем обучить пользователей работать именно через этот интерфейс.
Если специфика бизнеса требует работы именно в форме документа Регистрация цен поставщиков, нам потребуется вмешательство в программный код. Посмотрим, как это можно реализовать с помощью механизма расширений, не снимая основную конфигурацию с поддержки.
Основная задача — заменить построчное получение старых цен на один пакетный запрос. Вместо того чтобы вызывать функцию получения цены для каждой строки, мы соберем всю номенклатуру документа в массив и одним запросом получим данные из регистра ЦеныНоменклатурыПоставщиков.
Пример логики оптимизированного запроса:
// В расширении перехватываем процедуру получения данных
&НаСервере
Процедура ОптимизированноеЗаполнениеСтарыхЦен(ДокументОбъект)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТабличнаяЧасть.Номенклатура,
| ТабличнаяЧасть.Характеристика,
| ТабличнаяЧасть.ВидЦеныПоставщика
|ПОМЕСТИТЬ ВТ_Товары
|ИЗ
| &ТЧ КАК ТабличнаяЧасть;
|
|ВЫБРАТЬ
| Цены.Номенклатура,
| Цены.Цена КАК СтараяЦена
|ИЗ
| РегистрСведений.ЦеныНоменклатурыПоставщиков.СрезПоследних(&Дата, ) КАК Цены
|ГДЕ
| (Цены.Номенклатура, Цены.Характеристика) В (ВЫБРАТЬ Номенклатура, Характеристика ИЗ ВТ_Товары)";
Запрос.УстановитьПараметр("ТЧ", ДокументОбъект.Товары.Выгрузить());
Запрос.УстановитьПараметр("Дата", ДокументОбъект.Дата);
// Далее заполняем данные в ТЧ одним проходом
КонецПроцедуры
Такой подход позволяет сократить время открытия документа с нескольких минут (или часов) до нескольких секунд, так как обращение к базе данных происходит всего один раз.
Разберем ситуацию, когда задержки вызваны правами доступа. Как было отмечено на форуме, иногда открытие документа под полными правами значительно ускоряет процесс. Это происходит потому, что для администратора 1С не строит сложные SQL-запросы с проверкой каждого ограничения RLS.
Если вы выяснили, что под полными правами документ открывается быстро, а под обычными — медленно, стоит проанализировать настройки профилей групп доступа. Возможно, стоит упростить ограничения для ролей, связанных с регистрацией цен, или использовать механизм ПривилегированныйРежим в критических участках кода, где происходит чтение цен.
Не стоит забывать и о состоянии самой СУБД. Проанализируем регламентные операции, которые могут влиять на скорость выборки из регистра цен:
ЦеныНоменклатурыПоставщиков. Если в нем хранятся миллионы записей многолетней давности, возможно, стоит провести свертку или очистку неактуальных данных.Подводя итог, можно сказать, что «три часа на открытие документа» — это всегда следствие неоптимальных алгоритмов, наложенных на большой объем данных или сложные права доступа. Используя комплексный подход — от перехода на рабочее место прайс-листов до программной оптимизации запросов в расширении — вы сможете добиться комфортной работы пользователей в 1С:УТ 11.