Как перехватить открытие формы справочника и передать контекст при редактировании ячейки в ТабличномПоле 1С++?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

При разработке интерфейсов на платформе 1С:Предприятие 7.7 с использованием внешней компоненты 1С++ часто встает задача тонкой настройки поведения ячеек элемента управления ТабличноеПоле. В частности, при работе с колонками ссылочного типа (справочники, документы) стандартный вызов метода РедактироватьЗначение открывает форму выбора по умолчанию. Однако разработчику нередко требуется вмешаться в этот процесс: передать в открываемую форму текущий контекст, установить специфические отборы или вовсе заменить форму выбора на специализированную обработку подбора.

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

Причина проблемы и механизм работы метода

Проанализируем вызов метода редактирования, который обычно используется для ячейки с кнопкой выбора («педалькой»):

ТП.РедактироватьЗначение(Стр, Колонка, Регион, _знач, , , "ВыбЗнач", "0x00000020");

Здесь седьмым параметром передается строковый идентификатор элемента диалога (в примере — "ВыбЗнач"), а восьмым — битовая маска стилей редактирования. Флаг 0x00000020 (десятичное значение 32, константа dpHasButton) указывает элементу управления на необходимость отрисовки кнопки выбора в ячейке.

При этом разработчики часто сталкиваются с двумя вопросами:

  1. Где именно перехватить момент нажатия на кнопку выбора, чтобы передать контекст родительской формы?
  2. Почему при начале редактирования (особенно при интерактивном добавлении строки в таблицу) форма списка справочника сразу распахивается автоматически, не дожидаясь клика пользователя?

Отключение автоматического открытия формы списка

Выясним причину автооткрытия: для колонок с ссылочными типами данных в ТабличномПоле по умолчанию активирован режим автовыбора. Как только строка становится активной для редактирования, компонент самостоятельно инициирует открытие формы справочника.

Чтобы отключить это поведение и открывать форму только по явному нажатию пользователем на кнопку выбора, необходимо использовать флаг dpDisableAutoChoice, шестнадцатеричное значение которого — 0x00000200 (в десятичной системе — 512).

Скомбинируем флаг наличия кнопки и флаг запрета автовыбора с помощью побитового сложения:

0x00000020 + 0x00000200 = 0x00000220 (в десятичной системе: 32 + 512 = 544).

Посмотрим на обновленный вызов метода:


ТП.РедактироватьЗначение(Стр, Колонка, Регион, _знач, , , "ВыбЗнач", "0x00000220");

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

Перехват события выбора и передача контекста

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

Разберем по шагам алгоритм перехвата:

  1. В процедуре ПриНачалеВыбораЗначения проверяем совпадение идентификатора элемента диалога.
  2. Сбрасываем стандартную обработку с помощью ФлагСтандартнойОбработки = 0 (или директивы СтатусВозврата(0)), чтобы платформа не открывала форму по умолчанию.
  3. Программно открываем нужную форму справочника через ОткрытьФорму или ОткрытьФормуМодально, передавая в параметре системную переменную Контекст или специально сформированный СписокЗначений.
  4. Принимаем выбранное значение и обновляем данные в строке ТабличногоПоля.

Рассмотрим пример реализации с модальным открытием формы:


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

Обработка результата при немодальном открытии

Если требуется открыть форму немодально, передав контекст родительской формы для обратной связи, используем процедуру ОбработкаВыбораЗначения:


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

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

Альтернативные способы решения

Помимо стандартного механизма 1С, компонент 1С++ предоставляет дополнительные возможности:

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