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