Как открыть отдельную форму для ввода данных при выборе реквизита в 1С?

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

При разработке собственных документов в 1С часто возникает задача, когда стандартного выбора из справочника недостаточно. Например, нам нужно, чтобы при нажатии на кнопку выбора в реквизите открывалась специализированная форма, где пользователь сможет заполнить множество дополнительных строк, выбрать несколько значений или произвести сложный расчет. Разберем, как реализовать такой механизм с помощью управляемых форм.

Основные принципы реализации

Для создания такой функциональности мы будем использовать событие НачалоВыбора поля ввода. Вместо стандартного открытия списка (например, справочника), мы принудительно перехватим управление и откроем нашу собственную форму с помощью метода ОткрытьФорму.

Чтобы всё заработало корректно, нам нужно выполнить три этапа:

  1. Отключить стандартную обработку выбора в событии НачалоВыбора.
  2. Передать данные в открываемую форму через структуру параметров.
  3. Использовать механизм ОписаниеОповещения, чтобы после закрытия дополнительной формы передать результат обратно в основной документ.

Шаг 1: Настройка события начала выбора

Перейдем в форму документа, выберем нужный элемент управления (поле ввода) и в палитре свойств найдем событие НачалоВыбора. Создадим обработчик на клиенте. Важно установить параметр СтандартнаяОбработка в значение Ложь, чтобы система не пыталась открыть стандартный выбор.

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


&НаКлиенте
Процедура НашРеквизитНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    ОткрытьНашуФорму();
    
КонецПроцедуры

Шаг 2: Подготовка параметров и открытие формы

Чтобы дополнительная форма понимала, с какими данными ей работать (например, уже выбранными ранее сотрудниками), мы создадим структуру ПараметрыФормы. Также мы создадим объект ОписаниеОповещения — это «callback»-функция, которая будет вызвана платформой сразу после того, как пользователь закроет нашу вторую форму.


&НаКлиенте
Процедура ОткрытьНашуФорму()
    
    // Подготавливаем данные, которые хотим передать в форму
    МассивДанных = Новый Массив;
    Для Каждого Строка Из Объект.НашаТабличнаяЧасть Цикл
        МассивДанных.Добавить(Строка.ПолеДанных);
    КонецЦикла;
    
    // Создаем параметры для передачи
    ПараметрыФормы = Новый Структура;
    ПараметрыФормы.Вставить("СписокЗначений", МассивДанных);
    
    // Создаем оповещение, которое сработает при закрытии формы
    Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияНашейФормы", ЭтотОбъект);
    
    // Открываем форму
    ОткрытьФорму("Документ.НашДокумент.Форма.СпециальнаяФормаВыбора", 
        ПараметрыФормы, ЭтотОбъект, , , , Оповещение);
            
КонецПроцедуры

Шаг 3: Обработка результата закрытия формы

Теперь нам нужно реализовать процедуру, которая примет результат из нашей дополнительной формы. В этой процедуре мы получим данные из параметра Результат и обновим основной документ.


&НаКлиенте
Процедура ПослеЗакрытияНашейФормы(Результат, ДополнительныеПараметры) Экспорт
    
    Если Результат <> Неопределено Тогда
        // Здесь мы обрабатываем полученный массив или структуру
        // и заполняем данные в объект документа
        Объект.НашаТабличнаяЧасть.Очистить();
        Для Каждого Элемент Из Результат Цикл
            НоваяСтрока = Объект.НашаТабличнаяЧасть.Добавить();
            НоваяСтрока.ПолеДанных = Элемент;
        КонецЦикла;
    КонецЕсли;
    
КонецПроцедуры

Рекомендации по реализации

При использовании данного подхода помните о следующих моментах:

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

← На главную