Базовый курс. Занятие №4

Занятие по 1-му блоку базового курса.

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

Также нужно выполнить домашнее задание, текст которого доступен на странице.

Задание необходимо выполнять в ИБ после предыдущего ДЗ.

В этой же теме необходимо написать отчет о выполнении задания.

ps. Участники курса без доступа в мастер-группу отчитаться по домашним заданиям не получиться.

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

Если не активировали токен — посмотрите видео-инструкцию (видео N5)

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

комментариев 126 на “Базовый курс. Занятие №4”

  1. Валентина 28.03.2011 в 20:01

    Задание выполнено, правда не без помощи. Просмотр вашего решения показал, что кое-какие нюансы были не учтены при выполнения задания мной (в целом решение совпало). В частности, забыла реализовать задачу в толстом клиенте, и про учет часовых поясов (вообще об этом не подумала – за что вам большое спасибо).

  2. Задание 4 выполнено.
    Трудностью было попытка сделать выбор обеда через обработку. Так и не удалось в управляемом режиме это сделать. Пересмотрел материал и сделал через “ОтметитьЭлементы”

  3. Задание выполнил.
    Но не обошлось без грабель совсем забыл про толстого клиента и “по проще” все сделано. Понял что нужно более вдумчивей подходить к выполнению заданий.
    Со структурой для 1000 вначале не понял в чем ошибка хотя в 3 задании уже работал с функцией формат где убирал символ НПП. Но отладчик помог.
    Перем глНачалоРабочегоДня Экспорт;
    Перем глКонецРабочегоДня Экспорт;
    Перем глОбед Экспорт;
    Процедура ПередНачаломРаботыСистемы(Отказ)
     глНачалоРабочегоДня = (9 * 3600) + (5 * 60) + 3;
     глКонецРабочегоДня = (18 * 3600) + (11 * 60) + 42;
     
     пЧас = Час(ТекущаяДата());
     пМинута = Минута(ТекущаяДата());
     пСекунда = Секунда(ТекущаяДата());
     
     Если ((пЧас * 3600) + (пМинута * 60) + пСекунда) < глНачалоРабочегоДня Тогда
      Предупреждение(“Текущее время ” + Прав(ТекущаяДата(), 8) +
          “. Сейчас заходить в конфигурацию нельзя. Разрешенное время входа после 9:05:38”, 10);
      Отказ = Истина;
     
     КонецЕсли;
    КонецПроцедуры

    Процедура ПередЗавершениемРаботыСистемы(Отказ)
     пЧас = Час(ТекущаяДата());
     пМинута = Минута(ТекущаяДата());
     пСекунда = Секунда(ТекущаяДата());
     
     Если глНачалоРабочегоДня < ((пЧас * 3600) + (пМинута * 60) + пСекунда) Тогда
      Режим = РежимДиалогаВопрос.ДаНет;
      Ответ = Вопрос(“Текущее время ” + Прав(ТекущаяДата(), 8) +
          “. Рабочий день заканчивается 18:11:42” +
          “. Вы действительно хотите выйти из программы?”, Режим,);
      Если Ответ = КодВозвратаДиалога.Нет Тогда
       Отказ = Истина;
      КонецЕсли;
     КонецЕсли;
     
    КонецПроцедуры
    Функция ВыбратьОбед()
     
    КонецФункции //
    Процедура ПриНачалеРаботыСистемы()
     глОбед = Новый Массив;
     
     СписокОбедов = Новый СписокЗначений;
     СписокОбедов.Добавить(“Курица”, “Курица”);
     СписокОбедов.Добавить(“Рыба”, “Рыба”);
     СписокОбедов.Добавить(“Мясо”, “Мясо”);
     
     Пока 1 = 1 Цикл
      Если глОбед.Количество() = 0 Тогда
       Если СписокОбедов.ОтметитьЭлементы(“Выберите обед.”) Тогда
           Для каждого Элемент из СписокОбедов Цикл
         Если Элемент.Пометка Тогда
          глОбед.Добавить(Элемент.Значение);
               КонецЕсли;
        КонецЦикла;
       КонецЕсли;
      Иначе
       Прервать;
      КонецЕсли;
     КонецЦикла;
     
     Числа = Новый Структура;
     Числа.Вставить(“Число1”, “Простое”);
     Числа.Вставить(“Число2”, “Простое”);
     
     Для Сч = 3 По 999 Цикл
      
      Для Сч2 = 2 По Сч – 1 Цикл
       
       Если Сч%Сч2 = 0 Тогда
        Числа.Вставить(“Число” + Формат(Сч, “ЧГ=0”), “Не простое”);
        Прервать;
        КонецЕсли;
       КонецЕсли;
       
      КонецЦикла;
      
     КонецЦикла;
     
     Сообщить(Числа.Число591);
     
     ХХХ = “Число332”;
     Сообщить(Числа[ХХХ]);
    КонецПроцедуры

  4. Олег Степанов 03.03.2011 в 13:39

    1. Проверка рабочего времени при входе в конфигурацию

    В модуле управляемого приложения:

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

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

    2. Выбор обеда для пользователя

    В модуле управляемого приложения:

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

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

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

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

    3. Проверка времени выхода пользователя из системы

    В модуле управляемого приложения:

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

    4. Заполнение структуры “Числа”

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

    Функция ЗаполнениеСтруктурыЧисла()
    Числа = Новый Структура;
    Для ш = 1 по 1000 Цикл
    Числа.Вставить(“Число”+Формат(ш,”ЧГ=”),ЭтоПростоеЧисло(ш));
    КонецЦикла;
    Возврат Числа;
    КонецФункции

    Функция ЭтоПростоеЧисло(ш)
    Результат = “Простое”;
    Для ф=2 по Цел(sqrt(ш)) Цикл
    Если ш % ф = 0 Тогда
    Результат = “Не простое”;
    Прервать;
    КонецЕсли;
    КонецЦикла;
    Возврат Результат;
    КонецФункции

    5. Обработка, которая проверяет на простоту введенное число

    // Чис – параметр типа “Число” на форме
    Процедура Проверить(Команда)
    НайденноеЗначение=””;
    Если Числа.Свойство(“Число”+Формат(Чис,”ЧГ=”),НайденноеЗначение) Тогда
    Результат = НайденноеЗначение;
    Иначе
    Результат = “Поддерживаются только числа от 1 до 1000”;
    КонецЕсли;
    КонецПроцедуры

  5. В процедуре ПередНачаломРаботыСистемы выставил проверку времени из процедуры ТекущееВремя, в случае несоответствия Отказ = Истина, значения ввремени записал в локальных переменных процедуры. Ну и соответственно в ПередЗавершениемРаботы Системы выставил проверку рабочего времени функцией Вопрос, по результатам ее выполнения значение переменной Отказ выставляется в Истина, либо не изменяется.
    Текст кода основного задания привожу ниже:
    <code>
    Процедура ПриНачалеРаботыСистемы()
     Меню = Новый СписокЗначений;
     Меню.Добавить(“Курица”);
     Меню.Добавить(“Рыба”);
     Меню.Добавить(“Мясо”);
     ХотьОдинЭлементОтмечен = Ложь;
     Пока НЕ ХотьОдинЭлементОтмечен Цикл
      Меню.ОтметитьЭлементы(“Выберите ваш обед:”);
      Для Каждого Элемент Из Меню Цикл
       Если Элемент.Пометка Тогда
        ХотьОдинЭлементОтмечен = истина;
       КонецЕсли;
      КонецЦикла; 
     КонецЦикла;
     ГлОбед = Новый Массив;
     Для Каждого Элемент Из Меню Цикл
      Если Элемент.Пометка Тогда
       ГлОбед.Добавить(Элемент.Значение);
      КонецЕсли;
     КонецЦИкла;
     
     Числа = Новый Структура;
     Нач = 1;
     Для ы = 1 По 1000 Цикл
      Если (Нач+1) % ы=0 Тогда
       Числа.Вставить(СтрЗаменить(“Число”+ы,Символ(160),””), “Простое”);  
      Иначе
       Числа.Вставить(СтрЗаменить(“Число”+ы,Символ(160),””), “Непростое”);
      КонецЕсли;
     
        Нач = Нач* ы;
    КонецЦикла;
    </code>
    Задание с заполнением отметок относительно простое, а вот число 1000 оказалось действительно очень непростым числом. Как только я не бился, я потом посмотрел значение разделителя числа 1000 через КодСимвола() в отладчике, ну и заменил тот символ, который был в разделителе, на пустое значение. А вот объяснение сего порадокса услышал только от автора курса…теперь вижу, какие иногда хитрые особенности бывают….

  6. Сильно отстал в связи с отпуском :) Но, пока половина отпуска осталась спешно догоняю… Задание выполнено.  Сложностей не возникло. Небольшая заминка произошла с структурой (тысячным элементом),  но в отладке всё исправил.

  7. Опоздал с решением. Вернулся из командировки.
    По графику работы – сравнивал значение функции с вычисленными значениями границ рабочего дня:
    Процедура ПередНачаломРаботыСистемы(Отказ)
    Момент = ТекущаяДата();
    РабочийДеньНачало = НачалоДня(Момент) + 9*60*60 + 5*60 + 38;
    РабочийДеньКонец = НачалоДня(Момент) + 18*60*60 + 11*60 + 42;

    Если Момент < РабочийДеньНачало ИЛИ Момент > РабочийДеньКонец Тогда
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = “В нерабочее время работа не возможна!”;
    Сообщение.Сообщить();
    Отказ = Истина;
    КонецЕсли;
    КонецПроцедуры
     
    Перед завершением работы сделал аналогичную процедуру, но с диалогом Вопрос.
    По обедам – сделал общую форму с реквизитом списокОбедов, заполнял реквизит в ф-ии ПриСозданииНаСервере. На форме в списке вывел пометки. В процедуре формы ПередЗакрытием заполнял переменную глОбед (объявлена в модуле упр. приложения) и если массив оставался пустой – отказывал в закрытии формы. Форма открывалась модально из функции ПриНачалеРаботыСистемы.
     
    Задание по структуре чисел выполнил – заполнил структуру циклом “Для”, номера преобразовывал функцией Формат(й, “ЧГ=”), тут же определял простое/не простое. Обращение к данным проверил в отладчике, немного запутался с ключом в переменной, но разобрался.
     
    Буду дальше догонять группу.

  8. eavechorek 08.02.2011 в 01:16

    Вход пользователя в систему обработала следующим образом:
    <code>Процедура ПередНачаломРаботыСистемы(Отказ)

    ВремяВхода = 32738;
    //при входе в систему проверим время начала работы
    ЧасВхода = Час(ТекущаяДата());
    МинутаВхода = Минута(ТекущаяДата());
    СекундаВхода = Секунда(ТекущаяДата());

    Если  ВремяВхода > (ЧасВхода * 3600 + МинутаВхода * 60 + СекундаВхода) Тогда
    Предупреждение(“Сейчас заходить в систему нельзя.”,,);
    Отказ = Истина;
    КонецЕсли;
    КонецПроцедуры
    </code>
    где ВремяВхода -это 9:05:38, переведенные в секунды.
    После успешного входа в систему, предлагаю выбрать меню, в проц. ПриНачалеРаботыСистемы():
    <code>
    ИнтерактивыйВыборОбеда.ВыборОбеда();
    Для Каждого Элемент Из глОбед Цикл
    Сообщить(Элемент);
    КонецЦикла;
    </code>
    где Перем глОбед Экспорт;
    а ИнтерактивыйВыборОбеда – общий модуль, выполняемый на клиенте
    <code>Процедура ВыборОбеда() Экспорт

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

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

    Если Меню.ОтметитьЭлементы(“Выбор обеда”) Тогда
    Для Каждого Элемент из Меню Цикл
    Если Элемент.Пометка Тогда
    //Сообщить(Элемент.Значение);
    глОбед.Добавить(Элемент.Значение);
    КонецЕсли;
    КонецЦикла;
    Иначе
    Предупреждение(“Вы должны что-нибудь выбрать”,3);
    ИнтерактивыйВыборОбеда.ВыборОбеда();
    КонецЕсли;
    КонецПроцедуры // ВыборОбеда()</code>
    Выход из системы аналогичен входу – время официального окончания работы системы перевела в секунды
    <code>Процедура ПередЗавершениемРаботыСистемы(Отказ)
    ВремяВыхода = 65502;
    //при выходе из систему проверим время окончания работы
    ЧасВыхода = Час(ТекущаяДата());
    МинутаВыхода = Минута(ТекущаяДата());
    СекундаВыхода = Секунда(ТекущаяДата());

    Если  ВремяВыхода > (ЧасВыхода * 3600 + МинутаВыхода * 60 + СекундаВыхода) Тогда

    Ответ = Вопрос(“Вы действительно хотите закончить работу в системе?”,РежимДиалогаВопрос.ДаНет);
    Если Ответ = КодВозвратаДиалога.Нет Тогда
    Отказ = Истина;
    КонецЕсли;
    КонецЕсли;
    КонецПроцедуры</code>
    Почему-то дома процедура не захотела работать, а на работе моментально начала реагировать :о)
    Простые – составные числа:
    <code>
    Числа = Новый Структура(“Число1,Число2″,”Простое”,”Простое”);
    Делений = 0;
    Для i = 3 По 1000 Цикл
    Ключ = “Число” + СокрЛП(i);
    НайденноеЗначение = “”;
    Если (i%2 = 0) И (i <> 2) Тогда
    Числа.Вставить(Ключ,”Непростое”);
    Иначе
    Для j = 1 По i Цикл
    Делений = ?(i%j = 0,Делений + 1,Делений);
    j = j + 1;
    КонецЦикла;
    КакоеЧисло =  ?(Делений = 2,”Простое”,”Непростое”);
    Числа.Вставить(Ключ,КакоеЧисло);
    Делений = 0;
    КонецЕсли;
    Числа.Свойство(Ключ,НайденноеЗначение);

    Сообщить(СокрЛП(i) + ” ” + НайденноеЗначение);
    КонецЦикла;
    </code>
    Когда дохожу до i = 1000, получаю ошибку:
    {МодульУправляемогоПриложения(40)}: Ошибка при вызове метода контекста (Вставить)
    Числа.Вставить(Ключ,”Непростое”);
    Задано неправильное имя атрибута структуры
    1000 записей для структурц много? i = 999 отрабатывает нормально.

    • >1000 записей для структурц много?
      Отнюдь.
      Количество записей в структуре условного неограниченно.
      А вот ключ должен удовлетворять требованиям идентификатора, чего не происходит для последнего элемента в вашей структуре.
      См. решение задания.

  9. Перем глОбед Экспорт;

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

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

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

    Функция ТекущееВремя()
    Дата = ТекущаяДата();
    Час = Час(Дата);
    Минута = Минута(Дата);
    Секунда = Секунда(Дата);
    Возврат Дата(1,1,1,Час,Минута,Секунда);
    КонецФункции

    Процедура СтруктураСЧислами()
    СтруктураТиповЧисел = Новый Структура;
    Для Индекс = 1 По 1000 Цикл
    ТипЧисла = “Простое”;
    Если Индекс < 10 Тогда
    Для Индекс2 = 2 По 9 Цикл
    Если Индекс%Индекс2 = 0 И Индекс <> Индекс2 Тогда
    ТипЧисла = ” Не простое”;
    КонецЕсли;
    КонецЦикла;
    Иначе
    Если Индекс%2 = 0 Или Индекс%3 = 0 Или Индекс%5 = 0
    Или Индекс%7 = 0 Или Индекс%9 = 0 Тогда
    ТипЧисла = ” Не простое”;
    КонецЕсли;
    КонецЕсли;
    СтруктураТиповЧисел.Вставить(“Число” + Формат(Индекс, “ЧГ=0”), ТипЧисла);
    КонецЦикла;
    КонецПроцедуры

  10. Решение:
    1. Проверка соответствия текущего                              времени рабочему при входе в систему               (Обработка События – Перед Началом                 Работы Системы):
     
    – создал переменную «Текущее время»
    – присвоил ей значение текущего времени (для получения тек. времени использовал функцию «ТекущаяДата»)
    – создал две переменные «ВерхняяГраница» и «НижняяГраница»
    – присвоил им значения  соответственно – 9:05:38 и 18:11:42
    – для этого использовал функцию «НачалоДня» (пример: НижняяГраница = НачалоДня(ТекущееВремя)+9*60*60+5*60+38)
    – Создал условный оператор Если …… Тогда  ……
    – Если «Текущее время» меньше «НижнейГраницы» ИЛИ больше  «ВерхнейГраницы» тогда параметру «Отказ» присваивается значение «ИСТИНА»
    2. Выбор обеда (Обработка События –                        При Начале Работы Системы):
    – с помощью конструктора «Новый», создал экземпляр класса СписокЗначений
    – с помощью метода «Добавить» добавил в Список Значений три варианта обеда
    – с помощью интерфейсного метода «ОтметитьЭлементы», вызываю окно выбора вариантов обеда
    – с помощью Цикла по условию «Пока …… Цикл» проверяю выбрал ли пользователь хотя бы 1 вариант обеда
    – Пока пометки всех 3-х элементов списка = ложь (ВидыОбеда[0].Пометка= Ложь И ВидыОбеда[1].Пометка= Ложь И ВидыОбеда[2].Пометка=Ложь), вызывается окно предупреждения и вновь идет обращение к интерфейсному методу «ОтметитьЭлементы»
    3. Передача значений СпискаЗначений в                глобальную переменную – массив                            (Обработка События – При Начале                           Работы Системы):
    – в разделе Объявления переменных, объявляю экспортную переменную «глОбед»;
    – с помощью конструктора «Новый» создаю экземпляр класса «Массив» и присваиваю его глобальной переменной «глОбед»
    – создаю «Цикл по счетчику» от 0 до 2 в теле цикла создаю условный оператор «Если … Тогда»
    – При условии, что «Пометка» в строке СпискаЗначений = Истина (ВидыОбеда[Счетчик].Пометка = истина), методом «Добавить» добавляю в массив данную стоку (глОбед.Добавить(ВидыОбеда[Счетчик]);)
    4. Проверка на окончание рабочего дня                      при выходе из системы  (Обработка                        События – Перед Завершением                                    Работы Системы):
    – создал переменную «Текущее время»
    – присвоил ей значение текущего времени (для получения тек. времени использовал функцию «ТекущаяДата»)
    – создал переменную «ВерхняяГраница»
    – присвоил ей значение  18:11:42
    – для этого использовал функцию «НачалоДня» (пример: ВерхняяГраница = НачалоДня(ТекущееВремя)+18*60*60+11*60+42)
    – Создал два условных оператора «Если …… Тогда  ……», один вложен в другой
    – Если «Текущее время» меньше «ВерхнейГраницы»  = Истина, тогда Если в окне вопроса «Выйти из системы до окончания рабочего дня?»(Да/Нет) выбран ответ «Да», тогда параметру «Отказ» присваивается значение «ИСТИНА»
    5. Создание и заполнение «Структуры»                      Числа (Раздел основной программы)
    В википедии нашел условие при котором  число является простым, цитата … «Натуральное p > 1 является простым тогда и только тогда, когда (p − 1)! + 1 делится на p (теорема Вильсона).»
     
    – создаю Структуру «Числа»
    – с помощью метода Вставить добавляю первую запись в Структуру «Числа»  для Число1 = 1 (Числа.Вставить(“Число1”, “Не простое”))
    – таким же образом вставляю 2-ю запись для Число1000 – Не простое (т.к. почему то в цикле …. Когда счётчик становиться равен 1000, вылетает ошибка «Не верный параметр»)
    -для расчёта факториала создаю переменную «Факториал» равную единице
    – создаю Цикл по счетчику от 1 до 998 (меньше на 1-у единицу т.к. факториал нужно считать для p-1)
    – далее в теле цикла считаю факториал
    – ввожу переменную Параметр, равную Счетчик+1 (это и есть номер строки в Структуре)
    – с помощью метода «Вставить» вставляю в строку в Структуру
    – первый параметр («Ключ») метода вставить = “Число”+Строка(Параметр)
    – в качестве второго параметр («Значение») метода вставить указываю функцию «ПроверкаНаПростоеЧисло», в которую передаю 2 параметра: 1-й это «Факториал», 2-ой это «Параметр»
    – в функции создаю переменную равную «ОстатокОтДеления= (Факториал+1)%(Параметр);»
    – далее создаю условный оператор, который при условии, что переменная ОстатокОтДеления =0 возвращает «Простое», иначе «Не простое»
    6. Обращение к данным структуры по                        известному ключу (Раздел основной                      программы):
    создал переменную X
    присвоил ей значение «Числа.Число591»
    – в табло при отладке вывел переменную «X» и  убедился, что её значение = «Не простое», то есть обращение прошло
    7. Обращение к данным структуры по                        ключу в переменной (Раздел                                          основной программы):
    покопался в синтакс-помощнике, почитал о необязательном параметре метода Структуры «Свойство», (В данный параметр возвращается найденное значение)
    – создал переменную Y и присвоил ей значение “Число332”
    создал переменную Z и присвоил ей  = Числа.Свойство(Y,Q)
    программа ругнулась, что переменная Q – не объявлена, объявил её в соответствующем разделе модуля
    при отладке вывел в табло переменную «Q» и  убедился, что её значение = «Не простое», то есть обращение прошло

  11. Максим Ефимов 06.02.2011 в 13:14

    Перем СвойствоМП Экспорт;
    Перем глОбед;
    Перем РабочееВремяКонец;

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

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

    Процедура ПриНачалеРаботыСистемы()
    ГлОбед = ОткрытьФормуМодально(“ОбщаяФорма.ВыборОбеда”);

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

    Факт = 1;
    Для Сч = 1 По 1000 Цикл
    Если (Факт+1)%Сч=0 Тогда
    Статус = “Простое”;
    Иначе
    Статус = “Непростое”;
    КонецЕсли;

    Числа.Вставить(“Число”+Формат(Сч,”ЧГ=0”), Статус);

    Факт = Факт*Сч

    КонецЦикла;    

    ПоказатьОповещениеПользователя(Числа.Число591);
    Х = 332;
    ПоказатьОповещениеПользователя(Числа[“Число”+Х]);
    КонецПроцедуры

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

    Отказ = Ответ = КодВозвратаДиалога.Нет;
    КонецЕсли;    
    КонецПроцедуры

  12. Давыдяк Сергей 05.02.2011 в 20:47

    <code>
    Перем ГлОбед Экспорт;
    Перем НачалоРабочегоДня,КонецРабочегоДня;

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

    Год = Год(ТекДата);
    Месяц = Месяц(ТекДата);
    День = День(ТекДата);
    НачалоРабочегоДня = Дата(Год,Месяц,День,4,0,0);
    КонецРабочегоДня = Дата(Год,Месяц,День,20,50,0);

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

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

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

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

    Числа = Новый Структура;
    ТекЗначение = “”;

    Для Сч = 1 По 1000 Цикл
    Если Сч = 1 Тогда
    ТекЗначение = “Не простое”;
    Иначе
    ТекЗначение = “Простое”;
    Для Сч1 = 2 По Сч Цикл
    Если (Сч%Сч1 = 0) и (Сч<>Сч1) Тогда
    ТекЗначение = “Не простое”;
    Прервать;
    КонецЕсли;
    КонецЦикла;
    КонецЕсли;

    Числа.Вставить(?(Сч = 1000,СтрЗаменить(“Число”+Сч,Символы.НПП,””),”Число”+Сч),ТекЗначение);
    КонецЦикла;

    Х = “Число591″;
    Результат = 0;
    Числа.Свойство(Х,Результат);
    Сообщить(Х+” “+Результат);
    КонецПроцедуры

    </code>

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

  14. Задания с проверкой времени, обработкой реакции пользователя на вопросы, выбором и хранением обедов трудностей не вызвали.
    Третью задачу сделать не удалось, система уходит в глубокий ступор. Думаю, что выбрала неправильный алгоритм для поиска простых чисел и поэтому у системы не хватает вычислительной мощности.

    • Скорее всего произошло зацикливание, которое можно диагностировать с помощью отладчика.

      • Проверила с помощью отладчика, так и оказалось, зацикливание. Спасибо.

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

    • Про последнюю часть задания (с простыми числами) не успел проверить и описать, у меня уже 01:08, досдать завтра можно? или после опубликования ответа это не актуально?

      • Да, можно дописать отчет.

        • Последняя часть задания.
          В модуле УП определена переменная Числа.
          В процедуре события ПриНачалеРаботыСистемы() помещен следующий оператор:
          Числа = ПроверкаСервер.ЗаполнитьСтруктуру();

          <code>Функция ЗаполнитьСтруктуру() Экспорт    
          Числа = Новый Структура;            
          Для Счетчик=1 По 1000 Цикл
          ВидЧисла = “Простое”;               
          Для Счетчик2=2 по Счетчик-1 цикл
          Если Счетчик%Счетчик2=0 тогда
          ВидЧисла=”Не простое”;
          Прервать;
          КонецЕсли;        
          КонецЦикла;                         
          Ключ = “Число”+Формат(Счетчик, “ЧГ=”);
          Числа.Вставить(Ключ, ВидЧисла);        
          КонецЦикла;                            
          Возврат Числа;                         
          КонецФункции</code>

  16. Чтобы реализовать поддержку управляемого и обычного приложения, был создан общий модуль с галочками “Клиент (управляемое приложение)”, “Клиент (обычное приложение)”, в который были вынесены общие функции, используемые как в управляемом приложении, так и в обычном.
    1. Создаем обработчик события “ПередНачаломРаботыСистемы”. В нем получаем текущую дату с помощью функции “ТекущаяДата”, анализируем соответствует ли время текущей даты графику работы. Если нет, то устанавливаем параметр “Отказ” в значение Истина.
    2. Иначе, создаем список значений с 3-мя вариантами обедов и вызываем в цикле функцию “ОтметитьЭлементы” до тех пор, пока не будет отмечен хотя бы один элемент списка.
    3. Добавляем отмеченные элементы в массив “глОбед”, который объявлен в модуле управляемого/обычного приложения с помощью ключевого слова “Экспорт”.
    4. После этого с помощью процедуры “Сообщить” выводим все обеды из массива “глОбед”. В режиме управляемого приложения это осуществляется в обработчике события “ПередНачаломРаботыСистемы”, а в режиме обычного приложения – “ПриНачалеРаботыСистемы”.
    5. В обработчике события “ПередЗавершениемРаботыСистемы” делаем проверку, не пытается ли пользователь выйти раньше окончания рабочего дня. Если да, то задаем вопрос пользователю. В случае отказа от выхода устанавливаем параметр “Отказ” в значение Истина.
    6. Вычисление простых чисел осуществляется простым перебором. Необходимо применять функцию “Формат” для правильного формирования строкового ключа структуры. Обращение к данным структуры возможно как по известному ключу, так и по ключу, который содержится в переменной. В последнем случае нужно использовать функцию “Свойство”.
    Основные трудности при решении ДЗ:
    1. Сначала реализовал задание только для управляемого приложения. Потом просмотрел отчеты других участников, и понял, что требуется также реализовать поддержку обычного приложения.
    2. Долго не мог понять, почему не создается ключ “Число1000”. Оказалось, что нужно убрать пробел в строке “1 000”, которая получается по умолчанию при преобразовании числа 1000. Для этого использовал функцию “Формат” со строкой форматирования “ЧГ=0”.
    3. Не сразу догадался, что процедуру “Сообщить” в обычном приложении нужно использовать в обработчике события “ПриНачалеРаботыСистемы”.

  17. Перем глОбед Экспорт;
    перем Числа Экспорт;

    Функция МожноРаботать()
    СекундаНачалаРабочеговремени=9*3600+5*60+38;
    //СекундаКонцаРабочеговремени=18*3600+11*60+42;
    СекундаКонцаРабочеговремени=23*3600+59*60+59;
    ТекДата=ТекущаяДата();
    НачалоРаботы=НачалоДня(ТекДата)+СекундаНачалаРабочеговремени;
    КонецРаботы=НачалоДня(ТекДата)+СекундаКонцаРабочеговремени;
    Возврат (ТекДата>=НачалоРаботы) ИЛИ (ТекДата<=КонецРаботы);
    КонецФункции

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

    Процедура ПриНачалеРаботыСистемы()
    Пока Не глОбед.ОтметитьЭлементы(“Какой вариант обеда предпочитаете?”) Цикл
    Предупреждение(“Голодным быть нельзя!”);
    КонецЦикла;
    КонецПроцедуры

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

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

    Числа=Новый Структура;
    Числа.Вставить(“Число1″,”Простое”);
    Числа.Вставить(“Число2″,”Простое”);
    Для ПорядокЧисла=3 По 999 Цикл
    Числа.Вставить(“Число”+ПорядокЧисла,”Простое”);
    КонецЦикла;
    Числа.Вставить(“Число1000″,”Составное”);

    КоличествоЭлементов=Числа.Количество()-1;
    ЗначениеПроизведения=0;
    Для Итератор=0 По КоличествоЭлементов Цикл
    ТекЧисло=Итератор+2;
    НачальныйМножитель=?(ТекЧисло=2,2,3);
    Для Множитель=НачальныйМножитель По 500 Цикл
    Произведение=ТекЧисло*Множитель;
    Если Произведение>999 Тогда
    Прервать;
    Иначе
    Если Числа.Свойство(“Число”+Произведение,ЗначениеПроизведения) И ЗначениеПроизведения=”Простое” Тогда
    Числа.Вставить(“Число”+Произведение,”Составное”);
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;
    КонецЦикла;

    • только
      <code>
      //СекундаКонцаРабочеговремени=18*3600+11*60+42;
      СекундаКонцаРабочеговремени=23*3600+59*60+59;
      </code>
      надо поменять на
      <code>
      СекундаКонцаРабочеговремени=18*3600+11*60+42;
      </code>
      а то для норм тестов оставил, а потом поправить забыл

  18. все сделал с 1 000 не понял как разобраться, подсмотрел, справки не достаточно, хочется чтобы вы функцию формат и параметры объяснили подробнее.
    заполнение структуры делал в обработке, на форме: поле и кнопка чтобы определить значение по ключу. проблемы возникли при определении переменной структуру на сервере, почему переменная не хранится так же как на клиенте?? почему постоянно выполняется код модуля формы  если вызывать серверные процедуры….. смотреть лекции снова? я что то упустил?

    • >хочется чтобы вы функцию формат и параметры объяснили подробнее
      См. решение задания.

      Вопросы хорошие, рассмотрим их в МГ.

  19. Сорри, что опоздал
    Задание выполнено. Делал все в модуле управляемого приложения
    Перем глОбед Экспорт;

    Процедура ПередНачаломРаботыСистемы(Отказ)
    НачалоСеанса = ТекущаяДата();
    Вход = Час(НачалоСеанса)*3600+Минута(НачалоСеанса)*60+Секунда(НачалоСеанса);
    НРаботы = 9*3600+05*60+38;
    КРаботы = 18*3600+11*60+42;
    Если не ((Вход >= НРаботы) и (Вход <= КРаботы)) Тогда
    Предупреждение(“В настоящий момент вход в систему невозможен!”);
    Отказ =Истина;
    КонецЕсли;
    КонецПроцедуры

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

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

    Для Сч = 1 по 1000 Цикл
    Стр = “Число”+СтрЗаменить(Строка(Сч),Символы.НПП,””);
    Числа.Вставить(Стр,ПроверитьПростоеЧисло(Сч));
    КонецЦикла;
    Сообщить(Числа.Число591);
    Х = “Число332”;
    Сообщить(Числа[Х]);
    КонецПроцедуры

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

    Функция ПроверитьПростоеЧисло(Ч)
    Ст = “Простое”;
    Счетчик = Ч – 1;
    пока Счетчик > 1 Цикл
    Если (Ч%Счетчик = 0) Тогда
    Ст = “Непростое”;
    прервать
    КонецЕсли;    
    Счетчик = Счетчик – 1;
    КонецЦикла;
    Возврат Ст;
    КонецФункции

  20. Задание выполнено.
    Про работу со временем и списком уже все написали,
    тут сложностей не встретилось.
    Алгоритм определения простых чисел (число 1 сразу определим как не простое, а 2 как простое):
    <code>
    перем Числа;

    Процедура КнопкаВыполнитьНажатие(Кнопка)
    Числа = новый структура(“Число1,Число2″,”Не простое”,”Простое”);
    Для сч=3 По 1000 Цикл
    Простое = Истина;
    Если сч%2 = 0 Тогда
    Простое = ложь;
    Иначе
    сч1=3;
    Пока сч1 < сч-1 Цикл //цикл по нечетным числам
    Если сч%сч1=0 Тогда
    Простое = ложь;
    КонецЕсли;
    сч1=сч1+2;
    КонецЦикла;
    КонецЕсли;
    Числа.Вставить(“Число”+Формат(сч, “ЧГ=”), ?(Простое,”Простое”,”Не простое”));
    КонецЦикла;
    КонецПроцедуры
    </code>
    Поместим на форму поле ввода и обработаем событие ПриИзменении.
    Если на момент ввода числа структура простых чисел еще не сформирована, вызовем процедуру формирования.
    <code>
    Процедура пвЧислоПриИзменении(Элемент)
    Если типЗнч(Числа)<>тип(“Структура”) Тогда
    КнопкаВыполнитьНажатие(Неопределено);
    КонецЕсли;
    Зн = Неопределено;
    Если Числа.Свойство(“Число”+Формат(пвЧисло, “ЧГ=”), Зн) Тогда
    сообщить(“Число”+Формат(пвЧисло, “ЧГ=”)+” “+Зн);
    Иначе
    сообщить(“Число”+Формат(пвЧисло, “ЧГ=”)+” не найдено в структуре”);
    КонецЕсли ;
    КонецПроцедуры
    </code>

  21. Выкладываю решение задачи
    Перем глОбед Экспорт;
    Перем НачалоРабочегоДняСек, КонецРабочегоДняСек;
    Перем Меню;
    Перем Числа;

    Функция ЭтоПростоеЧисло(Число)
    ПростоеЧисло = Истина;
    Граница = Число – 1;
    Для Сч = 2 По Граница Цикл
    Если (Число % Сч) = 0  Тогда
    ПростоеЧисло = Ложь;
    Прервать;
    КонецЕсли;     
    КонецЦикла;
    Возврат ПростоеЧисло;
    КонецФункции // ЭтоПростоеЧисло()

    Процедура ЗаполнитьЧисла()
    Числа.Вставить(“Число1”, “Простое”);
    Числа.Вставить(“Число2”, “Простое”);
    Для Сч = 3 По 1000 Цикл
    Ключ = “Число” + Формат(Сч,”ЧГ=0″);
    Тип = ?(ЭтоПростоеЧисло(Сч), “Простое”,      “Составное”);
    Числа.Вставить(Ключ, Тип);
    КонецЦикла;
    КонецПроцедуры

    Процедура ПоказатьЧисла()
    Сообщить(“Число 591 – ” + Числа.Число591);
    Х = “Число332″;
    Если Числа.Свойство(Х)  Тогда
    Сообщить(Х + ” в структуре есть”);
    КонецЕсли;
    КонецПроцедуры

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

    Процедура ПоказатьОбед()
    Сообщить(“Ваш обед на сегодня:”);
    Для каждого  Блюдо Из глОбед Цикл
    Сообщить(Блюдо);    
    КонецЦикла;        
    КонецПроцедуры

    Функция НерабочееВремя()
    ТекДата = ТекущаяДата();
    ТекВремя =            ПолучитьВремяВСекундах(Час(ТекДата), Минута(ТекДата), Секунда(ТекДата));
    Если (ТекВремя < НачалоРабочегоДняСек) ИЛИ (ТекВремя > КонецРабочегоДняСек)  Тогда    
    Возврат Истина;    
    Иначе
    Возврат Ложь;
    КонецЕсли;
    КонецФункции // ПроверитьВозможностьРаботы()

    Функция ПолучитьВремяВСекундах(Час, Мин, Сек)
    Возврат Час * 3600 + Мин * 60 + Сек;
    КонецФункции // ПолучитьВремяВСекундах()

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

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

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

    НачалоРабочегоДняСек = ПолучитьВремяВСекундах(9, 5, 38);
    КонецРабочегоДняСек = ПолучитьВремяВСекундах(18, 11, 42);

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

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

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

  22. Задание выполнил.
    Задание выполнял в модуле управляемого приложения. Определил дату начала и дату окончания рабочего дня и сравнил с текущей датой. Предупреждение  и Отказ = Истина
    Затем В список значений внес блюда и методом ОтметитьЭлементы предоставил выбор пользователю.
    Проверкой в цикле Количества помеченных значений добился обязательного выбора пользователем хотя бы одного значения.
    Затем ПередЗавершениемРаботыСистемы(Отказ) проверка текущей даты с временем окончания рабочего дня, и Вопрос на выход. В случае нажатия кнопки Нет  Отказ =Истина
     
    При работе со структурой возникла проблема с числом 1000. При преобразовании в строку получается разделение триады “1 000”.  Пришлось побороться с удалением этого пробела.

  23. Обеды я посмотрел… вобщем зачтите мне их как “хвост” не буду я уже повторяться, потому что прочитал щас что тут делали. Ну и в голове вроде как тоже подобное все было, но не приступил. Скорее всего буду пытаться выполнять задания. но едва пока что  нулевой блок просмотрел – некогда. А вот числа мне понравились решетом Эратосфена! Название прям возбуждает.
    Писать начал в Модуле приложения в этой процедуре так как все таки хотел сначала обеды начать, а потом решил лечь спать ).
    Процедура ПередНачаломРаботыСистемы(Отказ) Экспорт
     n=1000;
     аПростыеЧисла=ПростыеЧисла(n);
     X=”Число332″;
     Y = “”;
     аПростыеЧисла.Свойство(X,Y);
     Сообщить(X+” “+Y);
     Сообщить(“Число591 “+аПростыеЧисла.Число591);
    КонецПроцедуры

    // Погуглили яндексом
    // Решето Эратосфена – алгоритм определения простых чисел
    // блок схема там же и на хрена мне мои 5 томов мат энциклопеди и справочник ;)

    Функция ПростыеЧисла(n) экспорт
     аМассив = новый Массив;
     //заполнение массива
     аМассив.Добавить(0);
     аМассив.Добавить(0);
     Для сч=2 по n Цикл
      аМассив.Добавить(сч);
     КонецЦикла;
     //замена на 0 начинается с 3-го элемента (первые два уже нули)
     m=2;
     Пока m<=n Цикл
      Если аМассив[m]<>0 Тогда
       j=m*2;
       Пока j<=n Цикл
        аМассив[j]=0;
        j = j + m;
       КонецЦикла; 
      КонецЕсли;
      m=m+1;  
     КонецЦикла;   
    // Ну и структуры 
     аСтруктура= Новый Структура();
     сч=0;
     Для Каждого Элемент из аМассив Цикл
      аСтруктура.Вставить(“Число”+Формат(Сч,”ЧГ=0″),?(Элемент=0,”Не простое”,”Простое”));
      сч=сч+1;
     КонецЦикла;
     Возврат аСтруктура;
    КонецФункции // ПростыеЧисла()

    • Да, забыл написать – 1 не считается простым числом… по моему – если я не ошибся

  24. Задание выполнено в модуле управляемого приложения:

    В процедуре ПередНачаломРаботыСистемы выполнена проверка соответствия текущего времени  рабочему интервалу с помощью первого числа первого месяца первого года. Если вход разрешен, вызываем процедуру выбора обеда.
    Процедура ПередЗавершениемРаботыСистемы аналогичное сравнение текущего времени с заданным.
    Процедура ВыборОбеда. Заполняем список значений, В цикле проверка «если ни одного значения не выбрано, предлагаем выбрать еще раз».
    Со структурой все сложно, пришлось подсмотреть. Вроде получилось, но хочется посмотреть ваше решение:

    <code>
    Процедура Структура()
    Числа=Новый Структура;
    Для число=1 По 1000 Цикл
    Если ПроверкаНаПростоту(Число)=истина Тогда
    Числа.Вставить(“Число”+Формат(Число,”ЧГ =0″),”Простое”);
    Иначе
    Числа.Вставить(“Число”+Формат(Число,”ЧГ =0 “),”НеПростое”);
    КонецЕсли;
    КонецЦикла;
    х = “Число2”;
    Сообщить(Числа[х]);
    Сообщить(Числа.Число591);
    КонецПроцедуры // Структура()
     
    Функция ПроверкаНаПростоту(Число)
    Если (Число%2=0) И (Число<>2)тогда
    Возврат Ложь;
    Иначе
    Для j=3 по sqrt(Число) Цикл
    Если  (Число%j=0) Тогда
    Возврат Ложь;
    КонецЕсли;
    КонецЦикла;
    Возврат Истина;
    КонецЕсли;
    КонецФункции
    </code>

  25. Роман Братанов 01.02.2011 в 05:09

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

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

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

    Иначе  // если не нужно ничего сообщать, то было бы: Отказ = Истина;
    Предупреждение(“Закрыт доступ по времени”,7);
    ЗавершитьРаботуСистемы(Ложь);

    КонецЕсли;

    КонецПроцедуры
    Проверка выбора обеда в отдельной процедуре с вариантами действий пользователя. Например, возможно нажать Ок, ничего не отметив.
    Процедура ВыборОбеда()

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

    ВыбранОбед=Ложь;

    Если Обеды.ОтметитьЭлементы(“Выберите вариант обеда”)=Истина Тогда

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

    Если ВыбранОбед=Ложь тогда
    Предупреждение(“Нужно выбрать обед…”,3);
    ВыборОбеда();
    КонецЕсли;    

    Иначе
    Предупреждение(“Нужно выбрать обед…”,3);
    ВыборОбеда();

    КонецЕсли;    

    Для каждого Обед Из Обеды Цикл
    Если Обед.Пометка = Ложь Тогда
    Обеды.Удалить(Обед);
    КонецЕсли;
    КонецЦикла;

    глОбед = Обеды.ВыгрузитьЗначения();

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

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

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

    КонецПроцедуры
    Простые числа:
    Числа = Новый Структура(“Число1″,”Простое”,”Число2″,”Простое”);

    Для сч=3 По 1000 Цикл
    Простое=1;

    Для й=2 По Sqrt(сч) Цикл
    Если сч % й =0 Тогда Простое = 0;
    Прервать;
    КонецЕсли;    
    КонецЦикла;

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

    КонецЦикла;

    Сообщить(Числа.Число591);
    х=”Число332″;
    Сообщить(Числа[х]);
    Здесь столкнулся с ситуацией, когда при достижении 1000 ключ структуры сформировался в виде “Число1 000”, что недопустимо, поэтому пришлось использовать формат, удаляющий пробел.

  26. Первое задние выполнил, особых проблем не было. В процедурах ПередНачаломРаботыСистемы и ПередЗавершениемРаботыСистемы использовал функцию ПроверкаНаВходВыход(текДата, Ч, М, С) , где текДата это текущая дата, Ч, М, С это значения час, минута и секунда начала или завершения рабочего дня. Данная функция состоит из строчки Возврат Дата(1,1,1,Час(текДата),Минута(текДата),Секунда(текДата)) < Дата(1,1,1,Ч,М,С);.
    Для Выбора обеда использую конструкцию
    Пока НЕ ВыборОбеда() Цикл
    КонецЦикла;
    В ф-ции ВыборОбеда создаю список значений, заполняю его согласно заданию и вызываю модальную форму используя метод ОтметитьЭлементы и далее так Возврат глОбед.Количество().
    В процедуре ПередЗавершениемРаботыСистемы для подтверждения выхода из системы применяю функцию глобального контекста Вопрос и в зависимости от ответа завершаю или не завершаю работу системы.
    Над вторым заданием пришлось подумать и опять (как в прошлом задание) ничего кроме двух вложенных циклов не придумал, наверное это не оптимальное решение, но результат похож на правильный.

    Стр = Новый Структура;
    Для Сч=1 По 1000 Цикл
    Ч=Сч;
    Значение = “Простое”;
    Для Д=2 По Ч-1 Цикл
    Если Сч%Д=0 Тогда
    Значение = “Не простое”;
    прервать;
    КонецЕсли;
    КонецЦикла;
    Стр.Вставить(“Число”+СтрЗаменить(Сч,Символы.НПП,””), Значение);
    КонецЦикла;

    Стр = Новый Структура;
    Для Сч=1 По 1000 Цикл
    Ч=Сч;
    Значение = “Простое”;
    Для Д=2 По Ч-1 Цикл
    Если Сч%Д=0 Тогда
    Значение = “Не простое”;
    прервать;
    КонецЕсли;
    КонецЦикла;
    Стр.Вставить(“Число”+СтрЗаменить(Сч,Символы.НПП,””), Значение);
    КонецЦикла;

     
     
     

  27. Отстал от графика. Если, выложу д.з. завтра – ничего страшного? :)

    • Выкладывайте, все ок.

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

        КонецЕсли;
        КонецПроцедуры

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

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

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

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

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

        Процедура СозданиеСтруктуры()

        Структ = Новый Структура();
        Для А=1 по 1000 Цикл
        Структ.Вставить(“Число”+Формат(А,”ЧГ=0”), ПроверкаПростогоЧисла(А));
        КонецЦикла;

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

        Функция ПроверкаПростогоЧисла(А)

        Счетчик = 2;
        Остаток = Окр(sqrt(А));
        Для счетчик=2 По Остаток Цикл
        Если А%Счетчик = 0 Тогда
        Возврат “Не простое”
        КонецЕсли;
        КонецЦикла;
        Возврат “Простое”

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

        Трудности возникли с Форматом числа, подсмотрел тут. Алгоритм поиска простого числа нашел из вики.

  28. Перем ГлОбед  Экспорт ;
    Процедура ПередНачаломРаботыСистемы(Отказ)
     ТекЧас= Час(ТекущаяДата());
     Если ТекЧас<8 или ТекЧас>16 Тогда
      Предупреждение(“Приходите в рабочее время”);
      Отказ=Истина;
     КонецЕсли;
    КонецПроцедуры
    Процедура ПередЗавершениемРаботыСистемы(Отказ)
     ТекЧас= Час(ТекущаяДата());
     Если ТекЧас<16 или ТекЧас<8 Тогда
      Ответ=Вопрос(“Рабочий день еще не закончился? Завершить работу системы”,РежимДиалогаВопрос.ДаНет,);
      Если Ответ=КодВозвратаДиалога.Нет Тогда
       Отказ=Истина;
      КонецЕсли;
     КонецЕсли;
     
    КонецПроцедуры
    Процедура ПриНачалеРаботыСистемы()
     СписокЗначений=Новый СписокЗначений;
     СписокЗначений.Добавить(“Курица”);
     СписокЗначений.Добавить(“Рыба”);
     СписокЗначений.Добавить(“Мясо”);
     Пока ПустоеЗначение(СписокЗначений) цикл
      СписокЗначений.ОтметитьЭлементы(“Обязательно выберети обед”) ;
     КонецЦикла;
     
     Структура=Новый Структура;
     ЧислоИтерац=1000;
     Для Индекс=1 по ЧислоИтерац Цикл
      Структура.Вставить(“Число_”+Формат(Индекс,”ЧГ=0”),ПроверкаНаПростату(Индекс)); 
     КонецЦикла;
     х=Структура.Число_591;
     Сообщить(“Значение Структуры “+х);
     х=”Число_332”;
     Если Структура.Свойство(х) тогда
      Сообщить(“Элемент с ключем “+х+” существует”);
      Сообщить (“его значение “+Структура[х]);
     КонецЕсли
    КонецПроцедуры
    Функция ПроверкаНаПростату(ПровЧисло)
     Для Индекс=1 по ПровЧисло Цикл
      Если Цел(ПровЧисло/Индекс)= ПровЧисло/Индекс И Индекс<>1 И ПровЧисло<>Индекс тогда
       Возврат “Сложное”
      КонецЕсли;
     КонецЦикла;
     Возврат “Простое”
    КонецФункции
     Функция ПустоеЗначение(Список)
     Счет=0;
     ГлОбед=Новый Массив;
     Для Каждого Стр из Список Цикл
      Если не Стр.Пометка Тогда
       Счет=счет+1 ;
      Иначе
       ГлОбед.Добавить(Стр.Значение );
      КонецЕсли;
     КонецЦикла;
     Если Счет=Список.Количество() тогда
      Предупреждение(“Обязательно выберети обед”);
      Возврат Истина
     Иначе
      Возврат Ложь
     КонецЕсли 
    КонецФункции

  29. Федор 31.01.2011 в 18:20

    <code>
    Перем глОбед;
    Перем Числа;
    Функция ПростоеЛиЧисло(Число)
     Если Число <= 1 Тогда
      Возврат Ложь;
     КонецЕсли;
     
     Итератор = 2;
     Пока Итератор * Итератор <= Число Цикл
      
      Если Число % Итератор = 0 Тогда
       Возврат Ложь;
      КонецЕсли;
      
      Итератор = Итератор + 1;
      
     КонецЦикла;
     
     Возврат Истина;
     
    КонецФункции

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

  30. Затруднения вызвал вопрос места компиляции модуля. Использовала общие модули:
    1.Серверный, с возможностью вызова сервера. Содержит функцию РабочееВремя().
    2.Клиентский. Содержит функцию ПолучитьПростыеЧисла() и процедуру СоздатьСтруктуруЧисла().
    Модуль управляемого приложения:
    Для обеспечения контроля рабочего времени в процедуре ПередНачаломРаботыСистемы() используем предупреждение, в процедуре ПередЗавершениемРаботыСистемы() – вопрос.
    Параметр “Отказ” получает значение в зависимости от значения функции РабочееВремя() и ответа на вопрос.
    Функция РабочееВремя() приводит текущую дату ко времени:
    Дата(1,1,1,Час(ТекущаяДата()),Минута(ТекущаяДата()),Секунда(ТекущаяДата()))
    и сравнивает с константами “НачалоРаботы” и “КонецРаботы”, хранящими только время.
    В процедуре ПриНачалеРаботыСистемы()заполняем список значений вариантов обеда. Чтобы обеспечить выбор, используем цикл: 
     Пока ОК=ложь цикл
      ОК=ВариантыОбеда.ОтметитьЭлементы(“Выберите вариант обеда”);
      Если ОК тогда //нажата ОК
       Для каждого Элемент из ВариантыОбеда Цикл
        Если Элемент.Пометка тогда
         глОбед.Добавить(Элемент);
        КонецЕсли;
       КонецЦикла;
       Если глОбед.Количество()=0 тогда
        ОК=Ложь;
       КонецЕсли;
      КонецЕсли;
     КонецЦикла;
    Здесь же вызываем процедуру СоздатьСтруктуруЧисла(). 
    Процедура СоздатьСтруктуруЧисла() заполняет структуру циклом по счетчику:
    Числа.Вставить(“Число”+Формат(Счетчик,”ЧГ=0”),  ?(ПростыеЧисла.Найти(Счетчик)<>неопределено, “Простое”, “Не простое”));
    где “ПростыеЧисла” – массив простых чисел.
    Функция ПолучитьПростыеЧисла(НачЧисло, КонЧисло) создает массив простых чисел.
    Используется обратный перебор массива 2-1000 для удаления не простых чисел:
    Для каждого Делитель из Массив цикл
     Индекс = Массив.ВГраница();
     Пока Массив[Индекс]>Делитель Цикл  //обратный перебор массива до числа-делителя
      Если Массив[Индекс]%Делитель=0 Тогда
       Массив.Удалить(Индекс);
      КонецЕсли;
      Индекс = Индекс – 1;
     КонецЦикла;
    КонецЦикла;

  31. Задание выполнил.
    Сначала показалось, что первый пункт вообще ерунда.  Оказалось нет – стал делать и провозился несколько часов.
    В ПередНачаломРаботы сделал вызов экспортной функции серверного общего модуля:

    Функция ПроверитьРабочееВремя(ТекущДата) Экспорт
     
     // Возвращает: Истина – Рабочее время, Ложь – нерабочее время
     
     ТекЧас = Час(ТекущДата);
     ТекМин = Минута(ТекущДата);
     ТекСек = Секунда(ТекущДата);
     
     ЧасНач = Константы.ЧасНач.Получить();
     МинНач = Константы.МинНач.Получить();
     СекНач = Константы.СекНач.Получить();
     ЧасКон = Константы.ЧасКон.Получить();
     МинКон = Константы.МинКон.Получить();
     СекКон = Константы.СекКон.Получить();  
        
     Если ТекЧас >= ЧасНач И ТекЧас <= ЧасКон Тогда  
      Если ТекЧас = ЧасНач Тогда
       Если ТекМин > МинНач Тогда
        Возврат Истина;
       ИначеЕсли ТекМин = МинНач Тогда
        Если ТекСек >= СекНач Тогда
         Возврат Истина;
        Иначе
         Возврат Ложь;
        КонецЕсли; 
       Иначе
        Возврат Ложь;    
       КонецЕсли;   
      ИначеЕсли ТекЧас = ЧасКон Тогда
       Если ТекМин > МинКон Тогда
        Возврат Ложь; 
       ИначеЕсли ТекМин = МинКон Тогда
        Если ТекСек > СекКон Тогда
         Возврат Ложь; 
        Иначе
         Возврат Истина;
        КонецЕсли;    
       Иначе
        Возврат Истина; 
       КонецЕсли;   
      Иначе
       Возврат Истина;   
      КонецЕсли;
     Иначе
      Возврат Ложь;
     КонецЕсли; 
     
    КонецФункции

    Если фун-я возвращает ЛОЖЬ, вход в программу запрещен, ОТКАЗ = ИСТИНА;

    С завершением работы до окончания рабочего дня – аналогично, проц-ра ПередЗавершениемРаботыСистемы().

    Насчет обеда спрашиваю в цикле ПОКА, использую метод ОтметитьЭлементы(), который возвращает ИСТИНА или ЛОЖЬ. Это значение и является условием выхода из цикла, т.е. если пользователь нажал ОТМЕНА, то метод ОтметитьЭлементы вернет ЛОЖЬ, и спросим по-новой))) Далее в массив добавляю отмеченные элементы списка с варинтами обедов. Если Кол-во элементов в этом массиве равно нулю (пользователь ничего не выбрал, но нажал ОК, то принудительно ставлю чтобы цикл пошел еще раз (условие в ПОКА)) .

    Со структурой – заполняю в цикле от 1 до 1000. Является ли число простым проверяю так:

    Функция ПроверитьПростоеЧисло(ПровЧисло)
     
     ПростоеЧисло = Истина;
     Для К = 1 По ПровЧисло Цикл
      Остаток = ПровЧисло % К;
      Если (Остаток = 0) И (К <> 1) И (К <> ПровЧисло) Тогда
       ПростоеЧисло = Ложь;
       Прервать;
      КонецЕсли;  
     КонецЦикла; 
     
     Если ПростоеЧисло Тогда
      Возврат “Простое”;
     Иначе
      Возврат “Не простое”; 
     КонецЕсли;
      
    КонецФункции

    Конечно, неоптимально, наверное, перебирать все числа, но пока не придумал как сделать лучше.

    Обращение по ключу: Числа.Число7
    Обращение по индексу: Числа[“Число7”]
      

  32. Taranov-SI 31.01.2011 в 15:15

    Задание Выполнено, проверено, все ок.
    Очень интересный последний пункт задания:
    Для себя сделал вывод- Так как ключ является свойством,  то его нельзя передавать через переменную. ???  Хотелось бы пояснения.

    • >то его нельзя передавать через переменную
      Давайте разберем на примере, приведите его.

  33. В модуле упр.приложения определяю переменные со словом экспорт, потом из обработки проверяю 
    Время определяю считая количество секунд, ОтметитьЭлементы проверяю в цикле предварительно выставив условие в истину, если выбор был – сбрасываю в ложь. Простое ли число определяю перебором от 2 до числа-1 на равенство остатка нулю. Последний пункт выполнил через метод Свойство.
    Но возникла следующая ошибка (цикл нормально выполняется до 999, когда пишу 1000- ошибка:
    {МодульУправляемогоПриложения(109)}: Ошибка при вызове метода контекста (Вставить)
      Числа.Вставить(Стр1, “Не простое”);
    по причине:
    Задано неправильное имя атрибута структуры
    Сам цикл:
    Стр1=”Число1″;
    Числа.Вставить(Стр1,”Простое”);
    Для Индекс=2 По 1000 Цикл
     Стр1=”Число”+Строка(Индекс);
      
     Если ЕстьПростое(Индекс)Тогда
      Числа.Вставить(Стр1, “Простое”);
      
     Иначе
      Числа.Вставить(Стр1, “Не простое”);
      
     КонецЕсли;
    КонецЦикла;

    • Ошибка связана с конвертацией числа в строку. Кроме цифр для 1000 добавляется разделитель триад, вот его и нужно победить.

  34. 1. Решено, проблем не возникло.

    2. Сначала заблудился в 3 соснах, потом подсмотрел в решенных и сделал:-)

    Вопрос : Обязательно выкладывать тут код ?

    • Нет, совсем не обязательно.
      Просто кратко схему решения, либо возникшие сложности и пути их преодоления.

  35. Patio-5Element 31.01.2011 в 12:42

    <Code>
    Перем НачалоРаботы, ОкончаниеРаботы;
    Перем ВариантОбеда;
    Перем ГлОбед Экспорт;
    Функция Время(Дата)
    ТекЧас = Час(Дата);
    ТекМинута = Минута(Дата);
    ТекСекунда = Секунда(Дата);
    ТекВремя = Дата(1,1,1,ТекЧас,ТекМинута,ТекСекунда);

    Возврат ТекВремя
    КонецФункции

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

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

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

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

    Ответ = Вопрос(ТекстВопроса, Режим, 70);
    Если Ответ = КодВозвратаДиалога.Нет Тогда
    Отказ = Истина;
    КонецЕсли;
    КонецЕсли;
    КонецПроцедуры

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

    НачалоРаботы = Дата(1,1,1,09,05,38);
    ОкончаниеРаботы = Дата(1,1,1,18,11,42);

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

    ВариантОбеда = Новый СписокЗначений;
    ВариантОбеда.Добавить(“курица”);
    ВариантОбеда.Добавить(“рыба”);
    ВариантОбеда.Добавить(“мясо”);
    </code>
    Процедура заполнения структуры простыми числами
    <code>
    Перем СтруктураПростоеЧисло Экспорт;

    Процедура ПростыеЧисла()
    МассивПростыхЧисел = новый Массив;
    МассивПростыхЧисел.Добавить(2);
    МассивПростыхЧисел.Добавить(3);
    МассивПростыхЧисел.Добавить(5);

    СтруктураПростоеЧисло.Вставить(“Число1″,”Простое”);
    СтруктураПростоеЧисло.Вставить(“Число2″,”Простое”);
    СтруктураПростоеЧисло.Вставить(“Число3″,”Простое”);
    СтруктураПростоеЧисло.Вставить(“Число4″,”НеПростое”);
    СтруктураПростоеЧисло.Вставить(“Число5″,”Простое”);
    СтруктураПростоеЧисло.Вставить(“Число6″,”НеПростое”);

    Для Счетчик = 7 по 1000 цикл
    СтрокаСчетчик = Строка(Счетчик);
    Если Не (Прав(СтрокаСчетчик,1) = “1”
    или Прав(СтрокаСчетчик,1) = “3”
    или Прав(СтрокаСчетчик,1) = “7”
    или Прав(СтрокаСчетчик,1) = “9”) тогда
    СтруктураПростоеЧисло.Вставить(“Число” + Формат(Счетчик,”ЧГ=0″),”НеПростое”);
    Продолжить;
    КонецЕсли;
    КореньСчетчика = Sqrt(Счетчик);
    Для Каждого Элемент из МассивПростыхЧисел цикл
    флЧислоДелитсяПолностью = (Счетчик%Элемент) = 0;
    Если флЧислоДелитсяПолностью тогда
    СтруктураПростоеЧисло.Вставить(“Число” + Формат(Счетчик,”ЧГ=0″),”НеПростое”);
    прервать;
    Иначе
    Если Элемент > КореньСчетчика тогда
    МассивПростыхЧисел.Добавить(Счетчик);
    СтруктураПростоеЧисло.Вставить(“Число” + Формат(Счетчик,”ЧГ=0″),”Простое”);
    Прервать;
    КонецЕсли;
    Конецесли;
    КонецЦикла;
    КонецЦикла;

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

    </code>

  36. Елена 31.01.2011 в 10:26

    Перем ГлОбед Экспорт ;
    Перем КонецРДня;
    Перем Числа;
    Процедура ПередНачаломРаботыСистемы(Отказ)
     НачалоРДня  = НачалоДня(ТекущаяДата())+9*60*60+5*60+38;
     КонецРДня   = НачалоДня(ТекущаяДата())+18*60*60+11*60+42;
     Отказ       = ТекущаяДата()<НачалоРДня или ТекущаяДата()>КонецРДня;
    КонецПроцедуры
    Процедура ПриНачалеРаботыСистемы()
     СписОбед = Новый СписокЗначений;
     СписОбед.Добавить(“Курица”);
     СписОбед.Добавить(“Рыба”);
     СписОбед.Добавить(“Мясо”);
     ГлОбед = СписОбед.ВыбратьЭлемент(“Выберете что будет на обед”,ГлОбед);
     Пока ГлОбед=Неопределено Цикл
      ГлОбед = СписОбед.ВыбратьЭлемент(“Выберете что будет на обед”,ГлОбед);
     КонецЦикла;
     
     Числа = Новый Структура;
     Числа.Вставить(“Число1″,”Простое”);
     Для а = 2 по 1000 Цикл
      Ключ = “Число”+Формат(а,”ЧГ=0”);
      Числа.Вставить(Ключ,ЭтоПростоеЧисло(а));
     КонецЦикла;
     Тест = Числа.Число1000;
     Х = 541;
     Тест1 = Числа[“Число”+Х];
    КонецПроцедуры
    Функция ЭтоПростоеЧисло(Ч)
     Для а=2 по Ч-1 Цикл
      Если Ч%а=0 Тогда
       Возврат “Не простое”;
      КонецЕсли;
     КонецЦикла;
     Возврат “Простое”;
    КонецФункции
    Процедура ПередЗавершениемРаботыСистемы(Отказ)
     Если ТекущаяДата()<КонецРДня Тогда
       Отказ = Вопрос(“Рабочий день еще не закончился. Вы уверены, что надо закрыть систему?”,РежимДиалогаВопрос.ДаНет)=КодВозвратаДиалога.Нет;
     КонецЕсли;
    КонецПроцедуры

  37. Харитонов Алексей 31.01.2011 в 08:14

    Добры день пока до 3 ДЗ руки не дошли.
    Вот рассказываю про четвертое:
     
    1. Контроль входа (обработчик события “ПередЗавершениемРаботыСистемы”) очень прост сравниваем ТекущаяДата с границами задаными по условию.
    2. Если вход произошел, то выбор обеда:
    Для обеда создаем список значений “Рыба” “Мясо” “Курица”
    Соответственно дальше иде проверка на выбор пользователя – Если переменная = неопределено то выдаем предупреждение об обязательном выборе обеда.
    3. При выходе (обработчик события “ПередЗавершениемРаботыСистемы”)контролируем ТекущуюДату на нижнюю границу рабочего времени если ТекущаяДата выхода меньше ее то задаем вопрос “Действительно ли пользователь хочет выйти?”
     
    4. А про структуру я не очень понял пока что должно быть ключем, а что значением если можно поясните по этому поводу.
     
     

    • В тексте задания добавил пример, посмотрите.
      Теперь понятно?

      • Харитонов Алексей 31.01.2011 в 11:35

        Да спасибо огромное!
        Вечером выложу отчет по этому пункту заданию!Не будет поздно?:)

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

    • Часть 2
      &НаКлиенте
      Процедура Структура(Команда)
        Стр = Новый Структура();
       Для НовоеЧисло=1 По 1000
        Цикл
          Флаг = ВыборПростогоЧисла(НовоеЧисло);
          Стр.Вставить(“Число”+формат(НовоеЧисло,”ЧРГ=0”),Флаг);
        КонецЦикла;
         Сообщить (Стр.Число591);      
        x = “Число332” ;
       Сообщить (Стр[x]);      
       КонецПроцедуры
      Функция ВыборПростогоЧисла(НовоеЧисло)
       Счетчик = 2;
          Остаток = Окр(sqrt(НовоеЧисло));
       Пока ((НовоеЧисло % Счетчик)<> 0) и (Счетчик <= Остаток)  Цикл
          Счетчик = Счетчик + 1; 
       КонецЦикла;
             Если Счетчик > Остаток Тогда
           Возврат “Простое”
          Иначе
              Возврат “Не простое”
          КонецЕсли; 
       КонецФункции // ВыборПростогоЧисла()

  39. respublica 31.01.2011 в 01:09

    Задание выполнил, особых проблем не возникло. Вкратце комментарий, чтобы не переносить код.
    1. Время начала и окончания просто объявил как переменные через функцию дата с первым годом и т.д. Сообщение пользователю выдается через Предупреждение.
    2. Форму выбора меню сделал  через общую форму,  на которой разместил список значений. Режим выбора – множественный, сделанный выбор отлавливается через событие Выбор, если выбор сделан – форма закрывается. Сама форма вызывается модально, в процедуре ПередЗакрытием проверяется сделан ли выбор.
    3.  Со структурой замечаний не возникло (символ НПП в 1000 заменил). Саму структуру получал по алгоритму:
    <code>
    ПростыеЧисла = Новый Массив;
    Для Инд = 2 По 1000 Цикл
    Значение = “Простое”; Ключ = ….;
    Для Каждого ПростоеЧисло Из ПростыеЧисла Цикл
    Если Инд%ПростоеЧисло = 0 Тогда
    Значение = “Не простое”;
    Прервать;
    КонецЕсли;
    КонецЦикла;
    Числа.Вставить(Ключ, Значение);
    Если Значение = “Простое” Тогда
    ПростыеЧисла.Добавить(Инд);
    КонецЕсли;
    КонецЦикла; 
    </code>
    Посмотрел в ответах, не только я использовал его. Возникает вопрос, насколько он оптимален с точки зрения производительности?

    • > Возникает вопрос, насколько он оптимален с точки зрения производительности?
      На этот вопрос сложно ответить без привязки к контексту. См. последнее видео решения 3-го задания.
      В целом алгоритм мне нравится.

  40. 1.  Создал ОбщийМодульСервер с галками Сервер, Вызов сервера. В нем написал функцию получения времени с сервера, т.к. на клиентах может быть разное время и ориентируемся все время по серверному времени!
    <code>
    ПолучитьДатуВремя(Ч,М,С)
    ДатаВремяНаСервере()
    </code>
    2. В модуле упр. приложения создал необходимые переменные. Границы рабочего дня инициализировал в самом низу модуля, чтобы каждый раз не высчитывать:
    <code>

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

    Функция ЯвляетсяПростым(Ч)
    Если (Ч <= 1) Тогда
    Возврат Ложь;
    КонецЕсли;
    i = 2;
    Пока i*i <= Ч Цикл
    Если (Ч % i = 0) Тогда Возврат Ложь; КонецЕсли;
    i=i+1;
    КонецЦикла;
    Возврат Истина;
    КонецФункции
    Процедура ПриНачалеРаботыСистемы()
    СписокБлюд = Новый СписокЗначений;
    СписокБлюд.Добавить(“Курица”);
    СписокБлюд.Добавить(“Рыба”);
    СписокБлюд.Добавить(“Мясо”);
    глОбед = Новый Массив;
    Пока глОбед.Количество()=0 Цикл
    Если СписокБлюд.ОтметитьЭлементы(“Выберите блюда на обед:”)=Истина Тогда
    Для каждого Блюдо Из СписокБлюд Цикл
    Если Блюдо.Пометка Тогда
    глОбед.Добавить(Блюдо);
    КонецЕсли;
    КонецЦикла;
    КонецЕсли;
    КонецЦикла;

    Числа = Новый Структура(“”);
    Для i=1 По 1000 Цикл
    Ключ = “Число”+Формат(i,”ЧГ=”);
    ТипЧисла = ?(ЯвляетсяПростым(i),”Простое”, “Не простое”);
    Числа.Вставить(Ключ, ТипЧисла);
    КонецЦикла;

    Сообщить(Числа.Число591);
    Сообщить(Числа.Число593);
    X=”Число332″;
    Сообщить(Числа[X]);
    КонецПроцедуры
    </code>