Формы и интерфейс: управляемые формы, события, команды
В прошлой теме вы познакомились с основами языка 1С: типами данных, условиями, циклами и тем, что код живёт в модулях и выполняется в контексте клиента или сервера. Теперь соберём эти знания в практическую картину: как в 1С устроен пользовательский интерфейс, что такое управляемые формы, как обрабатываются события и как пользователь запускает вашу логику через команды.
Цель этой статьи — чтобы вы могли:
уверенно отличать форму списка от формы объекта
понимать разницу между реквизитами формы и реквизитами объекта
создавать простую кнопку-команду и писать обработчик
правильно выбирать, где писать код: в модуле формы, объекта, общем модулеДля общей навигации по платформе и терминологии полезен официальный портал: Портал 1С:Предприятие 8.
Что такое управляемые формы
Управляемая форма — это стандартный механизм построения интерфейса в современных конфигурациях 1С. Платформа сама управляет жизненным циклом формы, отрисовкой элементов и вызывает ваш код в нужные моменты.
У формы есть несколько ключевых частей:
Реквизиты формы — данные, с которыми работает форма (например, текущий выбранный склад на форме, итоги, фильтры, флажки)
Элементы формы — то, что видит пользователь: поля ввода, таблицы, кнопки, группы, страницы
Команды — действия, которые можно выполнить (нажатие кнопки, пункт меню)
События — моменты, когда платформа вызывает ваш код (например, форма открылась, реквизит изменился, нажата команда)Важно: форма — это не просто “окно”. Это объект, который связывает интерфейс и данные.
Какие формы бывают и зачем они нужны
На старте чаще всего встречаются формы двух типов.
Форма списка — показывает список элементов справочника или список документов
Форма объекта — открывает конкретный элемент справочника или конкретный документ для просмотра и редактированияПример на ваших объектах из прошлых статей:
справочник Номенклатура:
- форма списка: список товаров
- форма объекта: карточка товара
документ ПоступлениеТоваров:
- форма списка: список поступлений
- форма объекта: конкретное поступление (шапка и табличная часть)
Платформа умеет создавать формы автоматически. На этапе обучения это нормально и правильно: сначала понять механику, потом углубляться в тонкую настройку.
Реквизиты объекта и реквизиты формы: в чём разница
Новички часто путают, где именно лежат данные.
Реквизиты объекта — это данные, которые хранятся в базе (реквизиты справочника, документа, строки табличной части)
Реквизиты формы — это данные “для работы формы” (например, временные вычисления, параметры отбора, вспомогательные поля)Ключевое отличие:
реквизит объекта имеет смысл с точки зрения хранения
реквизит формы имеет смысл с точки зрения интерфейса и сценария работыПрактический пример:
в документе ПоступлениеТоваров реквизит Склад в шапке — это реквизит объекта (он должен сохраниться)
реквизит формы ПоказыватьТолькоНулевыеЦены — это реквизит формы (пользователь включил фильтр на время работы)Если вы поместите “временный” флажок в объект, он начнёт сохраняться в базу и “засорять” данные. Если же вы попытаетесь хранить важные реквизиты документа только в форме, они пропадут после закрытия.
Модуль формы: где пишется интерфейсная логика
У каждой формы есть модуль формы — в нём обычно пишут код, который:
реагирует на действия пользователя
управляет доступностью и видимостью элементов
вызывает серверные процедуры для чтения/записи/расчётовТиповые ситуации, когда нужен модуль формы:
пользователь изменил поле Цена в строке табличной части — нужно пересчитать Сумма
пользователь нажал кнопку РассчитатьИтог — нужно посчитать общий итог по строкам
при открытии формы нужно заполнить реквизиты формы значениями по умолчаниюСобытия формы: когда платформа вызывает ваш код
Событие — это заранее определённый момент в жизни формы или элемента формы, когда платформа вызывает вашу процедуру.
Условно события можно разделить на группы.
События жизненного цикла формы
События изменения данных
События командСобытия жизненного цикла формы
Вы будете часто встречать такие сценарии:
форма создаётся (можно подготовить данные)
форма открывается (можно настроить интерфейс)Точные названия событий и их состав зависят от версии платформы и типа формы, но общая идея одна: часть кода выполняется на сервере при создании, а часть — на клиенте при взаимодействии.
Практическое правило:
подготовка данных, чтение из базы, заполнение таблиц — чаще сервер
управление элементами формы, реакции на ввод, сообщения пользователю — чаще клиентСобытия изменения данных
Самое полезное для новичка событие — при изменении реквизита.
Пример: пересчёт суммы строки табличной части.
Предположим, в табличной части Товары у вас есть Количество и Цена, а вы хотите поддерживать реквизит Сумма.
В модуле формы можно сделать так:
Смысл примера:
события ...ПриИзменении срабатывают, когда пользователь изменил значение
вы не дублируете расчёт в двух местах, а выносите его в общую процедуруЕсли у вас пока нет реквизита Сумма, вы можете добавить его в табличную часть документа как реквизит объекта. Это будет удобнее, чем держать сумму только “на экране”.
Команды: как пользователь запускает действия
Команда — это описанное действие, которое может быть доступно на форме как:
кнопка
пункт меню
элемент командной панелиКоманда обычно имеет обработчик в модуле формы.
Пример команды: “Рассчитать итог документа”
Допустим, вы хотите кнопку, которая считает общую сумму по табличной части и показывает её пользователю.
В форме добавляете реквизит формы ИтогСумма (тип число).
Добавляете команду РассчитатьИтог.
Добавляете кнопку на форму, привязанную к команде.
Пишете обработчик команды.Код в модуле формы:
Обратите внимание на важную деталь:
Объект в форме объекта документа — это сам редактируемый документ
обращение Объект.Товары означает, что вы работаете с данными документа, а не с временной таблицейЕсли вы создадите отдельную таблицу значений на форме и будете считать по ней, легко получить рассинхронизацию: пользователь поменял строку, но вы считаете по старому набору.
Разделение логики: форма, объект, общий модуль
Чтобы конфигурация росла без хаоса, важно с самого начала привыкать разделять ответственность.
Что писать в модуле формы
В модуле формы обычно оставляют:
реакции на действия пользователя
пересчёты “на лету”
вызов серверных функций
управление элементами формы (видимость, доступность)Что писать в модуле объекта
В модуле объекта документа или справочника обычно пишут:
проверки корректности данных перед записью
бизнес-правила, которые должны срабатывать независимо от того, откуда меняют объектПример: запретить запись документа без строк — это лучше в модуле объекта, а не в форме. Потому что документ могут записать не только из этой формы, но и программно.
Что писать в общем модуле
Общий модуль — хорошее место для:
повторно используемых функций расчёта
общих процедур (например, форматирование, валидация, сервисные методы)Практическая польза: вы не копируете одинаковый код по разным формам.
Клиент и сервер в формах: как не “сломать” выполнение
Управляемые формы почти всегда работают в модели “клиент вызывает сервер”.
Типичная схема:
пользователь нажал кнопку
сработала клиентская процедура (может обращаться к элементам формы)
она вызвала серверную функцию (читает базу, делает расчёт)
результат вернулся на клиент и показан на форме!Схема потока выполнения команды в управляемой форме: клиент → сервер → клиент
Мини-правила, которые экономят часы отладки:
всё, что трогает Элементы формы, должно быть на клиенте
всё, что активно читает данные, выполняет запросы и тяжёлые вычисления, лучше на сервере
если вы хотите вынести расчёт “в библиотеку”, делайте серверную функцию &НаСервереБезКонтекста, чтобы она не зависела от формыЭлементы формы: видимость и доступность
Частый интерфейсный сценарий: в зависимости от условий скрывать поле или запрещать редактирование.
Видимость — элемент видно или нет
Доступность — элемент можно редактировать или он “серый”Пример: если пользователь не выбрал склад, запретим проведение (или, в учебном варианте, просто подсветим, что нужно заполнить).
Примечание: конкретные имена элементов (КомандаПровести) зависят от того, как вы назвали кнопку/элемент в форме.
Как связать форму с метаданными из прошлых тем
В прошлой статье про метаданные вы создавали справочник и документ. Теперь полезно “приземлить” это на интерфейс.
Для объекта метаданных (справочник/документ) обычно есть цепочка:
Метаданные задают реквизиты и табличные части
Платформа (или вы) создаёт формы
Форма отображает реквизиты через элементы
Пользователь меняет значения
События формы вызывают ваш код
При записи и проведении включается логика объектаЭта цепочка — основа практически любой прикладной задачи в 1С.
Типичные ошибки новичков в формах
Ниже — самые частые проблемы и как о них думать.
Пытаются в &НаСервере обратиться к Элементы формы
Делают важную проверку только в форме, но забывают про запись “в обход формы”
Хранят временные параметры интерфейса в реквизитах объекта и получают “мусорные” данные в базе
Дублируют один и тот же расчёт в нескольких обработчиках вместо общей процедурыЕсли вы видите странное поведение, полезная диагностика:
где выполняется код (клиент/сервер)
к чему обращается код (объект/форма/элементы)
когда вызывается код (какое событие)Главное из статьи
Управляемая форма — основной интерфейсный механизм 1С: реквизиты формы, элементы, команды и события.
Команды запускают действия пользователя; обработчики обычно находятся в модуле формы.
Проверки “целостности данных” лучше дублировать на уровне объекта (например, ПередЗаписью), чтобы правила работали всегда.
Важно разделять клиентский код (интерфейс) и серверный код (данные и тяжёлые операции).В следующем шаге курса обычно переходят к более “данным” вещам: запросам, выборкам, заполнению табличных частей, а также к более строгим правилам проведения документов и движений по регистрам. Это даст ощущение полноценного прикладного решения: интерфейс → документ → движения → отчёт.