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