0. SeiOkami 1460 17.04.20 19:24 Сейчас в теме

Серверные вызовы, которые нельзя вызывать

Не баян, а классика. Рассмотрим особенность платформы настолько же древнюю, как сами УФ.

Перейти к публикации

Комментарии
Избранное Подписка Сортировка: Древо развёрнутое
Свернуть все
1. Rustig 1414 12.05.20 09:12 Сейчас в теме
(0) интересное исследование. спасибо.
"Меньше копипаста!", или как Вася универсальную процедуру писал

хочу спросить про старую публикацию: Вася в конце концов дописал свою универсальную процедуру или нет?
gubanoff; +1 Ответить
2. SeiOkami 1460 12.05.20 09:14 Сейчас в теме
(1) Да, там в самом конце есть спойлер с "Окончательная Васина процедура"
adhocprog; +1 Ответить
3. Darklight 22 12.05.20 09:52 Сейчас в теме
Отличная статья на малоизвестную тему ситуации, с которой легко столкнуться,но очень трудно понять в чём дело и открыть правильный раздел в синтаксис помощнике! Я, вот, сталкивался с такой проблемой, но как-то не задумывался в её причинах и не удосужился об этом прочитать в синтаксис помощнике.
ТЕПЕРЬ БУДУ ЗНАТЬ!
Статья МАСТ РИД всем!
Решал ранее переменной флагом мТакоеТоСобытиеВызвано - когда обработчик вызывался первый раз - флаг выставлял и выполнял серверный вызов - когда второй раз - сбрасывал флаг и выходил из обработчика.
Кстати в статье тут единственное место - к чему я бы придрался - плохо описано в п.3 применение переменной "ТекущаяСтрока" - надо было указать что это глобальная переменная моудля формы (или реквизит формы) и если это переменная то правильно было назвать её с префиксом м "мТекущаяСтрока" - но это мелочи.

Вот бы ещё проблему ошибки "Неизвестный идентификатор формы" побороть, когда после некоторых серверных вызовов при очередном серверном вызове возникает такая ошибка (встречал частенько в разных управляемых формах)
Вот этот, последний, случай возникает при применении общей типовой формы отчета в ЗУП 3.1 во внешнем отчёта (сначала формирую отчет с одним вариантом, а затем переключаю на другой - и ошибка):

Неизвестный идентификатор формы
{ОбщаяФорма.ФормаОтчета.Форма(886)}: ЗагрузитьВариант(ВариантФормы.КлючВарианта);

по причине:
Неизвестный идентификатор формы


Повторное формирование отчета уже закрывает форму с ошибкой

Информация для технической поддержки



Причём когда сделал свою форму с таким вот обработчиков формирования (из общей формы)

&НаКлиенте
Процедура Сформировать()
	ВыполнятьЗамеры = НастройкиОтчета.ВыполнятьЗамеры И ЗначениеЗаполнено(НастройкиОтчета.КлючЗамеров);
	Если ВыполнятьЗамеры Тогда
		Комментарий = НастройкиОтчета.ПрефиксЗамеров + "; " + НСтр("ru = 'Непосредственно:'") + " " + Строка(Непосредственно);
		МодульОценкаПроизводительностиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОценкаПроизводительностиКлиент");
		ИдентификаторЗамера = МодульОценкаПроизводительностиКлиент.ЗамерВремени(
			НастройкиОтчета.КлючЗамеров + ".Формирование",
			Ложь, Ложь);
		МодульОценкаПроизводительностиКлиент.УстановитьКомментарийЗамера(ИдентификаторЗамера, Комментарий);
	КонецЕсли;
	
	Результат = РезультатФормированияОтчета(ФормированиеПриОткрытии, НастройкиОтчета.Внешний Или НастройкиОтчета.Безопасный);
	Если Результат = Неопределено Тогда 
		Возврат;
	КонецЕсли;
	
	Если Результат.Статус <> "Выполняется" Тогда 
		ПослеФормирования(Результат, Ложь);
		Возврат;
	КонецЕсли;
	
	Обработчик = Новый ОписаниеОповещения("ПослеФормирования", ЭтотОбъект, Истина);
	ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
	ПараметрыОжидания.ВыводитьОкноОжидания = Ложь;
	
	ДлительныеОперацииКлиент.ОжидатьЗавершение(Результат, Обработчик, ПараметрыОжидания);
КонецПроцедуры
Показать


Проблема сохоранилась (и кстати, обработчики объекта отчета "ПриКомрпоновкеРезультат" вообще не запускался.

Решил только переходом на классическое формирование отчета через встроенную команду формы "Сформировать" (ну или через программный вызов метода формирования у формы).

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

Конечно - это может быть другая проблема не правильной работы в управляемых формах, достойная отдельной статьи, а может быть и следствием проблемы не правильного вызова обработчиков событий. Но тогда как она проявляется в типовой общей форме, ведь я в ней ничего не трогал, а просто применил в своё внешнем отчёте (причём неявно - просто как форму по умолчанию)
SeiOkami; +1 Ответить
4. SeiOkami 1460 12.05.20 10:15 Сейчас в теме
(3)

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


Да, натыкался на этот баг. Даже где-то себе сохранил заметку с небольшим исследованием. Нужно будет вернуться и разобраться в ситуации подробнее. Спасибо за наводку 👍
7. Darklight 22 12.05.20 17:34 Сейчас в теме
(4)Кстати в том же (уже "исправленном" отчёте) у меня ещё периодически и такая ошибка "Ошибка создания источника доступных настроек компоновки данных" возникает (при повторной компоновке отчёта - тестировал на копии, на рабочей серверной базе то же самое) при повторном формировании отчета (после того как открываю типовую форму настроек отчета):
Информация для технического специалиста

И сеанс закрывается!
Перед этим ещё и слетает настройка параметров отчета СКД.
Что-то со значением параметра - я в список добавил значение перечисления
8. Darklight 22 13.05.20 18:35 Сейчас в теме
(7)Всё стало ещё хуже.
Во-первых, эта ошибка проявляется только из под отладки
Во-вторых, я взял предыдущую версию отчета (где проблемы нет) - сохранил её в отдельный файл (без изменений) и в нём эта проблема ПОЯВИЛАСЬ!
Причём пробовал на нескольких релизах - последний, который удалось скачать 8.3.16.1224 для windows - та же фигня (достаточно один раз сформировать отчёт из формы настроек, при повторном формировании - ошибка):

Платформа: 1С:Предприятие 8.3 (8.3.16.1224)
Конфигурация: Зарплата и управление персоналом, редакция 3.1 (3.1.13.146) (http://v8.1c.ru/hrm/)
Copyright © ООО "1С-Софт", 2010 - 2020. Все права защищены
(http://www.1c.ru)
Режим: Файловый (без сжатия)
Приложение: Тонкий клиент
Локализация: Информационная база: русский (Россия), Сеанс: русский
Вариант интерфейса: Такси

Ошибки:
--------------------------------------------------------------------------------
13.05.2020 18:33:46
Ошибка создания источника доступных настроек компоновки данных
397873d4-1833-4fd3-a7cf-29c08d162916


И настройки СКД слетают


(кстати, а что там с релизами - скачивая архивы с более поздними релизами получают какую-то лабуду внутри архивов - какие-то JAVA пакеты утилиты Ring, причём архивы дистрибутивов весят по пол гига, а 7zip показывает что внутри всего 12 мегабайт)!
10. Darklight 22 14.05.20 17:40 Сейчас в теме
(8)С дистрибутивом 1С разобрался - оказалось 1С сменил версию архиватора RAR с 2.9 на 5.0, а я распаковывал старой версией 7zip - обновил его - и всё нормально распаковалось - соответственно - попробовал последний (на текущий момент) релиз платформы 1С 8.3.17.1386 - проблема осталась.
Заодно понял что проблема связана была с тем, что при возврате из типовой формы настроек в типовую (копию) форму отчёта запускался встроенный в неё алгоритм формирования отчёта

Процедура Сформировать()


- а он, по непонятным пока мне причинам, выводит мой отчёт из строя.
Поэтому заменил его вот таким кодом (вызываю из начала вышеназванной процедуры и выхожу из неё)

Процедура СформироватьСервер()


Но не могу понять почему работает предыдущая версия отчёта! И почему она перестаёт работать если её просто сохранить в новый файл.
Могут только предположить, что тут что-то связано с системой учета вариантов отчётов в БСП. В отчёте есть два встроенных варианта (иные не используются), правда в отчёте есть алгоритм, запускаемый после загрузки варианта, на севере, меняющий в нём настройки параметров на фиксированные. Но при закрытии окна настроек (сохранить и сформировать) этот алгоритм не запускается.
Не могу понять - что такого трансендентного у меня в отчёте сделано!
13. FlyVodolaz 21.05.20 19:12 Сейчас в теме
(8) Если это форма внешнего отчета/обработки то серверная часть 1С, при отсутствии серверных вызовов какое-то время, может "забыть" эту форму. Соответственно и адрес во временном хранилище становится недействительным. Но из-за этого не только теряются данные во временном хранилище. Но и любой серверный вызов приведет к ошибке идентификатора формы. Попробуйте нечто такое добавить:
&НаКлиенте
Процедура Пинг()
	ПингСервер();
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ПингСервер()
	Жив=Истина;
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	ПодключитьОбработчикОжидания("Пинг", 60, Ложь);
КонецПроцедуры
Показать
14. Darklight 22 21.05.20 22:45 Сейчас в теме
(13)Да внешний отчёт. Но в остальном - не вариант - ошибка стабильна - срабатывает сразу как открыть отчёт и выполнить в нём вышеназванный код (первый раз он отрабатывает хорошо - ну а потом любые серверные вызовы приводят к указанной ошибке). Причём есть работающая версия отчёта (где как ни странно этот типовой код в типовой форме работает) - ничего в нём не трогаю - просто сохраняют его из конфигуратора повторно - и всё - больше он не работает!
15. SeiOkami 1460 22.05.20 06:40 Сейчас в теме
(14) а если сохранить отчёт как внешний, проверить его "сломанность", а потом поместить его же в конфу?
Дело ли в том, что падает именно будучи внешним?
23. Darklight 22 22.05.20 17:01 Сейчас в теме
(15)Вставил отчёт в конфигурацию - обновил вспомогательные данные - запустил - проблемы нет :-|
Правда перед этим ещё рабочая старая копия, таки, тоже перестала работать :-( хотя я её не трогал а ранее она точно работала - вообще мистика!
Предыдущая копия тоже перестала работ как внешний отчёт.
Но, будучи, вставленным в конфигурацию - отчет таких ошибок не выдаёт, варианты СКД подключились и тоже работают!
Но почему не работает внешний отчёт (именно указанный типовой код)?
Не... ну могут тоже попробовать сам что-нибудь переместить во временное хранилище и просмотреть что будет дальше с внешним отчётом и вне данного типового кода....
24. FlyVodolaz 22.05.20 17:52 Сейчас в теме
(23)
Но почему не работает внешний отчёт

Я же писал, при отсутствии серверных вызовов какое-то время, может "забыть" эту форму. Время забытия зависит от многих факторов и 1С их не документирует. Основное скорее всего наличие свободной памяти. В общем это как с повторно возвращаемыми значениями, никто не знает сколько они будут жить. В вашем случае в форме вариантов отчетов скорее всего разворачиваются настройки схемы компоновки, что достаточно затратно по памяти
26. Darklight 22 25.05.20 09:38 Сейчас в теме
(24)Уверен на 100% что дело не в этом!
Во-первых, как уже писал, проблема проявляется и под файловой базой.
Во-вторых, как уже писал, проблема проявляется только из под отладки (а сейчас уточняю - сама отладка оказалась не причём - проблема возникает только если 1С: Предприятие запускается с параметром (аргументом командной строки) "РежимОтладки" - т.е. в типовых алгоритмах формирования отчёта (см мой пост (3))) что-то отрабатывает по-разному (возможно разница в том, что в режиме "РежимОтладки" не используются фоновые задания).
В-третьих, проблема возникает только в типовом коде из поста (3), когда меняю на свой - проблемы нет
В-четвёртых, у Вас в посте (13) идёт пинг сервера каждые 60 - мне чтобы дажды сформировать отчёт хватает и 30 секунд - проблема успевают возникнуть
В-пятых, я применил Ваш код из (13) и даже уменьшил период опроса до 5 секунд - проблема ОСТАЛАСЬ!
В-шестых, памяти на компьютере у меня доффига - схема СКД не такая уж большая и данные в ней тоже занимают не много (там нет больших таблиц в параметрах и отборах)
5. -vito- 452 12.05.20 11:16 Сейчас в теме
Виталий, предлагаю включить сюда же информацию и о внешне безобидном коде
&НаКлиенте
...
ДанныеСтроки = Элементы.Список.ТекущиеДанные;


При использовании свойства ТекущиеДанные выполняется неявный серверный вызов, что может приводить к неожиданному поведению формы. В моей практике были регулярные падения клиентских процессов при выполнении такой строки кода.

Существуют как минимум 2 альтернативных способа получить данные строки списка на клиенте, без серверного вызова.

а) поиском нужной строки в таблице (реквизит)
ТекущиеДанные = КроссТаблица.НайтиПоИдентификатору(Элементы.КроссТаблица.ТекущаяСтрока);


б) методом ДанныеСтроки таблицы формы (элемент)
ТекущиеДанные = Элементы.Зарплата.ДанныеСтроки(Элементы.Зарплата.ТекущаяСтрока);
mirco; Новиков; EVKash; m.biryukov; Aletar; herfis; C0mmander_Alex; fancy; the1; Vortigaunt; adhocprog; independ; SeiOkami; nomad_irk; acanta; +15 Ответить
6. nomad_irk 49 12.05.20 11:23 Сейчас в теме
(5)Мы столкнулись с этим когда пытались понять, почему форма договоров в УХ, на которую навешаны RLS очень сильно тупит при открытии и перемещении курсора по списку договоров. Переделали через

ТекущиеДанные = КроссТаблица.НайтиПоИдентификатору(Элементы.КроссТаблица.ТекущаяСтрока);

и все стало просто летать по сравнению с тем, что было до этого.
C0mmander_Alex; asg.aleks; SeiOkami; acanta; +4 Ответить
11. herfis 363 14.05.20 18:02 Сейчас в теме
Самое для меня полезное в этой статье - это комментарий (5)
16. VZyryanov 22.05.20 09:08 Сейчас в теме
(5) Разработчики 1С не в курсе, что ТекущиеДанные плохо использовать на клиенте.
В 1С:Бухгалтерия 3.0 Элементы.Список.ТекущиеДанные на клиенте вызывается в куче мест, например, ОбщаяФорма.НалогиИОтчеты.Форма.Модуль
&НаКлиенте
Процедура ВопросПередСменойОрганизации
17. -vito- 452 22.05.20 10:40 Сейчас в теме
(16) Владимир, разработчики 1С - такие же люди, как и мы с Вами. Разработчики Платформы - тоже. Мир не идеален.
Никто из нас с этим "сакральным знанием" не родился. Когда у меня падали клиентские процессы, разобраться в причине помог отдел ЦКТП 1С. В большинстве случаев этот код работает нормально. Но при каких-то условиях "что-то идет не так".
18. SeiOkami 1460 22.05.20 10:41 Сейчас в теме
(17) а не помните, как можно воспроизвести ситуацию?
Хочу провести эксперименты
19. -vito- 452 22.05.20 12:44 Сейчас в теме
(18)
а не помните, как можно воспроизвести ситуацию?

Виталий, не было выявлено каких-то явных особенностей, которые позволили бы воспроизвести проблему.
Код был в Процедуре ПриАктивацииСтроки()
стрПлатежнаяЗаявка = Элементы.Список.ТекущиеДанные;'

У нескольких пользователей (из общего числа около 1000), аварийно завершались клиентские процессы десятки раз в день. Воспроизвести ситуацию не удавалось. Отправлял дампы упавших процессов в ЦКТП 1С.
20. Дмитрий74Чел 188 22.05.20 12:51 Сейчас в теме
(17), (18) у меня не получается воспроизвести. Создал внешнюю обработку с дин.списком. В ПриАктивизацииСтроки() указал лДанные = Элементы.Список.ТекущиеДанные;
И никаких серверных вызовов в замере производительности или счетчике вызовов.
8.3.15.1830
21. SeiOkami 1460 22.05.20 13:15 Сейчас в теме
(20) да, в нормальной ситуации нет вызовов. И в СП про это ни слова.
Но, догадываюсь, что это какой-то определенный волшебный случай. Хочется найти способ имитировать проблему...
28. -vito- 452 27.05.20 17:37 Сейчас в теме
(21) Кто-то у меня пытался спросить откуда информация о неявном серверном вызове, но удалил комментарий.
Всё же отвечу:
Информация из переписки с сотрудниками ЦКТП 1С при расследовании инцидента.
Цитата из письма:
К падению приводит работа вот этого кода:
вызываемого из подписки на событие ПриАктивизацииСтроки()
стрПлатежнаяЗаявка = Элементы.Список.ТекущиеДанные;'
Код небезопасен тк делает неявные серверные вызовы в Элементы.Список.ТекущиеДанные.

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

Платформа, на которой проявлялась проблема - 8.3.10.2561. На других не проверял.
22. VZyryanov 22.05.20 13:50 Сейчас в теме
(17) Типовая БП 3.0.70.52, глобальный поиск по модулям. Найдено:
.ТекущиеДанные - 14575
Элементы.Список.ТекущиеДанные - 380
.НайтиПоИдентификатору( - 834
.ДанныеСтроки( - 103

1С использует все 3 способа получения данных строки. ТекущиеДанные используется, похоже, чаще других способов.
Возможно, есть ошибка платформы. Поэтому я буду стараться обходиться без использования ТекущиеДанные.
9. dhurricane 13.05.20 19:58 Сейчас в теме
Спасибо за исследовательскую работу. Порой для юных специалистов аргумент "в СП указан явный запрет" как таковым аргументом не является. "У меня же работает." Благодаря Вам теперь у меня есть и способы воспроизведения возможных проблем.
12. unichkin 1248 17.05.20 23:26 Сейчас в теме
Если ПриАктивизации.. необходим вызов сервера, надо ставить условие на наличие данных, защиту от повторного вызова, и подключать обработчик ожидания. Имхо, это можно уже назвать классическим решением)
25. olegarch 6 23.05.20 18:52 Сейчас в теме
Есть демонический список Реквизит1. Есть обработчик активизации строки.
Вроде как разрешенная штука:

&НаСервереБезКонтекста
Процедура Реквизит1ПриАктивизацииСтрокиНаСервере()
	// Вставить содержимое обработчика.
КонецПроцедуры

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


Тем не менее, как минимум на 8.3.12..8.3.14 вызов Реквизит1ПриАктивизацииСтрокиНаСервере() поломает множественный выбор строк.
Точнее, выделить-то можно будет, а вот отменить выбор одной строки...
27. Albert_2008 26.05.20 12:57 Сейчас в теме
Спасибо за исследование. "3. Запоминаем обработанную строку" - запомню, когда нибудь попробую.
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Программист 1С
Новороссийск
зарплата от 70 000 руб.
Полный день

Ведущий программист 1С
Санкт-Петербург
зарплата от 130 000 руб.
Полный день

Специалист 1 категории (Программист 1С ФЗД)
Фрязино
зарплата от 110 000 руб.
Полный день

Специалист 1 категории (Программист 1С)
Фрязино
зарплата от 110 000 руб.
Полный день

Автор новостных обзоров на тему 1С и бухучета
Санкт-Петербург
По совместительству