Часто при разработке в 1С возникает ситуация, когда документ обрастает множеством табличных частей (ТЧ), которые не нужны пользователю для повседневной работы. Это могут быть различные логи, истории изменений, технические данные, которые заполняются программно и нужны лишь для анализа в редких случаях. Возникает закономерный вопрос: влияют ли эти «невидимые» данные на скорость открытия основной формы документа, и как можно оптимизировать этот процесс, не теряя нужную информацию?
Давайте вместе разберемся в механизмах платформы 1С и рассмотрим несколько эффективных подходов к решению этой задачи.
Чтобы найти правильное решение, сначала нужно понять корень проблемы. Многие разработчики предполагают, что если табличная часть не выведена на форму, то платформа ее не загружает. Это не так.
Процесс открытия формы объекта можно разделить на два ключевых этапа:
ПриЧтенииНаСервере. В этот момент платформа выполняет чтение объекта из СУБД. Важно понимать, что объект считывается целиком, со всеми его реквизитами и всеми табличными частями, независимо от того, отображаются они на форме или нет. Если у вас 10 ТЧ, в каждой из которых по тысяче строк, все эти данные будут загружены из базы в память сервера. Это архитектурная особенность: ДокументОбъект — это целостная структура.Таким образом, даже если ваши служебные ТЧ скрыты, они все равно тратят время на чтение из базы данных. Но основной удар по производительности, который ощущает пользователь (особенно при работе через веб-клиент или медленное соединение), наносится при передаче этих больших объемов данных между сервером и клиентом.
Это самый простой и зачастую самый эффективный способ ускорить работу формы без изменения структуры данных. Платформа 1С предоставляет специальное свойство для реквизитов формы — Использовать всегда.
Как это работает?
По умолчанию для всех реквизитов, включая табличные части, это свойство установлено в значение «Да». Это означает, что данные этого реквизита будут постоянно передаваться между клиентом и сервером при каждом серверном вызове, чтобы поддерживать их в актуальном состоянии. Если для «тяжелой» табличной части установить это свойство в «Нет», произойдет следующее:
В результате мы значительно сокращаем объем сетевого трафика и время на сериализацию/десериализацию данных. Форма будет открываться и реагировать на действия пользователя заметно быстрее.
Разберем по шагам, как это настроить:
Использовать всегда.Важное ограничение: После отключения этого свойства вы больше не сможете обратиться к данным этой ТЧ напрямую на клиенте. Попытка прочитать Объект.МояСлужебнаяТЧ в клиентском коде вернет пустую таблицу, так как этих данных на клиенте просто нет. Это идеальный сценарий для нашего случая, когда данные нужны только на отдельной форме, открываемой по кнопке. При открытии этой вспомогательной формы вам нужно будет сделать серверный вызов, который получит данные из серверного объекта (Объект.МояСлужебнаяТЧ) и вернет их на клиент для отображения.
Это более кардинальный подход, который был предложен в самом начале обсуждения. Он заключается в том, чтобы полностью убрать служебные ТЧ из структуры документа и перенести их данные в один или несколько регистров сведений, подчиненных документу-регистратору.
Проанализируем плюсы и минусы этого решения.
Плюсы:
Минусы:
Когда этот подход оправдан? Перенос данных в регистры — отличное решение, если объем служебных данных настолько велик, что даже само чтение объекта на сервере становится узким местом (речь может идти о десятках и сотнях тысяч строк). Также этот вариант предпочтителен, если эти служебные данные активно используются в отчетах.
Кроме двух основных подходов, существуют и другие методы, которые могут быть полезны в специфических ситуациях.
Хранение данных в реквизите типа «ХранилищеЗначения»
Если ваши служебные данные не требуют анализа с помощью запросов и нужны только для просмотра, их можно упаковать в одну структуру или таблицу значений и сохранить в едином реквизите документа с типом ХранилищеЗначения.
«Ленивая» загрузка данных из ТЧ по запросу
Этот метод похож на работу с регистрами, но не требует изменения структуры документа. Табличные части остаются в документе, но вы не добавляете их как реквизиты на основную форму. Для отображения полученных таким способом данных подойдёт руководство по программному выводу таблицы значений на управляемую форму.
Алгоритм такой:
Документ.ИмяДокумента.ИмяТЧ), с отбором по ссылке на текущий документ.Подведем итог. Выбор способа оптимизации зависит от конкретной задачи, объемов данных и требований к их дальнейшему использованию.
Использовать всегда = "Нет". В 90% случаев этого будет достаточно.ХранилищеЗначения.Анализируйте вашу ситуацию, измеряйте производительность до и после изменений, и выбирайте тот метод, который наилучшим образом соответствует вашим целям. Для контроля времени выполнения операций и выявления проблемных участков пригодится инструмент для замера производительности и поиска узких мест.