Работа с формами документов в 1С:Предприятие — одна из ключевых задач для разработчиков и администраторов системы. Без грамотно спроектированных форм невозможно обеспечить удобный ввод данных, контроль корректности информации и интеграцию с бизнес-процессами компании. Эта статья поможет разобраться, как создать форму документа с нуля: от простейшей базовой до сложной управляемой, с учетом современных требований платформы 1С 8.3.
Мы рассмотрим не только техническую сторону (где нажать, какой код написать), но и практические нюансы: когда лучше использовать обычные формы, а когда — управляемые, как избежать типичных ошибок при связывании реквизитов, и почему иногда проще доработать стандартную форму, чем создавать новую с нуля. Особое внимание уделим автоматическому заполнению полей по событиям — это экономит время пользователей и снижает количество ошибок при ручном вводе.
Статья будет полезна как начинающим программистам 1С, так и опытным специалистам, которые хотят систематизировать знания или найти неочевидные приемы оптимизации форм. Все примеры приведены для актуальных версий платформы (8.3.20+), но majority принципов работают и в более ранних редакциях.
Что такое форма документа в 1С и зачем она нужна
Форма документа — это интерфейсный элемент, который позволяет пользователю взаимодействовать с объектом конфигурации "Документ". Без формы документ существует только как набор данных в базе, но ввести или просмотреть его содержимое невозможно. Формы бывают:
- 📄 Основные — для создания, редактирования и просмотра документа. Содержат все ключевые реквизиты.
- 🔍 Списка — для отображения нескольких документов в табличном виде (например, журнал документов).
- 📊 Выбора — упрощенные формы для подбора значений в других формах (например, выбор контрагента).
Главная задача формы — обеспечить удобный ввод данных с учетом бизнес-логики. Например, в форме документа "Реализация товаров" можно автоматически подставлять цены из прайс-листа при выборе номенклатуры, проверять остатки на складе или блокировать сохранение при отрицательных суммах. Без формы все эти действия пришлось бы выполнять вручную или через отдельные обработки.
В 1С 8.3 существует два типа форм:
- 🖥️ Обычные формы — устаревший формат, поддерживаемый для совместимости. Имеют ограниченные возможности по настройке интерфейса.
- 🎛️ Управляемые формы — современный подход, рекомендуемый для новых разработок. Поддерживают адаптивный дизайн, динамическое изменение элементов и работу в тонком/веб-клиенте.
⚠️ Внимание: С 2023 года 1С официально не рекомендует использовать обычные формы для новых конфигураций. Все типовые решения (например, 1С:ERP или 1С:УТ) переведены на управляемые формы. Однако знание обычных форм полезно для поддержки устаревших баз.
Подготовка к созданию формы: что нужно знать до начала работы
Прежде чем приступать к разработке формы, необходимо выполнить несколько обязательных шагов:
- Определить цель формы. Будет ли это основная форма для ввода данных, форма списка или специализированная форма (например, для печати)? От этого зависит состав элементов.
- Проанализировать реквизиты документа. Какие поля обязательны для заполнения? Какие можно скрыть по умолчанию? Нужны ли дополнительные реквизиты, которых нет в объекте?
- Продумать логику взаимодействия. Какие события должны обрабатываться (например, изменение номенклатуры → пересчет суммы)? Нужны ли проверки перед сохранением?
Также важно учитывать права доступа. Если форма будет использоваться разными ролями (например, менеджеры и бухгалтеры), возможно, потребуется динамически скрывать или блокировать отдельные элементы в зависимости от прав пользователя.
Для управляемых форм дополнительно нужно учитывать:
- 📱 Адаптивность — форма должна корректно отображаться на экранах разных размеров (включая мобильные устройства).
- 🔄 Динамическое обновление — возможность изменять состав элементов без переоткрытия формы (например, показывать дополнительные поля при выборе определенного типа документа).
- 🌐 Работа в веб-клиенте — не все элементы обычных форм поддерживаются в браузере.
⚠️ Внимание: Если вы дорабатываете типовую конфигурацию, сначала проверьте, нет ли уже готовой формы для вашего документа. Часто проще модифицировать существующую форму (добавив нужные элементы или обработчики), чем создавать новую с нуля. Это снизит риск конфликтов при обновлении конфигурации.
Создание обычной формы документа: пошаговая инструкция
Несмотря на то, что обычные формы считаются устаревшими, их все еще можно встретить в старых базах или в случаях, когда требуется максимальная совместимость. Рассмотрим процесс создания на примере документа "Заказ покупателя".
Шаг 1. Открытие конструктора форм
Перейдите в конфигуратор (Файл → Конфигуратор), найдите нужный документ в дереве объектов и откройте его контекстное меню. Выберите Создать форму → Форма документа. Откроется конструктор форм.
Шаг 2. Настройка основных реквизитов
В конструкторе автоматически будут добавлены стандартные реквизиты документа (номер, дата, организация и т.д.). Вам нужно:
- 📌 Перетащить дополнительные реквизиты из панели "Реквизиты" в форму (например, "Контрагент", "Сумма документа").
- 🔧 Настроить свойства элементов:
Видимость,Доступность,Цвет фона(для выделения важных полей). - 📏 Изменить компоновку: добавить закладки (
Элементы → Закладка) для группировки полей по смыслу.
Шаг 3. Добавление табличной части
Если документ содержит табличную часть (например, список товаров в заказе), перетащите ее из панели "Реквизиты" в форму. Настройте колонки:
- 📊 Укажите
ШиринуиПорядокотображения колонок. - 🔒 Заблокируйте редактирование системных колонок (например, "Номер строки").
- 💰 Для колонки "Сумма" установите формат
Числос двумя знаками после запятой.
Шаг 4. Написание обработчиков событий
Чтобы форма реагировала на действия пользователя, добавьте обработчики. Например, чтобы автоматически заполнять цену при выборе номенклатуры:
Процедура НоменклатураПриИзменении(Элемент)
Если Номенклатура.Выбран() Тогда
Цена = Номенклатура.ЦенаПродажи;
Сумма = Количество * Цена;
КонецЕсли;
КонецПроцедуры
Для сохранения изменений нажмите Файл → Сохранить и свяжите форму с документом в его свойствах (Формы → Основная форма документа).
☑️ Проверка перед сохранением обычной формы
Разработка управляемой формы: ключевые отличия и примеры
Управляемые формы предоставляют гораздо больше возможностей, но требуют другого подхода к разработке. Основные отличия:
| Параметр | Обычная форма | Управляемая форма |
|---|---|---|
| Поддержка тонкого клиента | ❌ Нет | ✅ Да |
| Динамическое изменение элементов | ❌ Ограничено | ✅ Полная поддержка |
| Адаптивный дизайн | ❌ Нет | ✅ Да (включая мобильные устройства) |
| Работа в веб-клиенте | ❌ Частично | ✅ Полная |
| Сложность разработки | ⚠️ Проще для простых задач | ⚠️ Сложнее, но гибче |
Пример создания управляемой формы для документа "Счет на оплату":
- В конфигураторе откройте документ и выберите
Создать форму → Управляемая форма. - Добавьте группы для логического разделения полей (например, "Реквизиты покупателя" и "Товары").
- Для табличной части используйте элемент
Табличное полес привязкой к реквизиту документа. - Настройте команды (кнопки "Провести", "Печать" и т.д.) через панель команд формы.
Ключевое отличие управляемых форм — использование модуля формы вместо модуля объекта. Например, чтобы динамически показывать поле "Договор" только для определенных контрагентов:
Процедура КонтрагентПриИзменении(Элемент)
Если Контрагент.ЭтоГруппа() Тогда
ЭлементыФормы.Договор.Видимость = Ложь;
Иначе
ЭлементыФормы.Договор.Видимость = Истина;
ЗаполнитьСписокДоговоров();
КонецЕсли;
КонецПроцедуры
Для управляемых форм также доступны клиентские и серверные процедуры. Серверные выполняются на сервере 1С и могут обращаться к базе данных, а клиентские — непосредственно в интерфейсе пользователя.
Используйте свойство АвтоВысота для табличных частей в управляемых формах — это позволит пользователям видеть все строки без прокрутки, если их немного.
Типичные ошибки при создании форм и как их избежать
Даже опытные разработчики иногда допускают ошибки, которые усложняют работу с формами. Вот наиболее распространенные из них:
- 🔄 Циклические ссылки в обработчиках. Например, если в событии
ПриИзмененииполя "Цена" вы меняете "Сумму", а в событии "Суммы" опять пересчитываете "Цену", форма зациклится. Решение: используйте флаги или условия для контроля выполнения кода. - 📉 Перегрузка формы элементами. Слишком много полей, кнопок и закладок затрудняет восприятие. Решение: группируйте элементы по смыслу и скрывайте редко используемые поля под кнопкой "Еще".
- 🔒 Отсутствие проверок прав доступа. Форма может показывать конфиденциальные данные пользователям без прав. Решение: используйте функцию
ПраваДоступа()для динамического скрытия элементов. - 🐢 Долгие операции в клиентских процедурах. Например, обращение к базе данных напрямую из клиентского кода блокирует интерфейс. Решение: выносите тяжелые операции на сервер с использованием
ВыполнитьНаСервере().
Еще одна частая проблема — некорректная привязка реквизитов. Если в форме отображается устаревшее значение поля, проверьте:
- Связан ли элемент формы с правильным реквизитом документа (
ПутьКДанным). - Обновляется ли значение после изменения (иногда требуется явный вызов
Обновить()). - Нет ли конфликтов с другими обработчиками, которые перезаписывают данные.
⚠️ Внимание: При работе с управляемыми формами в веб-клиенте избегайте использования модальных окон (Предупреждение(),Вопрос()) — они блокируют весь браузер, а не только форму 1С. Вместо этого используйтеПоказатьВопросПользователю()с асинхронной обработкой.
Доработка стандартных форм: когда создавать свою, а когда модифицировать существующую
В типовых конфигурациях (1С:Бухгалтерия, 1С:ЗУП, 1С:УТ) уже есть готовые формы для большинства документов. Вопрос — стоит ли их дорабатывать или лучше создать свою форму с нуля? Вот критерии принятия решения:
| Ситуация | Рекомендация | Обоснование |
|---|---|---|
| Нужно добавить 1-2 поля или кнопку | Доработать стандартную форму | Минимальные изменения = меньше рисков при обновлении |
| Требуется полностью другой интерфейс (например, замена таблицы на диаграмму) | Создать новую форму | Стандартная форма не подходит по архитектуре |
| Нужно изменить логику заполнения (например, другой алгоритм расчета суммы) | Доработать стандартную форму | Логику можно переписать в обработчиках без изменения интерфейса |
| Форма используется в подсистеме с высокой частотой обновлений (например, 1С:ERP) | Доработать стандартную форму | Собственная форма может конфликтовать с обновлениями |
Как доработать стандартную форму:
- Скопируйте форму в расширение конфигурации (
Конфигурация → Расширения → Создать). - В расширении найдите нужную форму и добавьте недостающие элементы.
- Переопределите обработчики событий (например,
ПриСозданииНаСервере). - Протестируйте изменения на копии базы перед применением в рабочей системе.
Если вы все же решили создать собственную форму, свяжите ее с документом через свойство Формы в конфигураторе. Учтите, что при обновлении типовых конфигураций ваша форма не будет затронута, но могут измениться реквизиты документа, к которым она привязана.
Что делать если после обновления перестала работать доработанная форма?
Обычно это происходит из-за изменения структуры документа в новой версии. Проверьте:
1. Соответствуют ли пути к реквизитам (ПутьКДанным) в форме актуальным именам в документе.
2. Не изменились ли типы данных (например, СправочникСсылка.Контрагенты мог стать СправочникСсылка.Партнеры).
3. Не добавлены ли новые обязательные реквизиты, которые нужно отображать в форме.
Если проблема серьезная, возможно, проще перенести доработки в новую версию формы из обновленной конфигурации.
Продвинутые приемы: динамические формы, печатные формы и интеграция
Когда базовые навыки создания форм освоены, можно переходить к более сложным задачам. Рассмотрим несколько продвинутых сценариев:
1. Динамическое изменение формы
В управляемых формах можно показывать или скрывать элементы в зависимости от условий. Например, в документе "Заказ покупателя" можно динамически добавлять поле "Адрес доставки", если выбран тип доставки "Курьер":
Процедура ТипДоставкиПриИзменении(Элемент)
Если ТипДоставки = Перечисление.ТипыДоставки.Курьер Тогда
ЭлементыФормы.АдресДоставки.Видимость = Истина;
ЭлементыФормы.АдресДоставки.Доступность = Истина;
Иначе
ЭлементыФормы.АдресДоставки.Видимость = Ложь;
КонецЕсли;
КонецПроцедуры
2. Печатные формы
Чтобы создать печатную форму (например, счет или накладную), используйте макет:
- В конфигураторе добавьте макет типа "Табличный документ" (
Объект → Макеты). - Настройте шаблон встроенным редактором или через Microsoft Excel.
- Свяжите макет с документом через процедуру
Печать():
Процедура Печать(Команда)
Макет = Документы.ЗаказПокупателя.ПечатнаяФормаСчета;
ТабДок = Новый ТабличныйДокумент;
ТабДок.Вывести(Макет);
ТабДок.Показать();
КонецПроцедуры
3. Интеграция с внешними системами
Если нужно отправлять данные из формы в другую систему (например, в CRM или ECM), используйте HTTP-сервисы или COM-соединение. Пример отправки данных в JSON-format:
Процедура ОтправитьВCRM(Команда)
Запрос = Новый HTTPЗапрос("https://api.crm.example.com/orders");
Запрос.УстановитьТелоИзСтроки(ПолучитьJSONДанные());
Запрос.УстановитьЗаголовок("Content-Type", "application/json");
Ответ = Новый HTTPСоединение;
Ответ.ОтправитьДляОбработки(Запрос);
Если Ответ.КодСостояния <> 200 Тогда
Сообщить("Ошибка отправки: " + Ответ.ПолучитьТекст());
КонецЕсли;
КонецПроцедуры
4. Использование расширений форм
Если нужно добавить функциональность к стандартной форме без ее модификации, создайте расширение формы:
- 🔧 В конфигураторе перейдите в
Конфигурация → Расширения → Добавить. - 📋 Выберите форму, которую хотите расширить, и добавьте новые элементы.
- 🔄 Переопределите нужные обработчики (например,
ПередЗаписью).
Динамические формы и печатные макеты — это мощные инструменты для автоматизации рутинных задач. Например, печатная форма счета может автоматически подставлять реквизиты организации, рассчитывать итоги и даже отправлять PDF по email прямо из 1С.
FAQ: Ответы на частые вопросы о формах документов в 1С
Как сделать, чтобы поле в форме автоматически заполнялось при выборе другого поля?
Используйте обработчик события ПриИзменении для первого поля. В нем напишите код, который заполнит второе поле. Например, для автоматического заполнения цены при выборе номенклатуры:
Процедура НоменклатураПриИзменении(Элемент)
Если Номенклатура.Выбран() Тогда
Цена = Номенклатура.ЦенаПродажи;
КонецЕсли;
КонецПроцедуры
Для управляемых форм не забудьте указать, что процедура выполняется на сервере, если требуется доступ к базе:
Процедура НоменклатураПриИзменении(Элемент)
Если Номенклатура.Выбран() Тогда
Цена = ПолучениЦеныНаСервере(Номенклатура);
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ПолучениЦеныНаСервере(Номенклатура)
Возврат Номенклатура.ЦенаПродажи;
КонецФункции
Почему в управляемой форме не отображается табличная часть?
Проверьте следующие моменты:
- Убедитесь, что табличное поле привязано к правильному реквизиту документа (
ПутьКДанным = "Объект.ТабличнаяЧасть"). - Проверьте видимость табличного поля:
ЭлементыФормы.ИмяТаблицы.Видимость = Истина. - Если табличная часть пустая, возможно, не загружены данные. В обработчике
ПриСозданииНаСервередобавьте код загрузки:
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Объект.Ссылка.Пустая() Тогда
Объект.ТабличнаяЧасть.Очистить();
Объект.ТабличнаяЧасть.Добавить();
КонецЕсли;
КонецПроцедуры
Также убедитесь, что в модуле объекта документа не переопределен метод ПриЧтенииДанных(), который мог бы блокировать загрузку табличной части.
Как в форме документа сделать кнопку, которая будет открывать другой документ?
Добавьте на форму кнопку (Элементы → Кнопка) и напишите обработчик нажатия. Пример кода для открытия связанного документа "Счет на оплату":
Процедура ОткрытьСчет(Команда)
Если Объект.Счет.Пустая() Тогда
Сообщить("Счет не указан!");
Возврат;
КонецЕсли;
ОткрытьФорму("Документ.СчетНаОплату.ФормаОбъекта", Объект.Счет);
КонецПроцедуры
Для управляемых форм используйте метод ОткрытьФормуМодально(), если нужно дождаться закрытия второй формы:
Процедура ОткрытьСчет(Команда)
ПараметрыФормы = Новый Структура("Ключ", Объект.Счет);
ОткрытьФормуМодально("Документ.СчетНаОплату.ФормаОбъекта", ПараметрыФормы);
КонецПроцедуры
Можно ли в одной форме отображать данные из нескольких документов?
Да, но для этого потребуется:
- Создать непривязанную форму (не привязанную к конкретному документу).
- Добавить на форму элементы, привязанные к разным объектам через
ПутьКДанным. - В модуле формы написать код загрузки данных из нужных документов.
Пример: форма для сравнения двух заказов покупателя. В модуле формы:
Перем Заказ1, Заказ2;
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Заказ1 = Документы.ЗаказПокупателя.НайтиПоНомеру("0001");
Заказ2 = Документы.ЗаказПокупателя.НайтиПоНомеру("0002");
ЭлементыФормы.ТаблицаЗаказ1.Значение = Заказ1.Товары;
ЭлементыФормы.ТаблицаЗаказ2.Значение = Заказ2.Товары;
КонецПроцедуры
Обратите внимание, что такая форма не будет автоматически обновляться при изменении документов. Для актуализации данных потребуется добавить кнопку "Обновить".
Как сделать, чтобы форма документа открывалась в полном экране?
Для управляемых форм используйте свойство ПолноэкранныйРежим:
Процедура ПриОткрытии(Отказ)
ЭтотОбъект.ПолноэкранныйРежим = Истина;
КонецПроцедуры
Для обычных форм полноэкранный режим не поддерживается напрямую, но можно эмулировать его, установив размер формы равным размеру экрана:
Процедура ПриОткрытии()
ЭтотОбъект.Ширина = РабочийСтол.Ширина;
ЭтотОбъект.Высота = РабочийСтол.Высота;
КонецПроцедуры
Учтите, что в веб-клиенте полноэкранный режим может блокироваться настройками браузера.