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

Публикация № 1225834 12.05.20

Разработка - Практика программирования

код ПриАктивацииСтроки уф сп баг цикл ошибка

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

Встречали ли такое? Создаёшь себе событие у таблицы формы. Никого не трогаешь.

 

А тут бац - нельзя создать процедуру на сервере. Неожиданно

 

Почему? Можно, конечно, почитать в Синтаксис Помощнике... Но зачем? Опять, небось, платформа косячит! Поэтому часто разработчики пытаются её перехитрить:

Выбирают создание "на сервере без контекста"

 

и удаляют текст "БезКонтекста"

 

Платформа не ругается, проверки синтаксиса проходят. Profit!!!

В действительности же, так делать не есть хорошо и может привести к неожиданным последствиям. Вплоть до падения платформы.

Обратимся всё же к Синтаксис Помощнику:

 

Как видим, сразу пишут о том, что так делать нельзя.

Более того:

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

Что это значит? Что в ПриАктивацииСтроки() нельзя изменять Заголовок, Доступность, Подсказку и т.д. Проверить это легко:

 

Так а почему? Самый быстрый пример:

 

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

 

Как это работает? Событие ПриАктивацииСтроки изменяет свойство, которое выполняет обращение к серверу, что снова вызывает событие ПриАктивизацииСтроки. И так до бесконечности (или же до падения платформы).

А вот ещё одно интересное поведение. Допустим, в ПриАктивацииСтроки() код выпал в ошибку:

 

Если это произойдёт в клиентском методе, то всё хорошо. Пользователь закроет окошко с ошибкой и продолжит работать:

 

То же произойдёт в методе НаСервереБезКонтекста

 

Но стоит применить директиву &НаСервере, как будет интересное поведение.

 

Теперь ошибка будет повторяться бесконечно. И ничего, кроме завершения работы сеанса, не поможет пользователю избавиться от неё.

 

Вот такая незадача.

Но проблема не только в ПриАктивацииСтроки(). Есть и другие методы, например, ПередНачаломИзменения(). В каждом из таких методов будет описан соответствующий комментарий в Синтаксис Помощнике. Что будет, если нарушить его указания?

Вот такое поведение нам удалось поймать на "продуктиве".

Суть кода: ПередНачаломИзменения() код обращается на сервер, делает запрос и получает строку, которую нужно присвоить в свойство поля формы "ПодсказкаВвода".

Мы же для примера приведем упрощенную реализацию без запроса.

В нашей тестовой обработке ПередНачаломИзменения() у нас срабатывает процедура:

 

 

Далее: в обработке имеется ОбязательнаяКолонка. И, если её не заполнить, произойдёт такое:

 

Ничего не обычного, всё работает. Но! Если вдруг пользователь откроет обработку и, не кликая на таблицу, нажмёт на кнопку проверки, то произойдёт падение с записью дампа:

 

Такое необычное поведение встретилось у нас на работе в продуктивной базе в форме документа. Представляете, как были недовольны пользователи, которые периодически натыкались на падающую от записи документа платформу?)

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

 

1. Не обращаемся к серверу

Часто разработчики делают то, что им не нужно (или так, как нет нужды). Далеко не всегда нужно обращаться на сервер. И далеко не всегда нужно производить действия, которые к этому приведут. Можно пересмотреть код в таких событиях. Например, в нашей ситуации с бесконечным изменением заголовка группы формы, можно воспользоваться свойством "ПутьКДаннымЗаголовка".

Для этого добавляем строковый реквизит:

 

А в свойствах группы указываем его:

 

А в коде меняем не заголовок группы, а значение строкового реквизита:

 

Кстати, такой подход сам по себе является оптимизацией в ситуациях, когда у группы часто меняется заголовок и работает быстрее, чем менять через свойство.

2. Используем &НаСервереБезКонтекста

Чаще всего обращения к серверу в подобных событиях можно сделать &НаСервереБезКонтекста. Просто далеко не всегда разработчик задумывается об этом заранее. Нужны данные формы в методе? Можно их передать. Чаще всего этого достаточно, главное - не лениться.

3. Запоминаем обработанную строку

Если уж нет никаких вариантов и нам нужно обязательно выполнить именно серверный метод, то можно попробовать просто запомнить последнюю обработанную строку и игнорировать попытки сделать это повторно. Вот пример реализации:

Добавляет числовой реквизит формы (или общую переменную формы "ТекущаяСтрока"). И дорабатываем наш метод:

 

4. Обработчик ожидания

Можно использовать обработчик ожидания. Например, в ПриАктивацииСтроки() не выполнять серверный код напрямую, а выполнять одноразовое выполнение обработчика ожидания, в котором уже происходят нужные действия.

 

Однако, как показывает практика, не во всех ситуациях использование обработчика ожидания позволяет избежать зацикливания. Поэтому, лучше всего этот метод использовать вместе с проверкой на повторную обработку строки. А ещё лучше комбинировать все методы, чтобы добиться наиболее оптимального результата.

 

Выводы

При разработке, старайтесь внимательно читать СП\ИТС и следовать рекомендациям. Можно, конечно, следовать принципу "главное работает". А в какой-то момент столкнуться с неожиданным поведением платформы. Потому что, в описанных нами примерах, ошибки могут вылезти в самый неожиданный момент. И уже на продуктиве =)

P.S.: А вообще, раз уж описан такой запрет в СП, то почему бы не сделать его на уровне проверки синтаксиса платформы? ¯\_(-_-)_/¯

 

Понравилась статья?

Не будьте равнодушными! Поставьте лайк плюс и переходите к другим статьям:

Специальные предложения

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

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

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

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

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


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

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



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

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


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

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

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

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

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


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

И сеанс закрывается!
Перед этим ещё и слетает настройка параметров отчета СКД.
Что-то со значением параметра - я в список добавил значение перечисления
8. Darklight 27 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 27 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 27 21.05.20 22:45 Сейчас в теме
(13)Да внешний отчёт. Но в остальном - не вариант - ошибка стабильна - срабатывает сразу как открыть отчёт и выполнить в нём вышеназванный код (первый раз он отрабатывает хорошо - ну а потом любые серверные вызовы приводят к указанной ошибке). Причём есть работающая версия отчёта (где как ни странно этот типовой код в типовой форме работает) - ничего в нём не трогаю - просто сохраняют его из конфигуратора повторно - и всё - больше он не работает!
15. SeiOkami 2434 22.05.20 06:40 Сейчас в теме
(14) а если сохранить отчёт как внешний, проверить его "сломанность", а потом поместить его же в конфу?
Дело ли в том, что падает именно будучи внешним?
23. Darklight 27 22.05.20 17:01 Сейчас в теме
(15)Вставил отчёт в конфигурацию - обновил вспомогательные данные - запустил - проблемы нет :-|
Правда перед этим ещё рабочая старая копия, таки, тоже перестала работать :-( хотя я её не трогал а ранее она точно работала - вообще мистика!
Предыдущая копия тоже перестала работ как внешний отчёт.
Но, будучи, вставленным в конфигурацию - отчет таких ошибок не выдаёт, варианты СКД подключились и тоже работают!
Но почему не работает внешний отчёт (именно указанный типовой код)?
Не... ну могут тоже попробовать сам что-нибудь переместить во временное хранилище и просмотреть что будет дальше с внешним отчётом и вне данного типового кода....
24. FlyVodolaz 22.05.20 17:52 Сейчас в теме
(23)
Но почему не работает внешний отчёт

Я же писал, при отсутствии серверных вызовов какое-то время, может "забыть" эту форму. Время забытия зависит от многих факторов и 1С их не документирует. Основное скорее всего наличие свободной памяти. В общем это как с повторно возвращаемыми значениями, никто не знает сколько они будут жить. В вашем случае в форме вариантов отчетов скорее всего разворачиваются настройки схемы компоновки, что достаточно затратно по памяти
26. Darklight 27 25.05.20 09:38 Сейчас в теме
(24)Уверен на 100% что дело не в этом!
Во-первых, как уже писал, проблема проявляется и под файловой базой.
Во-вторых, как уже писал, проблема проявляется только из под отладки (а сейчас уточняю - сама отладка оказалась не причём - проблема возникает только если 1С: Предприятие запускается с параметром (аргументом командной строки) "РежимОтладки" - т.е. в типовых алгоритмах формирования отчёта (см мой пост (3))) что-то отрабатывает по-разному (возможно разница в том, что в режиме "РежимОтладки" не используются фоновые задания).
В-третьих, проблема возникает только в типовом коде из поста (3), когда меняю на свой - проблемы нет
В-четвёртых, у Вас в посте (13) идёт пинг сервера каждые 60 - мне чтобы дажды сформировать отчёт хватает и 30 секунд - проблема успевают возникнуть
В-пятых, я применил Ваш код из (13) и даже уменьшил период опроса до 5 секунд - проблема ОСТАЛАСЬ!
В-шестых, памяти на компьютере у меня доффига - схема СКД не такая уж большая и данные в ней тоже занимают не много (там нет больших таблиц в параметрах и отборах)
32. Zurfik 15.02.21 05:33 Сейчас в теме
(26)В ОбщийМодуль.ДлительныеОперации, есть такие вот интересные комментарии, может попробовать в эту сторону копать? Собственно вы об этом и написали.
// Запустить выполнение функции в фоновом задании, если это возможно.
//
// При выполнении любого из следующих условий запуск выполняется не в фоне, а сразу в основном потоке:
//  * если вызов выполняется в файловой базе во внешнем соединении (в этом режиме фоновые задания не поддерживаются);
//  * если приложение запущено в режиме отладки (параметр /C РежимОтладки) - для упрощения отладки конфигурации;
//  * если в файловой ИБ имеются активные фоновые задания - для снижения времени ожидания пользователя;
//  * если выполняется функция модуля внешней обработки или внешнего отчета.
//
// Не следует использовать эту функцию, если необходимо безусловно запускать фоновое задание.
// Может применяться совместно с функцией ДлительныеОперацииКлиент.ОжидатьЗавершение.

Показать
34. Darklight 27 17.02.21 10:24 Сейчас в теме
(32)Думаю это не причём. Этот аргумент - лишь выставляет флаг - отладки в параметрах сеанса - который проверяется при в алгоритмах БСП - и выбирает запускать фоновый процесс или напрямую (в данном случае никаких фоновых процессов не запускается - не те алгоритмы) - но ветви когда да - формально могут выполняться разные. Активных фоновых заданий так же нет
5. VKislitsin 12.05.20 11:16 Сейчас в теме
Виталий, предлагаю включить сюда же информацию и о внешне безобидном коде
&НаКлиенте
...
ДанныеСтроки = Элементы.Список.ТекущиеДанные;


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

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

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


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

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

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

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

У нескольких пользователей (из общего числа около 1000), аварийно завершались клиентские процессы десятки раз в день. Воспроизвести ситуацию не удавалось. Отправлял дампы упавших процессов в ЦКТП 1С.
20. Дмитрий74Чел 204 22.05.20 12:51 Сейчас в теме
(17), (18) у меня не получается воспроизвести. Создал внешнюю обработку с дин.списком. В ПриАктивизацииСтроки() указал лДанные = Элементы.Список.ТекущиеДанные;
И никаких серверных вызовов в замере производительности или счетчике вызовов.
8.3.15.1830
21. SeiOkami 2434 22.05.20 13:15 Сейчас в теме
(20) да, в нормальной ситуации нет вызовов. И в СП про это ни слова.
Но, догадываюсь, что это какой-то определенный волшебный случай. Хочется найти способ имитировать проблему...
28. VKislitsin 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 способа получения данных строки. ТекущиеДанные используется, похоже, чаще других способов.
Возможно, есть ошибка платформы. Поэтому я буду стараться обходиться без использования ТекущиеДанные.
29. tormozit 6411 05.09.20 09:02 Сейчас в теме
(5) Очень похоже на ОШИБКУ в платформе, либо какую то очень специфическую ситуацию. Очень важно отделять задуманное (обычно документированное) поведение платформы, которое например описано в статье, от потенциальных/признанных ошибок платформы. Потенциальные ошибки надо отправлять на v8*1c.ru. Прочитав твой пост уверен многие решили, что это задуманное проведение платформы и использовать свойство ТекущиеДанные всегда плохо и оно всегда делает серверный вызов, а все, кто его используют, плохие программисты =). Но в документации про серверный вызов не написано. На ИТС например везде считается, что серверного вызова при этом не происходит. Например тут https://its.1c.ru/db/v8std/content/487/hdoc
Тогда проверка на клиенте выполняется без дополнительного серверного вызова и имеет вид:
    ТекущаяСтрока = Элемент.ТекущиеДанные; 
    Если ТекущаяСтрока.ЭтоГруппа Тогда
      Сообщение = Новый СообщениеПользователю();
      Сообщение.Текст = НСтр("ru = 'Выбор группы запрещен.'");
      Сообщение.Сообщить();
      Возврат;
    КонецЕсли;
retr0; triviumfan; zqzq; +3 Ответить
9. dhurricane 13.05.20 19:58 Сейчас в теме
Спасибо за исследовательскую работу. Порой для юных специалистов аргумент "в СП указан явный запрет" как таковым аргументом не является. "У меня же работает." Благодаря Вам теперь у меня есть и способы воспроизведения возможных проблем.
12. unichkin 1407 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. Запоминаем обработанную строку" - запомню, когда нибудь попробую.
31. SlavaKron 07.10.20 17:47 Сейчас в теме
Неявный серверный вызов может происходить, когда ДанныеФормыКоллекция заполнены на Сервере, а обращение происходит первый раз на Клиенте. Тогда данные считываются на сервере порционно, по моим наблюдениям – 1 серверный вызов на каждые 35 строк коллекции.
33. triviumfan 28 15.02.21 23:50 Сейчас в теме
Простите, но это баян. На дворе 2021 год.
Оставьте свое сообщение

См. также

Аналог PIVOT в запросе 1С (как выполнить транспонирование таблицы в запросе 1С) Промо

Практика программирования v8 Бесплатно (free)

В статье показывается простой метод реализации аналога оператора PIVOT в запросе 1С без использования соединений.

12.12.2020    4183    Eugen-S    23    

Что за ? в коде, или Секретный оператор в 1С

Практика программирования v8 Платформа 1C v8.2 Платформа 1С v8.1 1cv8.cf Бесплатно (free)

Инкремент, модуль и прочая магия, которая скрыта под символом "?"

21.10.2021    6083    SeiOkami    36    

Управление платформенными обработками (расширение для типовых)

Универсальные обработки v8 1cv8.cf Абонемент ($m)

Расширение использует недокументированную возможность для управления платформенными обработками. Например, чтобы подменить "Активные пользователи" или доработать "Конструктор запросов".

1 стартмани

07.10.2021    2694    5    SeiOkami    23    

Полезные примеры СКД, ч.2

Практика программирования v8 v8::СКД Бесплатно (free)

Еще несколько примеров решения задач в СКД.

06.04.2021    10323    Neti    8    

Использование классов .Net в 1С для новичков Промо

Практика программирования Разработка внешних компонент Универсальные функции v7.7 v8 Бесплатно (free)

Руководство для новичков. Написав статью http://infostart.ru/public/238584/, я понял, что многие не понимают того, что написано. Поэтому в этой статье постараюсь более подробно остановиться на азах и без кода на вражеском языке (C#)

27.01.2016    85357    Serginio    115    

Неочевидные нюансы записи управляемой формы

Практика программирования v8 v8::УФ Платформа 1C v8.2 1cv8.cf Бесплатно (free)

Разберем несколько нюансов записи управляемой формы.

02.04.2021    12222    SeiOkami    54    

Обзор полезных методов БСП 3.1.4

Практика программирования БСП (Библиотека стандартных подсистем) v8 1cv8.cf Бесплатно (free)

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

25.03.2021    38619    rayastar    51    

Звуковое управление в 1С 8.3

Практика программирования v8 1cv8.cf Бесплатно (free)

В данной статье описано создание библиотеки для звукового управления (выполнение команд голосом) для платформы 1С 8.3. Задача была поставлена так, чтобы модуль функционировал непосредственно на клиенте 1С, осуществляя управление формами, и взаимодействовал с интерфейсом.

16.03.2021    7011    velemir    33    

Serverless (Faas) в 1С. Создание и вызов Yandex Cloud Functions Промо

Универсальные функции Практика программирования v8 Бесплатно (free)

"Я не могу просто взять и скопировать код с гитхаба", "у нас 1С микросервисами окружена", "возможностей мало" - частые фразы 1С разработчиков. которым не хватает возможностей платформы в современном мире. Faas, конечно, история не новая, но нас сдерживало 152ФЗ и задержки по пингам. Для того, чтобы действительно использовать в 1С код, к примеру, на Python, надо было приложить усилия. Теперь всё намного проще - берём и используем.

28.12.2020    8717    comol    31    

Флаг "Использовать ПОЧТИ всегда", или Нюанс динамических списков

Практика программирования v8 Платформа 1C v8.2 1cv8.cf Бесплатно (free)

Небольшая пятничная история по программной работе со строкой динамического списка.

11.02.2021    5857    SeiOkami    36    

Наследование свойств элементов, или Как пользователь может сломать вашу форму

Практика программирования v8 Платформа 1C v8.2 1cv8.cf Бесплатно (free)

В 1С можно установить свойства ТолькоПросмотр, Доступность и Видимость не только на элементы формы, но и на группы элементов. Но стоит ли так делать? Оказывается, пользователь может обойти запреты, которые установлены на папку. Об этом подробнее в видео.

12.01.2021    3925    SeiOkami    25    

Доработка проведения в ERP 2.5. (Регистры накопления, Регистры сведений)

Практика программирования v8 ERP2 БУ Бесплатно (free)

Покажу точки входа для доработки "типового" проведения документов в ERP для регистров оперативного учета. Рассмотрим три основные ситуации: нужно изменить имеющееся проведение документа; нужно сделать записи в существующие регистры; нужно с нуля описать алгоритм проведения в добавленный регистр. Пример реализован на 1С:ERP Управление предприятием 2 (2.5.4.120)

10.01.2021    10493    BuriyLesha    10    

Использование программных перечислений, ч.1: строковые константы Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

Часто ли у вас возникает необходимость в коде выполнять сравнение на строку?

10.12.2016    40976    unichkin    74    

Сервис регистрации ошибок 1С (пример создания)

Практика программирования v8 1cv8.cf Бесплатно (free)

Разработаем вместе простой сервис регистрации ошибок для 1С на самой 1С =)

13.10.2020    6255    SeiOkami    26    

Множественные клики [Полтергейсты 1С]

Практика программирования v8 1cv8.cf Бесплатно (free)

Что будет, если нажимать на кнопки в Предприятии в момент выполнения кода? А если в отладке? Оказывается, 1С в отладке в ожидании запоминает нажатые кнопки, а потом выполняет их поочерёдно...

25.09.2020    1651    SeiOkami    6    

Базовые вещи БСП, которые облегчат жизнь программисту 1С

Практика программирования БСП (Библиотека стандартных подсистем) v8 1cv8.cf Россия Бесплатно (free)

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

30.08.2020    19752    quazare    34    

Вспомогательные инструкции в коде 1С Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

Помогаем редактору кода 1С помогать нам писать и анализировать код.

15.10.2018    35933    tormozit    106    

Новое отображение ошибок в 1С

Практика программирования v8 1cv8.cf Бесплатно (free)

Рассмотрим развитие механизма отображения ошибок в 1С (начиная с 8.3.17)

10.08.2020    17988    SeiOkami    35    

Форма выбора (подбор) в управляемых формах

Практика программирования v8 v8::УФ 1cv8.cf Россия Бесплатно (free)

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

08.05.2020    74906    user5300    19    

Оформление и рефакторинг сложных логических выражений Промо

Практика программирования v8 Россия Бесплатно (free)

В сложных логических выражениях нередко самому автору спустя какое-то время тяжело разобраться, не говоря уже о других программистах. Предлагаемая методика позволяет повысить наглядность таких выражений путем оформления в виде И-ИЛИ дерева и одновременно выполнять их рефакторинг.

20.09.2012    82714    tormozit    131    

Программная работа с настройками СКД

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Нюансы программной работы с настройками системы компоновки данных в отчетах и динамических списках. Обзор всех видов настроек компоновки. Что в каких случаях правильно применять. В качестве примера рассмотрена работа с отборами и группировками.

27.01.2020    64089    ids79    26    

[СКД] Программное создание схемы компоновки данных

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Сделаем отчет на СКД полностью программно, без использования макета "схема компоновки данных".

15.01.2020    42907    John_d    22    

Последовательности событий при проведении документа 1С. Шпаргалка + про формы + про расширения

Практика программирования v8 Россия Бесплатно (free)

Собрал информацию о событиях/подписках/расширениях в одном месте.

30.12.2019    34526    kuzyara    38    

Запись значения в поле ввода/формы со срабатыванием события ПриИзменении Промо

Практика программирования v8 1cv8.cf Россия Бесплатно (free)

Иногда возникает необходимость после записи значения в какое либо поле ввода/формы вызвать для него обработчик события ПриИзменении, а о вызове самого события приходится только мечтать. В этой статье приводится программный способ вызова этого события.

11.07.2007    54192    tormozit    51    

30 задач. Странных и не очень

Практика программирования v8 Бесплатно (free)

30 задач на знание языка программирования 1С и некоторого поведения платформы. Маленьких. Странных и не очень.

02.12.2019    23935    YPermitin    62    

Как передать IP адрес, который вызвал HTTP запрос в 1C (для веб-сервера Apache)

Практика программирования v8 Бесплатно (free)

Столкнулся с задачей получения IP адреса, который вызывает http сервис 1С. Итак, решение:

22.11.2019    12163    Sibars    19    

Полезные процедуры и функции для программиста

Практика программирования Универсальные функции v8 1cv8.cf Россия Бесплатно (free)

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

07.10.2019    39346    HostHost    41    

Как сделать из &НаКлиентеНаСервереБезКонтекста почти &НаКлиентеНаСервере Промо

Практика программирования v8 1cv8.cf Россия Бесплатно (free)

Как сделать метод формы, доступный на клиенте и на сервере одновременно, и сохранить при этом удобство разработки

10.09.2017    50951    tormozit    74    

Таблица значений. Нюансы

Практика программирования v8 Бесплатно (free)

Обзор некоторых аспектов использования общеизвестного инструмента 1С.

01.10.2019    52274    Yashazz    56    

О программе Postman для тестирования API и для чего она нужна 1С-нику

Практика программирования Программное обеспечение (software) v8 Бесплатно (free)

Для чего нужна программа Postman для тестирования API и какая от него польза для 1С-программиста.

24.09.2019    19819    budidich    31    

Оповещения боту из 1С за 31 минуту

Практика программирования Интеграция v8::УФ 1cv8.cf Бесплатно (free)

Поделюсь опытом, как быстро сделать бота с оповещениями в Телеграмм из 1С без лишних затрат.

18.09.2019    20053    feva    44    

Выгрузка документа по условию Промо

Практика программирования Разработка v8 Бесплатно (free)

Что делать, если документы нужно выгружать не все подряд, а по какому-то фильтру: статусу, дате, набору условий... А что если он соответствовал этим условиям, а потом перестал? А если потом опять начал? Такие ситуации заставили попотеть не одного программиста.

25.04.2019    17942    m-rv    3    

[Шпаргалка] Программное создание элементов формы

Практика программирования Работа с интерфейсом v8 1cv8.cf Бесплатно (free)

Программное создание практически всех популярных элементов формы.

06.09.2019    99756    rpgshnik    75    

Агрегатные функции СКД, о которых мало кто знает

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Пользуетесь ли Вы всеми возможными агрегатными функциями, которые предоставляет система компоновки данных? Если Вы используете только: СУММА, КОЛИЧЕСТВО, МИНИМУМ, МАКСИМУМ, СРЕДНЕЕ, то эта статья для Вас.

05.09.2019    76499    ids79    56    

Регистры бухгалтерии. Общая информация

Практика программирования Математика и алгоритмы v8 v8::БУ БУ Бесплатно (free)

Общая информация о внутреннем устройстве регистров бухгалтерии.

05.09.2019    45904    YPermitin    25    

Как прикрутить ГУИД к регистру сведений Промо

Практика программирования Перенос данных из 1C8 в 1C8 Разработка v8 Бесплатно (free)

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

16.04.2019    23239    m-rv    18    

Три костыля. Сказ про фокусы в коде

Практика программирования v8 Бесплатно (free)

Три интересных (или странных) костыля в коде, которые могут помочь в повседневных и не очень задачах.

03.09.2019    30069    YPermitin    81    

Отслеживание выполнения фонового задания

Практика программирования Универсальные функции Разработка v8 1cv8.cf Бесплатно (free)

Запуск фонового задания из модуля внешней обработки. Отслеживание выполнения задания в виде прогресса, расположенного на форме.

17.08.2019    44754    ids79    22    

Функции СКД: ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Подробное описание и использование внутренних функций системы компоновки данных: Вычислить, ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив, ВычислитьВыражениеСГруппировкойТаблицаЗначений.

08.08.2019    149057    ids79    75    

Как сделать запрос на изменение данных Промо

Практика программирования v8 v8::Запросы 1cv8.cf Бесплатно (free)

В статье приведены особенности внутренней архитектуры и примеры работы с расширением языка запросов 1С.

01.06.2018    36684    m-rv    23    

Фоновое выполнение кода в 1С - это просто

Практика программирования v8 1cv8.cf Бесплатно (free)

Как легко запускать выполнение в фоне, не прибегая к долгому описанию фоновых процедур.

02.08.2019    59741    avalakh    26    

Разбираемся с параметрами редактирования СКД

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Связь по типу, Параметры выбора, Связи параметров выбора

31.07.2019    41105    json    17    

СКД - наборы данных и связи между ними, создание собственной иерархии, вложенные отчеты

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Набор данных объект. Использование в схеме компоновки нескольких наборов данных. Различные варианты связи наборов: объединение, соединение. Использование иерархии в отчетах на СКД. Создание собственной иерархии, иерархия детальных записей. Использование вложенных схем в отчетах на СКД.

26.07.2019    103798    ids79    16    

Метод формирования движений в типовых регистрах нетиповыми регистраторами Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

Вариант решения задач с проведением по типовым регистрам нетиповыми регистраторами. Зачем - чтобы при сравнении конфигурации не обращать внимание на свойства регистров и исключить вероятность допущения горькой оплошности при обновлении информационных баз, заменив типы регистраторов основной конфигурации типами конфигурации поставщика. Для программных продуктов, имеющих в своем составе метаданных документ "Корректировка регистров"("Корректировка записей регистров").

05.12.2017    30712    itriot11    34    

СКД - использование расширений языка запросов, секция ХАРАКТЕРИСТИКИ

Инструментарий разработчика Практика программирования v8 v8::СКД Бесплатно (free)

Автоматическое и не автоматическое заполнение полей компоновки данных. Использование расширений языка запросов для СКД «{…}», секция ВЫБРАТЬ, секция ГДЕ, параметры виртуальных таблиц. Автоматизированное использование дополнительных данных в запросе: секция ХАРАКТЕРИСТИКИ.

17.07.2019    47940    ids79    27    

Регистры сведений. За кулисами

Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

Небольшие заметки по внутреннему устройству регистров сведений.

09.07.2019    33622    YPermitin    14    

"Меньше копипаста!", или как Вася универсальную процедуру писал

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Программист Вася разбирает подход создания универсальных методов на примере программного вывода СКД.

04.07.2019    22460    SeiOkami    53    

Работа с настройками системы компоновки данных

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Варианты отчетов, работа с настройками вариантов: структура группировок, поля отчета, отборы, сортировка, условное оформление, другие настройки, настройки отображения диаграмм.

02.07.2019    82936    ids79    18    

Создание отчетов с помощью СКД - основные понятия и элементы

Практика программирования Математика и алгоритмы v8 v8::СКД Бесплатно (free)

Основные принципы работы СКД. Понятия схемы компоновки и макета компоновки. Описание основных элементов схемы компоновки: наборы данных, поля, вычисляемые поля, ресурсы, параметры.

25.06.2019    75252    ids79    28