Базовый курс. Домашнее задание №4

Первое задание по 1-му блоку базового курса.

Для выполнения рекомендуется изучить следующие главы 1-го блока.
Глава 1. Типы данных
Глава 2. Контекст выполнения кода
Глава 3. Модули
Глава 4. Синтакс-помощник

К сожалению, у Вас недостаточно прав для просмотра этой записи. Если Вы еще не залогинены на сайте — залогиньтесь. Если Вы оплачивали курс, у Вас активирован токен доступа, Вы залогинены, но Вы видите эту запись — напишите нам на e-mail поддержки.

комментариев 115 на “Базовый курс. Домашнее задание №4”

  1. НачалоРабДня=НачалоДня(ВремяНаСерв)+9*60*60+5*60+48;
    Если ВремяНаСерв<НачалоРабДня тогда
    отказ=Истина;
    конецесли;
    Сравниваем даты, а не строки должно прокатить.
    По списку значений:
    МожноЗавершитьВыбор=Ложь;
    пока не МожноЗавершитьВыбор цикл
    СписокЗначений.ОтметитьЭлементы();
    Для каждого Эл из СписокЗначений цикл
    Если эл.Пометка=Истина тогда
    МожноЗавершитьВыбор=Истина;
    КонецЕсли;
    Конеццикла;
    конеццикла;

    Сначала забыла поставить в серверных функциях флаг “вызов из клиентского”. Все -таки, нет еще рефлекса.
    Все остальное -стандартно.

  2. iporozhnyakov 08.12.2010 в 23:51

    Домашнее задание №4 я реализовал следующим образом.

    В модуле управляемого управжнения реализовал следующий код:

    Перем глОбед Экспорт;
    Процедура ПередНачаломРаботыСистемы(Отказ)
     ТекущаяДата = ТекущаяДата();
     НачалоРабочегоДня = Дата(1,1,1,9,5,38);
     КонецРабочегоДня = Дата(1,1,1,18,11,42);
     
     Если Дата(1,1,1,Час(ТекущаяДата),Минута(ТекущаяДата),Секунда(ТекущаяДата)) < НачалоРабочегоДня
     ИЛИ Дата(1,1,1,Час(ТекущаяДата),Минута(ТекущаяДата),Секунда(ТекущаяДата)) > КонецРабочегоДня Тогда
     Предупреждение(“Сейчас заходить в конфигурацию нельзя.”);
     Отказ = Истина;
     КонецЕсли;
    КонецПроцедуры

    Процедура ПриНачалеРаботыСистемы()
     
     ВариантыОбеда = Новый СписокЗначений;
     ВариантыОбеда.Добавить(“Курица”);
     ВариантыОбеда.Добавить(“Рыба”);
     ВариантыОбеда.Добавить(“Мясо”);
     Если ВариантыОбеда.ОтметитьЭлементы(“Выберите обед”) Тогда
      Для каждого Элемент из ВариантыОбеда Цикл
       Если Элемент.Пометка Тогда
        глОбед.Добавить(Элемент.Значение);
       КонецЕсли;
      КонецЦикла;
     КонецЕсли;
    КонецПроцедуры

    Процедура ПередЗавершениемРаботыСистемы(Отказ)
     ТекущаяДата = ТекущаяДата();
     НачалоРабочегоДня = Дата(1,1,1,9,5,38);
     КонецРабочегоДня = Дата(1,1,1,18,11,42);
     
     Если Дата(1,1,1,Час(ТекущаяДата),Минута(ТекущаяДата),Секунда(ТекущаяДата)) > НачалоРабочегоДня
      И Дата(1,1,1,Час(ТекущаяДата),Минута(ТекущаяДата),Секунда(ТекущаяДата)) < КонецРабочегоДня Тогда
      Ответ = Вопрос(“Завершить работу программы?”,РежимДиалогаВопрос.ДаНет,60,КодВозвратаДиалога.Нет);
      Если Ответ = КодВозвратаДиалога.Нет Тогда
       Отказ = Истина;
      КонецЕсли;
     КонецЕсли;
    КонецПроцедуры

    глОбед = Новый СписокЗначений;

  3. При выполнении задания о толстом клиенте почему то не подумал :). Взял на заметку, что необходимо поддерживать и обычное приложение. Реализовал все так:
    Начало работы по графику и окончание – переменный модуля управляемого приложения, инициализируются вне процедур, в теле основной программы методом добавления к началу дня текущей даты количества часов * 3600 + количества минут*60 + количество секунд. Сделал так для удобства сравнения напрямую с временем входа и выхода. Про функции получения локального времени ничего не знал, соответственно не применял их. Отдельно написал функцию получения списка обедов и функцию наличия отметок (перебором ищу первую отметку, если есть возврат Истина, если перебор закончился то Ложь) и использую эти функции в цикле:
    Пока (СписокОбедов.ОтметитьЭлементы(“Выберите обед (выбор обязателен!!!)”) = Ложь) Или НетПометокВСписке(СписокОбедов) Цикл
    // ничего не делаем :)
    КонецЦикла;
    Ну и когда отметка обедов произошла, добавляем отмеченные в массив.
    Выход из программы – обычно, а вот для определения простоты чисел нашел в интернете алгоритм, который называется “решето Аткина”. Наверно не буду описывать его выкладку, чтобы не забивать вам головы, но вроде бы работает, и по скорости при больших количествах анализируемых чисел должен выигрывать у перебора. Количество итераций у алгоритма точно считать не хотелось (в полтретьего ночи), но авторы (А. О. Л. Аткин и Дэниел Ю. Бернштайн) утверждают что сложность алгоритма равна N/(lg lgN), т.е. при N= 1000 количество итераций получается 2096. При желании могу опубликовать алгоритм

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

  4. stevelagory 08.12.2010 в 01:17

    Для сравнения времени использовал форматированные строки, проверка велась на входение во временной интервал . Считаю что такой вариант при данной формулировки приемлим, хотя предложенный преподавателем конечно лучше. В ряде случаев при решении задания действовал на интуиции (например, при установке таймаутов сообщения), хотя потом просмотрев ответ понял почему надо поступать именно так. Спасибо.  Для поиска простых чисел не стал применять перебор а использовал немного измененное “Решето Эратосфена”.
    Я понимал про наличие подводных камней в данном задании но многие все равно не смог обойти.
    1) Упустил из виду необходимость поддержки обучного приложения…
    2) Конвертация 1000 – обошел за счет модификации алгоритма “Решето Эратосфена” (хотя было лень возится с заменой символа, а пименить Формат правильно не смог хотя и пробовал).
    Ниже привожу свой вариант решения, полученный перед просмотров ответов:
    <code>
    Перем глОбед Экспорт ;
    Перем Числа ;

    Процедура ПередНачаломРаботыСистемы(Отказ)
    ДТ = Формат(ТекущаяДата(),”ДФ=ЧЧ:мм:сс”) ;
    Если ДТ < “09:05:38” ИЛИ “18:11:42” < ДТ Тогда
    Текст = “Вы пытаетесь войти в систему в нерабочее время!”;
    Предупреждение(Текст, 10);
    Отказ = Истина ;
    КонецЕсли ;
    КонецПроцедуры

    Процедура ПриНачалеРаботыСистемы()

    СписокЗначений = Новый СписокЗначений() ;
    СписокЗначений.Добавить( “Курица” ) ;
    СписокЗначений.Добавить( “Рыба” ) ;
    СписокЗначений.Добавить( “Мясо” ) ;
    ОбедНеВыбран = Истина ;
    Пока ОбедНеВыбран Цикл
    Если СписокЗначений.ОтметитьЭлементы( “Выберите вариант обеда” ) Тогда
    Для Каждого Элемент Из СписокЗначений Цикл
    Если Элемент.Пометка Тогда
    глОбед.Добавить( Элемент.Значение ) ;
    КонецЕсли ;
    КонецЦикла ;
    КонецЕсли ;
    Если ( глОбед.Количество() = 0 ) Тогда
    Текст = “Вам необходимо выбрать обед!”;
    Предупреждение(Текст, 10);
    Иначе
    ОбедНеВыбран = Ложь ;
    КонецЕсли ;
    КонецЦикла ;

    Сообщить( “Число591 = ” + Числа.Число591 ) ;
    Х = “Число332” ;
    Сообщить( “Число332 = ” + Числа[Х] ) ;

    КонецПроцедуры

    Процедура ПередЗавершениемРаботыСистемы(Отказ)
    ДТ = Формат(ТекущаяДата(),”ДФ=ЧЧ:мм:сс”) ;
    Если ( “09:05:38” <= ДТ ) И ( ДТ <= “18:11:42” ) Тогда
    Режим = РежимДиалогаВопрос.ДаНет;
    Текст = “Вы хотите выйти из системы до окончания рабочего дня?”;
    Ответ = Вопрос(Текст, Режим, 0);
    Отказ = ( Ответ = КодВозвратаДиалога.Нет ) ;
    КонецЕсли ;
    КонецПроцедуры

    глОбед = Новый Массив() ;

    Числа = Новый Структура() ;

    Четное = Ложь ;
    Для й = 1 По 999 Цикл
    Ключ = “Число” + й ;
    Числа.Вставить( Ключ, ?(Четное И й > 2, “Не простое”, “Простое”) ) ;
    Четное = Не Четное ;
    КонецЦикла;
    Числа.Вставить( “Число1000”, “Не простое” ) ;

    й = 3 ;
    Пока ( й*й <= 999 ) Цикл
    Если Числа[“Число”+й] = “Простое” Тогда

    я = й * й ;
    Пока я <= 999 Цикл
    Числа[“Число”+я] = “Не простое” ;
    я = я + й ;
    КонецЦикла;

    КонецЕсли ;
    й = й + 2 ;
    КонецЦикла;

    </code>

  5. stevelagory 07.12.2010 в 13:20

    Доброго всем времени суток! С опозданием начинаю выкладывать решения задач, появился шанс догнать группу и финишировать вместе. буду бороться!
    Для сравнения даты с временем начала и окончания рабочего дня решил использовать форматированную строку, выбор обработчиков событий не вызвал вопросов.
    Жас буду изучать вариант решения преподавателя и комментария коллег.
    Код задания:
    <code>
    Перем глОбед ;

    Процедура ПередНачаломРаботыСистемы(Отказ)
    ДТ = Формат(ТекущаяДата(),”ДФ=ЧЧ:мм:сс”) ; 
    Если ДТ < “09:05:38” ИЛИ “18:11:42” < ДТ Тогда 
    Текст = “Вы пытаетесь войти в систему в нерабочее время!”;
    Предупреждение(Текст, 10);
    Отказ = Истина ;
    КонецЕсли ;
    КонецПроцедуры

    Процедура ПриНачалеРаботыСистемы()
    СписокЗначений = Новый СписокЗначений() ;
    СписокЗначений.Добавить( “Курица” ) ;
    СписокЗначений.Добавить( “Рыба” ) ;
    СписокЗначений.Добавить( “Мясо” ) ;
    Если СписокЗначений.ОтметитьЭлементы( “Выберите вариант обеда” ) Тогда
    Для Каждого Элемент Из СписокЗначений Цикл 
    Если Элемент.Пометка Тогда
    глОбед.Добавить( Элемент.Значение ) ;
    КонецЕсли ;
    КонецЦикла ;
    КонецЕсли ;
    КонецПроцедуры

    Процедура ПередЗавершениемРаботыСистемы(Отказ)
    ДТ = Формат(ТекущаяДата(),”ДФ=ЧЧ:мм:сс”) ; 
    Если ( “09:05:38” <= ДТ ) И ( ДТ <= “18:11:42” ) Тогда 
    Режим = РежимДиалогаВопрос.ДаНет;
    Текст = “Вы хотите выйти из системы до окончания рабочего дня?”;
    Ответ = Вопрос(Текст, Режим, 0);
    Отказ = ( Ответ = КодВозвратаДиалога.Нет ) ;
    КонецЕсли ;
    КонецПроцедуры

    </code>

    • stevelagory 07.12.2010 в 14:03

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

  6. comradeegor 03.12.2010 в 17:00

    В Модуле управляемого приложения объявил следующие переменные:

    Перем НачалоРабДня;
    Перем КонецРабДня;
    Перем ВариантыОбеда;
    Перем Числа;
    Перем глОбед Экспорт;

    В модуле приложения их инициализировал.

    Для проверки входа/выхода:
    Время начала/окончания дня заданы так:
    НачалоРабДня = “090538”;
    КонецРабДня  = “181142”;

    Проверки заданы так:
    <code>ТекущаяДата = ТекущаяДата();
     ТекущаяДатаСтрока = Формат(ТекущаяДата, “ДФ=yyyyMMdd”); 
     Если ТекущаяДата < Дата(ТекущаяДатаСтрока + КонецРабДня) Тогда … </code>

    ГлОбед заполнял с помощью рекурсивной функции. Методом ОтметитьЭлементы() отмечал, проходил циклом по списку, отмеченные добавлял в массив. Если массив оказывался не пустым – возвращал его, иначе вызывал функцию снова.

    Со структурой “Числа” проблем не возникло. Она тоже инициализировалась в модуле приложения в цикле от 1 до 1000. При определении ключа пришлось использовать функцию Формат() для того, чтобы сгруппировать 1 000 до 1000.

  7. Здравствуйте. Задание выполнила. Но про то что база может работать в филиалах, находящихся в разных часовых поясах, я как то не подумала. Также закрепила свои познания в области директив наСервере, наКлиенте. Также довольно долго отрабатывает цикл по простым числам, если бы провверочные границы увеличились хотя бы до 50000 чисел, алгоритм последовательного деления на каждое число, ну покрайней мере на моем компьютере, заглохнул бы надолго. Также, немножко огорчает тот факт, что в принципе одно и тоже приходиться делать в модуле управляемого приложения и обычном клиенте, путем создания общих модулей и вызова их функций.
    И еще такой вопрос, я вот делал выбор блюд через вызон внешнего отчета и на нем ывводил список значений, так можно поступить, или лучше выполнять через отметить элементы?

    • Так можно поступить, но кажется отчет для этого действия – лишнее.
      Можно создать общую форму.

  8. Задание выполнено:
    1. В модуле управляемого приложения и модуле обычного приложения процедура ПриНачалеРаботыСистемы()   сравнивается  ТекущаяДата() с этой же датой но в интервале с 9:05:38 по 18:11:42  Если время не входит, ЗавершитьРаботуСистемы(Ложь); 
    2. со списком значений проблем не было, очень подробно рассказано в уроках. Массив глОбед доступен все время в сеансе работы.
    3. в процедуре ПередЗавершениемРаботыСистемы(Отказ) , время ТекущейДаты сравнивается с 18:11:42 , и если еще рано, задается вопрос, действительно ли закрыть приложение.  Если КодВозвратаДиалога.Нет Тогда  Отказ = Истина;

  9. dmitry.mazaev 28.11.2010 в 21:46

    <code>
    Перем глОбед, ВремяНачалаРаботы, ВремяОкончанияРаботы, Числа;
    Процедура ПриНачалеРаботыСистемы()

    ТекДата = ТекущаяДата();

    ВремяНачалаРаботы = НачалоДня(ТекущаяДата()) + 9 * 60 * 60 + 5 * 60 + 38;
    ВремяОкончанияРаботы = НачалоДня(ТекущаяДата()) + 18 * 60 * 60 + 11 * 60 + 42;

    Если ТекДата >= ВремяНачалаРаботы И ТекДата <= ВремяОкончанияРаботы Тогда

    Меню = Новый СписокЗначений;
    Меню.Добавить(“Курица”, “Курица”);
    Меню.Добавить(“Рыба”, “Рыба”);
    Меню.Добавить(“Мясо”, “Мясо”);

    ВыборМеню(Меню);
    ПолучитьСтруктуруЧисел();

    Иначе

    Предупреждение(“Работа с базой в данное время запрещена”);

    ЗавершитьРаботуСистемы(Ложь);

    КонецЕсли;

    КонецПроцедуры

    Процедура ВыборМеню(МенюОбед)

    глОбед = Новый Массив;

    Результат = МенюОбед.ОтметитьЭлементы(“Выберите обед”);

    Если Не Результат Тогда

    Сообщить(“Необходимо выбрать вариант обеда!!!”);

    ВыборМеню(МенюОбед);

    КонецЕсли;

    Для каждого ТекЭлемент Из МенюОбед Цикл

    Если ТекЭлемент.Пометка Тогда

    глОбед.Добавить(ТекЭлемент);

    КонецЕсли;

    КонецЦикла;

    КонецПроцедуры // ВыборМеню()

    Процедура ПолучитьСтруктуруЧисел()
    Перем Значение;
    Числа.Вставить(“Число1”, “Простое”);
    Числа.Вставить(“Число2”, “Простое”);
    Числа.Вставить(“Число3”, “Простое”);

    Для Счетчик = 4 По 1000 Цикл
    МаксДелитель = Цел(Счетчик / 2);
    ФлагПростого = Истина;

    Для Делитель = 2 По МаксДелитель Цикл
    Если Цел(Счетчик / Делитель) = Счетчик / Делитель Тогда
    ИмяВСтруктуре = “Число” + Формат(Счетчик, “ЧГ=0”);
    Числа.Вставить(ИмяВСтруктуре, “Составное”);
    ФлагПростого = Ложь;
    Прервать;
    КонецЕсли;
    КонецЦикла;

    Если ФлагПростого Тогда
    ИмяВСтруктуре = “Число” + Формат(Счетчик, “ЧГ=0”);
    Числа.Вставить(ИмяВСтруктуре, “Простое”);
    КонецЕсли;

    КонецЦикла;

    Числа.Свойство(“Число997”, Значение);
    Сообщить(“Число = 997″ + ” ” + Значение);

    X = “Число999”;
    Числа.Свойство(x, Значение);
    Сообщить(“X = Число999″ + ” ” + Значение);

    КонецПроцедуры

    Процедура ПередЗавершениемРаботыСистемы(Отказ)

    Если ТекущаяДата() < ВремяОкончанияРаботы Тогда

    Если Вопрос(“Вы уверены что хотите закончить работу? Рабочий день еще не кончился!”, РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Нет Тогда
    Отказ = Истина;
    КонецЕсли;
    КонецЕсли;

    КонецПроцедуры

    Числа = Новый Структура;
    </code>

  10. Процедура ПриНачалеРаботыСистемы()
    Список = Новый СписокЗначений;
    Список.Добавить(“Курица”);
    Список.Добавить(“Рыба”);
    Список.Добавить(“Мясо”);

    глОбед = Новый Массив;

    Если Список.ОтметитьЭлементы(“Выберите вариант обеда:”) Тогда
    Для каждого Элемент Из Список Цикл
    i= 0 ;
    Если Элемент.Пометка Тогда
    глОбед.Вставить(i,Элемент.Значение);
    i=i+1;
    КонецЕсли;
    КонецЦикла;
    КонецЕсли;

    КонецПроцедуры

    Процедура ПередНачаломРаботыСистемы(Отказ)

    ТекДата = ТекущаяДата();

    ТекДатаНач = НачалоДня(ТекДата)+(38)+(5*60)+(8*60*60);
    ТекДатаКон = НачалоДня(ТекДата)+(42)+(11*60)+(18*60*60);

    //входим в систему
    Если (ТекДата>ТекДатаНач) и (ТекДата<ТекДатаКон) Тогда

    Иначе
    Отказ = Истина;
    КонецЕсли;

    КонецПроцедуры

    Процедура ПередЗавершениемРаботыСистемы(Отказ)
    ТекДата = ТекущаяДата();

    ТекДатаКон = НачалоДня(ТекДата)+(42)+(11*60)+(18*60*60);

    Режим = РежимДиалогаВопрос.ДаНет;

    Если ТекДата<ТекДатаКон Тогда

    Ответ = Вопрос(“Рабочий день еще не закончился! Вы хотите выйти из программы?”,Режим,0);

    Если Ответ = КодВозвратаДиалога.Да Тогда
    Отказ = Ложь;
    Иначе
    Отказ = Истина;
    КонецЕсли;
    КонецЕсли;
    КонецПроцедуры

  11. Процедура ПередНачаломРаботыСистемы(Отказ)Процедура ПередЗавершениемРаботыСистемы(Отказ)
    ТекДата = ТекущаяДата();

    ТекДатаКон = НачалоДня(ТекДата)+(42)+(11*60)+(18*60*60);

    Режим = РежимДиалогаВопрос.ДаНет;

    Если ТекДата<ТекДатаКон Тогда

    Ответ = Вопрос(“Рабочий день еще не закончился! Вы хотите выйти из программы?”,Режим,0);

    Если Ответ = КодВозвратаДиалога.Да Тогда
    Отказ = Ложь;
    Иначе
    Отказ = Истина;
    КонецЕсли;
    КонецЕсли;
    КонецПроцедуры

    ТекДата = ТекущаяДата();

    ТекДатаНач = НачалоДня(ТекДата)+(38)+(5*60)+(8*60*60);
    ТекДатаКон = НачалоДня(ТекДата)+(42)+(11*60)+(18*60*60);

    //входим в систему
    Если (ТекДата>ТекДатаНач) и (ТекДата<ТекДатаКон) Тогда

    Иначе
    Отказ = Истина;
    КонецЕсли;

    КонецПроцедуры
     
    Процедура ПриНачалеРаботыСистемы()
    Список = Новый СписокЗначений;
    Список.Добавить(“Курица”);
    Список.Добавить(“Рыба”);
    Список.Добавить(“Мясо”);

    глОбед = Новый Массив;

    Если Список.ОтметитьЭлементы(“Выберите вариант обеда:”) Тогда
    Для каждого Элемент Из Список Цикл
    i= 0 ;
    Если Элемент.Пометка Тогда
    глОбед.Вставить(i,Элемент.Значение);
    i=i+1;
    КонецЕсли;
    КонецЦикла;
    КонецЕсли;

    КонецПроцедуры

  12. Выполнил:
    Перем глОбед Экспорт;
    Процедура ПередНачаломРаботыСистемы(Отказ)
    НачалаРаботы = Дата(Год(ТекущаяДата()),Месяц(ТекущаяДата()),День(ТекущаяДата()),09,05,38);
    КонецРаботы = Дата(Год(ТекущаяДата()),Месяц(ТекущаяДата()),День(ТекущаяДата()),18,11,42);

    Если (ТекущаяДата()>=НачалаРаботы)И(ТекущаяДата()<=КонецРаботы) Тогда
    Иначе
    Предупреждение(“Не рабочее время”);
    Отказ = Истина;
    КонецЕсли;
    КонецПроцедуры

    Процедура ПриНачалеРаботыСистемы()
    Список = Новый СписокЗначений;
    глОбед = Новый СписокЗначений;
    Список.Добавить(“Курица”);
    Список.Добавить(“Рыба”);
    Список.Добавить(“Мясо”);
    Список.ОтметитьЭлементы(“Выберете вариант обеда”);
    Для Каждого Стр Из Список Цикл
    Если Стр.Пометка Тогда
    глОбед.Добавить(Стр.Значение);
    КонецЕсли;
    КонецЦикла;
    КонецПроцедуры

  13. 1) В модулях управляемого и обычного приложения:
    <code>
    Перем глОбед Экспорт;
     
    Процедура ПередНачаломРаботыСистемы(Отказ)
     
    ГодТекущий = Год(ТекущаяДата());
    МесяцТекущий = Месяц(ТекущаяДата());
    ДеньТекущий = День(ТекущаяДата());
     
    Если (ТекущаяДата() < Дата(ГодТекущий,МесяцТекущий,ДеньТекущий,9,5,38)) ИЛИ (ТекущаяДата() > Дата(ГодТекущий,МесяцТекущий,ДеньТекущий,18,11,42)) Тогда
    Предупреждение(“Входить в систему разрешено между 9:05:38 и 18:11:42. Текущее время “+Час(ТекущаяДата())+”:”+Минута(ТекущаяДата())+”:”+Секунда(ТекущаяДата()),10,”Внимание!”);
    Отказ = Истина;
    КонецЕсли;
     
    КонецПроцедуры
     
    Процедура ПередЗавершениемРаботыСистемы(Отказ)
    ГодТекущий = Год(ТекущаяДата());
    МесяцТекущий = Месяц(ТекущаяДата());
    ДеньТекущий = День(ТекущаяДата());
     
    Если (ТекущаяДата() > Дата(ГодТекущий,МесяцТекущий,ДеньТекущий,9,5,38)) И (ТекущаяДата() < Дата(ГодТекущий,МесяцТекущий,ДеньТекущий,18,11,42)) Тогда
    Если Вопрос(“Вы действительно хотите выйти из системы. Рабочий день заканчивается в 18:11:42.
    |Текущее время “+Час(ТекущаяДата())+”:”+Минута(ТекущаяДата())+”:”+Секунда(ТекущаяДата()), РежимДиалогаВопрос.ДаНет,10,КодВозвратаДиалога.Нет,,КодВозвратаДиалога.Нет) <> КодВозвратаДиалога.Да Тогда
    Отказ = Истина;
    КонецЕсли;
    КонецЕсли;
    КонецПроцедуры
     
    Процедура ПриНачалеРаботыСистемы()
    ОбщийМодуль2.ПроверкаОтметкиСЗ();
    ОбщийМодуль2.ПростыеЧисла();
    КонецПроцедуры
     
    глОбед = Новый СписокЗначений;
    глОбед.Добавить(“Курица”);
    глОбед.Добавить(“Рыба”);
    глОбед.Добавить(“Мясо”);
     
    </code>
    1) Создал Общий модуль, поставил галки «Клиент (упр. прил)», «Клиент (об. прил)»:
    <code>
     
    Процедура ПроверкаОтметкиСЗ() Экспорт
    глОбед.ОтметитьЭлементы(“Выберите блюдо”);
    Отметка = Ложь;
    Для каждого Эл Из глОбед Цикл
    Если Эл.Пометка Тогда
    Отметка = Истина;
    Прервать;
    КонецЕсли;
    КонецЦикла;
    Если НЕ Отметка Тогда
    Предупреждение(“Необходимо выбрать хотя бы 1 блюдо”,10,”Выбор блюда”);
    ПроверкаОтметкиСЗ();
    КонецЕсли;
    КонецПроцедуры
     
    Функция ПростыеЧисла() Экспорт
    Числа = Новый Структура;
    Для Счетчик1 = 2 По 1000 Цикл
    Простое = Истина;
    Для Счетчик2 = 2 По Счетчик1-1  Цикл
    Если (Счетчик2 <> Счетчик1) И (Счетчик1%Счетчик2 = 0) Тогда
    Простое = Ложь;
    Числа.Вставить(“Число”+Формат(Счетчик1,”ЧГ=0″),”Не простое”);
    Прервать;
    КонецЕсли;
    КонецЦикла;
    Если Простое Тогда
    Числа.Вставить(“Число”+Формат(Счетчик1,”ЧГ=0″),”Простое”);
    КонецЕсли;
    КонецЦикла;
    Сообщить(Числа.Число591);
    X = “Число332”;
    Сообщить(Числа[X]);
     
    Возврат Числа;
     
    КонецФункции // ПростыеЧисла()
    </code>

  14. Задание выполнил. Сложностей не возникло. Использованы события ПриНачалеРаботыСистемы() и ПередЗавершениемРаботыСистемы()

  15. Задание выполнено.
    1. в процедуре ПередНачаломРаботыСистемы проверка на рабочее время
    2. в процедуре ПриНачалеРаботыСистемы инициализация СпискаЗначение и вызов функции ОбязательныйВыборОбеда(СписокОбеда)
    3 функция ОбязательныйВыборОбеда(СписокОбеда)
    Если СписокОбеда.ОтметитьЭлементы(“Выберите обед”) Тогда
    ОбедВыбран = Ложь;
    Для каждого Обед Из СписокОбеда Цикл
    Если Обед.Пометка Тогда
    глОбед.Добавить(Обед);        
    ОбедВыбран = Истина;
    КонецЕсли;
    КонецЦикла;    
    Если НЕ ОбедВыбран Тогда
    Предупреждение(“Для выбора необходимо проставить галочку у понравившегося обеда!”);
    ОбязательныйВыборОбеда(СписокОбеда);
    КонецЕсли;
    Иначе
    Предупреждение(“Обед должен быть выбран обязательно!”);
    ОбязательныйВыборОбеда(СписокОбеда);
    КонецЕсли;
    4. в процедуре ПередЗавершениемРаботыСистемы
    вопрос о выходе из системы в рабочее время
    5. В модуле Управляемого приложения создана структура Числа и заполнена
    Для Сч=2 По 1000 Цикл
    Для Сч2 = 1 По 1000/Сч  Цикл
    ЗнПер = Сч2*Сч;
    Если НЕ Числа.Свойство(“Число”+Формат(ЗнПер, “ЧГ = 0”)) Тогда
    Числа.Вставить(“Число”+Формат(ЗнПер, “ЧГ = 0”), “Непростое”);
    КонецЕсли;
    КонецЦикла;    
    КонецЦикла;
    Далее в цикле заполняются простые числа (те которых нет в структуре).  Оба обращения проверены.

  16. Задание выполнил. Упустил
    1) написание кода для работы  в обычном приложении.
    2) Дату входа  определял только как ТекущуюДату
    3) Эмуляцию терминирующего окна для выбора обеда.

  17. Задание сделал
    перед началом работы смотрим на количество секунд на момент входа и принимаем решение впускать или нет
    (Если (ВремяВхода < 32738) ИЛИ (ВремяВхода > 65502))
    перед выходом почти тоже самое, процедуры в модуле управляемого приложения:
    ПередНачаломРаботыСистемы и ПередЗавершениемРаботыСистемы
    в процедуре ПриНачалеРаботыСистемы
    создаем список из указанных элементов, используем ОтметитьЭлементы, что бы выбрать, добавляем в массив, что отметил пользователь проверяя в цикле свойство “Пометка”, вроде ничего не упустил

  18. Manase940N 17.11.2010 в 19:19

    Задание выполнил почти по той же схеме, что и все.
    Весь алгоритм расположен в  модуле управляемого приложения.
    Только начало и окончание рабочего дня не держал в константах или в глобальных переменных, а напрямую объявлял в коде.
    Не стал разбивать текущую дату на часы/минуты/секунды, а просто форматированием преобразовал к строке, затем к числу.

  19. Андрей 16.11.2010 в 16:43

    потренировался с работой метаданными (резницу между клиетом и сервером в обращении к перечислениям, константам, справочникам). создал Перечисление.ВидРабочего времени – который опредлял какой идёт запрос или “врямя начала предприятия или время окончания работы предприятия. время начала и окончания работы оформил как константы. А меню обеда – заполнил в справочник.

    Конечно пока при переходе на управляемые формы разграничения между клиентом и сервером вызывают доп. время для отладки.

  20. Admin_Net_1C 15.11.2010 в 18:53

    Домашнее задание выполнил.
    Для проверки рабочего времени в процедуре ПередНачаломРаботыСистемы использовал условие:
    Если (ТекЧас*60*60+ТекМин*60+ТекСек < 9*60*60+5*60+38) ИЛИ (ТекЧас*60*60+ТекМин*60+ТекСек > 18*60*60+11*60+42) Тогда
    Отказ = Истина;
    КонецЕсли;
    а в процедуре ПередЗавершениемРаботыСистемы:
    Если ТекЧас*60*60+ТекМин*60+ТекСек < 18*60*60+11*60+42 Тогда
    Если Вопрос(“А может поработаем еще, а?”,РежимДиалогаВопрос.ДаНет,60,КодВозвратаДиалога.Да,”А если подумать…”) = КодВозвратаДиалога.Да Тогда
    Отказ = Истина;
    КонецЕсли;
    КонецЕсли;
    Для выбора вырианта обеда сделал рекурсивную процедуру ВыборВариантаОбеда:

    ВыбВариантОбеда = СписокБлюд.ВыбратьЭлемент(“Выберите вариант обеда”);

    Если ВыбВариантОбеда = Неопределено Тогда
    ВыборВариантаОбеда()
    Иначе
    глОбед = ВыбВариантОбеда;
    КонецЕсли;

    пускай точно, укзывает чего на обед подавать, а то мучайся тут, изобретай им меню…)))

  21. Перем глВремяНачало Экспорт;
    Перем глВремяОкончание Экспорт;
    Перем глОбед Экспорт;
    Процедура ПриНачалеРаботыСистемы()   
     
     День  = Лев(ТекущаяДата(),2);
     Месяц = Сред(ТекущаяДата(),4,2);
     Год   = Сред(ТекущаяДата(),7,4);
     
     глВремяНачало    = Дата(Год + Месяц+ День+”090538″);
     глВремяОкончание = Дата(Год + Месяц+ День+”181142″);
     
     Если ТекущаяДата()< глВремяНачало ИЛИ
       ТекущаяДата()> глВремяОкончание  Тогда 
      
      Сообщение = Новый СообщениеПользователю();
            Сообщение.Текст =  “Заходить в конфигурацию нельзя”;
            Сообщение.Сообщить();             
      ЗавершитьРаботуСистемы(Ложь);
     КонецЕсли;    
     
     глОбед = Новый СписокЗначений;   
     глОбед.Добавить(“Рыба”);
     глОбед.Добавить(“Мясо”);
        глОбед.Добавить(“Курица”);
     глОбед.ОтметитьЭлементы(“Какой вариант обеда вы предпочитаете?”);
     
    КонецПроцедуры
    Процедура ПриЗавершенииРаботыСистемы()
     
     Если ТекущаяДата()> глВремяНачало И
      ТекущаяДата()< глВремяОкончание  Тогда 
      
      Ответ = Вопрос(“Закрыть конфигурацию?”,РежимДиалогаВопрос.ДаНет);
      Если Ответ=КодВозвратаДиалога.Да Тогда  
        ЗавершитьРаботуСистемы(Ложь);
      КонецЕсли;
     КонецЕсли;  
     
    КонецПроцедуры

  22. Задание сделал в модуле управляемого приложения, вот его вид:
    Перем глОбед Экспорт;
    Перем ВремяНачала,ВремяКонца;

    Процедура ПередНачаломРаботыСистемы(Отказ)
    Если ТекущаяДата()>=ВремяНачала И ТекущаяДата()<=ВремяКонца Тогда
    СЗ=Новый СписокЗначений;
    СЗ.Добавить(“Курица”);
    СЗ.Добавить(“Рыба”);
    СЗ.Добавить(“Мясо”);
    ВыбЭлемент=СЗ.ВыбратьЭлемент(“Выберите вид обеда!”);
    Если Не ВыбЭлемент=Неопределено Тогда
    глОбед.Добавить(ВыбЭлемент.Значение);
    КонецЕсли;
    Иначе
    Предупреждение(“В нерабочее время работать с программой нельзя!”,3);
    Отказ=Истина;
    КонецЕсли;
    КонецПроцедуры

    Процедура ПередЗавершениемРаботыСистемы(Отказ)
    Если ТекущаяДата()>=ВремяНачала И ТекущаяДата()<=ВремяКонца Тогда
    Ответ=Вопрос(“Вы действительно хотите выйти из системы до окончания рабочего дня?”,РежимДиалогаВопрос.ДаНет,0);
    Если Ответ=КодВозвратаДиалога.Нет Тогда
    Отказ=Истина;    
    КонецЕсли;
    КонецЕсли;    
    КонецПроцедуры

    ВремяНачала=Дата(Год(ТекущаяДата()),Месяц(ТекущаяДата()),День(ТекущаяДата()),09,05,38);
    ВремяКонца=Дата(Год(ТекущаяДата()),Месяц(ТекущаяДата()),День(ТекущаяДата()),18,11,42);
    глОбед=Новый Массив;

  23. Задание выполнил.
    Создал
    <code>Перем НачРабДня, КонРабДня;</code>
    , которые проинициализировал так:
    <code>
    НачРабДня =  9*3600+5*60+38;
    КонРабДня = 18*3600+11*60+42;
    </code>
    Проверка реализована так:
    <code>
    ТекущВремяСек = ТекущаяДата()-НачалоДня(ТекущаяДата());
    Если (ТекущВремяСек < НачРабДня) ИЛИ (ТекущВремяСек > КонРабДня) Тогда

    <code>
    Для контроля выхода – условие аналогичной конструции.
    Для заполнения массива строк глОбед в процедуре ПриНачалеРаботыСистемы() использовал список значений и его метод ОтметитьЭлементы.
    Был слегка раздосадован, что метод списка “ВыгрузитьЗначения()” не хочет обращать внимания на Пометку элементов. Пришлось сделать в цикле.

  24. Приветствую Всех! Как обычно выкладываю свой необыкновенный код).
    Единственная сложность возникла, когда делал 1-е задание. Система не выводила сообщение, когда я использовал процедуру “Предупреждение(…)” Почему?
    <code>
    Перем ГлОбед Экспорт;
    Перем НачалоСмены;
    Перем КонецСмены;
    Процедура ПередНачаломРаботыСистемы(Отказ)

    НачалоСмены = (9*60 + 05)*60 + 38;
    КонецСмены = (18*60 + 11)*60 + 42;

    ТекДата = ТекущаяДата();
    ТекВремя = ТекДата – НачалоДня(ТекДата);

    Если ТекВремя < НачалоСмены ИЛИ ТекВремя > КонецСмены Тогда
    Текст = “ru =’Вы вошли в систему в нерабочее время. График работы с 9:05:38 до 18:11:42.'”;
    //Предупреждение(НСтр(Текст), 10);
    Ответ = Вопрос(НСтр(Текст),РежимДиалогаВопрос.ОК,10,, “Вход в систему”);
    //Отказ = Истина;
    КонецЕсли;

    КонецПроцедуры
    Процедура ПриНачалеРаботыСистемы()

    Меню = Новый СписокЗначений;
    Меню.Добавить(“Курица”);
    Меню.Добавить(“Рыба”);
    Меню.Добавить(“Мясо”);
    ТекстВопроса = НСтр(“ru=’Что вы будете сегодня на обед?'”);
    //ЗаказПользователя = Вопрос(ТекстВопроса,Меню,,,”Меню на обед”);

    Меню.ОтметитьЭлементы(ТекстВопроса);

    ГлОбед = Новый Массив;

    Для каждого Элемент из Меню Цикл
    Если Элемент.Пометка Тогда
    ГлОбед.Добавить(Элемент.Значение);
    КонецЕсли;
    КонецЦикла;

    КонецПроцедуры
    Процедура ПередЗавершениемРаботыСистемы(Отказ)

    ТекДата = ТекущаяДата();
    ТекВремя = ТекДата – НачалоДня(ТекДата);

    Если ТекВремя > НачалоСмены И ТекВремя < КонецСмены Тогда

    ТекстВопроса = НСтр(“ru =’График работы с 9:05:38 до 18:11:42, сейчас только %ТекВремя%. Вы уверены что хотите завершить работу?'”);
    ТекстВопроса = СтрЗаменить(ТекстВопроса,”%ТекВремя%”, Формат(ТекДата,”ДЛФ=T”));
    ОтветПользователя = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет);
    Если ОтветПользователя = КодВозвратаДиалога.Нет Тогда
    Отказ = Истина;
    КонецЕсли;
    КонецЕсли;

    КонецПроцедуры
    Перем ГлОбед Экспорт;
    Перем НачалоСмены;
    Перем КонецСмены;
     
    Процедура ПередНачаломРаботыСистемы(Отказ)

    НачалоСмены = (9*60 + 05)*60 + 38;
    КонецСмены = (18*60 + 11)*60 + 42;

    ТекДата = ТекущаяДата();
    ТекВремя = ТекДата – НачалоДня(ТекДата);

    Если ТекВремя < НачалоСмены ИЛИ ТекВремя > КонецСмены Тогда
    Текст = “ru =’Вы вошли в систему в нерабочее время. График работы с 9:05:38 до 18:11:42.'”;
    //Предупреждение(НСтр(Текст), 10);
    Ответ = Вопрос(НСтр(Текст),РежимДиалогаВопрос.ОК,10,, “Вход в систему”);
    Отказ = Истина;
    КонецЕсли;

    КонецПроцедуры
     
    Процедура ПриНачалеРаботыСистемы()

    Меню = Новый СписокЗначений;
    Меню.Добавить(“Курица”);
    Меню.Добавить(“Рыба”);
    Меню.Добавить(“Мясо”);
    ТекстВопроса = НСтр(“ru=’Что вы будете сегодня на обед?'”);

    Меню.ОтметитьЭлементы(ТекстВопроса);

    ГлОбед = Новый Массив;

    Для каждого Элемент из Меню Цикл
    Если Элемент.Пометка Тогда
    ГлОбед.Добавить(Элемент.Значение);
    КонецЕсли;
    КонецЦикла;
     

    КонецПроцедуры
     
    Процедура ПередЗавершениемРаботыСистемы(Отказ)

    ТекДата = ТекущаяДата();
    ТекВремя = ТекДата – НачалоДня(ТекДата);

    Если ТекВремя > НачалоСмены И ТекВремя < КонецСмены Тогда

    ТекстВопроса = НСтр(“ru =’График работы с 9:05:38 до 18:11:42, сейчас только %ТекВремя%. Вы уверены что хотите завершить работу?'”);
    ТекстВопроса = СтрЗаменить(ТекстВопроса,”%ТекВремя%”, Формат(ТекДата,”ДЛФ=T”));
    ОтветПользователя = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет);
    Если ОтветПользователя = КодВозвратаДиалога.Нет Тогда
    Отказ = Истина;
    КонецЕсли;
    КонецЕсли;

    КонецПроцедуры
    </code>

    • >Система не выводила сообщение, когда я использовал процедуру «Предупреждение(…)»
      Скорее всего вы использовали функцию в серверном программном коде, где интерфейсная работа недопустима.
      Функция

      Сообщить( )

      в этом плане особенная. Она накапливает сообщения, а потом выводит их на клиенте.

  25. Антон К. 15.11.2010 в 00:00

    Добрый вечер,
    опишу мое решение:
    1) проверку того, что вход возможен, и запрос подтверждения выхода произвожу в процедурах ПередНачаломРаботыСистемы() и ПередЗавершениемРаботыСистемы() соответственно.
    2) запрос предпочитаемых на обед блюд произвожу в процедуре ПриНачалеРаботыСистемы().
    Переменную глОбед инициализирую в блоке инициализации модуля УправляемогоПриложения: глОбед = Новый Массив;
    Привожу текст процедуры ПриНачалеРаботыСистемы():
    <code>

    Процедура ПриНачалеРаботыСистемы()
    Блюда = Новый СписокЗначений;
    Блюда.Добавить(“курица”);
    Блюда.Добавить(“рыба”);
    Блюда.Добавить(“мясо”);
    Блюда.ОтметитьЭлементы(“Предпочтительный вариант обеда”);
    Для Каждого Блюдо Из Блюда Цикл
    Если Блюдо.Пометка Тогда
    глОбед.Добавить(Блюдо.Значение);
    КонецЕсли;
    КонецЦикла;

    Для Каждого Блюдо из глОбед Цикл
    Сообщить(Блюдо);
    КонецЦикла;

    КонецПроцедуры
    Процедура ПриНачалеРаботыСистемы()
    Блюда = Новый СписокЗначений;
    Блюда.Добавить(“курица”);
    Блюда.Добавить(“рыба”);
    Блюда.Добавить(“мясо”);
    Блюда.ОтметитьЭлементы(“Предпочтительный вариант обеда”);
    Для Каждого Блюдо Из Блюда Цикл
    Если Блюдо.Пометка Тогда
    глОбед.Добавить(Блюдо.Значение);
    КонецЕсли;
    КонецЦикла;
    КонецПроцедуры
    </code>

  26. Осознала, что не знаю красивого метода получения времени из даты. Это “формат”? В данном задании предложу свой вариант: датавхода-Началодня(датавхода)>9*60*60+5*60+28.

  27. Вроде бы очевидно, что проверку возможности входа в Модуле управляемого приложения (передначаломработы()). Особенно, учитывая, что в 5 -м задании появляются роли и разрешено не обращать внимание на обычное приложение.  Я правильно понимаю, что при выполнении текущаядата() на клиенте, получаем дату клиента. А на сервере (в клиент-серверном) – дату на сервере? Если так, то логичнее получать дату сервера. В общем модуле к-рый вызовется из модуля управляемого приложения. Жаль, что в файловом нельзя получать текущую дату другого компьютера. И еще, я не совсем понимаю смысл  ТекущаяДатаСеанса(), ТекущаяУниверсальнаяДата().

    • >Я правильно понимаю, что при выполнении текущаядата() на клиенте, получаем дату клиента. А на сервере (в клиент-серверном) – дату на сервере?
      Правильно.
      ТекущаяДата() всегда возвращает текущее время того компьютера, на котором выполняется.
      В файловом варианте – всегда время текущего компьютера.
      В клиент-серверном варианте, если она выполняется на клиенте – будет время клиента, если на сервере – будет время сервера.
      >И еще, я не совсем понимаю смысл ТекущаяДатаСеанса(), ТекущаяУниверсальнаяДата().
      Последний метод учитывает установленный часовой пояс текущего сеанса.

    • А если сервер в другом часовом поясе, еще и привести к поясу клиента надо. Или не заморачиваться и брать время клиента сразу.

  28. Отчет обязательно должен быть одним комментарием?

  29. Задание сделал, алгоритм примерно такой же как и у многих. Создал общий модуль с компиляцией на клиенте в ней процедуру:
    Функция ПроверитьВозможностьЗапуска() Экспорт

    НачалоРабочегоДня = НачалоДня(ТекущаяДата())+9*3600+5*60+38;
    КонецРабочегоДня = НачалоДня(ТекущаяДата())+18*3600+11*60+42;

    Если ТекущаяДата()>=НачалоРабочегоДня И ТекущаяДата()<=КонецРабочегоДня Тогда
    Возврат Истина
    Иначе
    Возврат Ложь;
    КонецЕсли;

    КонецФункции // ПроверитьВозможностьЗапуска()
    В модуле управляемого приложения:
    Перем ГлОбед Экспорт;

    Процедура ПередНачаломРаботыСистемы(Отказ)
    ВозможностьРаботы = ОбщийМ.ПроверитьВозможностьЗапуска();
    Если ВозможностьРаботы = Ложь Тогда
    Предупреждение(“Запуск программы в нерабочее время не возможен!”,30,”Ошибка!”);
    Отказ=Истина;
    Иначе
    ВыбратьОбед();
    КонецЕсли;
    КонецПроцедуры

    Процедура ПередЗавершениемРаботыСистемы(Отказ)
    ПравомерностьВыхода = ОбщийМ.ПроверитьВозможностьЗапуска();
    Если ПравомерностьВыхода=Истина Тогда
    Ответ = Вопрос(“Рабочий день еще не закончился! Вы действительно хотите выйти?”, РежимДиалогаВопрос.ДаНет);
    Если Ответ=КодВозвратаДиалога.Нет Тогда Отказ=Истина;
    КонецЕсли;
    КонецЕсли;
    КонецПроцедуры

    Процедура ВыбратьОбед()

    Обед = Новый СписокЗначений;
    Обед.Добавить(“Курица”);
    Обед.Добавить(“Рыба”);
    Обед.Добавить(“Мясо”);

    Если Обед.ОтметитьЭлементы(“Выберите обед”) Тогда
    ГлОбед = Новый Массив;
    Для каждого Элемент Из Обед Цикл
    Если Элемент.Пометка = Истина Тогда
    ГлОбед.Добавить(Элемент.Значение);
    КонецЕсли;
    КонецЦикла;
    КонецЕсли;
    КонецПроцедуры
    В целом очень понравился материал про контекст, хотя бы более менее стало понятно, хотя конечно практика и еще раз практика

  30. Сергей Войстрик 13.11.2010 в 01:23

    // Проверка времени входа-выхода. Создаем клиентский общий модуль «ПроверкаВремениВходаВыхода». Текст модуля:
    Процедура ПроверкаВремениВхода(Отказ) Экспорт
    Отказ = ТекущаяДата() < Дата(Формат(ТекущаяДата(),”ДФ=ггггММдд”)+”090538″) или ТекущаяДата() > Дата(Формат(ТекущаяДата(),”ДФ=ггггММдд”)+”181142″);
    Если Отказ Тогда
    Предупреждение(“В нерабочее время доступ закрыт!”);
    КонецЕсли;
    КонецПроцедуры
    Процедура ПроверкаВремениВыхода(Отказ) Экспорт
    Если ТекущаяДата() < Дата(Формат(ТекущаяДата(),”ДФ=ггггММдд”)+”181142″) Тогда
    Отказ = Вопрос(“Вы действительно желаете закрыть программу?”,РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Нет;
    КонецЕсли;
    КонецПроцедуры
    // В модулях управляемого приложения и обычного приложения вызываем проверки:
    Процедура ПередНачаломРаботыСистемы(Отказ)
    ПроверкаВремениВходаВыхода.ПроверкаВремениВхода(Отказ);
    КонецПроцедуры
     
    Процедура ПередЗавершениемРаботыСистемы(Отказ)
    ПроверкаВремениВходаВыхода.ПроверкаВремениВыхода(Отказ);
    КонецПроцедуры
    // Проверка обедов. Модуль управляемого приложения:
    Перем глОбед Экспорт;
    Процедура ПриНачалеРаботыСистемы()
    Меню = Новый СписокЗначений;
    Меню.Добавить(“Курица”);
    Меню.Добавить(“Рыба”);
    Меню.Добавить(“Мясо”);
    Если Меню.ОтметитьЭлементы(“Что сегодня на обед?”) Тогда
    глОбед = Новый Массив;
    Для Каждого Блюдо Из Меню Цикл
    Если Блюдо.Пометка Тогда
    глОбед.Добавить(Блюдо.Значение);
    КонецЕсли;
    КонецЦикла;
    КонецЕсли;
    КонецПроцедуры

  31. Задание выполнил:
    Создал общий модуль выполняющийся на сервере с возможностью вызова.
    В модуле описал Экспортную функцию  «ПроверкаРежима»  которая возвращает истину или ложь в зависимости от того падает ли время запуска в интервал работы.
    В модуле Управляемого приложения создал процедуры обработчиков событий. ПередНачаломРаботыСистемы, ПриНачалеРаботыСистемы, ПередЗавершениемРаботыСистемы.
    И объявил глобальный массив глОбед
    В процедуре «ПередНачаломРаботыСистемы». Вызывал функцию «ПроверкаРежима»  из общего модуля. Функция дает значение ИСТИНА или ЛОЖЬ результат передавал в параметра «Отказ» процедуры обработчика. И выдолвал сообщение пользователю Интерактивной функцией «Вопрос».
    В процедуре «ПриНачалеРаботыСистемы» Создал «Список» в него добавлял значения методом «Добавить»  далее вызвал метод Списка   ОтметитьЭлементы. Пользователь выбирал элементы.
    В цикле ДЛЯ КАЖДОГО ИЗ перебирал помеченные элементы используя свойства ЭлементаСпискаЗначений.Пометка  и передавал их в массив глОбед.
    В процедуре «ПередЗавершениемРаботыСистемы»
    Вызывал функцию «ПроверкаРежима»  из общего модуля. Функция дает значение ИСТИНА или ЛОЖЬ результат  менял на обратный (опретором  НЕ)  и передавал в параметр «Отказ» процедуры обработчика. Также добавил условие которое  срабатывало по значению параметра « отказ» в условии задавал Вопрос пользователю в с режимом ДА,НЕТ результат вопроса преобразовывал с помощь условия ЕСЛИ в истину или ложь и передавал в параметр «отказ».
    Сложность: Задание не трудное. Контекст моделей очень подробно объяснен в урока. Но сразу запомнить все сложно, повторение уроков и синтакс-помощник  очень помогают.

  32. Sergey.Volkov 12.11.2010 в 17:57

    1) СОздал функцию ПроверкаРабочегоВремени(), которая проверяет является ли день выходным и то, что текущее время больше 9.00 и меньше 18.00. Эту функцию вызываю в процедуре ПриНачалеРаботыСистемы() модуля приложения.
    Если время нерабочее выполняется следующее:
    Предупреждение(“Нерабочее время”);
    Exit();
    2) Для запроса пользователя применяю резвизит формы “ВариантыОбеда” с типом СписокЗначений и метод его ВыбратьЭлемент(). Запоминаю выбранное в глобальной переменной.
    3) Для проверки окончания рабочего дня использую процедуру ПередЗавершениемРаботыСистемы(Отказ) модуля приложения, в которой присваиваю аргументу Отказ значение истина или ложь в зависимости от выбора пользователя в диалоговом окне Вопрос().

  33. Выкладываю решение в более читабельном виде (с тегами). Просьба удалить предыдущий пост.
    1. Создал константы НачалоРабочегоДня и ОкончаниеРабочегоДня, поместил в них соответствующие значения.

    2. Создал общий модуль ОбщийМодульКонстанты с установленным свойством «ВызовСервера» и поместил в него экспортную функцию:

    Функция ПолучитьЗначениеКонстанты(ИмяКонстанты) Экспорт 

    Возврат Константы[ИмяКонстанты].Получить();

    КонецФункции

    3. В модуле управляемого приложения:
    создал экспортную переменную глОбед;
    для проверки времени входа пользователя в программу использовал обработчик события ПередНачаломРаботыСистемы:

    Процедура ПередНачаломРаботыСистемы(Отказ)

    ВремяНачала =    ОбщийМодульКонстанты.ПолучитьЗначениеКонстанты  («НачалоРабочегоДня»); 
    ВремяОкончания = ОбщийМодульКонстанты.ПолучитьЗначениеКонстанты(«ОкончаниеРабочегоДня»);

    Если (Формат(ТекущаяДата(), "ДЛФ=В; ДФ=ЧЧммсс") &lt; Формат(ВремяНачала, "ДЛФ=В; ДФ=ЧЧммсс")) ИЛИ
    (Формат(ТекущаяДата(), "ДЛФ=В; ДФ=ЧЧммсс") &gt; Формат(ВремяОкончания, "ДЛФ=В; ДФ=ЧЧммсс")) Тогда

    Предупреждение("Сейчас нельзя заходить в систему!");
    Отказ = Истина;

    КонецЕсли;

    КонецПроцедуры

    для проверки времени выхода пользователя из программы использовал обработчик события ПередЗавершениемРаботыСистемы:

    Процедура ПередЗавершениемРаботыСистемы(Отказ)

    ВремяНачала = ОбщийМодульКонстанты.ПолучитьЗначениеКонстанты(«НачалоРабочегоДня»);
    ВремяОкончания = ОбщийМодульКонстанты.ПолучитьЗначениеКонстанты(«ОкончаниеРабочегоДня»);

    Если (Формат(ТекущаяДата(), «ДЛФ=В; ДФ=ЧЧммсс») &lt; Формат(ВремяОкончания, «ДЛФ=В; ДФ=ЧЧммсс»)) Тогда

    Ответ = Вопрос(«Рабочий день еще не закончен! Продолжить работу?», РежимДиалогаВопрос.ДаНет, 10); 

    Если (Ответ = КодВозвратаДиалога.Да) Тогда
    Отказ = Истина;
    КонецЕсли;

    КонецЕсли;

    КонецПроцедуры

    выбор варианта обеда реализовал в обработчике события ПриНачалеРаботыСистемы(): 

    Процедура ПриНачалеРаботыСистемы()

    глОбед = Новый Массив;

    Меню = Новый СписокЗначений;
    Меню.Добавить(«Курица»);
    Меню.Добавить(«Рыба»);
    Меню.Добавить(«Мясо»);

    Если Меню.ОтметитьЭлементы(«Выберите вариант обеда») Тогда
    Для Каждого Элемент Из Меню Цикл
    Если Элемент.Пометка Тогда
    глОбед.Добавить(Элемент.Значение);
    КонецЕсли; 
    КонецЦикла; 
    КонецЕсли;
  34. SelyukovDm 12.11.2010 в 17:17

    Перем глОбед Экспорт;
    Процедура ПередНачаломРаботыСистемы(Отказ)
    НачалоРабочегоДня = Дата(Год(ТекущаяДата()),Месяц(ТекущаяДата()),День(ТекущаяДата()),9,5,38);
    Если ТекущаяДата() < НачалоРабочегоДня Тогда
    Предупреждение(“Сейчас заходить в конфигурацию нельзя!”);
    Отказ = Истина;
    КонецЕсли;
    КонецПроцедуры
    Процедура ПриНачалеРаботыСистемы()
    СписокВариантов = Новый СписокЗначений;
    СписокВариантов.Добавить(“Курица”);
    СписокВариантов.Добавить(“Рыба”);
    СписокВариантов.Добавить(“Мясо”);
    Если СписокВариантов.ОтметитьЭлементы(“Какой вариант обеда он предпочитаете?”) Тогда
    глОбед = Новый Массив;
    Для каждого Элемент Из СписокВариантов Цикл
    Если Элемент.Пометка Тогда
    глОбед.Добавить(Элемент.Значение);
    КонецЕсли;
    КонецЦикла;
    КонецЕсли;
    КонецПроцедуры
    Процедура ПередЗавершениемРаботыСистемы(Отказ)
    КонецРабочегоДня = Дата(Год(ТекущаяДата()),Месяц(ТекущаяДата()),День(ТекущаяДата()),18,11,42);
    Если ТекущаяДата() < КонецРабочегоДня Тогда
    Отказ = Вопрос(“Вы желаете покинуть систему до окончания рабочего дня?”, РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Нет;
    КонецЕсли;
    КонецПроцедуры
    Перем глОбед Экспорт;
    Процедура ПередНачаломРаботыСистемы(Отказ) НачалоРабочегоДня = Дата(Год(ТекущаяДата()),Месяц(ТекущаяДата()),День(ТекущаяДата()),9,5,38); Если ТекущаяДата() < НачалоРабочегоДня Тогда Предупреждение(“Сейчас заходить в конфигурацию нельзя!”); Отказ = Истина; КонецЕсли;КонецПроцедуры
    Процедура ПриНачалеРаботыСистемы() СписокВариантов = Новый СписокЗначений; СписокВариантов.Добавить(“Курица”); СписокВариантов.Добавить(“Рыба”); СписокВариантов.Добавить(“Мясо”); Если СписокВариантов.ОтметитьЭлементы(“Какой вариант обеда он предпочитаете?”) Тогда глОбед = Новый Массив; Для каждого Элемент Из СписокВариантов Цикл Если Элемент.Пометка Тогда глОбед.Добавить(Элемент.Значение); КонецЕсли;  КонецЦикла; КонецЕсли; КонецПроцедуры
    Процедура ПередЗавершениемРаботыСистемы(Отказ) КонецРабочегоДня = Дата(Год(ТекущаяДата()),Месяц(ТекущаяДата()),День(ТекущаяДата()),18,11,42); Если ТекущаяДата() < КонецРабочегоДня Тогда Отказ = Вопрос(“Вы желаете покинуть систему до окончания рабочего дня?”, РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Нет; КонецЕсли;КонецПроцедуры

  35. Задание выполнено.
    В модуле управляемого приложения создал три глобальные переменные глОбед, НачалоРабочегоДня, ОкончаниеРабочегоДня.
    Время начала и окончания рабочего дня задал как строки при инициализации модуля.
    Первую часть задания реализовал в предопределенной процедуре ПередНачаломРаботыСистемы. Текущее время определил как СтрЗаменить(Формат(ТекущаяДата(), “ДЛФ=В”), “:”, “”);
    Если текущее время не попадает в интервал (НачалоРабочегоДня, ОкончаниеРабочегоДня), то Отказ=Истина.
    Вторую часть задания реализовал в предопределенной процедуре ПриНачалеРаботыСистемы. Заполнил список значений, предложил отметить нужное (метод ОтметитьЭлементы()) и перекинул выбор в глОбед по условию ЭлементСЗ.Пометка=Истина.
    Третью часть задания реализовал в предопределенной процедуре ПередЗавершениемРаботыСистемы. Всё аналогично с первой частью, только Отказ=Истина при условии вхождения ТекущееВремя в заданный интервал и нажатии кнопки “Нет” в вопросе.
    Код продублировал в модуле обычного приложения.

  36. Задание сделал, список обеда выводил с указанием дня обеда ))) после 12-00 обед планируется на следущий день с проверкой выходного/праздничного дня по календрю.

  37. В Модуле управляемого приложения создал экспортную переменную глОбед. Там же реализовал и весь код.  Правда сначала сделал выбор значения для переменной глОбед в Общем модуле (с установленном флагом выполнения на клиенте). Но из-за того что там не доступны экспортируемые переменные пришлось создавать аналог массива глОбед, и его возвращать, решил сделать проще и перенес код процедуры в модуль управляемого приложения (там доступен контекст работы на клиенте, который нужен для создания окна ОтметитьЭлементы). Хотя в синтаксис помошнике и читаю что ОтметитьЭлементы доступен на сервере но при попытке вызова данной функции в контексте сервера вываливается по ошибке что не может создать окно (оно и понятно это же диалог который должен создаваться только на клиенте). Это ошибка в синтаксис помошнике или я не знаю как использовать  ОтметитьЭлементы на сервере? Для анализа время работы конфигурации использовал процедуры ПередНачаломРаботыСистемы(Отказ) и ПередЗавершениемРаботыСистемы(Отказ). Время входа анализировал следующим образом

    ВремяНачала = 9*3600+05*60+38;
    ДатаВремяВхода = НачалоДня(ТекущаяДата())+ВремяНачала;
    если ТекущаяДата()<ДатаВремяВхода тогда
    Предупреждение(“Вход в систему запрещен!”,0,”Не рабочее время”);
    Отказ = Истина;
    конецЕсли;    

    Аналогично анализировал время выхода (только вместо Предупреждение использовал функцию Вопрос).

  38. Задание выполнила. Приблизительно, как все. Понравились и уроки и задание.
    Самое “неинтересное” заполнение массива в цикле перебором строк СпискаЗначений. По-другому нельзя?

  39. Елена Остапчук 12.11.2010 в 02:20

    Задание выполнила следующим образом:
    В Модуле управляемого приложения
    1. Объявила глобальную переменную Обед;
    2. Процедура  ПередНачаломРаботыСистемы. Текущие время, для сравнения с графиком,  получила через функцию ТекущаяДата. Преобразовала в число. Далее полученное число сравниваю со значениями начала и окончания работы по графику, если не попадает в интервал, вывожу предупреждение. Отказ = Истина;
    3. Процедура ПередЗавершениемРаботыСистемы. Аналогично предыдущей, вместо Предупреждения используется Вопрос;
    4. Процедура ПриНачалеРаботыСистемы. Создаем список значений, заполняем. Определяем тип переменной Обед – массив. С помощью метода ОтметитьЭлементы производим выбор значений.