Бонусное домашнее задание. Разминка для ума.

Коллеги, достаточно много комментариев на тему сложности взаимодействия между клиентом и сервером.

Давайте немного потренируемся, я создал небольшой программный код, который советую вам прокрутить в голове.

Текст задания упакован в pdf-файл.

Результат можно написать в эту ветку.

ps. Комментарии читайте только после собственного выполнения ;)

комментариев 29 на “Бонусное домашнее задание. Разминка для ума.”

  1. Harley Davidson 01.10.2010 в 09:37

    А я сразу в конфигуратор полез, т.к. не заметил подвоха на первый взгляд.
    “Синтаксический контроль” сразу ругаться давай:
    {Документ.Тест.Форма.ФормаДокумента.Форма(8,11)}: Переменная не определена (Тест2)
    Сообщить(<<?>>Тест2); (Проверка: Тонкий клиент)

    И тут на меня снизошло озарение из мастер-группы, где было подобное =)
    Суть в том, что директива компиляции должна быть у каждой переменной, если её нет – значит по умолчанию стоит директива “&НаСервере”, что в нашем случае – абсолютное зло =)

    • Вообще есть рекомендация каждую переменную описывать отдельной строкой.
      То есть не использовать конструкцию “Перем Тест1, Тест2”.
      Мы об этом говорим в продвинутом :)

  2. Да. В мастер-группе такое было. Конечно Тест2 серверная.

  3. Поймали и меня ))), серверная она, серверная

  4. Жесть… :))))

  5. &НаКлиенте
    Перем Тест1,Тест2;
    Вот так точно на Клиенте отрабатывает

  6. SmartUseless 26.07.2010 в 20:19

    Про область действия директивы &НаКлиенте лектор объяснял в предыдущем блоке, ну и про видимость серверных переменных на клиенте тоже было сказано, только вот в конкретном контексте применить эти абстрактные знания требуется некий волевой акт..

  7. Михайлов Сергей 24.07.2010 в 06:49

    Сразу понял – этот вопрос был уже разобран в мастер-группе.

  8. Константин Павленко 23.07.2010 в 13:00

    Чувствовал, что есть подвох, но не сразу понял где именно. Пришлось ещё раз заглянуть в Блок 1. Спасибо за разминку.

    • А вот я этот момент при просмотре пропустил либо был невнимателен :(
      Надо будет к 1 блоку вернуться

  9. Тест2 будет на сервере. соответственно ошибка во время синтаксического контроля.

  10. Тут мог бы закрасться и другой прикол,
    в тексте задания сказано

    Событие НажатиеНаКнопку связано с одной из кнопок формы.

    но не сказано что ПриОткрытии привязана к форме ) так что если бы обе переменные были бы клиентскими то задача была бы еще интереснее

  11. Илья Чернов 23.07.2010 в 11:09

    1. Сообщить(Тест2), обращение к сервеной переменной.
    2. Тест2=Тест1,
    некой локальной переменной Тест2 присваивается Тест1.

  12. Если написать:
    &НаКлиенте
    Перем Тест1;
    &НаКлиенте
    Перем Тест2;
    то ошибка исчезнет.

  13. Дирректива &НаКлиенте действует только для Тест1, Тест2 – серверная. Соответственно будет неопределена.

  14. Тест2 – серверная переменная, есс-но, на клиенте – не видна…

    НО!!!!
    если бы мы сделали такое объявление:
    &НаКлиенте
    Перем Тест1;
    &НаКлиенте
    Перем Тест2;

    ТО ВСЕ было бы как написано….

  15. progr-2008 22.07.2010 в 22:35

    Тест2 по-умолчанию &НаСервере, а кнопка – &НаКлиенте, ошибка.

  16. &НаКлиенте
    Процедура (Команда)
    Сообщить(Тест2)
    КонецПроцедуры

    Это обработка “НажатиеНаКнопку”?

  17. Директива распространяется только на первую переменную, вторая по умолчанию создается на сервере, соответственно ошибка при проверке и выполнении.

  18. вы, наверное, опечатались: Процедура (Команда) – что это такое? меня заклинило…

    • Перекачаем файл :)

    • но если продолжить, Тест2 будет неопределна, как и думал :), т.к. каждой переменной необходимо явно указывать директиву клиента, по умолчанию будет сервер. :)

  19. Анатолий Белогорцев 22.07.2010 в 21:05

    По логике вещей – вторая переменная (Тест2) создана без директивы компиляции, соответственно, по-умолчанию – это директива &НаСервере.
    В обработчике события “При открытии” инициализируется переменная модуля формы (Тест1) и локальная переменная (Тест2) функции “При открытии”.
    В первой же процедуре локальная переменная Тест2 неинициализирована, соответственно, модуль не должен пройти синтаксический контроль.

    Или я где-то недопонял суть задания? :)

  20. Тест2 – серверная.