Как автоматически снять флажок при выборе номенклатуры во внешней обработке

Программист 1С v8.3 (Управляемые формы)
← На главную

В разработке на платформе 1С:Предприятие часто возникает задача автоматизации заполнения или изменения одних полей формы в зависимости от действий пользователя в других полях. Типичный пример — необходимость снять определенную «галочку» (булев реквизит), когда пользователь выбирает позицию в поле с типом СправочникСсылка.Номенклатура. Рассмотрим детально, как это реализовать, разберем программный код и технические нюансы взаимодействия элементов формы.

Постановка задачи и анализ ситуации

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

Проанализируем, почему это важно. В интерфейсах 1С логика «зависимых полей» является стандартом. Если выбор номенклатуры делает неактуальным предыдущее состояние формы (например, флажок «Пустая позиция» или «Требуется подбор»), система должна реагировать мгновенно. Для этого в платформе предусмотрен механизм событий.

Шаг 1. Создание обработчика события на форме

Прежде всего, разберем, как заставить программу «услышать» момент изменения поля. Просто написать код в модуле недостаточно — его нужно «привязать» к конкретному элементу управления. Рассмотрим последовательность действий:

  1. Откроем внешнюю обработку в конфигураторе и перейдем на закладку Формы.
  2. В редакторе формы выберем элемент, соответствующий номенклатуре (обычно это поле ввода).
  3. Перейдем в палитру свойств этого элемента (нажмем правую кнопку мыши — Свойства или воспользуемся клавишей Alt + Enter).
  4. В списке свойств найдем раздел События. Нас интересует событие ПриИзменении (на английском — OnChange).
  5. Нажмем на кнопку с лупой рядом с этим событием. Платформа предложит создать процедуру. В управляемых формах важно выбрать вариант Создать на клиенте, так как визуальные изменения интерфейса происходят именно в клиентском контексте.

Платформа автоматически сгенерирует «заготовку» (контейнер) для нашего кода. Рассмотрим, как она выглядит:


&НаКлиенте
Процедура НоменклатураПриИзменении(Элемент)
    // Сюда мы будем писать наш код
КонецПроцедуры

Шаг 2. Написание кода для управляемых форм

В современных конфигурациях (например, ERP, УТ 11, БП 3.0), работающих на управляемом интерфейсе, данные формы отделены от программных объектов. Реквизиты, которые мы видим на форме, обычно входят в состав основного реквизита Объект.

Проанализируем код, который решит нашу задачу. Нам нужно обратиться к реквизиту формы, который мы назвали «ГулочкаСБулево» (или любое другое имя, заданное в конфигураторе), и присвоить ему значение Ложь.

Рассмотрим пример кода:


&НаКлиенте
Процедура НоменклатураПриИзменении(Элемент)
    
    // Прямое обращение к реквизиту объекта через точку
    Объект.ГулочкаСБулево = Ложь;
    
КонецПроцедуры

Выясним причину использования префикса Объект. В управляемой форме реквизиты внешней обработки (те, что созданы на вкладке «Данные» самой обработки) группируются внутри структуры Объект. Если же вы создали реквизит непосредственно на вкладке «Реквизиты» самой формы (а не обработки), то обращение будет идти напрямую по имени без слова Объект.

Шаг 3. Особенности для обычных форм

Если вы работаете в старой конфигурации (например, УПП 1.3 или ЗУП 2.5), то механизм будет несколько иным. В обычных формах нет жесткого разделения на клиент и сервер в рамках одного модуля формы, и обращение к реквизитам происходит проще.

Посмотрим на пример кода для обычной формы:


Процедура НоменклатураПриИзменении(Элемент)
    
    // В обычных формах обращаемся напрямую
    ГулочкаСБулево = Ложь;
    
КонецПроцедуры

Здесь важно помнить, что имя ГулочкаСБулево должно в точности совпадать с именем реквизита, которое указано в метаданных обработки или в списке реквизитов формы.

Разбор типичных ошибок и нюансов

Проанализируем ситуацию, когда код написан, но флажок не снимается. Рассмотрим основные причины:

  1. Отсутствие связи события с процедурой: Часто разработчики копируют текст процедуры из интернета, но забывают зайти в свойства элемента формы и выбрать эту процедуру в поле события ПриИзменении. В таком случае 1С просто не знает, что при выборе номенклатуры нужно запустить этот код.
  2. Неверное имя реквизита: Обратите внимание, что Имя реквизита (которое используется в коде) и Заголовок (который видит пользователь на экране) — это разные вещи. Всегда проверяйте колонку «Имя» в дереве реквизитов.
  3. Тип данных: Убедитесь, что реквизит, который вы пытаетесь изменить, действительно имеет тип Булево. Если это число или строка, присвоение значения Ложь может привести к ошибке или неверному отображению.

Сложные случаи: взаимодействие между окнами

В сообщениях форума упоминалось, что «гулочка» должна убираться «на форме в самой конфигурации». Это может означать, что внешняя обработка открыта как вспомогательное окно, а флажок находится в основном документе. Рассмотрим, как решить такую задачу через механизм Оповещений.

В модуле внешней обработки мы вызываем специальный метод:


&НаКлиенте
Процедура НоменклатураПриИзменении(Элемент)
    
    // Передаем сигнал другим открытым окнам
    Оповестить("СнятьФлажокПослеВыбораНоменклатуры", , "ВнешняяОбработка");
    
КонецПроцедуры

А в форме основной конфигурации (например, в форме документа «Заказ клиента») нужно создать обработчик события ОбработкаОповещения:


&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
    
    Если ИмяСобытия = "СнятьФлажокПослеВыбораНоменклатуры" Тогда
        Объект.НужнаяГалочка = Ложь;
    КонецЕсли;
    
КонецПроцедуры

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

Заключение и рекомендации

Мы разобрали, как решить задачу автоматического изменения булева реквизита всего в «три строчки». Несмотря на кажущуюся простоту, этот пример охватывает важные аспекты разработки в 1С: работу с событиями элементов формы, различие клиентского и серверного контекста, а также взаимодействие между формами.

Для более глубокого понимания процессов рекомендуем изучить литературу, упомянутую в обсуждении, в частности пособия М. Г. Радченко. Понимание того, как платформа управляет данными в памяти и как события передаются от пользовательского интерфейса к программному коду, позволит вам решать гораздо более сложные задачи автоматизации бизнес-логики.

← На главную