При разработке интерфейсов в 1С часто возникает задача максимально упростить ввод данных для пользователя. Один из классических сценариев: при нажатии на клавишу Ins или кнопку «Добавить» в табличной части документа, система не просто должна создать пустую строку, но и сразу открыть форму выбора справочника для заполнения ключевой колонки (например, «Номенклатура» или «Контрагент»). Рассмотрим, как реализовать это поведение в обычных формах, проанализируем возможные проблемы с фокусом окна и разберем наиболее элегантные методы решения.
Это самый очевидный путь, который первым делом пробуют разработчики. Суть заключается в том, чтобы перехватить момент, когда строка уже создана и курсор встал в ячейку. Однако здесь возникает нюанс: если просто открыть форму выбора, она может «уйти» на задний план, оставив активной форму документа.
Проанализируем программный код, который позволяет решить проблему активации окна через глобальную переменную и обработчик ожидания или обновление отображения:
Перем ФормаВыбораСпр;
Процедура ТабличнаяЧасть1ПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
// Проверяем, что это именно новая строка, а не редактирование старой
Если НоваяСтрока Тогда
ФормаВыбораСпр = Справочники.МоёИмяСправочника.ПолучитьФормуВыбора();
ФормаВыбораСпр.ВладелецФормы = Элемент.ТекущаяКолонка; // Указываем владельцем колонку ТЧ
ФормаВыбораСпр.Открыть();
КонецЕсли;
КонецПроцедуры
Процедура ОбновлениеОтображения()
// Метод для принудительного вывода формы выбора на передний план
Если ФормаВыбораСпр <> Неопределено И ФормаВыбораСпр.Открыта() Тогда
ФормаВыбораСпр.Активизировать();
ФормаВыбораСпр = Неопределено; // Сбрасываем переменную после активации
КонецЕсли;
КонецПроцедуры
В данном примере мы используем событие ОбновлениеОтображения, чтобы гарантировать, что форма выбора получит фокус после того, как платформа завершит все стандартные действия по отрисовке новой строки. Это надежный, хотя и несколько «громоздкий» способ.
Этот метод считается более профессиональным и «чистым». Его преимущество в том, что мы можем вызвать форму выбора еще до того, как строка фактически будет добавлена в табличную часть. Если пользователь передумает и закроет форму выбора, в табличной части не останется «мусорной» пустой строки.
Разберем алгоритм реализации:
СтандартнаяОбработка = Ложь, чтобы отменить автоматическое добавление пустой строки.Пример кода для реализации этого подхода:
Процедура ТабличнаяЧасть1ПередНачаломДобавления(Элемент, Отказ, Копирование, ТекстУзла, НоваяСтрока)
СтандартнаяОбработка = Ложь;
Отказ = Истина; // Отменяем стандартное добавление
// Вызываем форму выбора модально (для обычных форм это допустимо)
ВыбранноеЗначение = Справочники.МоёИмяСправочника.Выбрать();
Если ВыбранноеЗначение <> Неопределено Тогда
НоваяСтрокаОбъект = ТабличнаяЧасть1.Добавить();
НоваяСтрокаОбъект.ИмяРеквизита = ВыбранноеЗначение;
// Передаем фокус в нужную колонку
ЭлементыФормы.ТабличнаяЧасть1.ТекущаяСтрока = НоваяСтрокаОбъект;
КонецЕсли;
КонецПроцедуры
Существует еще более элегантный способ, который позволяет задействовать стандартные механизмы платформы. Мы можем «заставить» систему думать, что пользователь сам нажал на кнопку с тремя точками в ячейке. Для этого используется метод ВыполнитьКнопкуВыбора().
Рассмотрим, как это выглядит в коде:
Процедура ТабличнаяЧасть1ПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
Если НоваяСтрока Тогда
// Имитируем нажатие кнопки выбора в текущей ячейке
ЭлементыФормы.ТабличнаяЧасть1.ВыполнитьКнопкуВыбора();
КонецЕсли;
КонецПроцедуры
Этот метод хорош тем, что он автоматически учитывает все настройки, заданные для колонки в конфигураторе (связи параметров выбора, отборы по владельцу и т.д.). Система сама откроет нужную форму и вернет выбранное значение в ячейку без дополнительного кода по присвоению.
Чтобы описанные выше методы работали корректно, необходимо проверить свойства колонки табличной части в конфигураторе. Проанализируем ключевые флаги:
Да.Нет), иначе вместо формы справочника будет открываться выпадающий список.СправочникСсылка.Номенклатура).Выясним, что делать, если колонка имеет составной тип (например, в ней может быть и «Товар», и «Услуга»). В этом случае перед открытием формы выбора система должна понять, какой именно справочник открывать. При использовании метода ВыполнитьКнопкуВыбора() платформа сначала предложит пользователю выбрать тип данных, что является стандартным и понятным поведением.
Если же вы используете ручное открытие формы через ПолучитьФормуВыбора(), вам придется сначала вызвать диалог ВыбратьТип(), проанализировать результат и только потом открывать соответствующую форму. Поэтому для составных типов данных имитация нажатия кнопки выбора является наиболее предпочтительной.
Таким образом, мы рассмотрели три основных способа автоматизации выбора элементов в табличной части. Выбор конкретного метода зависит от ваших задач: если нужно просто «нажать кнопку» за пользователя — используйте ВыполнитьКнопкуВыбора(). Если требуется сложная логика проверки перед добавлением строки — используйте ПередНачаломДобавления.