Как ускорить работу с Таблицей Значений на сервере в Управляемых Формах 1С?

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

При переводе старых обработок и отчетов с Обычных Форм на Управляемые разработчики часто сталкиваются с существенным падением производительности. Проанализируем типичную ситуацию: на форме есть несколько реквизитов типа ТаблицаЗначений. Серверная процедура формирует эти таблицы, записывает их через ЗначениеВРеквизитФормы и вызывает другие серверные процедуры. Эти вложенные процедуры в начале работы вычитывают данные через РеквизитФормыВЗначение, обрабатывают их, и при завершении снова сохраняют через ЗначениеВРеквизитФормы. Если таблицы объемные (10-15 тысяч строк), такие постоянные выгрузки и загрузки реквизитов начинают катастрофически тормозить систему. Разберем по шагам, почему это происходит и как правильно организовать работу с данными.

Выясним причину падения производительности

Методы РеквизитФормыВЗначение() и ЗначениеВРеквизитФормы() — одни из самых ресурсоемких операций в платформе 1С:Предприятие 8. Они выполняют сложную XDTO-сериализацию и десериализацию данных. При каждом вызове платформа физически пересоздает объект в оперативной памяти сервера, выделяет новую память и сопоставляет типы. Для таблиц с десятками тысяч строк накладные расходы становятся критическими.

Важно понимать ограничения платформы: объект ТаблицаЗначений физически не существует на стороне клиента в управляемом приложении. Для связи с пользовательским интерфейсом используется объект-прослойка ДанныеФормыКоллекция. Методы преобразования предназначены исключительно для разовой подготовки данных перед их показом пользователю или для первоначального чтения при старте алгоритма. Использовать их как транзитный буфер между серверными процедурами категорически не рекомендуется.

Рассмотрим несколько эффективных способов решения этой проблемы.

Способ 1: Правильная передача данных через параметры

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

Метод ЗначениеВРеквизитФормы следует вызывать только один раз — в самом конце, когда все расчеты завершены и данные нужно вернуть на клиент для отображения.

Способ 2: Работа напрямую с ДанныеФормыКоллекция

В большинстве случаев вам не нужно каждый раз преобразовывать реквизит формы (который на сервере представлен типом ДанныеФормыКоллекция) в полноценную Таблицу Значений. Методы объекта ДанныеФормыКоллекция во многом аналогичны методам ТаблицаЗначений. Вы можете напрямую обращаться к строкам, использовать цикл Для Каждого или метод НайтиСтроки().

Если же вам все-таки нужны специфические методы Таблицы Значений (например, свертка), можно получить ее быстрее с помощью метода Выгрузить():


// Получаем Таблицу Значений из реквизита формы
ТЗ = Отчет.МояТаблица.Выгрузить();

// ... выполняем операции с ТЗ ...

// Загружаем обратно без использования ЗначениеВРеквизитФормы
Отчет.МояТаблица.Загрузить(ТЗ);

Способ 3: Использование Менеджера Временных Таблиц (МВТ)

Если процедуры обрабатывают 10-15 тысяч строк, выполнять расчеты в циклах с помощью методов Таблицы Значений неэффективно. Гораздо правильнее будет поместить сформированную ТЗ во временную таблицу базы данных. Для этого используйте МенеджерВременныхТаблиц.

Сам менеджер легко передается параметром между серверными процедурами. Все ресурсоемкие расчеты, фильтрации и соединения таблиц при этом перекладываются на СУБД с помощью языка запросов. Это дает многократный прирост скорости при работе с большими объемами данных.

Способ 4: Изоляция во внеконтекстных вызовах

Для ускорения работы рекомендуется переносить ресурсоемкие расчеты в процедуры с директивой &НаСервереБезКонтекста. В этом случае контекст формы (и все ее тяжелые реквизиты) не гоняется между клиентом и сервером.

Возникает вопрос: как передать большую таблицу в такую процедуру? Используйте Временное Хранилище. Большие таблицы после создания можно поместить во временное хранилище на сервере (получив адрес). В дальнейшие процедуры (в том числе внеконтекстные) вы передаете только короткий строковый адрес, по которому получаете данные обратно в нужный момент.

Способ 5: Использование массива структур

Если таблица формируется динамически и вам не требуются специфические методы (такие как Свернуть() или Итог()), рассмотрите замену Таблицы Значений на Массив, состоящий из элементов типа Структура. Преимущество массива структур в том, что он очень легко сериализуется, не привязан к контексту формы и может свободно передаваться между клиентом и сервером без тяжелых преобразований и ошибок XDTO.

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

← На главную