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