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

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

Как сделать произвольную форму в 1С

Разбираем, как создать произвольную форму в 1С: конструктор форм, программное создание элементов, реквизиты формы, команды и типичные ошибки разработчика.

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

В управляемом приложении (платформа 8.3) формы описываются декларативно: вы задаёте структуру элементов, а платформа сама строит интерфейс под тонкий клиент, веб-клиент и мобильное приложение. Это принципиально отличается от обычных форм 8.2, где элементы размещались по координатам. Поэтому работа с произвольной формой сводится к трём задачам: добавить реквизиты формы, разместить элементы в дереве и описать обработчики событий в модуле формы.

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

Какие виды форм существуют в 1С и какую выбрать

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

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

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

Форма объекта

Подходит для редактирования данных справочника или документа; платформа сама обеспечивает запись, но структура привязана к реквизитам объекта.

Форма обработки

Максимальная свобода компоновки и логики; данные хранятся в реквизитах формы и должны сохраняться программно.

Общая форма

Используется, когда один и тот же диалог нужен в нескольких местах конфигурации; вызывается через ОткрытьФорму().

Создание формы в конфигураторе

Откройте конфигуратор, найдите нужный объект (например, обработку) в дереве конфигурации, перейдите на вкладку «Формы» и нажмите «Добавить». Запустится конструктор: укажите имя формы (латиницей, без пробелов, например ФормаНастройки) и тип. Для первой формы обработки конструктор предложит сделать её основной — соглашайтесь, если это главный интерфейс.

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

Порядок создания формы
  1. 1
    Откройте объект конфигурации и на вкладке «Формы» нажмите «Добавить»
  2. 2
    Укажите имя формы и тип, при необходимости назначьте её основной
  3. 3
    Добавьте реквизиты формы — они будут хранить данные интерфейса
  4. 4
    Перетащите реквизиты в дерево элементов и сгруппируйте их
  5. 5
    Добавьте команды и кнопки, назначьте обработчики в модуле
  6. 6
    Запустите режим предприятия и проверьте работу формы

Реквизиты формы: где хранятся данные

Реквизиты формы — это переменные, живущие на сервере и отображаемые в интерфейсе. Добавляются они в правом верхнем окне редактора кнопкой «Добавить реквизит». Укажите имя, тип (строка, число, ссылка, таблица значений, динамический список) и, при необходимости, заголовок для отображения.

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

Элементы формы и их компоновка

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

Компоновка в управляемых формах строится на группах. Создавайте группы (кнопка «Добавить группу») и задавайте им свойства: «Группировка» (вертикальная, горизонтальная), «Отображение», «Ширина». Порядок элементов в дереве определяет порядок на экране. Не пытайтесь задавать координаты — их нет; вместо этого управляйте вложенностью групп и свойствами растягивания.

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

Команды и кнопки

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

Обработчики команд бывают клиентскими и серверными. Директива &НаКлиенте выполняется на компьютере пользователя — там доступен интерактив (вопросы, открытие других форм), но нет прямого доступа к базе. Директива &НаСервере работает с данными, но не может показывать диалоги. Типовой шаблон: клиентская процедура собирает параметры и вызывает серверную, которая выполняет работу с базой.

bsl
&НаКлиенте
Процедура ЗагрузитьДанные(Команда)
    ЗагрузитьДанныеНаСервере();
    ПоказатьПредупреждение(, "Загрузка завершена");
КонецПроцедуры

&НаСервере
Процедура ЗагрузитьДанныеНаСервере()
    // работа с базой данных
КонецПроцедуры

Программное создание элементов формы

Когда структура интерфейса зависит от данных (например, набор полей задаётся настройками), элементы создают программно. Делать это нужно в обработчике ПриСозданииНаСервере — до того, как форма показана пользователю. Используются три коллекции: Элементы.Добавить(), РеквизитыФормы (через метод ИзменитьРеквизиты()) и Команды.Добавить().

Типовая последовательность: сначала добавьте реквизит через массив объектов Новый РеквизитФормы и метод ИзменитьРеквизиты(), затем создайте элемент и свяжите его с реквизитом через свойство ПутьКДанным. Для динамической команды задайте её свойство Действие именем процедуры модуля.

bsl
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Добавляемые = Новый Массив;
    Добавляемые.Добавить(Новый РеквизитФормы("КомментарийДоп",
        Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(200))));
    ИзменитьРеквизиты(Добавляемые);
    
    Поле = Элементы.Добавить("КомментарийДоп", Тип("ПолеФормы"));
    Поле.Вид = ВидПоляФормы.ПолеВвода;
    Поле.ПутьКДанным = "КомментарийДоп";
КонецПроцедуры

Проверка результата и типичные ошибки

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

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

Расширения как безопасная альтернатива

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

Создаётся расширение через меню «Конфигурация → Расширения конфигурации». Далее на нужной форме выбирается «Добавить в расширение», после чего в расширении доступны те же инструменты: реквизиты, элементы, команды, обработчики с аннотациями «Вместо», «Перед», «После». Ограничение: расширение не может менять структуру данных типовых объектов, только добавлять новые.

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

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

Открытие формы
Норма

Форма открывается без ошибок, все элементы на месте

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

Ошибка «Поле не найдено» или пустое окно — проверьте ПутьКДанным и имена реквизитов

Работа кнопок
Норма

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

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

Ничего не происходит — обработчик не назначен или ошибка в серверной процедуре

Обновление конфигурации
Норма

После обновления доработки на месте (расширение)

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

Доработки пропали — форма была изменена напрямую в типовой конфигурации

Частые вопросы

Можно ли создать форму без объекта конфигурации?

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

Как открыть произвольную форму из другой формы?

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

Почему элементы формы не видны пользователю?

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

Чем отличается реквизит формы от реквизита объекта?

Реквизит объекта хранится в базе данных и сохраняется при записи. Реквизит формы существует только пока форма открыта и нужен для промежуточных вычислений и интерфейсных данных. Чтобы сохранить значение реквизита формы, его нужно программно перенести в объект или другое хранилище.

Можно ли менять состав элементов после открытия формы?

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

Что делать, если форма работает в тонком клиенте, но ломается в веб-клиенте?

Проверьте использование модальных вызовов и методов, недоступных в веб-клиенте (например, прямой работы с файловой системой без расширения). Замените модальные диалоги на асинхронные аналоги с описанием оповещения — это требование современной платформы.

Итог

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

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