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