Почему заблокирован отбор в форме выбора договора контрагента и как его изменить в 1С

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

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

Причины блокировки отборов в пользовательском режиме

Проанализируем механизм работы типовой формы выбора договора. В отличие от открытия справочника напрямую из главного меню, выбор значения из поля документа инициализирует передачу строгого контекста. Это сделано разработчиками конфигурации для защиты от учетных коллизий:

  1. Жесткая привязка к владельцу и организации. Договор в 1С всегда подчинен конкретному контрагенту и заключается с определенной организацией предприятия. Типовой механизм не позволяет выбрать договор контрагента «А» для контрагента «Б», либо договор чужой организации.
  2. Программная блокировка доступности элементов отбора. При вызове формы выбора параметры отбора передаются с признаком Доступность = Ложь (или блокируются на уровне структуры отбора). Пользователь не может снять эти флажки вручную в окне выбора.
  3. Ограничения по способам ведения взаиморасчетов и видам договоров. Для конкретных документов допускаются только определенные типы договоров. Например, в заказе покупателя не могут фигурировать договоры с поставщиками или договоры с детализацией расчетов «По счетам», если логика документа рассчитана только на взаиморасчеты «По заказам» или «По договору в целом».

Где формируется отбор при начале выбора договора

Рассмотрим, где именно в конфигурации заложена логика фильтрации. Откроем модуль формы документа ЗаказПокупателя и найдем процедуру-обработчик события поля ввода ДоговорКонтрагентаНачалоВыбора.

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


мТекущийДоговорКонтрагента = ДоговорКонтрагента;
СписокВидовДоговоров = Новый СписокЗначений;
СписокВидовДоговоров.Добавить(Перечисления.ВидыДоговоровКонтрагентов.СПокупателем);

Если ВидОперации = Перечисления.ВидыОперацийЗаказПокупателя.ПродажаКомиссия Тогда
    СписокВидовДоговоров.Добавить(Перечисления.ВидыДоговоровКонтрагентов.СКомиссионером);
КонецЕсли;

// Заказ можно оформлять по договору, взаиморасчеты по которому ведутся 
// либо по заказам, либо по договору в целом
СтруктураДополнительныхПараметров = Новый Структура();
СтруктураОтбора = Новый Структура();
СписокСпособовВеденияВзаиморасчетов = Новый СписокЗначений();
СписокСпособовВеденияВзаиморасчетов.Добавить(Перечисления.ВедениеВзаиморасчетовПоДоговорам.ПоДоговоруВЦелом);
СписокСпособовВеденияВзаиморасчетов.Добавить(Перечисления.ВедениеВзаиморасчетовПоДоговорам.ПоЗаказам);

СтруктураОтбора.Вставить("ЗначениеОтбора", СписокСпособовВеденияВзаиморасчетов);
СтруктураОтбора.Вставить("ВидСравненияОтбора", ВидСравнения.ВСписке);
СтруктураДополнительныхПараметров.Вставить("ВедениеВзаиморасчетов", СтруктураОтбора);

РаботаСДиалогами.НачалоВыбораЗначенияДоговораКонтрагента(ЭтотОбъект, ЭтаФорма, Элемент, Контрагент, ДоговорКонтрагента, СтруктураДополнительныхПараметров, СписокВидовДоговоров);

В приведенном фрагменте видно, что именно процедура РаботаСДиалогами.НачалоВыбораЗначенияДоговораКонтрагента принимает контекст документа (текущую организацию, контрагента, допустимые виды договоров и способы ведения взаиморасчетов) и открывает форму с установкой нередактируемых отборов.

Пошаговая диагностика: почему договор не отображается

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

  1. Проверяем соответствие реквизита «Организация». Откроем справочник ДоговорыКонтрагентов напрямую через меню программы. Убедимся, что организация в карточке договора в точности совпадает с организацией, выбранной в шапке документа.
  2. Проверяем реквизит «Ведение взаиморасчетов». Если в договоре указан вариант «По счетам» или «По документам расчетов», типовой заказ покупателя не отобразит его из-за отбора СписокСпособовВеденияВзаиморасчетов.
  3. Проверяем реквизит «Вид договора». Для документов реализации и заказов покупателя подходят только виды СПокупателем (или СКомиссионером при комиссии). Договоры с видом Прочее или СПоставщиком автоматически отсекаются.
  4. Проверяем пометку на удаление. Удаленные договоры исключаются из стандартного выбора по умолчанию.

Варианты программной корректировки отбора

Если бизнес-логика предприятия требует расширить список доступных для выбора договоров, рассмотрим возможные пути решения.

Способ 1. Расширение списка доступных способов взаиморасчетов

Если требуется разрешить выбор договоров с другими способами ведения расчетов, скорректируем заполнение списка в процедуре ДоговорКонтрагентаНачалоВыбора:


// Добавляем дополнительный способ ведения взаиморасчетов в список
СписокСпособовВеденияВзаиморасчетов.Добавить(Перечисления.ВедениеВзаиморасчетовПоДоговорам.ПоСчетам);

Способ 2. Полное отключение дополнительного фильтра по взаиморасчетам

Если ограничение по взаиморасчетам не требуется вовсе, можно не передавать структуру фильтрации по этому реквизиту в процедуру общего модуля:


// Очищаем или не заполняем структуру дополнительных параметров
СтруктураДополнительныхПараметров = Новый Структура();

РаботаСДиалогами.НачалоВыбораЗначенияДоговораКонтрагента(
    ЭтотОбъект, 
    ЭтаФорма, 
    Элемент, 
    Контрагент, 
    ДоговорКонтрагента, 
    СтруктураДополнительныхПараметров, 
    СписокВидовДоговоров
);

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

← На главную