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

13.08.21

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

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

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

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

 

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

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

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

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

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

 

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

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

 

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

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

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

 

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

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

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

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


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

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

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

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

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

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

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

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

 

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

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

 

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

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

См. также

Сервисы интеграции без Шины и интеграции

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

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

13.03.2024    2542    dsdred    16    

57

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    5842    dsdred    53    

82

Как готовить и есть массивы

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

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

24.01.2024    5824    YA_418728146    25    

67

Планы обмена VS История данных

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

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    6939    dsdred    36    

113

1С-ная магия

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

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

06.10.2023    19023    SeiOkami    46    

118

Дефрагментация и реиндексация после перехода на платформу 8.3.22

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

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    12723    human_new    27    

76

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    9359    YA_418728146    6    

143

Внешние компоненты Native API на языке Rust - Просто!

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

Внешние компоненты для 1С можно разработывать очень просто, пользуясь всеми преимуществами языка Rust - от безопасности и кроссплатформенности до удобного менеджера библиотек.

20.08.2023    6517    sebekerga    54    

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

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

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