Почему не срабатывает ОбработкаПолученияДанныхВыбора при выборе статьи расходов в 1С:ERP?

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

При конфигурировании и доработке прикладных решений на платформе 1С:Предприятие 8.3 нередко возникает задача кастомизировать список выбора элементов для конкретного реквизита. Стандартным платформенным механизмом для этого выступает событие ОбработкаПолученияДанныхВыбора, расположенное в модуле менеджера объекта. Однако при попытке настроить фильтрацию или формирование списка для статьи расходов в документе «Приобретение товаров и услуг» конфигурации «1С:ERP Управление предприятием» разработчики часто сталкиваются с тем, что точка останова в модуле менеджера не срабатывает, а платформа игнорирует добавленный алгоритм, даже если включена опция быстрого выбора.

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

Архитектурные причины: почему управление не доходит до модуля менеджера

Проанализируем сначала базовые принципы работы платформы 1С:Предприятие при получении данных выбора. Событие модуля менеджера ОбработкаПолученияДанныхВыбора предназначено для строго определенных сценариев:

  1. Формирование выпадающего списка при включенном свойстве быстрого выбора.
  2. Автоподбор значений при вводе текста по строке.
  3. Явный программный вызов метода ПолучитьДанныеВыбора().

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

В типовых конфигурациях линейки ERP для реквизитов аналитики расходов (план видов характеристик СтатьиРасходов) реализована специализированная логика. В форме документа «Приобретение товаров и услуг» на уровне элемента табличной части назначен собственный обработчик клиентского события ТоварыСтатьяРасходовНачалоВыбора.

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

Способ 1. Переопределение обработчика «НачалоВыбора» в расширении

Рассмотрим основной способ восстановления контроля над процессом выбора. Если логику требуется изменить для конкретного документа, необходимо перехватить процедуру события НачалоВыбора через механизм расширений конфигурации с использованием аннотаций &Вместо или &ИзменениеИКонтроль.

Посмотрим на пример переопределения логики в модуле формы документа с возвратом стандартной обработки, если требуется инициировать стандартный подбор:


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

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

Способ 2. Использование события «ОбработкаПолученияДанныхВыбора» на форме

Разберем альтернативный вариант, когда необходимо управлять именно выпадающим списком быстрого выбора или автоподбором непосредственно в контексте документа, не затрагивая модуль менеджера объекта метаданных.

Для этого у самого элемента формы ТоварыСтатьяРасходов создается обработчик события ОбработкаПолученияДанныхВыбора. В нем формируется индивидуальный список допустимых значений:


&НаСервере
Процедура ТоварыСтатьяРасходовОбработкаПолученияДанныхВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    
    ДанныеВыбора = Новый СписокЗначений;
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |	СтатьиРасходов.Ссылка КАК Ссылка,
        |	СтатьиРасходов.Наименование КАК Наименование
        |ИЗ
        |	ПланВидовХарактеристик.СтатьиРасходов КАК СтатьиРасходов
        |ГДЕ
        |	НЕ СтатьиРасходов.ПометкаУдаления";
        
    Выборка = Запрос.Выполнить().Выбрать();
    Пока Выборка.Следующий() Цикл
        ДанныеВыбора.Добавить(Выборка.Ссылка, Выборка.Наименование);
    КонецЦикла;
КонецПроцедуры

Проверка сопутствующих свойств реквизита и элемента формы

Проанализируем дополнительные настройки, которые могут мешать платформенному получению данных выбора, если код обработчиков формы скорректирован, но отладчик по-прежнему не заходит в модуль менеджера:

  1. Свойство «СпособВыбораЗначения» (ChoiceMode): проверьте свойство элемента формы. Если установлено значение ИзФормыВыбора, платформа принципиально не формирует выпадающий список быстрого выбора и сразу вызывает форму. Должно быть установлено значение БыстрыйВыбор или Авто.
  2. Свойство «РежимВыбораИзСписка»: если этот флаг включен, платформа не обращается к серверным механизмам менеджера, а считывает значения напрямую из коллекции СписокВыбора элемента формы.
  3. Настройки «Ввод по строке»: проверьте свойства самого плана видов характеристик в метаданных. Если для него не заданы реквизиты для ввода по строке (например, Наименование или Код), платформенный автоподбор по вводимым символам выполняться не будет.

Таким образом, ключевой причиной блокировки события в 1С:ERP является встроенный алгоритм формы ТоварыСтатьяРасходовНачалоВыбора, перехватывающий управление. Корректировка данного обработчика решает проблему получения данных выбора.

← На главную