ПриПолученииДанныхНаСервере + Контекст формы. Лайфхак

13.08.21

Разработка - Механизмы платформы 1С

Передать свои произвольные данные в событие, которое "без контекста"? Легко!

Есть в распоряжении разработчика с некоторых пор хорошее событие динамического списка, ПриПолученииДанныхНаСервере. Про него уже много сказано и примеров приведено, и как свои поля сделать, и как условное оформление прикрутить. Но вот проблема: это событие &НаСервереБезКонтекста, и ничего про остальной контекст формы не знает (по-хорошему, это правильно, меньше тормозов и лишнего барахла). А вот как передать туда нечто из контекста формы, столь нужное для показа и оформления?

Как верно указал тов.Tormozit, можно использовать структуру "ДополнительныеСвойства", свойство настройки СКД. Но, к сожалению, мне известен ряд релизов платформы, которые благополучно игнорировали заполнение этого свойства. Для начала попробуйте его - если работает, то всё нижеизложенное уже можно и не читать.

 

В зависимости от флажка

Предположим, мы хотим показывать некоторые данные только, если на форме стоит некий флаг. Назовём его "Показывать подробности". Сразу оговорюсь, многое можно сделать, модифицируя запрос дин.списка, но - не всё. Некоторые вещи проще и даже быстрее получить в этом событии. Итак:

В тексте запроса дин.списка в самой первой строке, до основного запроса, пишем:

ВЫБРАТЬ &ПоказыватьПодробности; // не забываем точку с запятой

Теперь СКД списка знает этот параметр, и мы его можем менять. То, что запрос стал пакетным, никого уже давно не смущает.

 

В событии формы "ПриСозданииНаСервере" объявляем исходное значение этого параметра (пусть это будет Ложь):

ДинСписок.КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("ПоказыватьПодробности", Ложь);

 

Делаем сам флажок. Для события "ПриИзменении" этого флажка пишем:

&НаСервере
Процедура ПоказыватьПодробностиПриИзмененииНаСервере()
	ДинСписок.КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("ПоказыватьПодробности", ПоказыватьПодробности);
	Элементы.ТабличноеПолеДинСписка.Обновить(); // принудительно вызываем событие ПриПолученииДанных
КонецПроцедуры

&НаКлиенте
Процедура ПоказыватьПодробностиПриИзменении(Элемент)
	ПоказыватьПодробностиПриИзмененииНаСервере();
КонецПроцедуры

 

И самое главное, в событии дин.списка "ПриПолученииДанныхНаСервере" пишем:

ЗначениеПараметра = Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ПоказыватьПодробности"));
ТекущееЗначениеФлага = ?(ЗначениеПараметра = Неопределено, Ложь, ЗначениеПараметра.Значение);
Если ТекущееЗначениеФлага Тогда
    // показываем то, что нам надо
КонецЕсли;

Вуаля, в переменной "ТекущееЗначениеФлага" мы имеем данные флажка из контекста формы. Мы использовали аргумент события "Настройки", содержащий текущие настройки компоновщика дин.списка, использованные при получении предоставленной нам выборки данных.

Конечно, если флажок сохраняется между сеансами работы с формой, то придётся сделать ещё один установочный вызов параметра "ПоказыватьПодробности" в зависимости от флажка, уже когда настройки восстановлены, т.е. дёргать сервер ещё раз; но в любом случае при инициализации дин.списка, а она происходит по завершении ПриСозданииНаСервере, параметр надо как-то исходно определять.


Усложним задачу

Предположим, нам надо передать в ПриПолученииДанныхНаСервере некую коллекцию, допустим, структуру. Это делается так:

В тексте запроса дин.списка в самой первой строке, до основного запроса, пишем:

ВЫБРАТЬ &МойПараметр;

В событии формы "ПриСозданииНаСервере" объявляем исходное значение этого параметра как пустую строку. Если, конечно, структура сразу не должна оказаться в обработчике события. Так или иначе, в тот момент, когда в событии должна оказаться наша структура, следует сделать так:

// где-то на сервере
АдресВХ = ПоместитьВоВременноеХранилище(НужнаяСтруктура);
ДинСписок.КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("МойПараметр", АдресВХ);

И вызвать обновление списка. СКД воспримет этот параметр как обычную 36-символьную строку, и корректно обработает, а точнее, проигнорирует. Но получить нужное внутри события мы сможем:

ЗначениеПараметра = Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("МойПараметр"));
Если рЗначение <> Неопределено Тогда
    НужнаяСтруктура = ПолучитьИзВременногоХранилища(ЗначениеПараметра.Значение);
КонецЕсли;	

 

Обращаю внимание, что второй параметр, т.е. ключ, в функции "ПоместитьВоВременноеХранилище", позволяет управлять тем, как и сколько времени будет "жить" эта наша структура. В приведённом примере - сгинет после серверного вызова. Можно дать некий жёсткий GUID, который просто хардкодом вбить в модуль, например, тогда будет до конца сеанса. Подробности - см. в СП.

Важно: вызванное программно или из интерфейса обновление списка НЕ очищает временное хранилище, хотя и дёргает обсуждаемое нами получение данных. Видимо, "ПриПолученииДанныхНаСервере" с точки зрения 1С не совсем "неконтекстный серверный вызов из формы".

 

Кому пригодится - хорошо.

ПриПолученииДанныхНаСервере передача контекста формы динамический список настройки динамического списка

См. также

Механизмы платформы 1С Работа с интерфейсом Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Про ООП в 1С и о том, как сделать свой код более кратким и выразительным при помощи использования текучего интерфейса (fluent interface).

03.02.2025    6477    bayselonarrend    126    

59

Механизмы платформы 1С Программист Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.27 появилась возможность использовать WebSocket-клиент. Давайте посмотрим, как это все устроено и чем оно нам полезно.

14.01.2025    8438    dsdred    60    

106

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 1C:Бухгалтерия Бесплатно (free)

Эта небольшая статья - некоторого рода шпаргалка по файловым потокам: как и зачем с ними работать, какие преимущества это дает.

23.06.2024    12242    bayselonarrend    21    

162

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 1C:Бухгалтерия Бесплатно (free)

Пример использования «Сервисов интеграции» без подключения к Шине и без обменов.

13.03.2024    8133    dsdred    18    

82

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    28812    YA_418728146    33    

73
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. tormozit 7270 13.08.21 09:52 Сейчас в теме
ДинСписок.КомпоновщикНастроек.Настройки.ДополнительныеСвойства пробовал?
SagittariusA; improg; zzz14; sinichenko_alex; artbear; jONES1979; +6 Ответить
2. Yashazz 4835 13.08.21 11:50 Сейчас в теме
(1) Пробовал. Нестабильно себя ведёт - на некоторых 8.3.19 почему-то внутри события оказывалась пустая структура. И не все типы жрёт, например, хранилище значений почему-то не хотела. Не знаю, может, доведут до ума.

А вообще за напоминание спасибо, упомяну сейчас.
3. tormozit 7270 13.08.21 11:51 Сейчас в теме
(2) Зачем "типы жрать"? Помещай туда адрес временного хранилища. Это ж красивее будет чем запрос портить ради его передачи.
sinichenko_alex; Yashazz; +2 Ответить
4. Yashazz 4835 13.08.21 11:53 Сейчас в теме
(3) Это да, согласен. Впрочем, у СКД с хранилищем значений вообще сложные отношения. В отчётах как параметр отлично терпит, БСП даже навострилась там своё барахло держать, а в дин.списках обижается.
6. ntemny 62 16.08.21 10:25 Сейчас в теме
(3)У меня на 8.3.17 Настройки.ДополнительныеСвойства периодически чистые как слеза младенца становились. Так что тоже пришлось через параметр данные передавать.
7. tormozit 7270 16.08.21 14:05 Сейчас в теме
(6) Не сталкивался с таким. Похоже на какую то ошибку платформы. Есть пример для воспроизведения?
8. ntemny 62 16.08.21 16:07 Сейчас в теме
(7) . Просто на дин. список прайса кидал массив измененных цен
&НаКлиенте
СписокПрайс.КомпоновщикНастроек.Настройки.ДополнительныеСвойства.Вставить("МассивЦен",СписокЦенПрайса);
На сервере КомпоновщикНастроек.Настройки.ДополнительныеСвойства оказывался пустым.
А вот так СписокПрайс.Параметры.УстановитьЗначениеПараметра("МассивЦен",СписокЦенПрайса)
работал всегда
Только может вру про релиз. Я кажется эту фишку в 19 году еще писал на 8.3.10. Склероз.
12. Yashazz 4835 16.08.21 21:45 Сейчас в теме
(8) У меня ощущение, что эта ошибка "всплывает" в связке с каким-то набором факторов. Будто настройки СКД где-то в платформе копируются и их доп.свойства теряются, или реинициализация, или сериализация неполная... и это на нескольких релизах. Собственно, я и вообще занялся подобным извратом потому, что вменяемый способ не прокатил.

Я знаю несколько таких случаев, когда второстепенные свойства (коллекция дополнительных, или вторичные идентификаторы, или "пользовательские" добавки) теряются. Если играть с СКД в хмл и обратно, то с некоторыми моментами вообще песня. Применимость условного оформления, помню, терялась, вложенные схемы искривлялись, разрешение списка для параметра сносило... Много чего бывает.
5. SlavaKron 16.08.21 09:38 Сейчас в теме
(2)
хранилище значений почему-то не хотела.
Всё, что передается в настройки ДС, должно также иметь отображение и на клиенте.
10. Yashazz 4835 16.08.21 21:43 Сейчас в теме
(5) Тем не менее, попробуйте засунуть хранилище значений в качестве параметра СКД дин.списка. У меня на 8.3.19.1150 не прокатило.
9. AntonProgma 49 16.08.21 17:25 Сейчас в теме
Профессионализм в 1С сводится к знанию тупиков и побочных эффектов.
user608739_serg999h; RustIG; +2 Ответить
11. Yashazz 4835 16.08.21 21:44 Сейчас в теме
(9) Профессионализм везде, безотносительно инструмента, сводится к знанию тупиков, побочек и умения быстро, разумно и адекватно ситуации найти выход.
13. AntonProgma 49 16.08.21 23:24 Сейчас в теме
(11) Похоже, в поднятой теме у всех свой разумный и адекватный выход :)
14. Yashazz 4835 17.08.21 12:31 Сейчас в теме
(13) В поднятой теме, как во многих, связанных с СКД и динамическими списками, у многих слегка разные релизы платформы и слегка разные косяки в них. И, соответственно, варианты обхода этих косяков различаются.
15. AntonProgma 49 17.08.21 13:13 Сейчас в теме
(14) самая большая проблема в таких решениях - дилема. Вроде бы в среде с ректально-ориентированной архитектурой разработчики и должны были спланировать неочевидные решения. Но в то же время лазейки могут появиляться случайно по независящим от разрабов обстоятельствам, и, соответственно, могут исчезать в случайный момент.
16. behemoth96 16 01.12.21 11:12 Сейчас в теме
Держи краба. Сильно помогло.
Оставьте свое сообщение