Бонусное домашнее задание. Разминка для ума.
Коллеги, достаточно много комментариев на тему сложности взаимодействия между клиентом и сервером.
Давайте немного потренируемся, я создал небольшой программный код, который советую вам прокрутить в голове.
Текст задания упакован в pdf-файл.
Результат можно написать в эту ветку.
ps. Комментарии читайте только после собственного выполнения ;)
А я сразу в конфигуратор полез, т.к. не заметил подвоха на первый взгляд.
“Синтаксический контроль” сразу ругаться давай:
{Документ.Тест.Форма.ФормаДокумента.Форма(8,11)}: Переменная не определена (Тест2)
Сообщить(<<?>>Тест2); (Проверка: Тонкий клиент)
И тут на меня снизошло озарение из мастер-группы, где было подобное =)
Суть в том, что директива компиляции должна быть у каждой переменной, если её нет – значит по умолчанию стоит директива “&НаСервере”, что в нашем случае – абсолютное зло =)
Вообще есть рекомендация каждую переменную описывать отдельной строкой.
То есть не использовать конструкцию “Перем Тест1, Тест2”.
Мы об этом говорим в продвинутом :)
Да. В мастер-группе такое было. Конечно Тест2 серверная.
Поймали и меня ))), серверная она, серверная
Жесть… :))))
&НаКлиенте
Перем Тест1,Тест2;
Вот так точно на Клиенте отрабатывает
Верно.
Про область действия директивы &НаКлиенте лектор объяснял в предыдущем блоке, ну и про видимость серверных переменных на клиенте тоже было сказано, только вот в конкретном контексте применить эти абстрактные знания требуется некий волевой акт..
Сразу понял – этот вопрос был уже разобран в мастер-группе.
Чувствовал, что есть подвох, но не сразу понял где именно. Пришлось ещё раз заглянуть в Блок 1. Спасибо за разминку.
А вот я этот момент при просмотре пропустил либо был невнимателен :(
Надо будет к 1 блоку вернуться
Тест2 будет на сервере. соответственно ошибка во время синтаксического контроля.
Тут мог бы закрасться и другой прикол,
в тексте задания сказано
Событие НажатиеНаКнопку связано с одной из кнопок формы.
но не сказано что ПриОткрытии привязана к форме ) так что если бы обе переменные были бы клиентскими то задача была бы еще интереснее
Глубоко копнули ;)
1. Сообщить(Тест2), обращение к сервеной переменной.
2. Тест2=Тест1,
некой локальной переменной Тест2 присваивается Тест1.
Если написать:
&НаКлиенте
Перем Тест1;
&НаКлиенте
Перем Тест2;
то ошибка исчезнет.
Дирректива &НаКлиенте действует только для Тест1, Тест2 – серверная. Соответственно будет неопределена.
Тест2 – серверная переменная, есс-но, на клиенте – не видна…
НО!!!!
если бы мы сделали такое объявление:
&НаКлиенте
Перем Тест1;
&НаКлиенте
Перем Тест2;
ТО ВСЕ было бы как написано….
Тест2 по-умолчанию &НаСервере, а кнопка – &НаКлиенте, ошибка.
&НаКлиенте
Процедура (Команда)
Сообщить(Тест2)
КонецПроцедуры
Это обработка “НажатиеНаКнопку”?
Именно так.
Директива распространяется только на первую переменную, вторая по умолчанию создается на сервере, соответственно ошибка при проверке и выполнении.
вы, наверное, опечатались: Процедура (Команда) – что это такое? меня заклинило…
Перекачаем файл :)
но если продолжить, Тест2 будет неопределна, как и думал :), т.к. каждой переменной необходимо явно указывать директиву клиента, по умолчанию будет сервер. :)
По логике вещей – вторая переменная (Тест2) создана без директивы компиляции, соответственно, по-умолчанию – это директива &НаСервере.
В обработчике события “При открытии” инициализируется переменная модуля формы (Тест1) и локальная переменная (Тест2) функции “При открытии”.
В первой же процедуре локальная переменная Тест2 неинициализирована, соответственно, модуль не должен пройти синтаксический контроль.
Или я где-то недопонял суть задания? :)
В этом-то и суть :)
Тест2 – серверная.
Краткость – сестра.
Все верно :)