Разработка и Конфигурация · 11 мин
Как сделать произвольную форму в 1С
Разбираем, как создать произвольную форму в 1С: конструктор форм, программное создание элементов, реквизиты формы, команды и типичные ошибки разработчика.
Произвольная форма в 1С — это форма, которую разработчик создаёт самостоятельно: либо как основную форму объекта (справочника, документа), либо как независимую форму обработки или отчёта. Она нужна, когда типовой автоматически генерируемой формы недостаточно: требуется нестандартное расположение элементов, дополнительные реквизиты, собственные команды или особая логика заполнения.
В управляемом приложении (платформа 8.3) формы описываются декларативно: вы задаёте структуру элементов, а платформа сама строит интерфейс под тонкий клиент, веб-клиент и мобильное приложение. Это принципиально отличается от обычных форм 8.2, где элементы размещались по координатам. Поэтому работа с произвольной формой сводится к трём задачам: добавить реквизиты формы, разместить элементы в дереве и описать обработчики событий в модуле формы.
Ниже разобран полный цикл: от создания формы в конфигураторе до программного изменения элементов и проверки результата. Примеры приведены для управляемых форм — именно они используются во всех современных конфигурациях.
Какие виды форм существуют в 1С и какую выбрать
Прежде чем создавать форму, определите её назначение. Форма объекта (элемента справочника, документа) привязана к данным конкретной записи и автоматически поддерживает запись и проведение. Форма списка отображает таблицу записей с отбором и сортировкой. Форма выбора используется при подборе значения в поле ввода.
Отдельный случай — форма обработки или отчёта. Она не привязана к конкретному объекту данных и подходит для произвольных интерфейсов: панелей настройки, мастеров, диалогов загрузки файлов, рабочих мест. Если вам нужен полностью самостоятельный экран без привязки к справочнику или документу — создавайте внешнюю или встроенную обработку и добавляйте в неё форму.
Сравнение вариантов
Подходит для редактирования данных справочника или документа; платформа сама обеспечивает запись, но структура привязана к реквизитам объекта.
Максимальная свобода компоновки и логики; данные хранятся в реквизитах формы и должны сохраняться программно.
Используется, когда один и тот же диалог нужен в нескольких местах конфигурации; вызывается через ОткрытьФорму().
Создание формы в конфигураторе
Откройте конфигуратор, найдите нужный объект (например, обработку) в дереве конфигурации, перейдите на вкладку «Формы» и нажмите «Добавить». Запустится конструктор: укажите имя формы (латиницей, без пробелов, например ФормаНастройки) и тип. Для первой формы обработки конструктор предложит сделать её основной — соглашайтесь, если это главный интерфейс.
После создания откроется редактор формы с тремя ключевыми областями: дерево элементов слева вверху, список реквизитов справа вверху и вкладка модуля внизу. Вся дальнейшая работа идёт в этих трёх областях. Чтобы увидеть результат, запустите 1С в режиме предприятия и откройте обработку — или используйте предварительный просмотр формы в редакторе.
- 1Откройте объект конфигурации и на вкладке «Формы» нажмите «Добавить»
- 2Укажите имя формы и тип, при необходимости назначьте её основной
- 3Добавьте реквизиты формы — они будут хранить данные интерфейса
- 4Перетащите реквизиты в дерево элементов и сгруппируйте их
- 5Добавьте команды и кнопки, назначьте обработчики в модуле
- 6Запустите режим предприятия и проверьте работу формы
Реквизиты формы: где хранятся данные
Реквизиты формы — это переменные, живущие на сервере и отображаемые в интерфейсе. Добавляются они в правом верхнем окне редактора кнопкой «Добавить реквизит». Укажите имя, тип (строка, число, ссылка, таблица значений, динамический список) и, при необходимости, заголовок для отображения.
Для табличных данных используйте реквизит типа «ТаблицаЗначений» и добавляйте в него колонки как подчинённые реквизиты. Для списков справочников и документов с отбором лучше подходит «ДинамическийСписок» — он сам читает данные из базы и поддерживает настройку запроса. Важно понимать: реквизиты формы не сохраняются в базу автоматически. Если данные нужно хранить, записывайте их программно — в реквизиты объекта, регистр сведений или хранилище настроек.
Элементы формы и их компоновка
Элементы — это визуальные контролы: поля ввода, кнопки, таблицы, надписи, группы. Простейший способ добавить элемент — перетащить реквизит из списка в дерево элементов. Платформа сама выберет подходящий вид: для строки — поле ввода, для булево — флажок, для таблицы значений — таблицу.
Компоновка в управляемых формах строится на группах. Создавайте группы (кнопка «Добавить группу») и задавайте им свойства: «Группировка» (вертикальная, горизонтальная), «Отображение», «Ширина». Порядок элементов в дереве определяет порядок на экране. Не пытайтесь задавать координаты — их нет; вместо этого управляйте вложенностью групп и свойствами растягивания.
Для каждого элемента доступны события: «ПриИзменении» у поля ввода, «Нажатие» у кнопки, «ПриАктивизацииСтроки» у таблицы. Обработчик создаётся через палитру свойств элемента — платформа автоматически добавит процедуру-заготовку в модуль формы.
Команды и кнопки
Команды формы добавляются на одноимённой вкладке редактора. Укажите имя, заголовок (то, что увидит пользователь) и действие — процедуру в модуле формы. После создания команды перетащите её в дерево элементов, чтобы получить кнопку, или в командную панель формы.
Обработчики команд бывают клиентскими и серверными. Директива &НаКлиенте выполняется на компьютере пользователя — там доступен интерактив (вопросы, открытие других форм), но нет прямого доступа к базе. Директива &НаСервере работает с данными, но не может показывать диалоги. Типовой шаблон: клиентская процедура собирает параметры и вызывает серверную, которая выполняет работу с базой.
&НаКлиенте
Процедура ЗагрузитьДанные(Команда)
ЗагрузитьДанныеНаСервере();
ПоказатьПредупреждение(, "Загрузка завершена");
КонецПроцедуры
&НаСервере
Процедура ЗагрузитьДанныеНаСервере()
// работа с базой данных
КонецПроцедурыПрограммное создание элементов формы
Когда структура интерфейса зависит от данных (например, набор полей задаётся настройками), элементы создают программно. Делать это нужно в обработчике ПриСозданииНаСервере — до того, как форма показана пользователю. Используются три коллекции: Элементы.Добавить(), РеквизитыФормы (через метод ИзменитьРеквизиты()) и Команды.Добавить().
Типовая последовательность: сначала добавьте реквизит через массив объектов Новый РеквизитФормы и метод ИзменитьРеквизиты(), затем создайте элемент и свяжите его с реквизитом через свойство ПутьКДанным. Для динамической команды задайте её свойство Действие именем процедуры модуля.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Добавляемые = Новый Массив;
Добавляемые.Добавить(Новый РеквизитФормы("КомментарийДоп",
Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(200))));
ИзменитьРеквизиты(Добавляемые);
Поле = Элементы.Добавить("КомментарийДоп", Тип("ПолеФормы"));
Поле.Вид = ВидПоляФормы.ПолеВвода;
Поле.ПутьКДанным = "КомментарийДоп";
КонецПроцедурыПроверка результата и типичные ошибки
После доработки формы обновите конфигурацию базы данных (F7) и откройте форму в режиме предприятия. Проверьте: все ли элементы видны, корректно ли работают кнопки, сохраняются ли введённые данные после закрытия и повторного открытия. Проверяйте форму в том клиенте, которым пользуются сотрудники, — поведение в тонком и веб-клиенте может отличаться.
Расширения как безопасная альтернатива
Если конфигурация типовая и обновляется поставщиком, произвольную форму или изменение существующей лучше делать через расширение. Расширение подключается поверх конфигурации без снятия её с поддержки: вы заимствуете форму, добавляете свои элементы и обработчики, а при обновлении типовой конфигурации ваши доработки сохраняются.
Создаётся расширение через меню «Конфигурация → Расширения конфигурации». Далее на нужной форме выбирается «Добавить в расширение», после чего в расширении доступны те же инструменты: реквизиты, элементы, команды, обработчики с аннотациями «Вместо», «Перед», «После». Ограничение: расширение не может менять структуру данных типовых объектов, только добавлять новые.
Как проверить результат
Форма открывается без ошибок, все элементы на месте
Ошибка «Поле не найдено» или пустое окно — проверьте ПутьКДанным и имена реквизитов
Команда выполняется, пользователь видит результат или понятное сообщение
Ничего не происходит — обработчик не назначен или ошибка в серверной процедуре
После обновления доработки на месте (расширение)
Доработки пропали — форма была изменена напрямую в типовой конфигурации
Частые вопросы
Можно ли создать форму без объекта конфигурации?
Да — через внешнюю обработку (файл .epf). Она создаётся в конфигураторе через «Файл → Новый → Внешняя обработка», содержит произвольную форму и открывается в режиме предприятия без изменения конфигурации. Это удобно для сервисных инструментов и тестирования.
Как открыть произвольную форму из другой формы?
Используйте метод ОткрытьФорму("Обработка.ИмяОбработки.Форма.ИмяФормы", Параметры, Владелец) на клиенте. Через параметры можно передать данные в открываемую форму, а через владельца — организовать возврат результата с помощью оповещений.
Почему элементы формы не видны пользователю?
Чаще всего причина в правах или функциональных опциях: если реквизит связан с объектом, недоступным по роли, элемент скрывается автоматически. Также проверьте свойство «Видимость» элемента и родительских групп — оно могло быть сброшено программно.
Чем отличается реквизит формы от реквизита объекта?
Реквизит объекта хранится в базе данных и сохраняется при записи. Реквизит формы существует только пока форма открыта и нужен для промежуточных вычислений и интерфейсных данных. Чтобы сохранить значение реквизита формы, его нужно программно перенести в объект или другое хранилище.
Можно ли менять состав элементов после открытия формы?
Добавлять реквизиты после открытия нельзя — ИзменитьРеквизиты() работает только до первого показа формы. Но видимость, доступность, заголовки и содержимое списков выбора существующих элементов можно менять в любой момент из клиентских и серверных процедур.
Что делать, если форма работает в тонком клиенте, но ломается в веб-клиенте?
Проверьте использование модальных вызовов и методов, недоступных в веб-клиенте (например, прямой работы с файловой системой без расширения). Замените модальные диалоги на асинхронные аналоги с описанием оповещения — это требование современной платформы.
Что важно запомнить
Произвольная форма строится из трёх частей: реквизиты хранят данные, элементы отображают их, команды и обработчики задают логику. Динамические интерфейсы создаются программно в ПриСозданииНаСервере, а доработку типовых конфигураций безопаснее выполнять через расширения.