Директивы компиляции в модулях не форм #761416


#0 by TormozIT
Уже не раз при переносе кода из модуля формы в общий модуль забыл убрать директивы компиляции (&НаСервере, &НаКлиенте и т.д.) и они не вызывали ошибки компиляции. Хотя в модулях не форм они лишены смысла и только вносят путаницу. Считаю что их следовало бы запретить использовать в модулях не форм. А как считаете вы и почему?
#1 by TormozIT
Забыл про модули команд. Они там тоже нужны.
#2 by vvp91
Справка Конфигуратор Каждая процедура и функция модуля формы, модуля команды и общего модуля управляемого приложения предваряется директивой компиляции, определяющей среду исполнения данной процедуры. Директива предваряется символом "&". Допустимые директивы:
#3 by Fragster
надо вообще выкинуть систему крыжиков, директив компиляции , инструкций препроцессора и сделать нечто более похожее на ООП, дабы исключить сомнительные методы обеспечения безопасности типа "вызовсервера", например
#4 by Fragster
Заодно и "асинхронность" переделать на прозрачную для программиста (чтобы было как раньше), или уже на нормальную модель с сообщениями (в т.ч. клиент-сервер), лямбдами и замыканиями.
#5 by TormozIT
Непонятно как работают эти директивы при компиляции в режиме внешнего соединения и обычного приложения.
#6 by Casey1984
-> Запретить все что непонятно!
#7 by TormozIT
Запретить все избыточное и непонятное.
#8 by TormozIT
Что понятнее? 1. #Если Сервер Или ВнешнееСоединение Тогда &НаСервере Процедура Моя1 ... &НаСервере 2. #Если Сервер Или ВнешнееСоединение Тогда Процедура Моя1 ... #Конец
#9 by GROOVY
Попробуйте фееричную конструкцию: #Если Клинет Тогда Я долго искал в чем причина... Ошибок нет, но не компилиться кусок общего модуля.
#10 by TormozIT
На эту тему я уже давно требовал сделать выдачу warning или error, но они не сочли это важным.
#11 by Casey1984
&НаСервере используется по умолчанию. Нафига ты её нагородил?
#12 by Fragster
копипаста из модуля формы
#13 by Casey1984
А там нафига нагородил?
#14 by Fragster
а там конструктор обработчиков событий нагородил. и рекомендации 1с к оформлению кода.
#15 by Casey1984
ну так в чем тогда вопрос, сам усложнил же?
#16 by Fragster
в том, что не работает как надо, например во внешнем соединении (потому как оно себя ведет как толстый клиент), от этого ловится куча ошибок
#17 by Casey1984
например?
#18 by TormozIT
Какие ошибки компиляции будут в следующем общем модуле со всеми включенными режимами компиляции и проверки? Чур не подсматривать в конфигуратор
#19 by Casey1984
Ты чего-то не дописал.
#20 by TormozIT
Точнее забыл удалить строку Моя32;, что не так важно.
#21 by Casey1984
4535 на клиенте
#22 by TormozIT
Ракета
#23 by Casey1984
ну так и что не понятно?
#24 by TormozIT
Вопросом на вопрос? По я уж подумал, что ты решился ответить на .
#25 by Casey1984
ответ не обнаружена 4535 я же написал в Вопрос: "что не понятно в директивах компиляции?"
#26 by TormozIT
Ответ довольно неглубокий. Как минимум выше речь шла про режим компиляции внешнее соединение. Также в постановке вопроса указано, что проверяются все режимы компиляции. А ты написал ответ даже без указания режимов компиляции.
#27 by Casey1984
для сервера и внешнего соединения, ясно же
#28 by TormozIT
А почему ты считаешь будет найден метод Моя956 в режиме внешнего соединения?
#29 by Casey1984
потому что &НаСервере
#30 by TormozIT
&НаСервере (&AtServer) — определяет серверную процедуру (функцию);
#31 by TormozIT
+ Про внешнее соединение не нашел. Подскажи, из чего ты сделал вывод что &НаСервере есть внешнее соединение.
#32 by TormozIT
Кто проникся темой, может еще почитать что пишут по ней на партнерском форуме В общем то пока там никто не смог обосновать и четко описать использование директив компиляции в общих модулях.
#33 by Casey1984
Из того что внешнее соединение у нас исполняется "на сервере"
#34 by TormozIT
Внешнее соединение исполняется во внешнем соединении. Не понимаю, как оно может исполняться "на сервере". Можешь еще немного пояснить, а лучше ткнуть в ИТС или процитировать?
#35 by Casey1984
Цитирую твой код: -- &НаКлиенте -- 1. Процедура Моя13 без директивы компиляции будет в контексте сервера. 2. Процедура Моя4535 с директивой &НаКлиенте будет в контексте клиента. Тут становится ясно, что Моя13 не видит Моя4535. Тебя интересует почему именно для сервера и внешнего соединения? Потому-что в этих режимах доступен код в контексте сервера, а в этом контексте у нас ошибка!
#36 by Casey1984
P.S. И это не значит что в тонком клиенте нельзя вызвать серверный код. Просто проверка явно организована без избытка. И для тонкого клиента она ничего не выдаст по причине, что в нем никаких ошибок не возникнет, так как вызова серверной процедуры Моя13 из клиентского кода нет! А нет, то зачем проверять?
#37 by ЧеловекДуши
Они не только вносят путанице. Модули начинают работать по другому :)
#38 by Casey1984
А если у модуля поставить галочку Клиент (управляемое приложение) выдает, ибо можно вызвать извне ;) В общем как-то так ;)
#39 by ЧеловекДуши
Для такого конторки 1С нужно будет напрячься и написать нормальный компилятор, который бы оптимизировал бы код :)
#40 by ЧеловекДуши
Самое веселое, если поставить в модуле галочку Сервер + Клиент (управляемое приложение)... Вот тогда компилятор начинает верещать на ошибки в модуле, если писать процедуры без Директив :)
#41 by Casey1984
Хоть и нет слова Экспорт, вот тут да алгоритм проверки делает возможно лишнее?
#42 by Casey1984
Главное что работа директив понятна, как минимум мне.
#43 by TormozIT
Хорошо что тебе она понятна. Но плохо, что понимаешь ты их неправильно. На партнерском форуме с коллегами мы обнаружили ошибку функции "Проверка модуля (CTRL+F7)" 8.3.7.1805 Некорректная проверка директивы компиляции НаСервере в общем модуле во внешнем соединении. 1С 8.3.7.1805, файловый и клиент-серверный варианты Проблема Проверка модуля (CTRL+F7) ошибочно считает метод с директивой компиляции НаСервере доступным в режиме внешнего соединения Воспроизведение Восстановить базу из выгрузки. Открыть в конфигураторе общий модуль ОбщийМодуль1 &НаКлиенте КонецПроцедуры и выполнить проверку модуля (CTRL+F7). При этом будет выдана только ошибка {ОбщийМодуль.ОбщийМодуль1.Модуль(10,3)}: Процедура или функция с указанным именем не определена (МояКлиент) Хотя ожидается еще ошибка {ОбщийМодуль.ОбщийМодуль1.Модуль(11,3)}: Процедура или функция с указанным именем не определена (МояСервер)   <<?>>МояСервер; (Проверка: Внешнее соединение)
#44 by vhl
возражений не имею. и снова в теме ООП!
#45 by vhl
1с пилит 8.3.9 и 8.4, 8.3 себя не оправдала
Тэги:
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С