Как программно установить отбор в форме выбора и получить значение в таблицу на обычных формах

Программист 1С v8.3 (Обычные формы) Управленческий учет
← На главную

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

Постановка задачи и анализ ситуации

Представим сценарий: у нас есть внешняя обработка, в ней расположена ТаблицаЗначений (или табличная часть). Одной из колонок является ссылка на документ ЗаказПокупателя. Нам нужно, чтобы при нажатии на кнопку выбора в этой ячейке открывалась форма списка заказов, где уже установлен фильтр по контрагенту, указанному в этой же строке или в шапке обработки. Если просто вызвать стандартную форму, пользователь увидит все заказы, что неудобно и замедляет работу.

Рассмотрим пошагово, как правильно инициировать выбор и вернуть результат обратно в таблицу.

Шаг 1. Инициация выбора и установка фильтра

Для начала нам необходимо перехватить стандартное событие выбора. В свойствах элемента управления (поля ввода в колонке таблицы) находим событие НачалоВыбора. Именно здесь мы будем писать наш код.

Важный нюанс: Чтобы система не открывала стандартную форму без фильтров, мы должны установить параметр СтандартнаяОбработка = Ложь. Разберем пример кода, который открывает нужную форму и накладывает отбор:


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

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

Проанализируем этот код. Мы используем метод ПолучитьФормуВыбора, а вторым параметром передаем Элемент (владелец). Это критически важный момент для обычных форм. Если владельцем указано поле ввода, то при выборе значения в форме списка 1С автоматически подставит выбранную ссылку в это поле и запишет ее в данные строки.

Шаг 2. Правильное обращение к данным текущей строки

Разберем типичную ошибку, которую допускают многие: обращение к строке по индексу, например ЭтаФорма.Заказы[0].Контрагент. Проблема в том, что такой код всегда будет брать данные из первой строки таблицы, даже если пользователь нажал на кнопку выбора в пятой строке.

Для корректной работы мы всегда должны использовать свойство ТекущиеДанные табличного поля. Это гарантирует, что фильтр будет сформирован на основании значений той строки, с которой сейчас взаимодействует пользователь.

Шаг 3. Режим выбора vs Режим просмотра

Выясним, почему иногда вместо выбора значения открывается карточка документа. В 1С обычные формы могут работать в разных режимах. Если вы используете общую форму списка, убедитесь, что вы явно указали РежимВыбора = Истина.

При использовании метода ПолучитьФормуВыбора этот режим обычно устанавливается автоматически, но если вы вызываете форму через ПолучитьФорму("Документ.ЗаказПокупателя.ФормаСписка"), не забудьте добавить следующую строку перед открытием:

ФормаСписка.РежимВыбора = Истина;

Шаг 4. Обработка сложного выбора (событие ОбработкаВыбора)

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

Рассмотрим, как это реализовать:


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

Расширенные настройки отбора

Метод Отбор.Контрагент.Установить() — это упрощенная форма записи. Иногда нам требуется более сложная логика, например, отбор по списку значений или по иерархии. Проанализируем, как настроить отбор более детально:

  1. Использование: Необходимо убедиться, что свойство Использование установлено в Истина.
  2. Вид сравнения: Мы можем выбрать ВидСравнения.ВСписке, ВидСравнения.ВИерархии или ВидСравнения.НеРавно.
  3. Значение: Само значение, по которому фильтруем.

Пример расширенной настройки:


ФормаВыбора.Отбор.Контрагент.ВидСравнения = ВидСравнения.Равно;
ФормаВыбора.Отбор.Контрагент.Значение = ТекущийКонтрагент;
ФормаВыбора.Отбор.Контрагент.Использование = Истина;

Особенности работы во внешних обработках

Посмотрим на ситуацию со стороны архитектуры. Когда мы работаем с внешними обработками, формы документов берутся из основной конфигурации. Если в самой конфигурации в форме выбора заказа прописан жесткий код в событии ПриОткрытии (например, программный сброс всех фильтров), то наши настройки из внешней обработки могут "затираться".

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

Итоги

Мы рассмотрели, как эффективно реализовать подбор документов с фильтрацией на обычных формах 1С. Основные моменты, которые стоит запомнить:

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

← На главную