К статье
Практический материал

Разработка и Конфигурация · 12 мин

ПриСозданииНаСервере в 1С: назначение, порядок вызова и примеры

ПриСозданииНаСервере в 1С — обработчик события формы: когда вызывается, чем отличается от ПриОткрытии, типичные ошибки и примеры кода для управляемых форм.

ПриСозданииНаСервере — это обработчик события управляемой формы в 1С:Предприятии, который выполняется на сервере в момент создания формы, до её отображения пользователю. В нём принято инициализировать реквизиты формы, заполнять начальные данные, настраивать условное оформление и проверять права доступа — до того, как клиент увидит интерфейс.

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

Ниже разобраны порядок вызова события, отличие от клиентского обработчика ПриОткрытии, типовые сценарии использования, ограничения серверного контекста и примеры кода, которые можно переносить в свои конфигурации.

Что такое ПриСозданииНаСервере и когда оно вызывается

ПриСозданииНаСервере — это событие модуля управляемой формы, которое платформа генерирует на сервере в процессе создания формы. Обработчик объявляется с директивой &НаСервере и выполняется до передачи формы на клиент, то есть до того, как пользователь увидит окно.

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

Обработчик имеет два параметра: Отказ и СтандартнаяОбработка. Установка Отказ = Истина прерывает создание формы — она не будет открыта. Параметр СтандартнаяОбработка управляет выполнением стандартных действий платформы, например чтения объекта из базы данных.

Порядок событий формы: где находится ПриСозданииНаСервере

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

  1. ОбработкаЗаполнения (на сервере, в модуле объекта или формы) — только для новых объектов при интерактивном вводе на основании или копировании.
  2. ПриСозданииНаСервере — создание формы на сервере, инициализация данных.
  3. ПриОткрытии (на клиенте) — форма уже отображена, доступны интерактивные действия.
  4. Далее — события элементов формы, ПриПовторномОткрытии и другие.

Ключевой вывод из этой последовательности: всё, что требует обращения к базе данных, запросов и вычислений, должно выполняться в ПриСозданииНаСервере, а не в ПриОткрытии. Клиентский контекст не имеет прямого доступа к данным, и попытка решать серверные задачи на клиенте приводит к лишним серверным вызовам и замедлению открытия формы.

Чем ПриСозданииНаСервере отличается от ПриОткрытии

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

КритерийПриСозданииНаСервереПриОткрытии
Контекст выполненияСерверКлиент (тонкий, веб, толстый)
Доступ к базе данныхПолный: запросы, объектыТолько через серверные вызовы
Интерактив с пользователемНевозможенДоступен (вопросы, оповещения)
Работа с файловой системой клиентаНедоступнаДоступна
Момент вызоваДо отображения формыПосле отображения формы

Правило выбора простое: если коду нужны данные из базы — это ПриСозданииНаСервере; если нужно показать вопрос, запустить обработку ожидания или обратиться к файлам на компьютере пользователя — это ПриОткрытии. Смешивать задачи в одном обработчике нельзя: платформа просто не скомпилирует недопустимые вызовы в серверном контексте.

Сравнение вариантов

ПриСозданииНаСервере

Инициализация данных, запросы, условное оформление, проверка прав. Ограничение: нет интерфейса и клиентского контекста.

ПриОткрытии

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

ОбработкаЗаполнения

Только заполнение нового объекта при вводе на основании или копировании. Не вызывается при открытии существующего объекта.

Типовые задачи, которые решают в этом обработчике

На практике в ПриСозданииНаСервере сосредоточена основная подготовительная логика формы. Типичные сценарии:

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

Пример: инициализация данных при создании формы

bsl
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	Если Параметры.Ключ.Пустая() Тогда
		// Новый объект: устанавливаем значения по умолчанию
		Объект.Ответственный = Пользователи.ТекущийПользователь();
	КонецЕсли;
	
	// Настройка видимости по роли
	Элементы.ГруппаЦены.Видимость = Пользователи.РолиДоступны("ДобавлениеИзменениеЦен");
	
КонецПроцедуры

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

Проверка условий и отказ от открытия

Если форму нельзя показывать — например, у пользователя нет прав на объект или переданы некорректные параметры, — установите Отказ = Истина. Форма не будет создана, и клиент получит отказ от открытия. Сообщить причину пользователю можно через Сообщить() перед установкой отказа или уже на клиенте в обработчике, который инициировал открытие.

Порядок действий
  1. 1
    Откройте модуль формы в конфигураторе и создайте обработчик ПриСозданииНаСервере через панель событий формы
  2. 2
    Убедитесь, что директива компиляции — &НаСервере
  3. 3
    Разместите код инициализации: чтение параметров, запросы, настройку элементов
  4. 4
    Для недопустимых сценариев установите Отказ = Истина
  5. 5
    Проверьте открытие формы в режиме предприятия под пользователями с разными ролями

Ограничения серверного контекста

Внутри ПриСозданииНаСервере действуют все ограничения серверного контекста управляемой формы. Нельзя вызывать модальные и немодальные диалоги, методы работы с файловой системой клиента, оповещения и любые интерактивные средства — такой код не скомпилируется или вызовет ошибку выполнения.

Второе ограничение — временной контекст. Некоторые данные формы ещё не полностью готовы: например, при создании формы существующего объекта данные объекта уже прочитаны, но реквизиты формы, создаваемые динамически, должны быть добавлены до обращения к ним. Если код обращается к элементу или реквизиту, которого нет, будет ошибка «Поле объекта не обнаружено».

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

Типичные ошибки при работе с обработчиком

Первая распространённая ошибка — размещение клиентского кода в серверном обработчике. Попытка вызвать Предупреждение(), Вопрос() или работу с файлами в ПриСозданииНаСервере заканчивается ошибкой компиляции. Решение — перенести интерактивную часть в ПриОткрытии.

Вторая ошибка — обращение к ЭтаФорма и её элементам так, как будто это клиентский контекст. На сервере доступ к элементам формы есть, но только для изменения свойств (видимость, доступность, заголовок), а не для интерактивных действий. Также нельзя использовать ТекущийЭлемент для установки фокуса — это делается на клиенте.

Третья ошибка — игнорирование параметра Отказ при проверках. Разработчик пишет проверку, выводит сообщение, но забывает установить Отказ = Истина, и форма всё равно открывается с некорректными данными.

Типичные ошибки
01
Вызов интерактивных методов (ПоказатьВопрос, Предупреждение) в серверном контексте — ошибка компиляции или выполнения
02
Тяжёлые запросы без отборов — форма открывается несколько секунд, пользователи жалуются на зависания
03
Проверка условий без установки Отказ = Истина — форма открывается, несмотря на ошибку
04
Обращение к реквизитам формы до их создания — «Поле объекта не обнаружено»
05
Дублирование инициализации в ПриСозданииНаСервере и ПриОткрытии — двойные серверные вызовы и рассинхронизация данных

Как проверить, что обработчик работает правильно

Базовая проверка — отладчик конфигуратора: точка останова на первой строке обработчика покажет момент вызова, значения параметров и состояние данных. Для форм, открываемых из веб-клиента или через фоновые механизмы, убедитесь, что в настройках отладки включён нужный режим подключения.

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

Контрольные точки

Как проверить результат

Скорость открытия формы
Норма

Форма появляется без заметной задержки

Тревожный признак

Заметная пауза перед отображением — ищите тяжёлые запросы в обработчике

Заполнение реквизитов
Норма

Все данные на месте при открытии

Тревожный признак

Пустые поля или ошибки «Поле объекта не обнаружено»

Поведение под разными ролями
Норма

Видимость и доступность элементов соответствуют правам

Тревожный признак

Одинаковое поведение у всех пользователей или ошибки доступа

Отказ при некорректных параметрах
Норма

Форма не открывается, пользователь получает сообщение

Тревожный признак

Форма открывается с пустыми или неверными данными

Если одна и та же инициализация нужна в нескольких формах, выносите её в общий серверный модуль и вызывайте из ПриСозданииНаСервере одной строкой. Так проще поддерживать код и исключить расхождения между формами.
ПЗ
Практическое замечание

Частые вопросы о ПриСозданииНаСервере

Можно ли в ПриСозданииНаСервере обратиться к данным объекта формы?

Да. Для существующего объекта данные уже прочитаны из базы и доступны через основной реквизит формы (обычно Объект). Для нового объекта доступны значения, установленные в ОбработкаЗаполнения, и параметры формы.

Почему обработчик ПриСозданииНаСервере не вызывается?

Чаще всего обработчик создан вручную, но не привязан к событию формы. Создавайте его через палитру свойств формы (кнопка с лупой у события «ПриСозданииНаСервере») — тогда платформа сама установит связь. Также проверьте, что процедура объявлена с директивой &НаСервере.

Вызывается ли событие при повторном открытии формы?

Нет. При повторном открытии уже существующей формы вызывается клиентское событие ПриПовторномОткрытии. ПриСозданииНаСервере срабатывает только при создании нового экземпляра формы.

Чем ПриСозданииНаСервере отличается от ОбработкаЗаполнения?

ОбработкаЗаполнения предназначена для заполнения данных нового объекта при вводе на основании, копировании или с параметрами заполнения. ПриСозданииНаСервере вызывается при любом создании формы, включая открытие существующих объектов, и отвечает за настройку самой формы.

Можно ли изменить состав реквизитов формы в этом обработчике?

Да, через метод ИзменитьРеквизиты() — это единственное место в жизненном цикле формы, где программное изменение состава реквизитов безопасно и рекомендовано. После создания формы на клиенте такая возможность недоступна.

Как передать данные из ПриСозданииНаСервере в клиентский обработчик ПриОткрытии?

Через реквизиты формы: серверный обработчик заполняет реквизит, а ПриОткрытии читает его значение. Прямой передачи параметров между этими событиями нет, поэтому реквизиты формы — штатный канал обмена данными между сервером и клиентом.

Итог

Что важно запомнить

ПриСозданииНаСервере — серверный обработчик создания управляемой формы, вызываемый один раз до её отображения. Используйте его для инициализации данных, запросов, настройки видимости и условного оформления. Интерактив с пользователем, запись в базу и тяжёлые вычисления в нём размещать нельзя: интерактив — в ПриОткрытии, изменение данных — только по действиям пользователя.