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