0. tormozit 5613 10.09.17 00:34 Сейчас в теме

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

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

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

Комментарии
Избранное Подписка Сортировка: Древо
1. CyberCerber 320 10.09.17 15:54 Сейчас в теме
Да, интересно
Но можно еще проще так директиву написать:

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

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

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

платформа еще 8.3.8
jONES1979; Dach; chebser; dj_serega; Nelli_A86; Diversus; wunderland; japopov; nvv1970; +9 Ответить
4. tormozit 5613 10.09.17 17:22 Сейчас в теме
(3) Под "считать такие выражения некорректными" имелось ввиду, что препроцессор будет выдавать ошибки. Сейчас он их не выдает и просто считает все неизвестное равным ЛОЖЬ.
5. spacecraft 10.09.17 17:26 Сейчас в теме
(4) когда должен выдавать ошибки препроцессор?
Если выдает ошибки при сохранении. Если сохранить, то при открытии:
"Ошибка в операторе препроцессора
#Если <<?>>ИСТИНА Тогда
Пропущен оператор препроцессора Если (If)"
Это кто ошибку дает?
6. tormozit 5613 10.09.17 20:06 Сейчас в теме
(5) Препроцессор выдает (и должен выдавать) ошибки при проверке модуля (до проверочной или боевой компиляции). Если включена опция "Проверять автоматически", то будет проверять в частности при сохранении модуля.
Dmitri93; +1 Ответить
7. 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 5613 11.09.17 00:10 Сейчас в теме
(7) Проверил. Ты прав. Действительно теперь препроцессор ругается именно на "истина" и "ложь". Видимо мое пожелание реализовали как то частично (только для самых популярных слов).
12. zqzq 17 11.09.17 08:14 Сейчас в теме
(10) Видимо пожалели таких горе-программистов как я :)
чтобы такой код продолжал работать:
#Если ДляСинтаксПодсказки #Тогда
   ППП = Документы....Создать();
#КонецЕсли
16. tormozit 5613 11.09.17 08:56 Сейчас в теме
(12) Перед "Тогда" решетка не нужна.
13. spacecraft 11.09.17 08:25 Сейчас в теме
(10) они тем самым сделали еще больше проблем.
Вот такой код будет корректен, но никогда не выполнится:
#Если Фигня Тогда
	Сообщить("Фигня");
#КонецЕсли

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

Да и любые комбинации, которые дают логическое значение, так же не будут работать.
57. Evil Beaver 6355 12.09.17 18:01 Сейчас в теме
(13) Начиная не помню с какой версии, нестандартные директивы компиляции трактуются как ошибки. Т.е. "Если Фигня" писать уже нельзя. Но, возможно, это накрыто режимом совместимости, и поэтому у некоторых компилируется без ошибок.
58. tormozit 5613 12.09.17 18:10 Сейчас в теме
(57) Это не совсем так. Смотри (10). Я написал в 1С багрепорт, чтобы это наконец сделали полностью так.
71. PythonJ 89 19.09.19 20:48 Сейчас в теме
Может лучше вставить вызов обновления в ПриЧтенииНаСервере, а не ПриСозданииНаСервере? Чтобы сработало даже когда пользователь нажмет "Перечитать".
72. tormozit 5613 19.09.19 23:56 Сейчас в теме
(71) Лучше чем что? Если это к приему из статьи, то это похоже на предложение заменить теплое на мягкое, т.е. предложение способа решения другой задачи.
73. PythonJ 89 20.09.19 00:29 Сейчас в теме
(72) Не, извиняюсь, неясно выразился. Сам примем великолепный. Давно уже видел статью и пользуюсь им. Раз уж 1С не дает писать код красиво, то пусть будет хотя бы удобно. Просто опять наткнулся, проглядел и обратил внимание, что в этой же конструкции с сервера всегда вызывал настройку формы из ПриЧтенииНаСервере, а не ПриСозданииНаСервере. Непосредственно к самому фокусу с директивами вопрос никакого отношения не имеет. Собственно это был именно вопрос, а не замечание.
53. Darklight 19 12.09.17 13:53 Сейчас в теме
(10)Самыми популярными должны быть слова вида
#Если Север Тогда   

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

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

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

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


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

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

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


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

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

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

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

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

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

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

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

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

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


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


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



на

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


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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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


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


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


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

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

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

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

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

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

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

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

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

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


Не ругается, при вызове выводит "1". Что-то разработчики платформы вообще "без контекста".
59. tormozit 5613 12.09.17 23:31 Сейчас в теме
(50) Сообщил об этой ошибке в 1С.
60. tsukanov 57 12.09.17 23:36 Сейчас в теме
61. Evil Beaver 6355 13.09.17 00:21 Сейчас в теме
(59) Они как-то отреагировали?
62. tsukanov 57 13.09.17 12:53 Сейчас в теме
(61) на партнерке в теме ни одного коммента
65. tormozit 5613 09.11.17 23:54 Сейчас в теме
63. dmitro 14.09.17 03:31 Сейчас в теме
(50) Очень не хватает во встроенном языке 1С перегрузки.
Хотя бы в упрощенном варианте, с возможность объявлять подпрограмму с одним именем в двух вариантах: для сервера и клиента.
64. spacecraft 14.09.17 09:08 Сейчас в теме
(63) это можно реализовать общими модулями.
А в модуле формы это невозможно из-за толстого клиента. В нем все на клиенте исполняется, соответственно получится дублирование процедур.
66. AlexO 127 18.07.18 15:43 Сейчас в теме
Это все хорошо, и клиенты, и серверы. А вот как обходить проблему, что в обработках нет общего реквизита (в общем случае - общей таблицы данных), куда можно было бы писать общие перекрестные данные?
Реквизиты обработки - не видны на форме; реквизиты формы - не найдешь в другой форме и в общем модуле...
67. chebser 4 25.01.19 10:34 Сейчас в теме
Для начинающих разработчиков нужно сделать специальную директиву компиляции - &НаКлиентеНоЕслиЧёТоИНаСервере
68. maxkrezi 70 28.01.19 17:24 Сейчас в теме
Если не ставить директиву то будет и на сервере и на клиенте, разве не так?
69. spacecraft 28.01.19 18:25 Сейчас в теме
(68)
Если не ставить директиву то будет и на сервере и на клиенте, разве не так?

Не так. Без директивы в модуле формы УФ будет по-умолчанию "НаСервере"(Толстый клиент УФ файлового варианта не рассматриваем). Да, она будет доступна с клиента, но как серверный метод с контекстным вызовом.
70. fredly_nightly 19.06.19 08:36 Сейчас в теме
Хороший "лафхак", только не совсем понятно, как его пропустили гуру-программисты и не закидали помидорами
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

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

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

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

Консультант-аналитик 1С
Рязань
зарплата до 80 000 руб.
Полный день

Программист 1С
Рязань
зарплата от 90 000 руб.
Полный день