Работа с обычными формами в 1С требует от разработчика понимания того, как связаны данные объекта и их визуальное представление. Часто возникает задача: при изменении одного реквизита (например, РазмерОдежды) необходимо не просто обновить другой реквизит (ВидОдежды), но и инициировать всю связанную с ним логику — пересчеты, проверки или заполнение зависимых полей. Для реализации подобных задач важно освоить программное изменение форм, что позволяет стандартизировать разработку и эффективно управлять поведением элементов.
Прежде всего, нам необходимо четко разделять понятия реквизита объекта и элемента формы. В обычных формах это разделение критично. Когда пользователь вводит данные в поле на форме, они попадают в ЭлементыФормы, а затем транслируются в ЭтотОбъект (реквизиты документа или справочника). Если мы хотим изменить значение программно, мы должны воздействовать на сам реквизит объекта.
Рассмотрим по шагам типичную ошибку. Попытка присвоить значение напрямую свойству ЭлементыФормы.ВидОдежды.Значение может привести к тому, что данные не будут корректно записаны в объект при сохранении или не вызовут стандартные механизмы платформы по проверке типов. Правильный подход — работа напрямую с реквизитом.
Если нам нужно просто «вписать» значение в поле, когда пользователь изменил другое поле, мы используем событие ПриИзменении. Выясним, как это выглядит на практике для нашего примера с одеждой:
Процедура РазмерОдеждыПриИзменении(Элемент)
// Присваиваем значение напрямую реквизиту объекта
ВидОдежды = Справочники.Номенклатура.НайтиПоНаименованию("Куртка");
// В обычных формах иногда требуется явно "толкнуть" интерфейс
// чтобы пользователь увидел изменения немедленно
ЭтаФорма.Обновить();
КонецПроцедуры
Метод ЭтаФорма.Обновить() заставляет платформу перечитать значения всех реквизитов объекта и отобразить их в соответствующих полях ввода на форме. Это особенно важно, если вы реализуете нестандартный функционал, например, отображение картинки из буфера, где визуальный отклик должен быть мгновенным.
Ситуация усложняется, если на реквизите ВидОдежды «висит» сложная процедура ВидОдеждыПриИзменении, которая должна выполниться заново. Простое присвоение значения переменной не вызовет выполнение кода в обработчике события. Проанализируем, как можно инициировать эту цепочку действий программно.
Для этого мы выносим общую логику в отдельную процедуру или вызываем обработчик напрямую. Подобный прием часто используется, когда нужно выполнить подсчет итогов по выделенным строкам таблицы формы или другие массовые пересчеты при изменении ключевых параметров. Посмотрим на пример реализации:
Процедура РазмерОдеждыПриИзменении(Элемент)
// 1. Устанавливаем новое (или подтверждаем старое) значение
ВидОдежды = Справочники.Номенклатура.НайтиПоНаименованию("Куртка");
// 2. Вызываем обработчик события другого поля программно
// Передаем в него элемент управления этого поля
ВидОдеждыПриИзменении(ЭлементыФормы.ВидОдежды);
КонецПроцедуры
Процедура ВидОдеждыПриИзменении(Элемент)
// Здесь выполняется важная логика, например, установка цен
ВыполнитьОченьВажноеДействие(Элемент.Значение);
КонецПроцедуры
Такой подход позволяет избежать дублирования кода. Мы имитируем действия пользователя: система «думает», что значение ВидОдежды было изменено вручную, и запускает все связанные механизмы.
Иногда необходимость «перезаполнения» возникает из-за того, что при смене размера старый вид одежды становится недоступным (например, если включены сложные фильтры). В 1С обычные формы поддерживают Связи параметров выбора. Если они настроены в конфигураторе, платформа может автоматически очищать или требовать перезаполнения поля при изменении владельца.
Однако, если автоматика не справляется, мы можем программно сбросить значение и открыть список выбора заново. Рассмотрим подробнее, как принудительно очистить поле перед «перезаполнением»:
ПриИзменении первого реквизита устанавливаем значение второго в Неопределено или пустую ссылку.ЭтаФорма.Обновить().ЭлементыФормы.ИмяПоля.Выбрать().Проанализируем несколько моментов, которые часто упускают начинающие разработчики при работе с обычными формами:
Зацикливание событий: Если процедура А вызывает БПриИзменении, а процедура Б в свою очередь вызывает АПриИзменении, программа уйдет в бесконечный цикл. Чтобы этого избежать, используйте флаг-переменную, аналогично тому, как это делается, когда выполняется восстановление и очистка хранилища настроек пользователя, чтобы не инициировать повторные записи при загрузке данных.
Свойство «Очищать при редактировании»: Проверьте свойства элемента формы. Если установлена галочка Очищать при редактировании, то при любом программном фокусе на поле старое значение может быть стерто, что помешает корректному «перезаполнению».
Метод ОбновитьОтображениеДанных(): Стоит помнить, что этот метод пришел из управляемых форм (v8.3). В классических обычных формах (v8.2 и режим совместимости) основным инструментом остается ЭтаФорма.Обновить() или прямое управление свойством Значение элемента формы: ЭлементыФормы.ВидОдежды.Значение = ВидОдежды.
Для специализированных рабочих мест может потребоваться даже более глубокая кастомизация интерфейса, например, запуск 1С на полный экран без заголовка окна, что часто встречается в POS-системах или на информационных киосках, где формы должны занимать все доступное пространство.
Реализация перезаполнения на обычных формах сводится к двум ключевым действиям: изменение данных в объекте и принудительный вызов логики обновления. Выбирайте способ в зависимости от сложности вашей конфигурации: если логика простая — достаточно присваивания и метода Обновить(), если сложная — не обойтись без программного вызова существующих процедур-обработчиков.