Почему документ «Регистрация цен поставщиков» в УТ 11.4 открывается слишком долго и как это исправить?

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

В работе с конфигурацией 1С:Управление торговлей 11.4 многие специалисты сталкиваются с крайне неприятной проблемой: документ Регистрация цен поставщиков, содержащий значительное количество строк (от 4000 и выше), может открываться несколько минут. При этом само проведение документа занимает считанные секунды, а серверные мощности (процессор, оперативная память, дисковые массивы) загружены незначительно. Рассмотрим детально, почему так происходит, и разберем методы решения этой задачи.

Анализируем причину: почему тормозит именно форма?

Для начала проанализируем ситуацию: почему документ Установка цен номенклатуры с аналогичным объемом данных открывается быстро, а Регистрация цен поставщиков — крайне медленно? Ответ кроется в архитектуре построения управляемой формы. В базе данных информация о ценах хранится «вертикально» (одна запись — одна цена для одной номенклатуры), но для удобства пользователя в документе Регистрация цен поставщиков реализован механизм транспонирования (разворота) таблицы.

Выясним причину глубже. При открытии формы система динамически выполняет следующие действия:

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

Если в документе 4000 строк и, например, 10 видов цен, платформе необходимо создать и отрисовать в памяти клиента десятки тысяч ячеек и объектов. Основное время тратится не на запрос к базе данных, а на генерацию и сериализацию контекста формы при передаче его с сервера на клиент. Именно поэтому замер производительности часто не показывает «виновную» строку кода — время уходит «между» серверными вызовами и моментом отображения окна.

Проблема избыточного преобразования типов

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


СтрокаНоменклатура = Строка(ТекущиеДанные.Номенклатура) 
    + ?(ИспользоватьХарактеристикиНоменклатуры, 
        ?(ЗначениеЗаполнено(ТекущиеДанные.Характеристика), 
        " (" + Строка(ТекущиеДанные.Характеристика) + ")", ""), "");

Проанализируем ситуацию: использование функции Строка() для ссылочного типа (СправочникСсылка.Номенклатура) заставляет платформу выполнять неявный микро-запрос к базе данных для получения наименования. Если в документе 4000 строк, система выполнит 4000 таких обращений. В условиях работы через RLS (ограничение доступа на уровне записей) каждое такое обращение сопровождается проверкой прав доступа, что многократно увеличивает задержку.

Способ 1: Оптимизация кода через расширение

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

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

  1. Перехватываем запрос, подготавливающий данные для отображения в форме.
  2. Добавляем в выборку поля Номенклатура.Наименование и Характеристика.Наименование.
  3. В коде формирования строки представления используем уже готовые строковые данные, избегая функции Строка(Ссылка).

Пример оптимизированного кода:


// Вместо Строка(ТекущиеДанные.Номенклатура)
// Используем заранее полученное поле из структуры данных
СтрокаНоменклатура = ТекущиеДанные.НоменклатураНаименование 
    + ?(ЗначениеЗаполнено(ТекущиеДанные.ХарактеристикаНаименование), 
        " (" + ТекущиеДанные.ХарактеристикаНаименование + ")", "");

Способ 2: Обновление платформы 1С

Если вы используете платформу версии 8.3.11 или 8.3.12, важно понимать, что в более ранних версиях механизмы передачи больших контекстов управляемых форм были менее оптимизированы. Начиная с версии 8.3.14 и выше, разработчики 1С внесли существенные улучшения в сериализацию данных и скорость отрисовки тяжелых форм. Посмотрим на практику: простое обновление платформы до актуального релиза (например, 8.3.22+) может сократить время открытия документа в 1.5–2 раза без изменения кода.

Способ 3: Настройка производительности операционной системы

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

Выполним следующие действия:

  1. Зайдем в Панель управления -> Электропитание.
  2. Установим режим Высокая производительность (High Performance).
  3. В настройках BIOS/UEFI сервера также рекомендуется отключить функции энергосбережения (C-States, SpeedStep), чтобы процессор всегда работал на номинальной или турбо-частоте.

Это позволит платформе 1С максимально быстро выполнять однопоточные операции по формированию дерева элементов формы.

Способ 4: Изменение бизнес-логики работы

Проанализируем ситуацию: действительно ли пользователю нужно видеть 4000–8000 строк в одном окне одновременно? Если документ загружается из внешнего файла (Excel), рассмотрите возможность проведения документа без открытия формы. Это можно сделать из формы списка. Если же визуальный контроль необходим, попробуйте внедрить следующие практики:

Резюме

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

← На главную