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

13.08.21

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

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

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

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

 

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

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

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

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

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

 

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

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

 

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

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

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

 

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

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

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

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


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

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

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

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

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

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

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

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

 

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

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

 

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

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

См. также

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

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

14.01.2025    3919    dsdred    38    

80

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

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

23.06.2024    9421    bayselonarrend    20    

158

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

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

13.03.2024    6881    dsdred    18    

80

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

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

24.01.2024    21756    YA_418728146    26    

73

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

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    24981    SeiOkami    48    

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

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

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