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

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

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

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

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

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

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

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

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

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

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

  1. Светлана 17.04.2011 в 20:13

    Перем ГлОбед экспорт;

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

    НачРаботы=Дата(Год(ТекущаяДата()),Месяц(ТекущаяДата()),

    День(ТекущаяДата()),9,5,38);

    Если ТекущаяДата()<НачРаботы Тогда

    Предупреждение(“Доступ к базе данных с “+ НачРаботы,15 );

    отказ=истина;

    иначе

    отказ=ложь;

    КонецЕсли;

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

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

    КонРаботы=Дата(Год(ТекущаяДата()),Месяц(ТекущаяДата()),

    День(ТекущаяДата()),18,11,42);

    Если ТекущаяДата()<КонРаботы Тогда

    Если Вопрос(“Вы уверены,что хотите выйти из системы? “,

    РежимДиалогаВопрос.ДаНет)=КодВозвратаДиалога.Да  тогда

    отказ=ложь;

    иначе

    отказ=истина;

    КонецЕсли;

    КонецЕсли;

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

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

    СписокЗнач= новый СписокЗначений();

    СписокЗнач.Добавить(“Курица”);

    СписокЗнач.Добавить(“Рыба”);

    СписокЗнач.Добавить(“Мясо”);

    Выбрали = 0;

    Пока Не Выбрали Цикл

    Если СписокЗнач.ОтметитьЭлементы(“Какой вариант

    |обеда Вы предпочитаете?”)=1 тогда;

    Для каждого Элемент Из СписокЗнач Цикл

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

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

    Выбрали = 1;

    КонецЕсли;

    КонецЦикла;

    КонецЕсли;

    КонецЦикла;

    Числа();

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

    Процедура Числа()

    Стр = Новый Структура;

    Для Число = 1 По 1000 Цикл

    Число1=СтрЗаменить(“Число”+Число,Символы.НПП,””);

    Если ПростоеЧисло(Число) Тогда

    Стр.Вставить(Число1,”Простое”);

    Иначе

    Стр.Вставить(Число1,”Не простое”);

    КонецЕсли;

    КонецЦикла;

    Сообщить(Стр.Число591);

    X =”Число591″;

    Сообщить(X+” “+Стр[X]);

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

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

    КолДелСОст0=0;

    Для сч=1 По 1000 Цикл

    Если Число%сч=0 Тогда

    КолДелСОст0=КолДелСОст0+1;

    КонецЕсли;

    КонецЦикла;

    Возврат (КолДелСОст0=2);

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

    ГлОбед= новый массив ;

  2. Всё забываю спросить – это только у меня не видно отформатированного кода и не работает тег <code> или это у всех так? Вообще конечно неформатированный код, особенно код с чужими идеями разбирать очень сложно.

    • А вы вставляете соответствующий тег?
      Форматированный код выглядит так:

      Функция ПолучитьТекущееВремяВСекундах()
      д = ТекущаяДата();  
      Возврат Час(д) * 3600 + Минута(д) * 60 + Секунда(д);
      КонецФункции
      • Евгений, “соответствующий тег”, вы имеете в виду code?
        Я – вставляю. Ни фига не получается – так же, как и у коллеги trambalda. :(
        Использую браузер Opera.
        Ваш пример форматированного кода выглядит как более мелкий шрифт, но также – без отступов. В принципе, читать тоже не очень удобно.
        Мой код стороннему наблюдателю, полагаю, читать вообще невозможно. :)

        • Да, тег code.
          Отступы действительно не реализованы.

          • Ну вот, уже виден некий результат вашего “разбираемся” код стал “расцвеченным”.  И хоть еще не все корректно расвечивается  (в мое коде,  на вскидку, не выделено “Иначе”), и, к тому же, жаль, что не реализована табуляция, да и с возвратом каретки надо что-то делать (иначе слишком большие дыры в тексте) – но уже гораздо читабельнее, чем было до того.
            Спасибо!

            • Продолжаем разбираться, сейчас боремся с табуляцией..

    • Веселый блок :)

      • Дальше будет еще веселее :)

        • Евгений, а вы каким браузером пользуетесь? у меня с <code> размер шрифта не меняется =)  Пример:
          <code>Сообщить(“Привет”);</code>

          • По всей видимости, вы вручную вставляете теги, верно?
            Правильнее использовать кнопку “code” из панели над комментарием.
            Можно выделить программный код, и нажать на “code”.

            • Вы знаете, у меня такой кнопки в панели нет. Скрин прилагаю:  http://saveimg.ru/show-image.php?id=4d4724a9cc6f3d74a15226c1f9d0e650

              • Странно, вот мой скрин:

                11

                Я использую Chrome. Возможно у вас IE9? В любом случае попробуйте другой браузер.

                • Я использую браузеры: Chrome и Opera. Результат одинаковый. У всех пользователей скорой всего этой кнопки нет, т.к. у всех большой шрифт вкладываемого кода… А возможно ли задать этот вопрос веб-мастеру? :)

                • Уже задал, ждем ответа.

                • <code>Разница в том, что при комментировании в админке и в посте – разные панели редактора</code>

              • Мой браузер – Opera. Вид картинки – абсолютно такой же, как у kinstoss. Т.е. – кнопки code нет!!! :(

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

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

     

    • Посмотрите решение, думаю вопросы снимутся.

  4. Все решил. Вышел небольшой затык с пробелом в 1000. Увидел в отладчике, добавил Формат. Простые числа решил найти не простым перебором, а чуть быстрее. Для проверки вывел на экран.
    <code>
    Перем глОбед Экспорт;

    Процедура ПередНачаломРаботыСистемы(Отказ)
    ТекДата=ТекущаяДата();
    ТекСекунда=ТекДата-НачалоДня(ТекДата);
    Отказ=((ТекСекунда<(9*3600+5*60+38)) или (ТекСекунда>(18*3600+11*60+42)));
    КонецПроцедуры

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

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

    Процедура НайтиПростыеЧисла(Предел,РежВыводаПростых=Истина)
    Числа=Новый Структура;
    Для Сч=1 По Предел Цикл
    Числа.Вставить(“Число”+Формат(Сч, “ЧГ=”), “Простое”);
    КонецЦикла;
    Для Сч=2 По Предел Цикл
    Стр=””;
    Числа.Свойство(“Число”+Формат(Сч, “ЧГ=”),Стр);
    Если Стр=”Простое” Тогда
    Сч2=Сч;
    Пока Сч2<=Предел Цикл
    Сч2=Сч2+Сч;
    Числа.Вставить(“Число”+Формат(Сч2, “ЧГ=”), “Не простое”);
    КонецЦикла;
    КонецЕсли;
    КонецЦикла;
    Если РежВыводаПростых=Истина Тогда
    Сообщить(“Простые числа от 1 до “+Предел+”:”);
    Для каждого Зн Из Числа Цикл
    Если Зн.Значение=”Простое” Тогда
    Сообщить(“”+Сред(Зн.Ключ,6));
    КонецЕсли;
    КонецЦикла;
    КонецЕсли;
    КонецПроцедуры // НайтиПростыеЧисла(Предел)

    </code>

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

    Функция ЧислоПростое(Знач Число)
     Результат = “Простое”;
     ВерхняяГраница = Окр(Число/2,0,РежимОкругления.Окр15как20);
     Для Сч=2 по ВерхняяГраница Цикл
      Если Число%Сч=0 Тогда
       Результат = “Не простое”; Прервать;
      КонецЕсли;
     КонецЦикла;
     
     Возврат Результат;
    КонецФункции

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

  7. Начало работы и окончание записал в константы. Кнопка “закрыть” и “ESC” реализованы в общей форме.
    Модуль управляемого приложения:

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

    проверка = истина;
    СервПроверкаНаРаботуССистемой.ПроверкаНаВход(проверка);

    Если НЕ проверка  Тогда

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

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

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

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

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

    Для каждого Строка Из СписокЗН Цикл

    Если Строка.Пометка Тогда

    глОбед.Добавить(Строка);
    КонецЕсли;
    КонецЦикла;
    КонецПроцедуры
    Структура = Новый Структура();
    Для Счетчик = 1 По 1000 Цикл

    Ключ = “Число” + Формат(Счетчик,”ЧГ=0″);
    Значение = СервПроверкаНаРаботуССистемой.ПроверкаНаЧисло(Счетчик);
    Структура.Вставить(Ключ,Значение);

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

    &НаСервере
    Процедура ПроверкаНаВход(проверка) Экспорт
     
    Дата =  ‘00010101’ + (ТекущаяДата() – НачалоДня(ТекущаяДата()));
    ВремяНачала = Константы.ВремяНачала.Получить();
    ВремяОкончания = Константы.ВремяОкончания.Получить();

    Если ВремяНачала >= Дата или ВремяОкончания <= Дата Тогда
    проверка = ложь;
    КонецЕсли;

     
    КонецПроцедуры // ПроверкаНаВход()
     
    &НаСервере
    Процедура ПроверкаНаВыход(проверка) Экспорт

    Дата =  ‘00010101’ + (ТекущаяДата() – НачалоДня(ТекущаяДата()));
    ВремяОкончания = Константы.ВремяОкончания.Получить();
     
    Если ВремяОкончания > Дата Тогда
    проверка = ложь;
    КонецЕсли;
     
    КонецПроцедуры // ПроверкаНаВыход()
     
    &НаСервере
    Функция ПроверкаНаЧисло(Число) Экспорт

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

    Для Счетчик=1 По ЧислоН Цикл

    Результат = Результат*Счетчик;
    КонецЦикла;

    Возврат Результат;
    КонецЕсли;
    КонецФункции // Факториал()
    Модуль общей формы:

    &НаКлиенте
    Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
    Ошибка = 0;

    Для каждого Строка Из Список Цикл

    Если Строка.Пометка Тогда

    Ошибка = Ошибка +1;

    КонецЕсли;

    КонецЦикла;

    Если Ошибка = 0 Тогда
    Отказ = Истина;
    Сообщить(“Выберите обед”);
    КонецЕсли;

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

    &НаКлиенте
    Процедура ПриОткрытии(Отказ)

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

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

    &НаКлиенте
    Процедура Команда1(Команда)
    Список.ОтметитьЭлементы(“Выберите обед”);
    КонецПроцедуры

    Проверку перебором делителей не понял, поэтому проверку на простое число реализовал с помощью “Теоремы Вильсона”

    • Прошу прощения за дубляж, эту фразу только сейчас увидел “При вставке фрагментов кода их следует обрамлять тегами <code></code>”. =) Впредь буду умнее.
      Нужно ли более подробно объяснять код?

      • >Нужно ли более подробно объяснять код?
        Нет, не требуется.

      • Попробую использовать теги :)
        <code>процедура Привет()
        Сообщить(Привет);
        </code>

  8. ДЗ4: Листинг Модуля Управляемого Приложения:
    <code>
    Перем глОбед;
    Перем НачалоРаботыПоГрафику;
    Перем КонецРаботыПоГрафику;

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

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

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

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

  9. О простых числах. Цитирую Вики: “В настоящее время в математике принято не относить единицу ни к простым, ни к составным числам”, но раз в условии она упоминается, то я ее включил в список простых. Для поиска простых чисел оптимально использовать алгоритм, в котором анализируются только числа, оканчивающиеся на 1, 3, 7, 9, так как все остальные числа, очевидно, не являются простыми. Для выявления, простое искомое число или нет, нужно попытаться поделить его на все уже найденные ранее простые числа, не превышающие квадратного корня из анализируемого числа. Этот способ работает в несколько раз быстрее Решета Эратосфена.
    Перем глОбед;
    Перем глВремяНачалаРабочегоДня;
    Перем глВремяОкончанияРабочегоДня;

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

    Функция ПолучитьПростыеЧисла(Предел)
    ПростыеЧисла = Новый Массив();
    ПростыеЧисла.Добавить(3);
    ПростыеЧисла.Добавить(5);
    Для Кандидат = 6 По Предел Цикл
    ПоследняяЦифра = Число(Прав(Кандидат, 1));
    Если ПоследняяЦифра = 1 ИЛИ ПоследняяЦифра = 3 ИЛИ ПоследняяЦифра = 7 ИЛИ ПоследняяЦифра = 9 Тогда Иначе Продолжить; КонецЕсли;
    Корень = Sqrt(Кандидат);
    Результат = Истина;
    Для Каждого ПростоеЧисло Из ПростыеЧисла Цикл
    Если ПростоеЧисло > Корень Тогда Прервать; КонецЕсли;
    Частное = Кандидат / ПростоеЧисло;
    Результат = Результат И Частное <> Цел(Частное);
    КонецЦикла;
    Если Результат Тогда
    ПростыеЧисла.Добавить(Кандидат);
    КонецЕсли;
    КонецЦикла;
    ПростыеЧисла.Добавить(1);
    ПростыеЧисла.Добавить(2);
    Возврат ПростыеЧисла;
    КонецФункции

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

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

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

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

    Сообщить(“Число591: “+Числа.Число591);
    Х = “Число332″;
    Сообщить(Х+”: “+Числа[Х]);
    КонецПроцедуры

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

    глВремяНачалаРабочегоДня = 9 * 3600 + 5 * 60 + 38; //09:05:38
    глВремяОкончанияРабочегоДня = 18 * 3600 + 11 * 60 + 42; //18:11:42
    глОбед = Новый Массив();

    • Хочу пояснить, почему я использовал ПриНачалеРаботыСистемы(), а не “Перед…”. В уроке было сказано, что “Перед…” выполняется ДО запуска системы, я это понял таким образом что раз система еще не запустилась, то и интерфейса нет, и сообщения выводить не получится, на деле не проверил, а оказалось что окошко с предупреждением вполне себе появляется на фоне желтой заставки.

      • И еще хочу заметить, что в данном случае, когда надо просто убрать пробелы, СтрЗаменить, быстрее, чем Формат.

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

  10. Еще один ?
    Для Число = 1 По 1000 Цикл
    Числа.Вставить( СтрЗаменить( “Число” + Число, Символ(160), “” ), ОпределитьЧисло(Число));
    КонецЦикла;
    Когда Число приняло значение 1000 строка “Число” + Число приняло значение Число1 000 – что ключем структуры быть не может. Символ я отловил и заменил. А как правильно нужно было поступить?

    • >А как правильно нужно было поступить?
      Об этом мы порассуждаем в решении задания.

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

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

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

  13. Задание выполнила следующим образом:
    <code> Перем ГлОбед;
    Перем ГлСтруктураЧисел Экспорт;

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

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

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

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

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

    Если ТекДата < ДоступныйКонецРаботы(ТекДата) Тогда

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

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

    Функция ДоступноеНачалоРаботы(Дата)
    Возврат Дата(Год(Дата),Месяц(Дата),День(Дата),9,5,38);
    КонецФункции

    Функция ДоступныйКонецРаботы(Дата)
    Возврат Дата(Год(Дата),Месяц(Дата),День(Дата),18,11,42);
    КонецФункции    

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

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

    СтруктураЧисел();
    КонецПроцедуры

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

    Возврат КонечныйСписок;
    КонецФункции

    Процедура СтруктураЧисел()
    ГлСтруктураЧисел = Новый Структура;

    Индекс = 0;
    Пока Индекс < 1000 Цикл
    Индекс = Индекс + 1;
    ГлСтруктураЧисел.Вставить(“Число” + Формат(Индекс,”ЧГ=0″),”Простое”);
    КонецЦикла;    

    Индекс = 2;    
    Пока  Индекс <= 1000 Цикл

    Число = Индекс;        
    Сч    = Число;        

    Пока Сч*Число <= 1000 Цикл            
    ГлСтруктураЧисел[“Число” + Формат(Сч*Число,”ЧГ=0″)] = “Не простое”;
    Сч = Сч + 1;
    КонецЦикла;    

    Индекс = Индекс + 1;
    КонецЦикла;    

    КонецПроцедуры    </code>
    Проверку структуры чисел осуществляла с помощью внешней обработки:
    <code> &НаКлиенте
    Процедура Проверить(Команда)
    Значение = “”;

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

    КонецПроцедуры </code>
    Здесь  параметр – число на форме.

  14. <code>
    Перем РабочееВремя;
    Перем СписокОбеда;
    Перем ГлОбед Экспорт;

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

    Процедура ПриНачалеРаботыСистемы()
    ПоказательВыбора = ЛОЖЬ;
    Пока Не ПоказательВыбора Цикл
    ПоказательВыбора = СписокОбеда.ОтметитьЭлементы(“Выберите обед”);
    КонецЦикла;
    ГлОбед = СписокОбеда.ВыгрузитьЗначения();
    КонецПроцедуры

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

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

    Если НЕ ПроверяемоеЧисло = Неопределено Тогда
    Значение = Числа.Свойство(ПроверяемоеЧисло,Значение);
    Сообщить(Значение);
    КонецЕсли;

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

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

    КонецФункции // ПроверкаНаПустоеЧисло()

    РабочееВремя = ((Час(ТекущаяДата()) * 3600 + Минута(ТекущаяДата()) * 60 + Секунда(ТекущаяДата()))>32738 Или (Час(ТекущаяДата()) * 3600 + Минута(ТекущаяДата()) * 60 + Секунда(ТекущаяДата()))<65502);
    СписокОбеда = Новый СписокЗначений;
    СписокОбеда.Добавить(“Курица”);
    СписокОбеда.Добавить(“Рыба”);
    СписокОбеда.Добавить(“Мясо”);
    </code>

  15. Виталий Межаков 16.04.2011 в 18:47

    Решение:
     
    1. Проверку на рабочее время реализовал сравнивая текущее время и границы рабочего дня, предварительно приведя все даты к секундам.
    Подробно по ссылке.
     
    2. Работу со списком значений реализовал согласно рекомендациям в занятиях. Неудобным показалось то, что нельзя сразу получить из списка все отмеченные элементы, получилось только перебором. Структуру заполнил, проверяя на возможные делители вычислением остатка от деления.
    Подробно по ссылке.

  16. Yuri Golovko 16.04.2011 в 16:45

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

  17. Андрей Красник 16.04.2011 в 15:44

    1. Проверка находится в процедуре «ПередНачаломРаботыСистемы». Для проверки рабочего времени рассмотрел два варианта
    серверный (функция в общем модуле)
    <code>
    Функция РабочееВремя() Экспорт
     
    Запрос = Новый Запрос;
    Запрос.Текст = “ВЫБРАТЬ
    |             ВЫБОР
    |                             КОГДА &ТекущееВремя МЕЖДУ ДАТАВРЕМЯ(1, 1, 1, 0, 5, 38) И  ДАТАВРЕМЯ(1, 1, 1, 18, 11, 42)
    |                                             ТОГДА ИСТИНА
    |                             ИНАЧЕ ЛОЖЬ
    |             КОНЕЦ КАК ЭтоРабочееВремя”;
     
    ТекДата = ТекущаяДата();
    Запрос.УстановитьПараметр(“ТекущееВремя”,Дата(1,1,1,Час(ТекДата),Минута(ТекДата),Секунда(ТекДата)));
     
    Выборка = Запрос.Выполнить().Выбрать();
    Выборка.Следующий();
    Возврат Выборка.ЭтоРабочееВремя;
    КонецФункции
    </code>
    и клиентский
    <code>
    Функция РабочееВремя()
    ВремяСтрокой = Формат(ТекущаяДата(),”ДФ=ЧЧ.мм.сс”);
    Возврат (ВремяСтрокой >= “00.05.38”) И (ВремяСтрокой <= “18.11.42”)
    КонецФункции
    </code>
    Она же используется в 4 части.
    2. Для 100% выбора использовал бесконечный цикл

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

    для проверки на простоту использовал функцию
    <code>
    Функция ЧислоПростое(Число)
    Простое = Истина;
    Для Сч = 3 По  Цел(Sqrt(Число))            Цикл
    Если Число % Сч = 0 Тогда
    Простое = Ложь;
    КонецЕсли;
    КонецЦикла;
    Возврат Простое;
    КонецФункции
    </code>
    4. Проверка находится в процедуре «ПередЗавершениемРаботы»

  18. Андрей Кусанов 16.04.2011 в 15:21

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

  19. Майор 16.04.2011 в 15:02

    Сделал, протестировал работу при различных вариантах, багов не нашёл )))

    Часть первая:
    Вход в систему, выбор обеда:
    Долго мучался с выводом сообщения, что работать ещё рано, пока не нашёл “ЗавершитьРаботуСистемы”.
    Да, сравнение времени честно подглядел в бонусных материалах ))
    <a href=”http://i029.radikal.ru/1104/ff/715dd7f7443f.jpg” rel=”nofollow”>ПриНачалеРаботыСистемы</a>

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

    Часть вторая:
    <a href=”http://i017.radikal.ru/1104/75/ee3cf5eb4c1e.jpg” rel=”nofollow”>Простые числа</a>

    По поводу обращения к данным структуры…
    Запнулся в начале на “Число1 000”, долго просидел.
    Вариант с известным ключём отрабатывает нормально:
    <code>
    Сообщить(Структура.Число591);
    </code>

    Вариант с переменной, (которого в уроках не было) вываливается в ошибку:
    <code>
    Х = “Число332”;
    Сообщить(Структура.Х);
    </code>

    В связи с этим вопрос – есть ли более простой способ, чем этот?
    <code>    
    Х = “Число332”;
    Для каждого Стр Из Структура Цикл
    Если Стр.Ключ = Х Тогда
    Сообщить(Стр.Значение);
    КонецЕсли;
    КонецЦикла;
    </code>

    • Да, есть более простой способ:

      Перем Значение;


      Если Структура.Свойство(Х, Значение) Тогда
      Сообщить(Значение);
      КонецЕсли;

    • Но есть и еще более простой способ:
      Сообщить(Структура[Х]);

      • Майор 16.04.2011 в 21:22

        Сообщить(Структура[Х]);
        действительно работает, но на мой взгляд – не очевидно, в синтакс-помощнике я, по крайней мере, не нашёл )))

        • >в синтакс-помощнике я, по крайней мере, не нашёл
          Действительно этой информации в СП нет.
          Полагаю, что это ошибка СП.

    • Майор 16.04.2011 в 20:07

      немного поторопился, в условие при старте недописал проверку на время после окончания рабочего дня…
      здесь исправленная версия:

      &lt;img src="

      http://i063.radikal.ru/1104/c2/3e7ca616dccb.jpg

      " alt="Первая часть" /&gt;

       

  20. В модуле управляемого приложения:
    <Code>
    //Функция проверки времени: возвращает Истину или Ложь
    Функция ТекущееВремяВПределахРабДня()

    ТекДата = ТекущаяДата();
    лЧас     = Формат(Час(ТекДата),        “ЧЦ=2;ЧВН=”);
    лМин     = Формат(Минута(ТекДата),    “ЧЦ=2;ЧВН=”);
    лСек     = Формат(Секунда(ТекДата),    “ЧЦ=2;ЧВН=”);
    ТекВремя = лЧас+лМин+лСек;

    Возврат ?(НачРабДня <= ТекВремя И ТекВремя <= КонРабДня, Истина, Ложь)

    КонецФункции
    НачРабДня = “090538”;
    КонРабДня = “181142”;
    </Code>
    Эта функция используется в процедурах
    ПередНачаломРаботыСистемы(Отказ) (используем метод Предупреждение) и
    ПередЗавершениемРаботыСистемы(Отказ) (использую метод Вопрос)
    Все остальные действия (создание меню и структуры чисел) – в процедуре
    <code>
    Процедура ПриНачалеРаботыСистемы()
    глОбед = Новый Массив;

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

    Повторять = Истина;
    Пока Повторять Цикл //повторяем до тех пор пока не будет выбора
    Повторять = НЕ Меню.ОтметитьЭлементы(“The menu, please…”);
    Если НЕ Повторять Тогда //возможно сбросили все отметки и нажали ОК – не допустим
    Повторять = Истина;
    Для каждого Элемент из Меню Цикл
    Если Элемент.Пометка Тогда
    глОбед.Добавить(Элемент);
    Повторять = Ложь;
    КонецЕсли;
    КонецЦикла;
    КонецЕсли;
    КонецЦикла;
    Сообщить(“Ваше меню:”);
    Для каждого Элемент Из глОбед Цикл
    Сообщить(“=== “+Элемент.Значение);
    КонецЦикла;
    //работаем со структурой
    ЗаполнитьСтруктуруПростымиЧислами();

    Зн = “”; ПоКлючу = “Число593”;
    Если Числа.Свойство(ПоКлючу,Зн)  Тогда
    Сообщить(“Нашли значение “””+Зн+””” по ключу “””+ПоКлючу+””””);
    Иначе
    Сообщить(“Не найден ключ “””+ПоКлючу+””””);
    КонецЕсли;
    КонецПроцедуры
    </code>
    В процедуре ЗаполнитьСтруктуруЧислами() используем следующий формат для ключа  структуры
    …………….
    Числа.Вставить(“Число”+Формат(Сч,”ЧГ=0”),Сч);
    ……………………..
     

  21. Юрий Торговцев 16.04.2011 в 11:49

    Задание выполнил.
    <code>
    Перем глОбед Экспорт; 
    Перем ТекущееВремя;
    Перем ВремяНачалаРаботы;
    Перем ВремяОкончанияРаботы;

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

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

    Предупреждение(“Сейчас заходить в конфигурацию нельзя.”);

    Отказ = Истина;

    КонецЕсли;

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

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

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

    СписокМеню = Меню;

    СделанаПометка = Ложь;

    Пока Не СделанаПометка Цикл

    Если Меню.ОтметитьЭлементы(“Какой вариант обеда Вы предпочитаете?”) Тогда

    Для каждого Блюдо Из Меню Цикл

    Если Блюдо.Пометка Тогда

    глОбед.Добавить(Блюдо.Значение);

    СделанаПометка = Истина;

    КонецЕсли;

    КонецЦикла;

    КонецЕсли;

    КонецЦикла;

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

    Для ТестируемоеЧисло=1 По 1000 Цикл

    Если ПростоеЧисло(ТестируемоеЧисло) Тогда

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

    Иначе

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

    КонецЕсли;

    КонецЦикла;

    Сообщить(“Число 591 простое? ” + ?(Числа.Число591 = “Простое”,”Да. “,”Нет. “) + Числа.Число591 + “.”);
    Х = “Число332”;
    У = “”;
    Сообщить(?(Числа.Свойство(Х, У),”В структуре есть элемент ” + Х + “. Его зачение – “”” + У + “””.”,”В структуре нет элемента ” + Х + “.”));

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

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

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

    Если Вопрос(“Целесообразно ли покидать систему до окончания рабочего дня?”,РежимДиалогаВопрос.ДаНет)= КодВозвратаДиалога.Нет Тогда

    Отказ = Истина;

    КонецЕсли;

    КонецЕсли;

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

    Функция ПростоеЧисло(ТестируемоеЧисло)

    Если ТестируемоеЧисло = 1 Тогда

    Возврат Истина;

    КонецЕсли;

    Делитель = 2;

    Пока ТестируемоеЧисло % Делитель <> 0 Цикл

    Делитель = Делитель + 1;

    КонецЦикла;

    Если Делитель = ТестируемоеЧисло Тогда

    Возврат Истина;

    Иначе

    Возврат Ложь;

    КонецЕсли;

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

    ТекущееВремя = Час(ТекущаяДата())* 60 * 60 + Минута(ТекущаяДата()) * 60 + Секунда(ТекущаяДата());

    ВремяНачалаРаботы = 9 * 60 * 60 + 5 * 60 + 38;

    ВремяОкончанияРаботы = 18 * 60 * 60 + 11 * 60 + 42;

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

  22. перем ГлОбед, ВремяСтарта, ВремяКонца экспорт;

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

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

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

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

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

    Если Элемент.Пометка Тогда
    Счетчик=Счетчик+1;
    КонецЕсли;
    КонецЦикла;
    Если Счетчик=0 Тогда

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

    КонецЕсли;     
    Если ВыбранОбед = Ложь Тогда

    Предупреждение(“Выберите хотябы одно блюдо”);

    КонецЕсли;

    КонецЦикла;

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

    КонецЦикла;

    ПростоеЧисло();
    КонецПроцедуры

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

    КонецЕсли;   

    Иначе Отказ=Ложь;
    КонецЕсли;    
    КонецПроцедуры
    Процедура ПростоеЧисло()
    Числа = новый Структура();
    Для Сч=1 По 999 Цикл
    Стр=”Число”+Строка(Сч);
    Числа.Вставить(Стр,”Простое”);
    КонецЦикла;
    Числа.Удалить(“Число1”);
    Числа.Вставить(“Число1″,”Не простое”);
    Сч2=2;
    Пока Сч2 <=Sqrt(999) Цикл
    Числа.Свойство(“Число”+Строка(Сч2));
    рез=Числа[“Число”+Строка(Сч2)];
    Если Рез=”Простое” тогда
    Сч3=Сч2*2;
    Пока Сч3 <= 999 Цикл    

    Числа.Удалить(“Число”+Строка(Сч3));
    Числа.Вставить(“Число”+Строка(Сч3),”Не простое”);    

    Сч3=Сч3+СЧ2;        
    КонецЦикла;    

    КонецЕсли;  

    Сч2=Сч2+1;
    КонецЦикла;

    Сообщить(Числа.Число591);
    Х=”Число332″;
    Если Числа.Свойство(Х)  Тогда
    Сообщить(Числа[Х]);
    иначе
    Сообщить(“НетТакого ключа”);

    КонецЕсли;

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

    Структура почемуто работает только до 999

    • >Структура почемуто работает только до 999
      Ответ будет в решении.

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

    Числа.Вставить(ключ,значСтруктуры);    
    КонецЦикла;

    сообщить(“”+Числа.Число591);
    х=332;
    сообщить(“Число332 “+?(Числа.Свойство(“Число”+х),Числа[“Число”+х],”не найдено.”));

  24. Ссылка на решение задания:
    http://imagepost.ru/images/4/xf/4xf_1.jpg

  25. Задание выполнил. Понял, что на 8.2 больше удобных средств оповещения пользователя по сравнению с 8.0 и 8.1. Так сообщение о невозможности начала работы можно вывести и через предупреждение с еще открытой программой и через оповещение пользователя, закрыв приложение. Создание структуры чисел мне показалось интересным в плане оптимизации алгоритмов.

  26. Мария 15.04.2011 в 20:39

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

    Структура=Новый Структура;
    Для  i=1 По 1000 Цикл
    k=Истина;
    СтЧисл=СтрЗаменить(“Число”+i,Символы.НПП,””);
    Для  j=2 По Цел(Sqrt(i)) Цикл
    Если i%j=0 И k Тогда
    k=Ложь;
    КонецЕсли;
    КонецЦикла;
    Если НЕ k Тогда
    Структура.Вставить(СтЧисл,”Составное”);
    Иначе
    Структура.Вставить(СтЧисл,”Простое”);
    КонецЕсли;
    КонецЦикла;
    Сообщить(Структура.Число535);
    Структура=Новый Структура; Для i=1 По 1000 Цикл
    k=Истина; СтЧисл=СтрЗаменить(“Число”+i,Символы.НПП,””); Для j=2 По Цел(Sqrt(i)) Цикл
    Если i%j=0 И k Тогда k=Ложь; КонецЕсли; КонецЦикла;
    Если k Тогда Структура.Вставить(СтЧисл,”Простое”); Иначе Структура.Вставить(СтЧисл,”Составное”); КонецЕсли; КонецЦикла; Сообщить(Структура.Число535);

     

  27. Может зря сюда, но support@spec8.ru молчит.
    1С:Предприятие 8.2 (8.2.12.96) – это “движок” на котором я изучаю
    Базовый курс. В “кино”(Block1-122-part0-main.avi ) Вы создаете команду формы, например
    “Массив”, далее перетаскиваете команду на командную панель (22-26
    секунды), на командной панели у Вас создается кнопка “Массив”, на
    форме тоже появляется надпись “Массив” в командной панели.
    Пытаюсь повторить Ваши действия – результат: всё тоже самое, но,
    после перетаскивания Свойство:Кнопка Имя “ФормаМассив” (у Вас
    “Массив”). Почему?

    • >но, после перетаскивания Свойство:Кнопка Имя «ФормаМассив» (у Вас «Массив»). Почему?
      Средства разработки не стоят на месте.
      В релизе на котором происходит демонстрация было такое поведение платформы, сейчас иное.
      Ничего страшного в этом нет.

      Да, кстати, ящик для вопросов по курсу mg.spec8ru@gmail.com.

  28. <code>
    Перем ГлОбед Экспорт;

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

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

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

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

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

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

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

    Сообщить(Числа.Число591);
    х = “Число591”;
    Сообщить(Числа[х]);
    КонецПроцедуры    

    </code>

  29. Сделано.
    Сильнейшее впечатление произвела борьба с функцией Формат, что бы убрать разделитель между группами.
    Появилась непонятка: если я выхожу из приложения через Меню/файл/Выход почему то в процедуру модуля УП ПередЗавершениемРаботыСистемы не попадаю? Может я сам где-то наколбасил?
    И вопрос по главам: ТаблицуЗначений созданную программно, я связал(и показал) с соответствующим элементом формы, но для этого пришлось “руками” создавать колонки. А как программно(динамически) это же сделать?

    • > Меню/файл/Выход почему то в процедуру модуля УП ПередЗавершениемРаботыСистемы не попадаю
      Это ошибка платформы. Разработчики о ней знают и возможно исправят в ближайших релизах.
      >А как программно(динамически) это же сделать?
      К сожалению, волшебного метода “СоздатьКолонки” нет (он работает только для Табличного Поля обычной формы). Поэтому либо придется вручную создавать колонке на форме, либо программно добавлять колонки к реквизиту формы. Но второй подход не является рекомендуемым, так как после программной модификации формы отключаются некоторые механизмы оптимизации.

  30. Вот 1 часть
    [img]http://imagepost.ru/images/4/_1/4_1_1.JPG[/img]
    Вто 2 часть
    [img]http://imagepost.ru/images/4/_2/4_2_1.JPG[/img]
     

  31. Задание выполнил.

  32. Виталий Межаков 15.04.2011 в 02:05

    Вопросы по универсальным коллекциям.
     
    1. В уроке было отмечено, что коллекции структура и соответствие очень похожи. Получается, что структура есть частный случай соответствия с ключом определенного типа. Тогда напрашивается вопрос – для чего был реализован этот частный случай? Возможно, какая-то оптимизация с точки зрения производительности? Или  выводы на счет близкой схожести данных коллекций не совсем верные?
     
    2. Было сказано, что универсальные коллекции зачастую используются для обработки данных. Одним из важных показателей скорости обработки данных является скорость поиска. Есть ли какая-то сравнительная характеристика для данного показателя при использовании различных коллекций? Есть мнение, что скорость поиска в соответствии выше чем, например, в таблице значений.
     
    3.Одним из отличий таблицы значений от массива названа возможность построения индексов. Можно поподробнее узнать, что это такое?
     
    Прошу меня извинить, если бегу впереди паровоза, и эти вопросы будут рассмотрены в дальнейшем. Бегло просмотрел содержание продвинутого курса по слайдам, и не увидел возможных ответов.

    • Вопросы рассмотрим в мастер-группе.

  33. Константин 15.04.2011 в 00:28

    Домашнее задание выполнил.
    1. Проверку рабочего времени сделал в предопределенной процедуре модуля управляемого приложения ПередНачаломРаботыСистемы и использованием метода глобального контекста Предупреждение.
    2. СписокЗначений реализовал в процедуре ПриНачалеРаботыСистемы. Использовал метод ОтметитьЭлементы
    3. Проверку сделал в процедуре ПередЗавершениемРаботыСистемы с использованием метода глобального контекста Вопрос
    4.Выполнил обычным перебором с вложенным циклом, хотя вначале хотелось реализовать алгоритм вроде “Решето Эратосфена”.

  34. 1.  В модуле управляемого приложения создал  событие “ПередНачаломРаботыСистемы(Отказ)” в ней одна строка: Отказ = РабочееВремя(), где Рабочее время() – функция, которая возвращает значение типа “Булево”.
    Код функции РабочееВремя():
    ТД = ТекущаяДата();
    НачРаботы = Дата(Год(ТД), Месяц(ТД),День(ТД),9,5,38);
    КонРаботы = Дата(Год(ТД),Месяц(ТД),День(ТД),18,11,42);
    Если ТД < НачРаботы или ТД > КонРаботы Тогда
    Предупреждение(“Конфигурация запускается только в рабочее время”,4,”Внимание”);
    Возврат Истина;
    КонецЕсли;
    Возврат Ложь;
    2. В том же модуле создал событие ПриНачалеРаботыСистемы() там создал и заполнил список значений “Списокобедов”, затем в нем же вызываю процедуру ВыбратьОбед(СписокОбедов).
    Код процедуры:
    Если СписокОбедов.ОтметитьЭлементы(“Выбор вариантов обеда”) Тогда
    Для Каждого Обед Из СписокОбедов Цикл
    Если Обед.Пометка Тогда
    глОбед.Добавить(Обед.Значение);
    КонецЦикла;
    Иначе
    ВыбратьОбед(СписокОбедов);
    КонецЕсли;
    3.  Событие ПередЗавершениемРаботыСистемы(Отказ). Там выполняю функцию Рабочеевремя(). Если возвращено Истина (т.е. еще рабочее время), то задаю вопрос и “Отказ”у присваиваю значение “Истина”, если ответ на вопрос “Да”
    4. тут вспомнил информатику со времен института:
    Процедура ЗаполнитьСтруктуру()
    СтрПростые =  Новый Структура;
    СтрПростые.Вставить(“Число1”,1);
    Для Инд = 1 по 1000 Цикл
    Ключ = СтрЗаменить(“Число “+ Инд,Символы.НПП,””);
    Если ПростоеЧисло(Инд) Тогда
    стрПростые.Вставить(Ключ,”Простое”);
    Иначе
    СтрПростые.Вставить(Ключ,”Не простое”);
    КонецЕсли;
    КонецЦикла;
     
    КонецПроцедуры
     
    Функция ПростоеЧисло(Числ)
    Ф = Истина;
    Для Инд = 2 по Цел(Sqrt(Числ)) Цикл
    Если Числ%Инд = 0 И Ф Тогда
    Ф = Ложь;
    КонецЕсли;
    КонецЦикла;
    Возврат Ф;
    КонецФункции
    Результаты: 1,2,3,5,7,11 и тд.

  35. Модуль управляемого приложения:
    http://imagepost.ru/images/d/z4/dz4.png
    Примерно так.

  36. Текст модуля управляемого приложения
    Перем глОбед;

    Функция РабочееВремя()
    НачалоРаботы = 90538;
    КонецРаботы =181142;
    ВремяНачала = Число(Формат(ТекущаяДата(), “ДФ=ЧЧммсс”));
    Возврат (ВремяНачала > НачалоРаботы) = (ВремяНачала < КонецРаботы)
    КонецФункции

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

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

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

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

  37. Особых трудностей не возникло. Вот модуль управляемого приложения.
    http://radikal.ru/F/s57.radikal.ru/i157/1104/59/48d44f59efbd.png.html

  38. Не полностью ясно, все- таки, когда надо типизировать колонки при их создании в таблице значений. Это как-то связано с отображением таблицы значений в табличном поле (таблице формы)?

    • Типизация не является обязательной.
      Но она может влиять на отображение в таблице формы.
      Для таблицы с нетипизированной колонкой при вводе новой строки система будет предлагать выбрать тип данных.
      Если же колонка типизирована, то сразу откроется форма выбора значения.

      • Спасибо, понятно. Так, впредь, можно ли здесь задавать небольшие вопросы именно по главам занятия а не только в контексте домашнего задания?

        • Да, можно задавать небольшие вопросы здесь.

    • А где в задании про таблицу значений сказано?

      • Видимо вопрос был в контексте темы 1-го блока про универсальные коллекции.

  39. Отчет
    1. Проверка в ПередначаломРаботысистемы – вызов общего модуля  функция РабочееВремя()
    2.       Массив глОбед + ОбщаяФорма с таблицей значений и колонками Пометка, Обед .
    3.       В общей форме перед закрытием проверяем на наличие отмеченных строк в тз, если  нет, то отказ = Истина.
    4.       Проверка в ПриЗавершенииРаботыСистемы – та же функция, что и в  п.1
    5.       Структура.
    Проблемы – долго разбиралась с общими модулями сервер-клиент, галочка вызов сервера и т.п. Очень непривычно, конечно. Структура  – столкнулась с тем, что в элемент 1000 добавляется разделитель, получается строка с пробелом, цикл вылетает. Решается через смену региональных установок , замену в строке или Формат.