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

Публикация № 671436

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

#Если Ложь Тогда
&НаСервере
#Иначе
&НаКлиентеНаСервереБезКонтекста
#КонецЕсли;
echo77; japopov; tormozit; +3 Ответить
2. tormozit 5590 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 5590 10.09.17 17:22 Сейчас в теме
(3) Под "считать такие выражения некорректными" имелось ввиду, что препроцессор будет выдавать ошибки. Сейчас он их не выдает и просто считает все неизвестное равным ЛОЖЬ.
5. spacecraft 10.09.17 17:26 Сейчас в теме
(4) когда должен выдавать ошибки препроцессор?
Если выдает ошибки при сохранении. Если сохранить, то при открытии:
"Ошибка в операторе препроцессора
#Если <<?>>ИСТИНА Тогда
Пропущен оператор препроцессора Если (If)"
Это кто ошибку дает?
6. tormozit 5590 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 5590 11.09.17 00:10 Сейчас в теме
(7) Проверил. Ты прав. Действительно теперь препроцессор ругается именно на "истина" и "ложь". Видимо мое пожелание реализовали как то частично (только для самых популярных слов).
12. zqzq 16 11.09.17 08:14 Сейчас в теме
(10) Видимо пожалели таких горе-программистов как я :)
чтобы такой код продолжал работать:
#Если ДляСинтаксПодсказки #Тогда
   ППП = Документы....Создать();
#КонецЕсли
16. tormozit 5590 11.09.17 08:56 Сейчас в теме
(12) Перед "Тогда" решетка не нужна.
13. spacecraft 11.09.17 08:25 Сейчас в теме
(10) они тем самым сделали еще больше проблем.
Вот такой код будет корректен, но никогда не выполнится:
#Если Фигня Тогда
	Сообщить("Фигня");
#КонецЕсли

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

Да и любые комбинации, которые дают логическое значение, так же не будут работать.
57. Evil Beaver 6282 12.09.17 18:01 Сейчас в теме
(13) Начиная не помню с какой версии, нестандартные директивы компиляции трактуются как ошибки. Т.е. "Если Фигня" писать уже нельзя. Но, возможно, это накрыто режимом совместимости, и поэтому у некоторых компилируется без ошибок.
58. tormozit 5590 12.09.17 18:10 Сейчас в теме
(57) Это не совсем так. Смотри (10). Я написал в 1С багрепорт, чтобы это наконец сделали полностью так.
71. PythonJ 87 19.09.19 20:48 Сейчас в теме
Может лучше вставить вызов обновления в ПриЧтенииНаСервере, а не ПриСозданииНаСервере? Чтобы сработало даже когда пользователь нажмет "Перечитать".
72. tormozit 5590 19.09.19 23:56 Сейчас в теме
(71) Лучше чем что? Если это к приему из статьи, то это похоже на предложение заменить теплое на мягкое, т.е. предложение способа решения другой задачи.
73. PythonJ 87 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 5590 11.09.17 00:16 Сейчас в теме
(9) Проверил свое предположение перед его публикацией? Оно не дает контекстную подсказку.
17. CyberCerber 311 11.09.17 09:20 Сейчас в теме
(9) Да, действительно плохо проверил
У меня сработал такой вариант:

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


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

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

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

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

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

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

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

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

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

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


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


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


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

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

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

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

Понятно, что язык 1С не строго типизированный, но это можно сделать не для ограничения типов параметров, а только для подключения подсказки.
dj_serega; the1; +2 Ответить
46. tormozit 5590 12.09.17 10:44 Сейчас в теме
(45) К сожалению, ты не вник в суть. Поэтому и дал такую поверхностную оценку В контекстной подсказке нужна не просто форма, а контекстная форма. Поэтому твоей конструкцией проблему не решить, а нужны именно инструкции (а не декларации) для контекстной подсказки.
48. CyberCerber 311 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 5590 12.09.17 12:16 Сейчас в теме
(50) Проверил. Подтверждаю. Это ошибка платформы. На досуге сообщу в 1С.
52. CyberCerber 311 12.09.17 12:16 Сейчас в теме
(50) Сейчас проверил... Да, действительно, это жесть! Написал три метода:

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

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

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


Не ругается, при вызове выводит "1". Что-то разработчики платформы вообще "без контекста".
59. tormozit 5590 12.09.17 23:31 Сейчас в теме
(50) Сообщил об этой ошибке в 1С.
60. tsukanov 57 12.09.17 23:36 Сейчас в теме
61. Evil Beaver 6282 13.09.17 00:21 Сейчас в теме
(59) Они как-то отреагировали?
62. tsukanov 57 13.09.17 12:53 Сейчас в теме
(61) на партнерке в теме ни одного коммента
65. tormozit 5590 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 Сейчас в теме
Хороший "лафхак", только не совсем понятно, как его пропустили гуру-программисты и не закидали помидорами
Оставьте свое сообщение

См. также

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

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

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

05.09.2019    9251    ids79    42       

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

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

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

03.09.2019    7473    YPermitin    67       

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

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

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

17.08.2019    7740    ids79    14       

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

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

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

08.08.2019    9577    ids79    22       

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

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

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

02.08.2019    9490    avalakh    21       

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

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

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

26.07.2019    8661    ids79    6       

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

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

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

17.07.2019    8208    ids79    24       

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

Статья Программист Стажер Нет файла v8 v8::СКД 1cv8.cf Бесплатно (free) Практика программирования Разработка

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

04.07.2019    6063    SeiOkami    48       

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

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

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

25.06.2019    16787    ids79    16       

Многопоточное ускорение однопользовательских нагрузок в 1С + Microsoft SQL Server 2017 174

Статья Программист Нет файла v8 v8::Запросы Бесплатно (free) Практика программирования Разработка

Взаимодействие с Microsoft SQL Server нередко вызывает трудности у 1С-ников, а потому интересны любые моменты, связанные с его использованием. О своем опыте работы с новым SQL Server 2017 участникам конференции Infostart-2018 рассказал директор ООО «Аналитика софт» Дмитрий Дудин.

11.06.2019    11213    dmurk    134       

Регистры накопления. Структура хранения в базе данных 172

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

Структура хранения регистров накопления в базе данных для платформы 1С:Предприятие 8.x. Первая часть в серии публикаций.

16.05.2019    16791    YPermitin    27       

Выполнение внешней обработки в фоновом задании 147

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

Подробное описание подхода к созданию длительной операции на основе внешней обработки. Реализация протестирована на 1С 8.3.12.1714 (x64).

11.05.2019    9460    Eret1k    22       

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

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

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

25.04.2019    4632    m-rv    2       

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

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

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

16.04.2019    7142    m-rv    16       

О расширениях замолвите слово... 192

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

О чём стоит задуматься при принятии решения о создании расширения конфигурации…

07.04.2019    15994    ellavs    122       

Git-репозитории для 1С-кода (опыт использования при небольших проектах) 199

Статья Программист Стажер Нет файла v8 Windows Бесплатно (free) Практика программирования Разработка

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

28.03.2019    12456    ellavs    83       

Трюки с внешними источниками данных 164

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

Некоторые трюки для преодоления ограничений внешних источников данных.

14.03.2019    12533    YPermitin    52       

Возможности типовых шаблонов ограничения доступа на уровне записей (RLS) 161

Статья Программист Нет файла v8 v8::Права Бесплатно (free) Практика программирования БСП (Библиотека стандартных подсистем) Роли и права

Краткий обзор применения типовых шаблонов ограничения доступа на уровне записей в конфигурациях, созданных на базе БСП: #ПоЗначениям, #ПоНаборамЗначений, #ПоЗначениямРасширенный, #ПоЗначениямИНаборамРасширенный

03.02.2019    15008    ids79    9       

EnterpriseData – часть 2. Процесс выгрузки данных 125

Статья Программист Нет файла v8 v8::УФ Россия Бесплатно (free) Практика программирования Обмен через XML

Основные этапы выгрузки данных через ED, обработчики событий выгрузки, правила обработки данных, правила конвертации объектов, конвертация свойств первого и второго этапов, процедуры БСП, используемые при выгрузке данных, структура «КомпонентыОбмена».

26.12.2018    12427    ids79    27       

Новый подход к обмену данными EnterpriseData 202

Статья Программист Нет файла v8 v8::УФ Россия Бесплатно (free) Практика программирования Обмен через XML

Хочу предложить Вашему вниманию цикл статей, посвященных обмену данными через универсальный формат (EnterpriseData или ED).

14.12.2018    20906    ids79    72       

EnterpriseData - пример доработки правил конвертации без использования КД 3.0 в расширении конфигурации 117

Статья Программист Нет файла v8 v8::УФ БП3.0 УТ11 Россия Windows Бесплатно (free) Практика программирования Обмен через XML

В статье подробно описан реальный пример доработки обмена данными через EnterpriseData (универсальный формат обмена) между конфигурациями УТ 11.4 и Бухгалтерия 3.0

16.11.2018    18329    ids79    20       

Программное заполнение пользовательских параметров и отборов СКД 135

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

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

13.11.2018    19020    Unk92    18       

Автоматические и управляемые блокировки применительно к типовым конфигурациям 1С 125

Статья Программист Нет файла v8 v8::blocking 1cv8.cf Бесплатно (free) Математика и алгоритмы Практика программирования

Основные принципы работы с режимами автоматических и управляемых блокировок в 1С Предприятие 8. Теория и применение в типовых конфигурациях: БП, УТ, ЕРП

10.11.2018    20512    ids79    40       

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

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

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

15.10.2018    20161    tormozit    100       

Произвольный код в фоновом режиме 163

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

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

03.09.2018    14342    nikita0832    41       

Основные понятия и механизмы оптимизации клиент-серверного взаимодействия в 1C 144

Статья Программист Нет файла v8 Россия Бесплатно (free) Математика и алгоритмы Практика программирования

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

23.08.2018    20829    Rain88    42       

Повышаем эффективность разработки правил обмена 122

Статья Программист Нет файла v8 КД ОС Бесплатно (free) Практика программирования Перенос данных из 1C8 в 1C8

Как повысить скорость и качество разработки правил обмена? Как вести групповую разработку правил обмена? Как облегчить сопровождение правил обмена после передачи в эксплуатацию? Об этом и многом другом вы можете узнать из этой статьи.

25.06.2018    19077    olegtymko    43       

Введение в механизм представлений в ЗУП ред. 3 152

Статья Программист Нет файла v8 v8::СПР ЗУП3.x Бесплатно (free) Практика программирования

В нашей организации на первом же телефонном собеседовании на должность разработчика по ЗУП ред. 3 вас обязательно спросят о том, что такое "Представления".

04.06.2018    24050    xrrg    82       

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

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

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

01.06.2018    20983    m-rv    21       

Строим графы средствами 1С (без GraphViz) 42

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

Множество статей на Инфостарте описывают, как работать с компонентой GraphViz, чтобы построить ориентированный граф. Но практически нет материалов, как работать с такими графами средствами 1С. Сегодня я расскажу, как красиво строить графы с минимальным пересечением. Нам этот метод пригодился для отрисовки алгоритмов в БИТ.Финансе, т.к. типовой механизм не устраивал. Еще это может быть полезно для визуализации различных зависимостей: расчета себестоимости, графы аффилированности компаний и т.д. Надеюсь, эта статья поможет сделать мир 1С красивее и гармоничней:) Итак, поехали...

23.05.2018    16786    slozhenikin_com    19       

Распределение расходов пропорционально продажам 9

Статья Программист Пользователь Нет файла v8 v8::ОУ УТ10 УУ Финансовый учет и бюджетирование (FRP) Учет доходов и расходов Бесплатно (free) Практика программирования

Финансовая модель. Распределение административных расходов по подразделениям пропорционально продажам за месяц. Дополнительные реквизиты против бизнес-процессов!

13.05.2018    11191    Rustig    9       

Просмотр временных таблиц запроса в отладчике без изменения кода 126

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

Данный способ можно использовать для просмотра содержимого временных таблиц запросов (менеджеров временных таблиц) без внесения изменений в код.

24.04.2018    23872    avfed@rambler.ru    19       

Минимализмы 3 350

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

Очередная серия "минимализмов" [http://infostart.ru/public/306536/, https://infostart.ru/public/460935/]. Также, как и в предыдущих статьях, здесь приведена подборка коротких оригинальных авторских решений некоторых задач. Ранее эти решения были разбросаны по моим комментариям к чужим публикациям.

19.02.2018    35207    ildarovich    44       

Этюды по программированию. Взаимодействие с Microsoft Word 108

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

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

11.12.2017    25646    milkers    23       

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

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

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

05.12.2017    21132    itriot11    34       

1С: Конвертация данных 3. Инструкции и примеры. EnterpriseData (универсальный формат обмена) 716

Статья Программист Нет файла v8 КД Бесплатно (free) Перенос данных из 1C8 в 1C8 Практика программирования Обмен через XML

Что такое КД3? Как начать использовать? Полезные дополнения к документации. Что нужно исправить в типовых обработках и конфигурации. Как изменить правила обмена не снимая конфигурацию с поддержки. Как отлаживать правила обмена?

19.11.2017    136211    MaxS    251       

Заполнение данных по ИНН контрагента с помощью альтернативного сервиса огрн.онлайн 131

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

Код для заполнения данных по ИНН контрагента из ЕГРЮЛ с сайта огрн.онлайн.

01.11.2017    22453    slava_1c    49       

Программные перечисления, ч.2: приемы кэширования при разработке 65

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

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

30.10.2017    20890    unichkin    17       

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

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

Краткая шпаргалка по программной работе с настройками СКД

29.10.2017    23827    json    9       

Работа с Excel 287

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования Загрузка и выгрузка в Excel

Собрал различные полезности для работы с Excel из 1С. Иногда приходится форматировать документ Excel программно из 1С. Так вот, чтобы не искать постоянно на просторах интернета как сделать левое выравнивание в ячейке Excel из 1С и т.п. решил опубликовать это...

23.10.2017    24186    arakelyan    39       

Добавление команд печати в конфигурациях на БСП 2.4.3 (в частности, в самописных документах в Бухгалтерии 3.0 после релиза 3.0.52.35) 143

Статья Программист Нет файла v8 v8::БУ БП3.0 Россия Бесплатно (free) Печатные формы документов Практика программирования БСП (Библиотека стандартных подсистем)

В статье https://infostart.ru/public/237013/ пользователя nick max рассматривался список действий для подключения команд печати в Бухгалтерии 3.0, работающей на БСП 2.3.6. В новом релизе Бухгалтерии 3.0.52.35 от 15.09.2017г. стала использоваться БСП 2.4.3, из-за чего произошли изменения в процедурах общих модулей, связанных с механизмом печати, и в процедурах их вызова в формах документов и в формах списков. Рассмотрим их.

18.09.2017    46255    bugtester    43       

Отказ от работы с временными файлами при работе с двоичными данными или Потоки как простая замена ADODB.Stream и временным файлам 126

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

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

12.09.2017    18005    vardeg    31