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

Программирование - Практика программирования

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

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

В случае управляемой формы такая процедура должна быть доступна и на клиенте и на сервере и не должна делать серверных вызовов. К сожалению в модуле управляемой формы недоступна директива компиляции &НаКлиентеНаСервере, а вместо нее есть &НаКлиентеНаСервереБезКонтекста. Поэтому у этой процедуры я всегда делаю параметр ЭтаФорма и передаю в него саму форму. Таким образом в теле процедуры контекст формы будет доступен через этот параметр.

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

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

&НаКлиентеНаСервереБезКонтекста
Процедура НастроитьЭлементыФормы(ЭтаФорма)
	Элементы = ЭтаФорма.Элементы;
	Элементы.Реквизит1.Видимость = ЭтаФорма.Реквизит2;
КонецПроцедуры

Однако контекстная подсказка конфигуратора не будет понимать, что в параметре ЭтаФорма находится контекстная форма. Чтобы заставить ее думать, что там находится контекстная форма, можно применить следующую комбинацию инструкций препроцессора и директив компиляции

#Если Сервер И Не Сервер Тогда
	&НаСервере
#Иначе
	&НаКлиентеНаСервереБезКонтекста
#КонецЕсли

В итоге модуль будет выглядеть так

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

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

// Реальная директива здесь - &НаКлиентеНаСервереБезКонтекста, остальные директивы нужны для контекстной подсказки по параметру ЭтаФорма
#Если Сервер И Не Сервер Тогда
	&НаСервере
#Иначе
	&НаКлиентеНаСервереБезКонтекста
#КонецЕсли
Процедура НастроитьЭлементыФормы(ЭтаФорма)
	Элементы = ЭтаФорма.Элементы;
	Элементы.Реквизит1.Видимость = ЭтаФорма.Реквизит2;
КонецПроцедуры

См. также

Комментарии
1. Константин Гейнрих (CyberCerber) 159 10.09.17 15:54 Сейчас в теме
Да, интересно
Но можно еще проще так директиву написать:

#Если Ложь Тогда
&НаСервере
#Иначе
&НаКлиентеНаСервереБезКонтекста
#КонецЕсли;
japopov; tormozit; +2 Ответить
2. Сергей Старых (tormozit) 4487 10.09.17 16:40 Сейчас в теме
(1) Спасибо. Действительно с "#Иначе" будет смотреться лаконичнее. По поводу "#Если Ложь" сам применял раньше такой подход, но он опасный, т.к. следующие выражения эквиваленты для препроцессора:
#Если Ложь
#Если Истина
#Если Штаны
Уже давно я попросил компанию 1С считать такие выражения некорректными, чтобы снизить вероятность скрытых опечаток, но пока они не стали этого делать.
vardeg; tsukanov; +2 Ответить
3. Oleg Space (spacecraft) 10.09.17 17:13 Сейчас в теме
(2)
Уже давно я попросил компанию 1С считать такие выражения некорректными, чтобы снизить вероятность скрытых опечаток, но пока они не стали этого делать.

Похоже они таки услышали. Причем буквально.
Такой код даже не компилируются:
	
#Если ИСТИНА Тогда
	Сообщить("Истина");
#КонецЕсли
#Если Ложь Тогда
	Сообщить("Ложь");
#КонецЕсли

Зато спокойно компилируется и отрабатывает вот такой код:
#Если Не МишкаКосолапый Тогда
	Сообщить("Фигня");
#КонецЕсли

платформа еще 8.3.8
Nelli_A86; Diversus; wunderland; japopov; nvv1970; +5 Ответить
4. Сергей Старых (tormozit) 4487 10.09.17 17:22 Сейчас в теме
(3) Под "считать такие выражения некорректными" имелось ввиду, что препроцессор будет выдавать ошибки. Сейчас он их не выдает и просто считает все неизвестное равным ЛОЖЬ.
5. Oleg Space (spacecraft) 10.09.17 17:26 Сейчас в теме
(4) когда должен выдавать ошибки препроцессор?
Если выдает ошибки при сохранении. Если сохранить, то при открытии:
"Ошибка в операторе препроцессора
#Если <<?>>ИСТИНА Тогда
Пропущен оператор препроцессора Если (If)"
Это кто ошибку дает?
6. Сергей Старых (tormozit) 4487 10.09.17 20:06 Сейчас в теме
(5) Препроцессор выдает (и должен выдавать) ошибки при проверке модуля (до проверочной или боевой компиляции). Если включена опция "Проверять автоматически", то будет проверять в частности при сохранении модуля.
Dmitri93; +1 Ответить
7. Oleg Space (spacecraft) 10.09.17 20:28 Сейчас в теме
(6) ок. Еще раз.
когда должен выдавать ошибки препроцессор?
Если выдает ошибки при сохранении.

Ошибка при сохранении:

{ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Форма(5,8)}: Ошибка в операторе препроцессора
#Если <<?>>ИСТИНА Тогда (Проверка: Сервер)
{ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Форма(7,3)}: Пропущен оператор препроцессора Если (If)
#<<?>>КонецЕсли (Проверка: Сервер)
{ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Форма(5,8)}: Ошибка в операторе препроцессора
#Если <<?>>ИСТИНА Тогда (Проверка: Тонкий клиент)
{ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Форма(7,3)}: Пропущен оператор препроцессора Если (If)
#<<?>>КонецЕсли (Проверка: Тонкий клиент)
Dmitri93; tormozit; +2 Ответить
10. Сергей Старых (tormozit) 4487 11.09.17 00:10 Сейчас в теме
(7) Проверил. Ты прав. Действительно теперь препроцессор ругается именно на "истина" и "ложь". Видимо мое пожелание реализовали как то частично (только для самых популярных слов).
12. ффф ыыы (zqzq) 16 11.09.17 08:14 Сейчас в теме
(10) Видимо пожалели таких горе-программистов как я :)
чтобы такой код продолжал работать:
#Если ДляСинтаксПодсказки #Тогда
   ППП = Документы....Создать();
#КонецЕсли
16. Сергей Старых (tormozit) 4487 11.09.17 08:56 Сейчас в теме
(12) Перед "Тогда" решетка не нужна.
13. Oleg Space (spacecraft) 11.09.17 08:25 Сейчас в теме
(10) они тем самым сделали еще больше проблем.
Вот такой код будет корректен, но никогда не выполнится:
#Если Фигня Тогда
	Сообщить("Фигня");
#КонецЕсли

А если перед ним написать:
Фигня = Истина;
то конфигуратор даже не среагирует. А при попытке открыть, выбросит исключение. Ведь снова получается:
#Если Истина Тогда

Да и любые комбинации, которые дают логическое значение, так же не будут работать.
57. Андрей Овсянкин (Evil Beaver) 4341 12.09.17 18:01 Сейчас в теме
(13) Начиная не помню с какой версии, нестандартные директивы компиляции трактуются как ошибки. Т.е. "Если Фигня" писать уже нельзя. Но, возможно, это накрыто режимом совместимости, и поэтому у некоторых компилируется без ошибок.
58. Сергей Старых (tormozit) 4487 12.09.17 18:10 Сейчас в теме
(57) Это не совсем так. Смотри (10). Я написал в 1С багрепорт, чтобы это наконец сделали полностью так.
53. Павел Одинцов (Darklight) 12.09.17 13:53 Сейчас в теме
(10)Самыми популярными должны быть слова вида
#Если Север Тогда   

или так
&НаСервереНаКлиентеБезКонтекста

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

А вообще в 1С лучше бы ввели оператор как с С++ #define, чтобы можно было самому определять свои директивы (и самому же их обрабатывать), как-то так:
#Define MyOption ой, простите, - по русски:
#ОПРЕДЕЛЕНИЕ МояОпция 

...
//где-то в далёком далёком модуле в одном месте алгоритма


#ЕСЛИ МояОпция ТОГДА

//некий алгоритм, завсящий от наличия выставленной опции МояОпция

#КОНЕЦЕСЛИ
Показать


"#ОПРЕДЕЛЕНИЕ МояОпция" можно дополнить и окончанием "#ОПРЕДЕЛЕНИЕ МояОпция #КОНЕЦОПРЕДЕЛЕНИЯ"

Было бы круто! Можно было бы самостоятельно код ветвить ещё на стадии компиляции....

Хотя.... тут нужно более чётко логику прорабатывать

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

Если же делать их именно классическими сишными, т.е. определяемыми в момент компилирования - тогда встаёт вопрос - где их размещать, чтобы алгоритмы ветвления корректно отработали. Но это, в рамках логики 1С, не проблема - ведь можно же найти сначала все дефайны во всех модулях (ну или хотя бы общих модулях)- сразу их все определить и затем уже ветвить компилить алгоритмы всех модулей конфигурации (и внешних обработок/отчётов кстати тоже, но уже при их открытии-создании).

Можно и просто отдельный новый модуль завести - типа как "Модуль сеанса" (или именно его и использовать) - где можно было бы размещать такие определения директив (и нигде больше).

Кстати, можно было бы сделать и гибридный вариант - т.е. дать возможность управлять определениями программно - но только в специальном модуле - который отрабатывал бы только в момент компиляции конфигурации. Вообще - такая исполнение - ОГОНЬ было бы! Эдакий модуль первичной инициализации конфигурируемого решения!

Ну и ещё, такие определения хотелось бы вешать не только на код алгоритмов, но и на метаданные -
Добавил, например, измерение регистру, пометил его как использующее определение "МояОпция" на значение ИСТИНА - если при компиляции конфигурации оно будет определено как ИСТИНА - измерение будет добавлено в конфигурацию информационной базы. Иначе - его там не будет. Ну, а, соответствующим образом (через ветвление по этом определение), помеченные алгоритмы, сами разберутся, когда использовать это измерение, а когда не использовать.

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

Эх.... наверное никогда этого не дождёмся.... :-(


Хотя, знаете, именно сейчас, пока 1С не прикрыла работу такой лавочки
#Если МояОпция Тогда
#КонецЕсли


вполне можно было бы это всё реализовать самому - попросту прогоняя тексты модулей через свой внешний препроцессор и заменяя
#Если МояОпция Тогда
...
#КонецЕсли



на

// так, увы, уже нельзя #Если ИСТИНА Тогда
#Если Сервер ИЛИ НЕ Сервер Тогда
...
#КонецЕсли


Когда в каком-то модуле будет определно значения МояОпция = ИСТИНА
Как определить? Да хоть так
///#ОПРЕДЕЛЕНИЕ МояОпция = ИСТИНА

Формально для 1С это не исполняемый и не компилируемый текст, но свой препроцессор может вполне его правильно разобрать

Ну, аналогично можно и с метаданными конфигурации
Правда помещать пометку придётся в свойство "Комментарий", как то так
"#ЕСЛИ МояОпция=ИСТИНА #КОНЕЦЕСЛИ" без "ТОГДА" оно здесь не нужно

Ну, в общем, что-то я совсем от темы удалился....

Мне статья понравилась, узнал что такая конструкция может иметь место быть

#Если Сервер И Не Сервер Тогда
	&НаСервере
#Иначе
	&НаКлиентеНаСервереБезКонтекста
#КонецЕсли
процедура какаято()....
9. Uladzimir - (nvv1970) 10.09.17 23:23 Сейчас в теме
(1) Не прокатывает такой вариант. Ложь - не нравится. Мишка косолапый в Штанах - лучше, но не то )

(0) Раз пошла такая пьянка, то можно вообще упроститься до
#Если Сервер Или Не Сервер Тогда
//#Если Клиент Или Не Клиент Тогда <<или так
	&НаКлиентеНаСервереБезКонтекста
#КонецЕсли

Платформа будто бы говорит "ой, всё! да вот вам чертов серверный контекст и не дурите голову!", предполагая что когда-нибудь этот бред все-таки не выполнится))
11. Сергей Старых (tormozit) 4487 11.09.17 00:16 Сейчас в теме
(9) Проверил свое предположение перед его публикацией? Оно не дает контекстную подсказку.
17. Константин Гейнрих (CyberCerber) 159 11.09.17 09:20 Сейчас в теме
(9) Да, действительно плохо проверил
У меня сработал такой вариант:

#Если А Тогда 
	&НаСервере 
#Иначе 
	&НаКлиентеНаСервереБезКонтекста 
#КонецЕсли


Только минус во всех этих подходах, что подсказка работает, но только для серверных методов, т.к. была объявлена директива &НаСервере.
18. Uladzimir - (nvv1970) 11.09.17 09:44 Сейчас в теме
(11) "Какие будут ваши доказательства?" (С) ))))
Картинка
(17)
Только минус во всех этих подходах, что подсказка работает, но только для серверных методов, т.к. была объявлена директива &НаСервере.

Это важное замечание.
Объявлять &НаСервере и не обязательно. Похоже что при наличии любых условий (##) такая директива добавляется в контекстной автоматом как директива по-умолчанию. Попробовал добиться, чтобы были видны клиентские методы (например, ПодключитьОбработчикОжидания) - вообще никак не получилось при любых вариациях с наличием условия (#Если + &НаКлиенте). Только при чистом &НаКлиенте видны.
Баловство это, но все равно интересно )
19. Сергей Старых (tormozit) 4487 11.09.17 09:59 Сейчас в теме
(18)
Объявлять &НаСервере и не обязательно
Продолжаешь заблуждаться. Видимо тебе мало (11) и (17)?
20. Uladzimir - (nvv1970) 11.09.17 10:03 Сейчас в теме
(19) Не понял тебя. Заблуждаться в чем? Поясни примером.
Мои примеры "работают", все проверил... Т.е. у меня одно есть контекстная подсказка, больше ни у кого нет?
#Если Сервер Или Не Сервер Тогда
&НаКлиентеНаСервереБезКонтекста
#КонецЕсли

Такой пример дает серверную контекстную подсказку без объявления где-либо НаСервере. Отлично бесконтекстно выполняется при и при клиентском и серверном вызове.
Блин, в чем тут заблуждение????
21. Сергей Старых (tormozit) 4487 11.09.17 10:49 Сейчас в теме
(20) Возможно ты прав, но просто какие то еще влияющие инструкции не показал. Покажи полностью модуль и покажи контекстную подсказку через точку от ЭтаФорма.
22. Uladzimir - (nvv1970) 11.09.17 11:12 Сейчас в теме
(21) Наконец разобрался о чем ты пишешь...
Т.е. у меня одно есть контекстная подсказка, больше ни у кого нет?
Оказывается именно так.
Причина оказалась в версиях платформы.
Например, На 8.3.6.2390 подсказка в моем примере еще была, на актуальной 8.3.10 - уже нет.
23. Сергей Старых (tormozit) 4487 11.09.17 11:15 Сейчас в теме
(22) Думаю и про 8.3.6.2390 ты заблуждаешься. Ты показывал скрин с подсказкой по локальному контексту, а не через точку от ЭтаФорма.
25. Oleg Space (spacecraft) 11.09.17 11:22 Сейчас в теме
(23) я покажу. 1с 8.3.8
Прикрепленные файлы:
29. Сергей Старых (tormozit) 4487 11.09.17 11:54 Сейчас в теме
(25) Это снегопат. А обсуждение про штатную контекстную подсказку конфигуратора.
31. Oleg Space (spacecraft) 11.09.17 11:57 Сейчас в теме
(29) ок. Вот штатная.
Прикрепленные файлы:
32. Сергей Старых (tormozit) 4487 11.09.17 12:14 Сейчас в теме
(31) Спасибо. Убедил. Согласен, на 8.3.8 так работало. Но на 8.3.10 не работает.
44. Александр Орефков (orefkov) 1472 12.09.17 08:24 Сейчас в теме
(29)
В данном конкретном случае снегопат просто выводит в своём списке содержимое штатной контекстной подсказки. Определяется это просто - если рамка вокруг списка толстая - это список, который составляет сам снегопат. Если рамка тонкая - это перехваченный снегопатом штатный список.
24. Oleg Space (spacecraft) 11.09.17 11:17 Сейчас в теме
(21) там весь прикол в том, что конструкция препроцессора не захватывает сам метод:
#Если Сервер Или Не Сервер Тогда 
&НаКлиентеНаСервереБезКонтекста 
#КонецЕсли

И в данном случае к контексту подсказки добавляется контекст по-умолчанию для модуля форм, т.е. &Сервер.
Если же #КонецЕсли будет после метода, то и контекст будет только тот, что указан препроцессору.
42. Сергей Ожерельев (Поручик) 3636 11.09.17 23:17 Сейчас в теме
(18) С какого-то релиза платформы объявлять &НаСервере стало обязательно, иначе появляются ошибки при вызове РеквизитФормыВЗначение.

На ошибку нарвался буквально вчера в одной из обработок, которая раьше благополучно работала без этой инструкции..
корум; nvv1970; +2 Ответить
43. Сергей Старых (tormozit) 4487 12.09.17 06:33 Сейчас в теме
(42) Не заметил такого. Поэтому прошу доказательства.
55. Сергей Ожерельев (Поручик) 3636 12.09.17 16:17 Сейчас в теме
(43) Вот. Без директивы &НаСервере будет ошибка

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

КонецПроцедуры
Показать
56. Сергей Старых (tormozit) 4487 12.09.17 16:25 Сейчас в теме
(55) Какая ошибка и на какой версии платформы?
8. Дамир Закиров (Dzenn) 61 10.09.17 22:11 Сейчас в теме
14. Yan Tsys (YanTsys) 9 11.09.17 08:35 Сейчас в теме
Помогите разобраться чем предложенный вариант будет отличаться от:

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

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

// ---------------------->>>
&НаСервере
Процедура НастроитьЭлементыФормы(ЭтаФорма)
	Элементы = ЭтаФорма.Элементы;
	Элементы.Реквизит1.Видимость = ЭтаФорма.Реквизит2;
КонецПроцедуры
Показать
15. Сергей Старых (tormozit) 4487 11.09.17 08:56 Сейчас в теме
(14) Тем что будут серверные контекстные вызовы. А в моем варианте их нет.
26. Yan Tsys (YanTsys) 9 11.09.17 11:34 Сейчас в теме
(15) Насколько я понимаю неконтекстный вызов функции это когда не передается контекст формы, но вы же его передаете как параметр "ЭтаФорма" ?
28. Сергей Старых (tormozit) 4487 11.09.17 11:51 Сейчас в теме
(26) Контекстный вызов это всегда вызов с клиента на сервер с синхронизацией данных формы. В статье же рассматривается локальный (без передачи управления на сервере) вызов с доступом к контексту формы.
33. Yan Tsys (YanTsys) 9 11.09.17 12:22 Сейчас в теме
(28) Извините настолько привык пользоваться только &НаСервереБезКонтекста что как-то в упор не увидел что у вас &НаКлиентеНаСервереБезКонтекста и что вызов с клиента вообще не будет трогать сервер... Спасибо за науку :)
27. Денис Монахов (wazup666) 11.09.17 11:51 Сейчас в теме
А чем не устраивает вызов процедуры НастроитьЭлементыФормы с директивой &НаКлиенте из обработчика ПриОткрытии?
30. Сергей Старых (tormozit) 4487 11.09.17 11:56 Сейчас в теме
(27) Тем что вызывать хочется одинаковый код на клиенте и на сервере без серверного вызова.
34. Денис Монахов (wazup666) 11.09.17 12:42 Сейчас в теме
(30) Ваше желание иметь одинаковый код на сервере и на клиенте мне понятно. Не понятно его целесообразность. Как часто вам приходиться настраивать форму с сервера минуя клиента?
36. Yan Tsys (YanTsys) 9 11.09.17 13:05 Сейчас в теме
(34) Денис а разве не для того нужен режим &НаСервере чтобы настраивать форму прямо на сервере до возврата управления клиенту?
В противном случае нам за глаза хватило бы &НаСервереБезКонтекста передали нужные данные обработали, вернули на клиента и настраиваем форму как хотим :)
37. Денис Монахов (wazup666) 11.09.17 13:19 Сейчас в теме
(36) Нет. Сомневаюсь, что сакральный смысл режима &НаСервере настраивать форму для клиента. Зачем занимать ресурсы сервера на настройку формы коли сервер вы вызвали с клиента и туда же вернетесь.
38. Yan Tsys (YanTsys) 9 11.09.17 13:23 Сейчас в теме
(37) Вот послушали бы сейчас вас в 1с и убрали сразу два режима &НаСервере и &НаКлиентеНаСервереБезКонтекста... И кстати фраза "Зачем занимать ресурсы сервера" целиком и полностью противоречит текущей политике 1с :)
40. Денис Монахов (wazup666) 11.09.17 14:43 Сейчас в теме
(38)
Вот послушали бы сейчас вас в 1с и убрали сразу два режима &НаСервере и &НаКлиентеНаСервереБезКонтекста...


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


(38)
И кстати фраза "Зачем занимать ресурсы сервера" целиком и полностью противоречит текущей политике 1с :)


Не нужно вырывать фразы из контекста. Речь идет о настройке формы. Например, смена доступности элемента. Или вы считаете, что для этого нужно обязательно бежать на сервер. А о политике 1С ничто не говорит лучше чем их официальные источники: http://v8.1c.ru/o7/201505layout/index.htm
Как раз в этой заметке разработчики платформы признают, что не очень оптимально вызывать сервер для смены видимости элемента и начиная с 8.3.7 этот механизм перенесен на клиента.

Ни вижу смысла дальше развивать эту тему. Каждый случай индивидуален. И посему откланиваюсь
корум; +1 Ответить
39. Сергей Старых (tormozit) 4487 11.09.17 13:41 Сейчас в теме
(34) Реквизиты формы доступны на клиенте и на сервере. Менять их можно на клиенте и на сервере. Поэтому и настраивать свойства элементов формы после их изменения также хочется на клиенте и на сервере по возможности одинаково. Для этого я и делаю такой метод.
Также я понимаю, что не все изменения можно обработать без серверных вызовов. Такая обработка уже выполняется в обычном клиент-серверном стиле.
35. Yan Tsys (YanTsys) 9 11.09.17 12:52 Сейчас в теме
41. Yan Tsys (YanTsys) 9 11.09.17 16:30 Сейчас в теме
Не нужно вырывать фразы из контекста. Речь идет о настройке формы. Например, смена доступности элемента. Или вы считаете, что для этого нужно обязательно бежать на сервер.

Не пытайтесь спорить сами с собой...
Никто не говорил что нужно ОБЯЗАТЕЛЬНО бежать на сервер.
Речь идет о том что не обязательно ждать когда управление вернется клиенту.
45. Константин Гейнрих (CyberCerber) 159 12.09.17 10:40 Сейчас в теме
Из всей дискуссии я понял, что мы тут занимаемся извращенными недокументированными возможностями.
А ведь 1С могла решить проблему подсказок одной конструкцией, о которой давно мечтаю - типизированием параметров методов.
Т.е. чтобы можно было описывать методы как-то так:

Процедура СделатьЧтоТо(Форма: УправляемаяФорма, Список: СписокЗначений)

Понятно, что язык 1С не строго типизированный, но это можно сделать не для ограничения типов параметров, а только для подключения подсказки.
46. Сергей Старых (tormozit) 4487 12.09.17 10:44 Сейчас в теме
(45) К сожалению, ты не вник в суть. Поэтому и дал такую поверхностную оценку В контекстной подсказке нужна не просто форма, а контекстная форма. Поэтому твоей конструкцией проблему не решить, а нужны именно инструкции (а не декларации) для контекстной подсказки.
48. Константин Гейнрих (CyberCerber) 159 12.09.17 11:47 Сейчас в теме
(46) А, в том смысле, что так в подсказке будут все методы и реквизиты формы как класса, но не будет конкретных реквизитов и элементов текущей нужной формы?
Да, это случай особый, но ту функцию, которую я описал, все равно иметь хочется. :-)
54. Павел Одинцов (Darklight) 12.09.17 14:10 Сейчас в теме
(45) Кстати, есть в мире не строго типизированные языки, в которых параметрам функции можно добавлять описания ограничений (специальными выражениями) на передаваемые значения, эдакие условия - зачатки методологии "Контрактов". Такие функции нельзя вызвать с неправильным параметром - сработает встроенный механизм и сам выдаст соответстввующую ошибку с лаконичным пояснением. В то же время, наложение такого ограничение на параметр даёт возможность редактору формировать контекстную подсказку при работе с ними внутри таких процедур, а так же при их написании их вызова в другом месте. И для генерации документации тоже.
1С вполне могла бы так сделать, но пока она лишь ввела вывод подсказок параметров для места использования функций, из комментариев этих функций.
49. Александр Цуканов (tsukanov) 37 12.09.17 11:48 Сейчас в теме
Прикольно. Спасибо.
Эх, когда же разрабы осчастливят нас нормальной директивой...
50. Александр Цуканов (tsukanov) 37 12.09.17 12:06 Сейчас в теме
Раз пошла такая пьянка, то вот коллегам еще фишка:
В модуле формы можно спокойно объявить несколько функций с одним наименованием, если они все будут с директивой &НаКлиентеНаСервереБезКонтекста

Обнаружил это случайно при парсинге модулей ERP 2.4
Там в нескольких отчетах такая копипаста.

При вызове функции берется вроде как первая объявленная
jif; Dmitri93; klinval; CyberCerber; tormozit; +5 Ответить
51. Сергей Старых (tormozit) 4487 12.09.17 12:16 Сейчас в теме
(50) Проверил. Подтверждаю. Это ошибка платформы. На досуге сообщу в 1С.
52. Константин Гейнрих (CyberCerber) 159 12.09.17 12:16 Сейчас в теме
(50) Сейчас проверил... Да, действительно, это жесть! Написал три метода:

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

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

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


Не ругается, при вызове выводит "1". Что-то разработчики платформы вообще "без контекста".
59. Сергей Старых (tormozit) 4487 12.09.17 23:31 Сейчас в теме
(50) Сообщил об этой ошибке в 1С.
60. Александр Цуканов (tsukanov) 37 12.09.17 23:36 Сейчас в теме
61. Андрей Овсянкин (Evil Beaver) 4341 13.09.17 00:21 Сейчас в теме
(59) Они как-то отреагировали?
62. Александр Цуканов (tsukanov) 37 13.09.17 12:53 Сейчас в теме
(61) на партнерке в теме ни одного коммента
63. user827194 (dmitro) 14.09.17 03:31 Сейчас в теме
(50) Очень не хватает во встроенном языке 1С перегрузки.
Хотя бы в упрощенном варианте, с возможность объявлять подпрограмму с одним именем в двух вариантах: для сервера и клиента.
64. Oleg Space (spacecraft) 14.09.17 09:08 Сейчас в теме
(63) это можно реализовать общими модулями.
А в модуле формы это невозможно из-за толстого клиента. В нем все на клиенте исполняется, соответственно получится дублирование процедур.
Оставьте свое сообщение