В процессе разработки на платформе 1С:Предприятие 8.3 начинающие программисты часто сталкиваются с ситуацией, когда один явный вызов процедуры с директивой &НаСервере приводит к тому, что встроенный счетчик производительности в нижней части экрана показывает 3, 5 или более вызовов. Это вызывает недоумение: кажется, что код написан неоптимально или платформа ведет себя непредсказуемо. Разберемся по шагам, почему это происходит, как правильно анализировать нагрузку на сервер и какие механизмы платформы скрываются за «лишними» вызовами.
Рассмотрим типичную ситуацию. У нас есть обработчик нажатия на картинку на клиенте, который вызывает серверную процедуру для изменения заголовка элемента формы. Код выглядит следующим образом:
&НаКлиенте
Процедура флАдресКартинкиНажатие(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
УстановитьЗаголовокЭлементаНаСервере(Элемент.Имя);
КонецПроцедуры
&НаСервере
Процедура УстановитьЗаголовокЭлементаНаСервере(ИмяЭлемента)
// Формируем имя реквизита динамически
ИмяРеквизита = "флАдресКартинки" + Сред(ИмяЭлемента, 5);
флАдресКартинки = ЭтаФорма[ИмяРеквизита];
// Поиск данных в таблице значений на сервере
МассивТч = ТаблицаПрикриплений.НайтиСтроки(Новый Структура("Реквизит", ИмяРеквизита));
Если МассивТч.Количество() > 0 Тогда
Элементы.флАдресКартинки.Заголовок = МассивТч[0].Идентификатор;
КонецЕсли;
ВыбранныйРеквизит = ИмяРеквизита;
КонецПроцедуры
На первый взгляд, здесь ровно один переход между клиентом и сервером. Однако монитор ресурсов может показать число 5. Давайте выясним, что именно считает платформа.
Первое, что нам необходимо усвоить: показатель в нижней строке состояния 1С (так называемый «счетчик вызовов») и инструмент «Замер производительности» в конфигураторе — это разные вещи. Рассмотрим причины расхождений:
УстановитьЗаголовокЭлементаНаСервере.Совет: Для оптимизации кода всегда ориентируйтесь на «Замер производительности», а не на общие цифры внизу экрана.
Когда мы вызываем серверную процедуру из модуля управляемой формы, платформа выполняет огромную невидимую работу. Вызов &НаСервере инициирует передачу всего контекста формы с клиента на сервер. После выполнения кода сервер должен вернуть измененный контекст обратно. Если в процессе выполнения вы изменили реквизиты формы (как в нашем примере ВыбранныйРеквизит = ИмяРеквизита;), платформа обязана обновить состояние элементов на клиенте.
Иногда, если форма перегружена данными или содержит сложные связанные элементы, возврат управления может сопровождаться дополнительными техническими пакетами данных, которые счетчик интерпретирует как отдельные вызовы.
В приведенном коде фигурирует реквизит флАдресКартинки. Скорее всего, это навигационная ссылка на временное хранилище или базу данных. Проанализируем, что происходит при изменении заголовка или связанных данных:
Изменение свойства Заголовок у элемента формы на сервере — это не просто смена текста. Рассмотрим подробнее: платформа 1С использует механизм автоматической расстановки элементов (AutoLayout). Если заголовок стал длиннее или короче, это может повлечь за собой пересчет всей геометрии формы. В сложных формах с множеством групп и вложенных элементов визуальное обновление может генерировать дополнительные служебные вызовы для уточнения параметров отображения.
Если в вашей базе активно используются расширения, то любое обращение к свойствам через ЭтаФорма[ИмяРеквизита] может привести к дополнительным проверкам. Платформа проверяет, не переопределен ли этот реквизит или логика доступа к нему в одном из расширений. В некоторых случаях это может инициировать дополнительные обращения к метаданным на стороне сервера.
Чтобы убедиться, что лишние вызовы не связаны с вашим кодом, выполните следующие действия:
УстановитьЗаголовокЭлементаНаСервере.Вы увидите, что сама процедура вызвана 1 раз. Если же общее число вызовов в нижней строке все равно 5, обратите внимание на:
ПодключитьОбработчикОжидания, который опрашивает сервер раз в несколько секунд.Проанализировав ситуацию, мы выяснили, что один логический вызов &НаСервере практически никогда не равен одному техническому пакету данных между клиентом и сервером. Платформа 1С — это сложная экосистема, которая берет на себя синхронизацию данных, отрисовку интерфейса и кэширование ресурсов. Для начинающего разработчика важно понимать: если замер производительности показывает один вызов вашей процедуры, значит, с точки зрения программного кода вы все сделали правильно. Лишние технические вызовы — это нормальная работа транспортного слоя платформы по обеспечению целостности управляемого интерфейса.