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