Имя: Пароль:
1C
 
Директивы компиляции в модулях не форм
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 себя не оправдала