Как программно подменить форму выбора субконто в документе 1С

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

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

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

Анализ проблемы и типичная ошибка при открытии формы

В типовых конфигурациях на платформе 1С:Предприятие 8.3 (включая конфигурацию 1С:Бухгалтерия предприятия) выбор субконто обрабатывается централизованно. В форме документа у поля ввода субконто назначен клиентский обработчик события НачалоВыбора, который вызывает типовые процедуры общих модулей, например ОбщегоНазначенияБПКлиент.НачалоВыбораЗначенияСубконто.

Когда разработчик пытается открыть произвольную форму списка с помощью метода ОткрытьФорму, часто возникает ситуация, при которой форма открывается в обычном режиме просмотра списка. При двойном клике или нажатии клавиши Enter объект открывается на редактирование, а не переносится в строку документа. Выясним причину: форма списка открывается без признака режима выбора, поэтому платформа не понимает, что от формы ожидается возвращение значения.

Пошаговое решение: перехват события НачалоВыбора

Рассмотрим, как правильно настроить программное открытие формы с передачей необходимых параметров выбора. Для этого выполним следующие действия по шагам:

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

Посмотрим на пример программного кода в модуле формы документа:


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

КонецПроцедуры

Нюансы выбора владельца формы и автоподстановка

Обратим особое внимание на третий параметр метода ОткрытьФорму — владельца открываемой формы. Здесь разработчики часто совершают ошибку, передавая ЭтаФорма:

  1. Передача ЭтаФорма: Если владельцем указана сама форма документа, платформа при выборе объекта не сможет автоматически определить, в какую именно колонку и строку табличной части вернуть значение. Разработчику придется вручную описывать событие формы ОбработкаВыбора, определять текущую активную строку и записывать значение в реквизит.
  2. Передача Элемент: Если в качестве владельца передан сам элемент управления (ячейка таблицы, из которой был вызван выбор), платформа автоматически поместит выбранное значение в реквизит текущей строки и вызовет связанное событие ПриИзменении. Это избавляет от необходимости писать дополнительный код обработки.

Установка позиционирования на текущем объекте

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

Ограничения быстрого ввода и клавиатурного подбора

Важно помнить, что событие НачалоВыбора перехватывает открытие формы только при интерактивном нажатии кнопки с троеточием или горячей клавиши F4. Если пользователь начнет набирать наименование или инвентарный номер непосредственно с клавиатуры в поле ввода, сработает механизм автоподбора или ввода по строке. В этом случае подмена формы через НачалоВыбора не сработает, и система обратится к стандартным полям поиска справочника.

Если требуется полностью исключить стандартный подбор и заставить пользователя использовать только специальную форму выбора, в свойствах элемента управления на форме документа рекомендуется отключить свойство быстрого выбора или обработать события Автоподбор и ОкончаниеВводаТекста.

Централизованная подмена через модуль менеджера справочника

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

Для этого используется обработчик ОбработкаПолученияФормы:


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

КонецПроцедуры

Такой подход позволяет централизовать логику выбора объектов в конфигурации, сохраняя стандартную архитектуру взаимодействия форм платформы 1С:Предприятие.

← На главную