При разработке интерфейсов на платформе 1С:Предприятие 7.7 с использованием внешней компоненты 1С++ часто встает задача тонкой настройки поведения ячеек элемента управления ТабличноеПоле. В частности, при работе с колонками ссылочного типа (справочники, документы) стандартный вызов метода РедактироватьЗначение открывает форму выбора по умолчанию. Однако разработчику нередко требуется вмешаться в этот процесс: передать в открываемую форму текущий контекст, установить специфические отборы или вовсе заменить форму выбора на специализированную обработку подбора.
Разберем детально, как перехватить интерактивный выбор значения, передать нужные параметры и предотвратить нежелательное автоматическое открытие формы при добавлении новых строк.
Проанализируем вызов метода редактирования, который обычно используется для ячейки с кнопкой выбора («педалькой»):
ТП.РедактироватьЗначение(Стр, Колонка, Регион, _знач, , , "ВыбЗнач", "0x00000020");
Здесь седьмым параметром передается строковый идентификатор элемента диалога (в примере — "ВыбЗнач"), а восьмым — битовая маска стилей редактирования. Флаг 0x00000020 (десятичное значение 32, константа dpHasButton) указывает элементу управления на необходимость отрисовки кнопки выбора в ячейке.
При этом разработчики часто сталкиваются с двумя вопросами:
Выясним причину автооткрытия: для колонок с ссылочными типами данных в ТабличномПоле по умолчанию активирован режим автовыбора. Как только строка становится активной для редактирования, компонент самостоятельно инициирует открытие формы справочника.
Чтобы отключить это поведение и открывать форму только по явному нажатию пользователем на кнопку выбора, необходимо использовать флаг dpDisableAutoChoice, шестнадцатеричное значение которого — 0x00000200 (в десятичной системе — 512).
Скомбинируем флаг наличия кнопки и флаг запрета автовыбора с помощью побитового сложения:
0x00000020 + 0x00000200 = 0x00000220 (в десятичной системе: 32 + 512 = 544).
Посмотрим на обновленный вызов метода:
ТП.РедактироватьЗначение(Стр, Колонка, Регион, _знач, , , "ВыбЗнач", "0x00000220");
Теперь форма не будет открываться самопроизвольно при активации ячейки или вводе новой строки.
Поскольку в метод РедактироватьЗначение был передан идентификатор "ВыбЗнач", платформа 1С 7.7 при нажатии кнопки в ячейке вызывает штатную предопределенную процедуру модуля формы ПриНачалеВыбораЗначения. Это позволяет перехватить открытие формы стандартными средствами языка без привлечения сложных внешних низкоуровневых хуков.
Разберем по шагам алгоритм перехвата:
ПриНачалеВыбораЗначения проверяем совпадение идентификатора элемента диалога.ФлагСтандартнойОбработки = 0 (или директивы СтатусВозврата(0)), чтобы платформа не открывала форму по умолчанию.ОткрытьФорму или ОткрытьФормуМодально, передавая в параметре системную переменную Контекст или специально сформированный СписокЗначений.Рассмотрим пример реализации с модальным открытием формы:
Процедура ПриНачалеВыбораЗначения(ИдентЭлемДиалога, ФлагСтандартнойОбработки)
Если ИдентЭлемДиалога = "ВыбЗнач" Тогда
// Отменяем стандартное платформенное открытие формы
ФлагСтандартнойОбработки = 0;
// Формируем параметры для передачи в открываемую форму
Парам = СоздатьОбъект("СписокЗначений");
Парам.Установить("РодительскийКонтекст", Контекст);
Парам.Установить("ТекущаяСтрока", ТП.ТекущаяСтрока);
Парам.Установить("ИмяКолонки", "Номенклатура");
// Открываем форму выбора модально
ВыбЭлемент = "";
ОткрытьФормуМодально("Справочник.Номенклатура.ФормаВыбора", Парам);
// Если значение было выбрано и возвращено через список параметров
Если Парам.Получить("Выбрано") = 1 Тогда
ВыбЭлемент = Парам.Получить("Значение");
// Записываем результат в источник данных ТабличногоПоля
ТаблицаДанных.ПолучитьСтрокуПоНомеру(ТП.ТекущаяСтрока);
ТаблицаДанных.Номенклатура = ВыбЭлемент;
// Перерисовываем измененные строки
ТП.ОбновитьСтроки();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Если требуется открыть форму немодально, передав контекст родительской формы для обратной связи, используем процедуру ОбработкаВыбораЗначения:
Процедура ПриНачалеВыбораЗначения(ИдентЭлемДиалога, ФлагСтандартнойОбработки)
Если ИдентЭлемДиалога = "ВыбЗнач" Тогда
ФлагСтандартнойОбработки = 0;
// Передаем контекст текущей формы в качестве параметра
ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора", Контекст);
КонецЕсли;
КонецПроцедуры
Процедура ОбработкаВыбораЗначения(ВыбЗнач, ИдентЭлемДиалога, ФлагСтандартнойОбработки)
Если ИдентЭлемДиалога = "ВыбЗнач" Тогда
// Записываем полученное значение в текущую строку источника данных
ТаблицаДанных.ПолучитьСтрокуПоНомеру(ТП.ТекущаяСтрока);
ТаблицаДанных.Номенклатура = ВыбЗнач;
ТП.ОбновитьСтроки();
КонецЕсли;
КонецПроцедуры
Помимо стандартного механизма 1С, компонент 1С++ предоставляет дополнительные возможности:
Событие_ПриНачалеВыбораЗначения), что удобно для создания централизованной логики во всей конфигурации без изменения каждой формы.Выбор, разработчик получает полный контроль над моментом вызова форм подбора без привязки к платформенному циклу редактирования ячейки. Для сохранения вручную введенного текста при этом используется событие ПриРедактированииЗначения.