В разработке на платформе 1С:Предприятие часто возникает задача автоматизации заполнения или изменения одних полей формы в зависимости от действий пользователя в других полях. Типичный пример — необходимость снять определенную «галочку» (булев реквизит), когда пользователь выбирает позицию в поле с типом СправочникСсылка.Номенклатура. Рассмотрим детально, как это реализовать, разберем программный код и технические нюансы взаимодействия элементов формы.
Представим ситуацию: у нас есть внешняя обработка. На ее форме расположены два элемента: поле ввода для выбора номенклатуры и флажок (чекбокс), который соответствует булеву реквизиту. Нам необходимо, чтобы в тот момент, когда пользователь нажимает на поле выбора, открывает список справочника и выбирает конкретный товар, флажок автоматически принимал значение Ложь. Это избавляет пользователя от лишних ручных действий и минимизирует риск ошибок при вводе данных.
Проанализируем, почему это важно. В интерфейсах 1С логика «зависимых полей» является стандартом. Если выбор номенклатуры делает неактуальным предыдущее состояние формы (например, флажок «Пустая позиция» или «Требуется подбор»), система должна реагировать мгновенно. Для этого в платформе предусмотрен механизм событий.
Прежде всего, разберем, как заставить программу «услышать» момент изменения поля. Просто написать код в модуле недостаточно — его нужно «привязать» к конкретному элементу управления. Рассмотрим последовательность действий:
Alt + Enter).ПриИзменении (на английском — OnChange).Платформа автоматически сгенерирует «заготовку» (контейнер) для нашего кода. Рассмотрим, как она выглядит:
&НаКлиенте
Процедура НоменклатураПриИзменении(Элемент)
// Сюда мы будем писать наш код
КонецПроцедуры
В современных конфигурациях (например, ERP, УТ 11, БП 3.0), работающих на управляемом интерфейсе, данные формы отделены от программных объектов. Реквизиты, которые мы видим на форме, обычно входят в состав основного реквизита Объект.
Проанализируем код, который решит нашу задачу. Нам нужно обратиться к реквизиту формы, который мы назвали «ГулочкаСБулево» (или любое другое имя, заданное в конфигураторе), и присвоить ему значение Ложь.
Рассмотрим пример кода:
&НаКлиенте
Процедура НоменклатураПриИзменении(Элемент)
// Прямое обращение к реквизиту объекта через точку
Объект.ГулочкаСБулево = Ложь;
КонецПроцедуры
Выясним причину использования префикса Объект. В управляемой форме реквизиты внешней обработки (те, что созданы на вкладке «Данные» самой обработки) группируются внутри структуры Объект. Если же вы создали реквизит непосредственно на вкладке «Реквизиты» самой формы (а не обработки), то обращение будет идти напрямую по имени без слова Объект.
Если вы работаете в старой конфигурации (например, УПП 1.3 или ЗУП 2.5), то механизм будет несколько иным. В обычных формах нет жесткого разделения на клиент и сервер в рамках одного модуля формы, и обращение к реквизитам происходит проще.
Посмотрим на пример кода для обычной формы:
Процедура НоменклатураПриИзменении(Элемент)
// В обычных формах обращаемся напрямую
ГулочкаСБулево = Ложь;
КонецПроцедуры
Здесь важно помнить, что имя ГулочкаСБулево должно в точности совпадать с именем реквизита, которое указано в метаданных обработки или в списке реквизитов формы.
Проанализируем ситуацию, когда код написан, но флажок не снимается. Рассмотрим основные причины:
ПриИзменении. В таком случае 1С просто не знает, что при выборе номенклатуры нужно запустить этот код.Булево. Если это число или строка, присвоение значения Ложь может привести к ошибке или неверному отображению.В сообщениях форума упоминалось, что «гулочка» должна убираться «на форме в самой конфигурации». Это может означать, что внешняя обработка открыта как вспомогательное окно, а флажок находится в основном документе. Рассмотрим, как решить такую задачу через механизм Оповещений.
В модуле внешней обработки мы вызываем специальный метод:
&НаКлиенте
Процедура НоменклатураПриИзменении(Элемент)
// Передаем сигнал другим открытым окнам
Оповестить("СнятьФлажокПослеВыбораНоменклатуры", , "ВнешняяОбработка");
КонецПроцедуры
А в форме основной конфигурации (например, в форме документа «Заказ клиента») нужно создать обработчик события ОбработкаОповещения:
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
Если ИмяСобытия = "СнятьФлажокПослеВыбораНоменклатуры" Тогда
Объект.НужнаяГалочка = Ложь;
КонецЕсли;
КонецПроцедуры
Этот метод более продвинутый и позволяет связывать разные объекты системы без прямого обращения к их формам, что делает код более гибким и устойчивым к изменениям.
Мы разобрали, как решить задачу автоматического изменения булева реквизита всего в «три строчки». Несмотря на кажущуюся простоту, этот пример охватывает важные аспекты разработки в 1С: работу с событиями элементов формы, различие клиентского и серверного контекста, а также взаимодействие между формами.
Для более глубокого понимания процессов рекомендуем изучить литературу, упомянутую в обсуждении, в частности пособия М. Г. Радченко. Понимание того, как платформа управляет данными в памяти и как события передаются от пользовательского интерфейса к программному коду, позволит вам решать гораздо более сложные задачи автоматизации бизнес-логики.