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