Справочник «Контрагенты»: как убрать автоматический отбор «Покупатель» при открытии формы выбора в отчете СКД?

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

При разработке собственных отчетов на базе Системы компоновки данных (СКД) в конфигурации «1С:Управление нашей фирмой» (УНФ) разработчики часто сталкиваются с ситуацией, когда платформа ведет себя слишком «умно». Одной из таких проблем является автоматическое наложение отбора Покупатель = Истина в форме выбора справочника Контрагенты, даже если в настройках отчета такой отбор не задавался. Рассмотрим детально, почему это происходит и как мы можем управлять этим поведением.

Разберем причину: магия метаданных и наследование свойств

Первым делом проанализируем ситуацию. Когда мы строим запрос в СКД и обращаемся к данным через точку, например, ОплатаДокументовОбороты.Документ.Контрагент, система 1С включает механизм получения свойств реквизита из метаданных первичного объекта. Выясним, почему это критично для нашего случая.

В конфигурации УНФ поле Документ в регистрах накопления (таких как ОплатаДокументов) является составным типом, включающим в себя Заказ покупателя, Расходная накладная, Приходная накладная и другие. У каждого из этих документов есть реквизит Контрагент. Если мы откроем свойства реквизита Контрагент в документе Расходная накладная, то увидим в строке «Параметры выбора» жестко заданную настройку: Отбор.Покупатель(Истина).

Система компоновки данных при формировании формы выбора видит путь к полю через конкретный документ и «заботливо» подтягивает эти ограничения в форму выбора справочника. Именно поэтому, даже если вы создали свою пустую форму выбора, платформа передает в нее параметры открытия с уже заполненной структурой отбора.

Решение 1: Переопределение параметров выбора в схеме СКД

Посмотрим на самый правильный и «чистый» способ исправления ситуации непосредственно в конструкторе Схемы компоновки данных. Нам не нужно менять программный код, достаточно изменить настройки поля в наборе данных.

  1. Откроем Схему компоновки данных вашего отчета.
  2. Перейдем на закладку «Наборы данных».
  3. Найдем в списке полей наше поле Контрагент.
  4. Обратим внимание на колонку «Параметры выбора». По умолчанию там пусто, но именно здесь мы можем перекрыть настройки, приходящие из метаданных документов.
  5. Нажмем на кнопку выбора в этой колонке и добавим новый параметр. В колонке «Имя параметра» укажем Отбор.Покупатель, а значение оставим пустым или снимем галочку, если это возможно.

Таким образом, мы явно говорим системе: «Игнорируй то, что написано в документах-регистраторах, и используй мои настройки для этого поля в контексте данного отчета».

Решение 2: Использование типизации в тексте запроса

Проанализируем другой подход. Если платформа подтягивает свойства из-за обращения к составному типу Документ, мы можем попробовать «разорвать» эту связь или сделать её более явной. Рассмотрим использование функции ВЫРАЗИТЬ.

Если в вашем отчете допустимо ограничить типы документов, используйте следующий прием в тексте запроса СКД:


ВЫБРАТЬ
    ВЫРАЗИТЬ(ОплатаДокументовОбороты.Документ КАК Документ.РасходнаяНакладная).Контрагент КАК Контрагент
ИЗ
    РегистрНакопления.ОплатаДокументов.Обороты КАК ОплатаДокументовОбороты

Однако помните, что если вы выразите тип как Документ.РасходнаяНакладная, то параметры выбора все равно могут подтянуться из этого документа. Для полной очистки параметров выбора иногда лучше выводить контрагента не «через точку» от документа, а напрямую из измерения регистра, если структура метаданных это позволяет:


ВЫБРАТЬ
    ОплатаДокументовОбороты.Контрагент КАК Контрагент
ИЗ
    РегистрНакопления.ОплатаДокументов.Обороты КАК ОплатаДокументовОбороты

Измерения регистра обычно не имеют жестких фильтров в параметрах выбора, в отличие от реквизитов документов.

Решение 3: Параметры редактирования на уровне поля СКД

Помимо «Параметров выбора», в СКД есть еще один мощный механизм — «Параметры редактирования». Это отдельная колонка на закладке «Наборы данных».

Рассмотрим, как это настроить:

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

Решение 4: Программная очистка в модуле отчета

Если визуальные средства СКД не помогают (что бывает при сложных взаимодействиях в УНФ через механизмы БСП), мы можем прибегнуть к программному вмешательству в модуле объекта отчета. Разберем, как перехватить формирование настроек.

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

Выясним, как это сделать в модуле формы отчета:


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

Важные замечания по конфигурации УНФ

Проанализируем особенности УНФ. Эта конфигурация активно использует Библиотеку стандартных подсистем (БСП) и функциональные опции. Если в базе включена функциональная опция «Использовать только продажи», система может на уровне общих модулей (например, УправлениеКонтактнойИнформациейУНФ) достраивать отборы для всех форм выбора контрагентов.

Также стоит проверить наличие Расширений. Если в расширении есть процедура &После("ПриСозданииНаСервере") для формы выбора справочника Контрагенты, она может принудительно устанавливать Элементы.Список.Период или Список.Отбор. Обязательно выполните глобальный поиск по конфигурации (включая расширения) по строке "Покупатель", чтобы исключить программное вмешательство.

Итог: В большинстве случаев проблема решается на уровне Схемы компоновки данных путем явного указания пустых Параметров выбора для поля. Это перекрывает «наследственность» свойств от реквизитов документов-регистраторов и позволяет пользователю выбирать любых контрагентов из справочника.

← На главную