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