Как работает программный код и передача данных в обычных формах 1С?

Программист IT и автоматизация бизнеса
← На главную

Переход к работе с обычными формами (ОФ) часто вызывает вопросы у разработчиков, привыкших к строгому разделению контекста в управляемом приложении. Несмотря на то, что управляемые формы являются современным стандартом, огромный массив типовых и доработанных решений (например, УПП 1.3) по-прежнему базируется на обычном интерфейсе. Разберем детально архитектурные особенности обычных форм, выясним, где именно выполняется программный код, и как минимизировать риски при работе с данными.

Контекст выполнения кода: Клиент или Сервер?

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

Рассмотрим подробнее основные модули:

  1. Модуль формы: Все процедуры и функции по умолчанию выполняются на клиенте. Вы имеете прямой доступ ко всему арсеналу объектов 1С, доступных в толстом клиенте.
  2. Модуль объекта: Это может показаться непривычным, но в обычном приложении код модуля объекта (например, справочника или документа) также выполняется на клиенте, если вызов инициирован из формы или клиентского кода.
  3. Модуль менеджера: Ситуация аналогична — если вы вызываете метод менеджера из клиентского контекста обычного приложения, он будет исполнен на стороне пользователя.

Однако существуют исключения. Код может быть принудительно исполнен на сервере в следующих случаях:

Проблема неявных серверных вызовов

Одной из самых коварных особенностей обычных форм является механизм взаимодействия с базой данных. В отличие от управляемых форм, где мы явно пишем &НаСервере, в ОФ обращение к серверу часто происходит скрыто.

Разберем ситуацию на примере: вы работаете с набором записей регистра на стороне клиента. Проанализируем код:


// Код выполняется на клиенте в обычной форме
Для Каждого Строка Из ТекОбъект.ТабличнаяЧасть Цикл
    Строка.Цена = Строка.Цена * 1.1; // Каждое обращение к свойству объекта может порождать запрос
КонецЦикла;

Выясним причину возможных тормозов: при каждом обращении к реквизитам объекта, которые не были кэшированы, платформа может инициировать сетевой обмен. Если вы добавляете 50 записей в набор, сервер может быть вызван 50 раз. Это происходит потому, что контекст строки кода не меняется, но под капотом стартует сетевая сериализация данных. Именно поэтому работа в ОФ через медленные каналы связи (интернет без RDP) практически невозможна.

Передача данных и работа с объектами

В обычных формах при открытии формы объекта (например, тяжелого документа) клиентская машина получает из базы данных весь объект целиком. Это включает в себя все реквизиты и все строки табличных частей. В управляемых формах передаются только ДанныеФормы, которые могут быть оптимизированы, но в ОФ мы всегда имеем дело с «полновесным» объектом.

Посмотрим на пример работы с данными в модуле формы:


Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    // Весь этот код работает на клиенте, но данные объекта уже здесь
    Если ЭтотОбъект.СуммаДокумента > 100000 Тогда
        Сообщить("Требуется дополнительное согласование!");
    КонецЕсли;
КонецПроцедуры

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

Сравнение архитектур и практические советы

Для лучшего понимания разницы между ОФ и УФ, проанализируем таблицу особенностей:

  1. Привязки против Группировок: В обычных формах нет автоматического распределения элементов. Вам придется вручную настраивать Привязки (Anchors), чтобы форма корректно растягивалась при изменении размера окна.
  2. Модальность: Обычные формы активно используют модальные окна (ОткрытьФормуМодально(), Вопрос()). В современном мире 1С это считается плохой практикой, но в рамках ОФ это стандартный механизм, который останавливает поток выполнения кода до ответа пользователя.
  3. События: В ОФ события элементов управления (например, ПриИзменении) всегда отрабатывают на клиенте мгновенно, что субъективно делает интерфейс более «отзывчивым» для пользователя, работающего в локальной сети.

Рассмотрим, как правильно организовать серверный вызов из обычной формы, если нам нужно выполнить тяжелый запрос к БД:


// В модуле формы
Процедура КнопкаСформироватьНажатие(Элемент)
    // Вызываем серверный метод из общего модуля
    Результат = СерверныеПроцедуры.РассчитатьДанныеНаСервере(Параметры);
    // Обрабатываем результат на клиенте
КонецПроцедуры

В этом случае в общем модуле СерверныеПроцедуры должна стоять галочка Сервер и Вызов сервера. Только так вы сможете гарантировать, что тяжелые вычисления или сложные запросы не будут «гонять» данные по сети лишний раз.

Рекомендации по изучению

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

Помните, что использование ОФ — это не шаг назад, а работа с определенным типом архитектуры. Главное — понимать, что за удобство разработки «в одном контексте» (на клиенте) вы платите производительностью сети и отсутствием кроссплатформенности (ОФ работают только под Windows).

← На главную