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