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