Имя: Пароль:
1C
 
Не отрабатывает серверная процедура
0 Dmitryy1
 
01.07.24
11:23
Задача заключается в том, чтобы при нажатии на строку динСписка на форме выводило данные по этой строке в таблице значение на этой же форме. Для этого использовал событие ПриАктивизацииСТроки. Посмотрел в отладчике, серверная процедура вообще не отрабатывает.

Вот мой код:
&НаСервере
Процедура РасшФормы_СписокРасширенныйПоискНоменклатураПриАктивизацииСтрокиПослеНаСервере(ТекущаяСтрока)

ЗапросДляТЗ = Новый Запрос;
ЗапросДляТЗ.Текст =
"ВЫБРАТЬ
| ТоварыКОтгрузкеОстатки.Номенклатура КАК Номенклатура,
| ТоварыКОтгрузкеОстатки.Характеристика КАК Характеристика,
| ТоварыКОтгрузкеОстатки.Склад КАК Склад,
| ТоварыКОтгрузкеОстатки.КОтгрузкеОстаток КАК КОтгрузкеОстаток
|ПОМЕСТИТЬ ТоварыКОтгрузке
|ИЗ
| РегистрНакопления.ТоварыКОтгрузке.Остатки КАК ТоварыКОтгрузкеОстатки
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| СвободныеОстаткиОстатки.Номенклатура КАК Номенклатура,
| СвободныеОстаткиОстатки.ВНаличииОстаток КАК ВНаличииОстаток,
| СвободныеОстаткиОстатки.ВРезервеСоСкладаОстаток КАК ВРезервеСоСкладаОстаток
|ПОМЕСТИТЬ СвободныеОстатки
|ИЗ
| РегистрНакопления.СвободныеОстатки.Остатки КАК СвободныеОстаткиОстатки
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ТоварыКОтгрузке.Номенклатура КАК Номенклатура,
| ТоварыКОтгрузке.Склад КАК Склад,
| ТоварыКОтгрузке.Характеристика КАК Характеристика,
| СвободныеОстатки.ВНаличииОстаток КАК ВНаличии,
| СвободныеОстатки.ВРезервеСоСкладаОстаток КАК ВРезерве,
| ТоварыКОтгрузке.КОтгрузкеОстаток КАК Отгружается,
| СвободныеОстатки.ВНаличииОстаток - СвободныеОстатки.ВРезервеСоСкладаОстаток - ТоварыКОтгрузке.КОтгрузкеОстаток КАК Доступно
|ИЗ
| ТоварыКОтгрузке КАК ТоварыКОтгрузке
| ЛЕВОЕ СОЕДИНЕНИЕ СвободныеОстатки КАК СвободныеОстатки
| ПО ТоварыКОтгрузке.Номенклатура = СвободныеОстатки.Номенклатура
|ГДЕ
| ТоварыКОтгрузке.Номенклатура.Ссылка = &ТекущаяСтрока";

ЗапросДляТЗ.УстановитьПараметр("ТекущаяСтрока", ТекущаяСтрока.Ссылка);
РезультатДляТЗ = ЗапросДляТЗ.Выполнить().Выгрузить();
ТаблицаСтроки.Загрузить(РезультатДляТЗ);

КонецПроцедуры

&НаКлиенте
Процедура РасшФормы_СписокРасширенныйПоискНоменклатураПриАктивизацииСтрокиПосле(Элемент)

ТекущаяСтрока = Элементы.СписокРасширенныйПоискНоменклатура.ТекущаяСтрока;
Если ТекущаяСтрока = Неопределено Тогда
Возврат;
КонецЕсли;

РасшФормы_СписокРасширенныйПоискНоменклатураПриАктивизацииСтрокиПослеНаСервере(ТекущаяСтрока);
КонецПроцедуры
1 mikecool
 
01.07.24
11:26
сделай заполнение ТЗ одновременно с ДС, а потом при активизации накладывай отбор
если конечно у тебя не лям строк
2 Волшебник
 
01.07.24
11:27
(0)
у виртуальных таблиц не заданы параметры и отборы

соединение со СвободныеОстатки не учитывает Характеристику

параметр &ТекущаяСтрока имеет плохое имя
3 Волшебник
 
01.07.24
11:28
(0) Если процедура вообще не отрабатывает, то не важно, что там внутри. Удалите весь её программный код, добавьте ЗаписьЖурналаРегистрации
4 RVN
 
01.07.24
11:31
(0) Отладка на сервере включена?
5 Мультук
 
01.07.24
11:34
(0)

А какая у вас версия УТ ?

Из УТ 11.5 РегистрНакопления.СвободныеОстатки был выпилен давным-давно как "пособник мирового империализъма"


В 11.5.11.56 его точно уже нет
6 Dmitryy1
 
01.07.24
11:43
(4) Да
7 lEvGl
 
01.07.24
11:56
ПриАктивизацииСтроки на сервере? О_О
а, вызов
ну значит не вызывается, кэш мэш обновление и тд
8 1Снеговик
 
01.07.24
13:02
(0) при чем тут событие вообще "РасширенныйПоискНоменклатураПриАктивизацииСтрокиПослеНаСервере"?

Есть на клиенте ПриАктивизацииСтроки, но из нее вроде нельзя дергать вызов сервера.

Что мешает запрос по остаткам запихнуть в динамический список сразу?
9 программистище
 
01.07.24
13:39
так может не расширенный список используется, а стандартный, там 2 динамических списка по логике
10 Повелитель 1С
 
01.07.24
16:30
(0)
1. Сам процедура должна отрабатывать. Нужно проверить, что клиентская отрабатывает.

2. Так делать неправильно.
В обработчике данного события нельзя использовать серверные методы формы с директивой компиляции &НаСервере, а также изменять свойства, которые могут привести к серверному вызову.

Рекомендую ПриАктивизацииСтроки сделать вызов другой клиентской процедуры через ПодключитьОбработчикОжидания(). А в этой другой процедуре вызвать серверную.
11 AlvlSpb
 
01.07.24
19:32
(8) Да 100% так и есть
(0) Попробуй
РасшФормы_СписокСтандартныйПоискНоменклатураПриАктивизацииСтрокиПослеНаСервере(ТекущаяСтрока)
14 lEvGl
 
02.07.24
09:36
Примечание:
В обработчике данного события нельзя использовать серверные методы
формы с директивой компиляции &НаСервере, а также изменять свойства,
которые могут привести к серверному вызову.


это херь какая то
15 Web00001
 
02.07.24
13:46
(14)Стучать надо по рукам тем, кто делает серверные вызовы напрямую из процедур по событию "При активизации строки" это очень плохая практика, постоянные микрофризы при работе со списком из-за постоянных дерганий сервера. Особенно при наличии директивы "НаСервере" а не "НаСервереБезКонтекста" когда при каждом чихе, форма сериализуется, улетает на сервер, там десереализуется, выполняются нужные действия и все повторяется в обратном порядке. На время проведения всех этих процедур интрефейс замерзает. Очень мерзкие ощущения от работы с такими списками.
16 Timon1405
 
02.07.24
13:48
(14) это защита от потенциальных циклических вызовов ПриАктивизацииСтроки-Вызов Сервера-ПриАктивизацииСтроки итд
17 lEvGl
 
02.07.24
14:13
(15) та вы шо, серьезно? надо показать текущий остаток номенклатуры для выделенной позиции, что делать?
(16) так почему она не работает?
18 Timon1405
 
02.07.24
14:34
(17) статье шел 8й год, а 1сники упорно не хотели учить матчасть...
https://wonderland.v8.1c.ru/blog/obrabotka-i-oformlenie-dannykh-dinamicheskogo-spiska/
19 lEvGl
 
02.07.24
14:36
(18) вы не ответили на вопрос
20 lEvGl
 
02.07.24
14:52
?
21 Timon1405
 
02.07.24
15:08
(19) отсюда не видно почему. может ТС ее не привязал к расширяемой или другие причины, гадать про которые смысла нет, потому что само направление решения исходной задачи неверное.
22 lEvGl
 
02.07.24
15:16
(21) какой ТС, зачем ТС
вызов сервера из клиентской ПриАктивизацииСтроки вполне происходит, где же защита тогда
23 программистище
 
02.07.24
15:43
(22) защита только в описании, хочешь шагни в эту дверь, но не говори, что тебя не предупреждали
24 Повелитель 1С
 
02.07.24
16:16
(23) Ещё есть параметр запуска на вкладке Дополнительные "Проверять серверные вызовы в обработчиках событий".
Если его установить, выдаются предупреждения в таких кривых обработчиках.
25 lEvGl
 
02.07.24
17:05
(23)
защита в описании

офигенно

можно и посложней ситуацию придумать, с последствиями посерьезней, но лень. когда написано одно, происходит другое.
тем не менее, что с остатками при активизации делать? надо, если вы всё понимаете буквально, усложнить: показать спецификацию (картинка) номенклатуры с остатками и еще набором данных из 15 строк табличного документа по ней. Какой набор данных уточнять не буду, можно?
(18) это можно в бмв
26 Timon1405
 
02.07.24
17:18
(25) ПодключитьОбработчикОжидания("МояКлиентскаяПРоцедура", 0.1, Истина);
&НаКлиенте
Процедура МояКлиентскаяПроцедура()
    МояКлиентСерверБезКонтекстнаяПроцедураМодуляФормы()
или
МояПроцедура из КлиентСерверного Общего модуля
КонецПроцедуры
27 lEvGl
 
02.07.24
17:32
(26)
ПодключитьОбработчикОжидания("МояКлиентскаяПРоцедура", 0.1, Истина);
&НаКлиенте
Процедура МояКлиентскаяПроцедура()
    МояКлиентСерверБезКонтекстнаяПроцедураМодуляФормы()
или
МояПроцедура из


а это ёпырст не нагрузка на сервер? Периодически по расписанию его дергать по делу и без. 10 раз в секунду, ну что бы пользователь не заметил, как он нажал на номенклатуру и типа формирование началось по его требованию, а не самопроизвольно. Если дергать не так часто, то пользак заметит, что нажать нажал, а толку нет, значит пошел ждать и чай пить, пока оно запустится
каеф 👍
28 Волшебник
 
02.07.24
17:34
(27) третий параметр Истина означет однократный вызов, а не 10 раз в секунду.
29 lEvGl
 
02.07.24
17:49
(28) ну да, не заметил
чем это будет принципиально отличаться от ПриАктивизацииСтроки и вызова процедуры с контекстом или без него? те же тапки в профиль, что вызовешь то и получишь. как то в контексте формы не надо без необходимости вызывать вобще нигде
30 Повелитель 1С
 
02.07.24
17:48
(28) Плюсую.
(27) Если пользователь будет чай пить при активизации строки, он скоро сойдёт с ума. А всё из-за кривого запроса.
31 Повелитель 1С
 
02.07.24
17:51
(29) ПриАктивизацииСтроки запрещено делать контекстные вызовы. Обработчик ожидания выполняется отдельно от ПриАктивизацииСтроки.
Кроме того, когда пользователь быстро переключит несколько строк, такой обработчик ожидания отработает только один раз, а событие ПриАктивизацииСтроки - несколько.
32 lEvGl
 
02.07.24
17:57
(31) та..

 ПриАктивизацииСтроки запрещено делать контекстные вызовы

что это означает? кто запретил, Анищенко что ли
зы. какие шустрые у вас пользователи

А всё из-за кривого запроса.

это другой вопрос
33 Повелитель 1С
 
02.07.24
18:01
(32) Разработчики платформы запретили. В этой версии просто отрабатывает интересно. В другой версии платформы может вообще не отработать или привести к неожиданному поведению.

Особой шустроты не нужно, чтобы успеть переключить строки, пока не запустился обработчик ожидания.
34 lEvGl
 
02.07.24
18:06
(33)
Особой шустроты не нужно, чтобы успеть переключить строки, пока не запустился обработчик ожидания.

а когда он подключится вы считаете?
35 Повелитель 1С
 
02.07.24
18:15
(34) Если выставить 0.1 секунду, начнёт выполняться с минимальным интервалом после перехода в состояние покоя.
36 lEvGl
 
02.07.24
18:22
(35) когда подключать обработчик ожидания?
37 Повелитель 1С
 
02.07.24
18:29
(36)

&НаКлиенте
Процедура РасшФормы_СписокРасширенныйПоискНоменклатураПриАктивизацииСтрокиПосле(Элемент)
    ПодключитьОбработчикОжидания("МояКлиентскаяПРоцедура", 0.1, Истина);    
КонецПроцедуры
38 Timon1405
 
02.07.24
18:32
ну что непонятного?
При активизации строки -> подключить разовый обработчик-> клиентская процедура-> клиент-серверная процедура
так работают типовые. не нравится - пишите в спортлото
39 lEvGl
 
03.07.24
07:22
(38) ну я понял, что

При активизации строки -> подключить разовый обработчик-> клиентская процедура-> клиент-серверная процедура


оказывается быстрее, короче, логичнее
даст меньше серверных вызовов(почему то), как следствие меньше передач формы на сервер и вобще в целом лучше чем

активизация - серверная процедура


При этом даже если ожидание 0,1 секунды, что гарантирует мгновенное выполнение всего этого каскада. А если не 0,1, то это непригодно. Все равно лучше.
Куда катится это все

пишите в спортлото


я лучше в прозрачный и логичный код напишу, а вам судьба беспрекословно выполнять предписания известной фирмы и повторять за типовыми
это из разряда "РС отличается от справочника отсутствием ссылки", надо просто быть в теме
40 Web00001
 
03.07.24
12:40
(39)Подключение обработчика, не фризит интерфейс, выполняясь в фоне, и обновляя форму по результату вычислений это раз.
Непонятно Зачем тащить на сервер вообще весь контекст формы, когда тебе нужно оттуда только контекст активной строки это два.

Как раз переписывал за такими умниками одну сложную форму. Пока прог тестил у себя на компе, все работало нормально. Потом когда форма выкатилась в прод и с ней начали работать из разных городов а в некоторых случаях и стран, оказалось. что очень неприятно при каждом движении по ТЧ получать фриз на 1.5секунды(пока сервер был на этой же машине или в соседней комнате, все было +- хорошо), если ты работаешь не из офиса. Особенно когда привык перебирать строки стрелочками на клаве. Самое интересное, что сказал прог в свое оправдание: "Ну это 1С такая. По другому сделать нельзя". Горит прям от таких "специалистов".
41 lEvGl
 
03.07.24
13:36
(40)
Подключение обработчика, не фризит интерфейс, выполняясь в фоне, и обновляя форму по результату вычислений это раз.

вобще не фризит. хоть бы проверяли перед тем как писать

чтобы было в фоне, надо делать в фоне, ваш КЭП. Вроде:
ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(Новый УникальныйИдентификатор());
Возврат ДлительныеОперации.ВыполнитьВФоне("", ПараметрыОтчета, ПараметрыВыполнения);

а не имитацию через обработчик ожидания

Непонятно Зачем тащить на сервер вообще весь контекст формы

да ни зачем, это не обсуждается
и про "горечь от специалистов" можно опустить
42 Web00001
 
03.07.24
13:44
>вобще не фризит. хоть бы проверяли перед тем как писать
Чукча не читатель, чукча писатель, читать(40) не стал, что было кому проверить

>чтобы было в фоне, надо делать в фоне
Длительные операции, возможно. Но у меня нет длительных операций, у меня есть операции, которые не должны фризить интерфейс во время работы пользователя.

>да ни зачем, это не обсуждается
Правда? Тут просто кто-то писал, что это хня какая-то про то, что "нельзя использовать серверные методы
формы с директивой компиляции &НаСервере"
43 lEvGl
 
03.07.24
13:56
(42) вааа
ваши аргументы чушевые, не о чем с вами, давно уже уехали от этого, поэтому проехали и забыли
44 Web00001
 
04.07.24
06:11
(43)🔥
45 lEvGl
 
04.07.24
06:35
(44)🤦
46 DrZombi
 
04.07.24
08:00
(0) Внесу своё, а вот так было бы...

Смотри в (43) "ДлительныеОперации.ПараметрыВыполненияВФоне(Новый УникальныйИдентификатор())"

При активации строки запускаешь фоновое выполнение, которое на сервере что-то делает, для пользователя незаметное.
А пользователю, пока делает, пишешь - "подождите... идет процесс".
Можно еще визуально картинку в строке менять, пока грузится одна картинка, загрузилось картинка другая (или нет её)
Можно семафорить цветом... подкрашивая в зелёненькое или желтенькое.

К примеру в последних доработках в БП 3.0 наконец дописали фоновые задания так, что можно выводить проценты обработки.
Так же добавили обработчик получения результата (в разы можно играться без обработчика ожидания с опросом фонового задания "Завершилось ли оно")

В общем, непонятно, а вы в какой конфе это пишите... и какую БСП используете :)
47 DrZombi
 
04.07.24
08:02
+(46) Результат хранить во Временном хранилище, хоть в том же динамическом списке, или рядом в реквизитах формы в виде "Адреса ВХ". :)