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

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

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

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

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

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

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

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

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

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

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

  1. Dmitrij_Brohoveckij 28.05.2011 в 17:08

    Все замечания в коде в виде комментариев
    http://paste.org.ru/?70np38

  2. Добрый день, прошу прощения догоняю группу.

    1. Задание выполнил в модуле Управляемого приложения.
    глОбед Экспортная переменная, которая инициализируется
    при начале работы системы списком значений, в котором
    пользователь ставит соответствующие пометки в вызванном
    диалоге “.ОтметитьЭлементы()”.

    2. Контроль за временем входа и выхода реализован с помощью
    двух переменных НачалоДня и КонецДня содержащих количество
    секунд с начала суток, при входе пользователя в систему
    просходит вычисление текущей секунды с начала суток и
    сравнивается с временными интервалами, после чего либо
    выдаётся сообщение либо пользователь запускается или
    выпускается.

    Сдела функция которая возвращает текущую секунду с начала
    суток для переданной даты.

    Функция ПозицияДня(выбДата)

    Возврат (Час(выбДата) * 60 * 60)
    + (Минута(выбДата) * 60)
    + (Секунда(выбДата));

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

    3. Работа со структурой вызвала сложности в понимании предмет
    ной области и потребовала более детального её разбора.
    Получилось два вложенных цикла с проверкой на Простое/Непростое,
    достаточно интересной оказалась функция “Формат()”
    обращение к нужному элементу структуры осуществлял

    стрЧисло[“Чсл456”] и

    текстНомер = “451”
    стрЧисло[“Чсл” + текстНомер]

  3. Тимур 16.05.2011 в 11:27

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

    2. Выбор варианта обеда
    По условию задачи, переменная глОбед должна быть глобальной, поэтому она объявлена экспортной.
    Процедуру обработки выбора варианта обеда логично разместить в процедуре события ПриНачалаРаботыСистемы().
    Процедура выбора вариантов обеда использует цикл Пока: он выполняется до тех пор, пока пользователь не выберет хотя бы один пункт из предложенных и не нажмет кнопку “ОК”.
    После нескольких попыток в условии цикла осталась только проверка выбранных вариантов. Показ диалогового окна выбора вариантов включен в тело цикла. В нем же анализируется нажатая кнопка и если это была не кнопка “ОК” – используется конструкция Продолжить для повторения ввода.
     
    Текст кода решения 2 части

    3. Проверка графика работы при выходе из системы
    Обработка проверки размещена в процедуре обработки события ПередЗавершениемРаботыСистемы()
    В ней проверяется, соответствует ли текущее время времени работы предприятия. Если нет – у пользователя методом глобального контекста Вопрос() запрашивается подтверждение выхода из системы .
     
    Текст кода решения 3 части

    4. Создание и проверка структуры простых чисел
    Создание структуры простых чисел размещено в процедуре инициализации модуля приложения. Проверка этой структуры – в процедуре обработки события ПриНачалеРаботыСистемы()
     
    Проверка простого числа осуществляется простым перебором всех возможных делителей.
     
    При создании ключей структуры возникла проблема: числа больше 999, преобразованные в строку содержали “лишний” символ, не позволявший использовать эту строку в качестве ключа. Обратившись к синтаксис-помощнику удалось выяснить, что у функции глобального контекста Формат() существует параметр “ЧРГ”, отвечающий за символ-разделитель целой части числа. Однако я так и не нашел возможности с помощью этой функции убрать этот символ, так как при использовании в этом параметре пустой строки используется символ неразрывного пробела.
    Для корректного преобразования числа в строку я использовал функцию СтрЗаменить(), удаляющую из строкового представления числа символ неразрывного пробела.
     
    Текст код решения 4-й части
    ————
    Текст модуля приложения целиком

    • Тимур 16.05.2011 в 14:19

      Посмотрел решение:
       
      1. Очень понравился пункт о том, что помимо времени выхода пользователя из системы нужно учитывать также и дату выхода
       
      2. Очень хорошо было еще раз понять о разделении клиента и сервера на примере разных часовых поясов клиента и сервера
       
      3. Полезная информация о таймауте Предупреждения и влияние его в нашем конкретном примере на соединения с базой
       
      4. Понял свою невнимательность при чтении синтаксис-помощника по функции Формат: нужно было использовать параметр “ЧГ”, а не “ЧРГ”
       
      5. Конструктор форматной строки – удобная вещь!
       
      6. Узнал о системном перечислении Символы. В своем решении использовал функцию Символ() с соответствующим кодом.

    • Тимур, очень детальный отчет, спасибо.
      Можно писать не так подробно, чтобы не тратить много времени.

      • Тимур 17.05.2011 в 17:05

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

        • Это было вовсе не замечание.
          Скорее наоборот, Ваши отчеты – пример для подражания.
          Мне приятно , а другим участникам полезно знакомиться с подобными отчетами, поэтому если есть возможность – продолжайте в том же духе :)

    • Здравствуйте, Тимур!
      Очень понравилось ваше решение со вставкой текстов модулей в отчет о сделанном ДЗ 
      Поделитесь, пожалуйста, секретом – что это за ресурс, на котором вы разместили текст кода? Как с ним работать?
      Спасибо.

      • Скорей всего это шаблон сайта на ПХП. =)

      • Тимур 17.05.2011 в 17:39

        Здравствуйте, Cos!
         
        Для размещения кода я использую http://paste.org.ru/ – онлайновое хранилище исходных кодов с подсветкой синтаксиса. Есть, конечно, и более продвинутые аналоги, но только в этом я нашел подсветку кода для языка 1С:Предприятия.
         
        Пользоваться им просто. При входе на сайт вы  увидите в центре большое поле ввода текста: в него нужно скопировать исходный код. Чуть выше этого поля из выпадающего списка выбирается язык для подсветки синтаксиса – я использую значение “rare: 1C” – и нажимается кнопка “paste” (слева от поля выбора языка). После этого вас переадресует на страницу, на которой будет хранится указанный вами код. Скопируйте адрес страницы из адресной строки браузера – и можете прислать эту ссылку кому хотите. Например, вставить в комментарий к домашнему заданию :)

        • Здравствуйте, Тимур!
          Большое спасибо за подробный ответ!
          На первый взгляд – все ясно и понятно.
          Обязательно попробую новый сервис для ответа на очередное ДЗ.

  4. Hrisoploka 11.05.2011 в 20:29

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

    • Да, можно. Догоняйте группу.

    • Тимур 16.05.2011 в 14:21

      Не используйте, пожалуйста, короткие имена переменных вроде Сч, СЗ, Эл, ППП, Ств и т.п.
      Поверьте, это просто ад для тех, кто будет поддерживать ваш код в дальнейшем.

  5. Задание выполнено. Проблем не возникло,  только пришлось вспоминать как определить простое число.

  6. Извините за опоздание.
    Задание выполнила не полностью:

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

     
    Для проверки времени входа в систему использовала функцию, которая запускалась из процедуры ПередНачаломРаботыСистемы(Отказ). В случае, если время было нерабочее, пользователю выдавалось окно предупреждения, а параметр Отказ = Истина.
    После отработки проверки появлялся список значений (использовала метод «ОтметитьЭлементы»). Путем перебора с помощью цикла «Для каждого» значения СпискаЗначений из колонки «Значение» передавались в Массив с именем ГлОбед. Для добавления нового значения в массив использовался метод «Добавить».
    Для проверки времени выхода из систему использовала ту же функцию, которая запускалась из процедуры ПередЗавершениемРаботыСистемы(Отказ).
    При заполнении значения (простое, не простое) в структуре «Числа» использовала алгоритм перебора всех возможных делителей и если количество делений нацело было меньше либо равно 2, то это число считалось простым. Для поиска значения в Структуре по ключу использовала метод «Свойство»

  7. elcinbektimirov 03.05.2011 в 12:12

    У меня вопрос такой, в примере Вы показали как определить тип значения путем сравнения. А есть ли возможность определения типа значения методом явным (например: Сообщить ТипЗнч(Элемент))

    • Приведенный Вами код возможен.
      Но есть проблема: в платформе 8.2 отображается только название(а если точнее синоним объекта).
      Например, для Элемента типа данных “СправочникСсылка.Номенклатура” будет выдано сообщение “Номенклатура”.

  8. Ярослав 28.04.2011 в 02:12

    Вопросы к  мастер группе
    Можно пару хороших наглядных  примеров с кэшем Функции общего Модуля и разницей между Модулем объекта и модулем приложения
     

    • Чтобы получить хороший ответ желательно задать развернутый вопрос.
      Напишите на ящик мастер-группы mg.spec8ru@gmail.com.
      >разницей между Модулем объекта и модулем приложения
      Точно об этим модулях идет речь?
      Ведь они совершенно разные. Первый относится к системе в целом, второй принадлежит конкретному объекту.

      • Ярослав 29.04.2011 в 00:13

        Прошу прощения, описАлся,  имел ввиду модуль менеджера. Понял насчет ящика

  9. Ярослав 28.04.2011 в 02:08

    Добрый день пора догонять.
    с обедами проблем не было.
    Про поводу структуры Нашел в нете как мне показалось простой и очень быстрый алгоритм Решето Сундарама.
    <code>
    //Код модуля приложения
    Перем ВремяНачалаРаботы;
    Перем ВремяОкончанияРаботы;
    перем СписокВыбора;
    перем ГлОбед Экспорт;
    Перем Числа Экспорт;
    Перем МпростыхЧисел; // Для алгоритма

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

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

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

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

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

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

    // Заполняет структуру чисел от 1 до 1000
    // Значение строка тип числа  – простое или не простое
    //
    Процедура ЗаполнитьЧисла()

    ПолучитьМассивПростыхЧисел(1000);

    Для а =1  По 1000 Цикл
    Если а > 10 и (Прав(а,1) = “1” или Прав(а,1) = “3” или Прав(а,1) = “7” или Прав(а,1) = “9”) Тогда
    Значение = ?(НЕ МпростыхЧисел.Найти(а) = неопределено,”Простое”,”Не простое” );
    иначеЕсли (а%2 = 0 или а%3 =0) и а > 3  Тогда
    Значение = “Не простое”;
    иначе
    Значение = “Простое”;
    КонецЕсли;

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

    КонецПроцедуры // ЗаполнитьЧисла()()

    //Заполняет массив простыми числами от 1 до N
    //и возвращает его
    //
    Функция ПолучитьМассивПростыхЧисел(N)
    //Решето Сундарама
    //Из ряда натуральных чисел от 1 до N исключаются все числа вида
    // i + j + 2ij,где индексы i<=j пробегают все натуральные значения, для которых i+j+2ij <= N,
    // а именно значения i=1,2,…(Sqrt(2N+1)-1)/2 и j=i,i+1,….(N-i)/(2i+1)
    //Затем каждое из оставшихся чисел умножается на 2 и увеличивается на 1.
    //Полученная в результате последовательность представляет собой все нечётные простые числа в отрезке [1,2N+1].
    Для  а = 1 по  N цикл
    МпростыхЧисел.Добавить(а);    
    КонецЦикла;

    Для  i  = 1 по Окр((Sqrt(2*N+1)-1)/2) цикл
    Для j = i По (N-i)/(2*i+1)Цикл
    Если i+j+2*i*j <=n  Тогда
    индекс = МпростыхЧисел.Найти(i+j+2*i*j);
    Если не индекс = Неопределено тогда
    МпростыхЧисел.Удалить(индекс);
    КонецЕсли;
    КонецЕсли;     

    КонецЦикла;

    КонецЦикла;

    Для каждого Элемент Из МпростыхЧисел Цикл
    Элемент = Элемент*2+1;
    КонецЦикла;

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

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

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

    ГлОбед = Новый Массив;
    Числа  = Новый Структура;
    МпростыхЧисел = Новый Массив;
     
    // Код проверки структуры а в обработке
    Если ЗначениеЗаполнено(Число1) Тогда
    Сообщить(Числа[“Число”+стрЗаменить(Строка(Число1),”,”,””)]);
    сообщить(“А вы знаете ,что например Число 481 ” + Числа.Число481);
    иначе Сообщить(“Введите число от 1 до 999”);    
    КонецЕсли;
    </code>
     

  10. Извиняюсь за дубль поста. Сперва выложил не в той теме.
    Выполнил ДЗ. Сравнил с вашим решением. Мне кажется, что моя вариация проверки времени проще читается.
    Скрин модуля приложения
    http://www.imagepost.ru/?v=eyqaxsgmeymwbgoxcuaalhfutwyskj.jpg
    Скрин общего модуля клиента
    http://www.imagepost.ru/?v=ydpsflvifyzzoxiuathyytnndpakgq.jpg

    • Хорошая реализация.

    • Тимур 16.05.2011 в 12:39

      Очень симпатично написано.
      Вы используете в качестве счетчиков цикла переменные с именами в другой раскладке. Смотрится хорошо и понятно, но придется при изменении кода постоянно переключать раскладку

  11. Здравствуйте.
    Задание выполнено не полностью. Совсем не поняла кусок про управлению кнопками при выборе меню. Решение ДЗ прочитаю после этого отчета
    <code>
    Перем ГлОбед;

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

    //1. Вход в систему
    СтрНачалоРабочегоДня = Лев(Строка(ТекущаяДата()),10) + ” 9:05:38″;
    НачалоРабочегоДня = Дата(СтрНачалоРабочегоДня);

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

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

    Меню.ОтметитьЭлементы(“Выберите меню”);

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

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

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

    Процедура ПередЗавершениемРаботыСистемы(Отказ)
    //4. Выход пользователя из системы
    СтрКонецРабочегоДня = Лев(Строка(ТекущаяДата()),10) + ” 18:11:42″;
    КонецРабочегоДня = Дата(СтрКонецРабочегоДня);

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

    Функция ВычислениеПростыхЧисел(Число)
    //5.Работа со структурой
    ВидЧисла = “”;
    Для счетчик = 2 По Число-1 Цикл
    Дробь = Число / Счетчик – Цел(Число / Счетчик);
    Если Дробь =0 Тогда
    ВидЧисла = “Не простое”;
    Прервать;
    КонецЕсли;
    КонецЦикла;

    Если ВидЧисла = “” Тогда
    ВидЧисла = “Простое”;
    КонецЕсли;

    Возврат ВидЧисла;    

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

    Процедура Структура()

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

    Для к = 1 По 50 Цикл
    ВидЧисла = ВычислениеПростыхЧисел(к);
    Числа.Вставить(“Число”+к,ВидЧисла);
    КонецЦикла;

    Переменная = “Число28”;
    Сообщить(Числа.Свойство(Переменная));

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

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

    </code>

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

    глОбед=СписокБлюд.ВыбратьЭлемент(“Выберите блюдо из списка”);
    Пока глОбед=Неопределено Цикл
    глОбед=СписокБлюд.ВыбратьЭлемент(“Обязательно нужно выбрать блюдо на обед!”);
    КонецЦикла;
    КонецПроцедуры // ЗапросОбеда()
    Процедура ПередЗавершениемРаботыСистемы(Отказ)
    Если ТекущаяДата()>=НачалоРабДня ИЛИ ТекущаяДата()<=КонецРабДня Тогда
    Ответ=Вопрос(“Рабочий день еще не закончен, вы действительно хотите покинуть программу?”,РежимДиалогаВопрос.ДаНет);
    Если Ответ=КодВозвратаДиалога.Нет Тогда
    Отказ=Истина;
    КонецЕсли;
    КонецЕсли;
    КонецПроцедуры
    НачалоРабДня=НачалоДня(ТекущаяДата())+(60*60*9+60*15+38);
    КонецРабДня=НачалоДня(ТекущаяДата())+(60*60*23+60*11+42);
    &НаКлиентеПерем глОбед Экспорт;Перем НачалоРабДня;Перем КонецРабДня;&НаКлиентеПроцедура ПередНачаломРаботыСистемы(Отказ) Если ТекущаяДата()<=НачалоРабДня ИЛИ ТекущаяДата()>=КонецРабДня Тогда Вопрос(“Вход в конфигурацию в нерабочее время невозможен!”,РежимДиалогаВопрос.ОК,15); Отказ=Истина; Иначе ЗапросОбеда(); //Добавление структуры по простым/не простым числам Числа=Новый Структура; Х=”Число17″; Для Счетчик=1 По 1000 Цикл Для Делитель=2 По 1000 Цикл Если Счетчик=Делитель ИЛИ Счетчик%Делитель<>0 Тогда Значение=”Простое”; Продолжить; Иначе Значение=”Не простое”; Прервать; КонецЕсли; КонецЦикла; Числа.Вставить(“Число”+Счетчик,Значение); КонецЦикла; //Конец работы со структурой по простым/не простым числам КонецЕсли;КонецПроцедуры
    &НаКлиентеПроцедура ЗапросОбеда() СписокБлюд=Новый СписокЗначений; СписокБлюд.Добавить(“Курица”,”Курица”); СписокБлюд.Добавить(“Рыба”,”Рыба”); СписокБлюд.Добавить(“Мясо”,”Мясо”); глОбед=СписокБлюд.ВыбратьЭлемент(“Выберите блюдо из списка”); Пока глОбед=Неопределено Цикл глОбед=СписокБлюд.ВыбратьЭлемент(“Обязательно нужно выбрать блюдо на обед!”); КонецЦикла;КонецПроцедуры // ЗапросОбеда() Процедура ПередЗавершениемРаботыСистемы(Отказ) Если ТекущаяДата()>=НачалоРабДня ИЛИ ТекущаяДата()<=КонецРабДня Тогда Ответ=Вопрос(“Рабочий день еще не закончен, вы действительно хотите покинуть программу?”,РежимДиалогаВопрос.ДаНет); Если Ответ=КодВозвратаДиалога.Нет Тогда Отказ=Истина; КонецЕсли; КонецЕсли;КонецПроцедуры
    НачалоРабДня=НачалоДня(ТекущаяДата())+(60*60*9+60*15+38);КонецРабДня=НачалоДня(ТекущаяДата())+(60*60*23+60*11+42);

    </code>

  13. Светлана 26.04.2011 в 21:57

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

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

    ВремяНачалаРаботы = НачалоДня(ТекущаяДата())+9*60*60+5*60+38;
    ВремяОкончанияРаботы = НачалоДня(ТекущаяДата())+18*60*60+11*60+42;
    //конец Модуля управляемого приложения
    ————————————————————–
    //Общий модуль “МодульВыбораОбеда” – в свойствах поставлена только галочка “Клиент(управляемое приложение)” и повторное использование возвращаемых значений  – “На время сеанса”
    Процедура ВыборОбедаМО() экспорт
     
     СписокОбедов = Новый СписокЗначений;
     СписокОбедов.Добавить(“Курица”);
     СписокОбедов.Добавить(“Рыба”);
     СписокОбедов.Добавить(“Мясо”);
     СписокОбедов.ОтметитьЭлементы(“Выберите вариант обеда!”);
     Выбрано = Ложь; 
     глОбед = Новый Массив;
     СтрокаОбеда = “”;
     Для каждого Элемент Из СписокОбедов Цикл
      Выбрано = Выбрано или Элемент.Пометка; 
      Если Элемент.Пометка = Истина Тогда
       глОбед.Добавить(Элемент);
       СтрокаОбеда = СтрокаОбеда+” “+Элемент.Значение;
      КонецЕсли;
     КонецЦикла; 
     
     Если Выбрано=Ложь Тогда
      Предупреждение(“Вы не выбрали вариант обеда, повторите!”, );
      ВыборОбедаМО();
     КонецЕсли;
     
     сообщить(“Вы выбрали на обед “+строкаОбеда);
     
    КонецПроцедуры
    //конец ОбщегоМодуля
    —————————————————————————————-
    Для проверки обращения к данным структуры на рабочую область рабочего стола добавила ОбщуюФорму.ФормаПроверкиСтруктуры с кнопкой “Найти число по ключу”
    //Модуль формы “ФормаПроверкиСтруктуры”
    &НаКлиенте
    Процедура НайтиЧислоПоКлючу(Команда)
     
     ЦифрыКлюча = 0;
     Если ВвестиЧисло(ЦифрыКлюча, “Введите цифры ключа”, 4,0) Тогда
      ЧислоИзСтруктуры = Числа[“Число”+Строка(ЦифрыКлюча)];
      сообщить(“Число “+Строка(ЦифрыКлюча)+ ” – “+ЧислоИзструктуры);
     КонецЕсли;
     
    КонецПроцедуры

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

    http://i016.radikal.ru/1104/57/f76c14751243.jpg

  15. Надежда 23.04.2011 в 01:04

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

    • Согласен, алгоритмический метод будет работать быстрее, чем перебор.
      Но, кажется, что-то не то с алгоритмом…
      Например, число 121 по нему будет простым. Хотя это не так.

      • Надежда 24.04.2011 в 01:25

        Да, это я что-то запуталась в рассуждениях о простых числах…   Делаю вывод, что с алг.методом надо быть внимательнее. его имеет смысл прорабатывать при частых обращениях для увеличения производительности (и об этом в предыдущих уроках Вы говорили)… Сейчас пока переделала проверку на простоту как у всех :). Спасибо.

        • Надежда 24.04.2011 в 17:54

          Внезапно решением осенило: добавила проверку на остаток от вычисления квадратного корня проверяемого числа и сразу все заработало. Проверила результаты – число простых чисел совпадает, в частности 121 – стало ка ки положено не простым.
          <code>
          КореньЧисла = Счетчик%Sqrt(Счетчик);
          СуммаОстатков=ДелениеНа2*ДелениеНа3*ДелениеНа5*ДелениеНа7*КореньЧисла ;
          КореньЧисла = Счетчик%Sqrt(Счетчик); СуммаОстатков=ДелениеНа2*ДелениеНа3*ДелениеНа5*ДелениеНа7*КореньЧисла ;</code>

          • Хм, чуть-чуть поперебирал несколько чисел.
            И вот Вам пример – 481.
            Судя по всему Ваш алгоритм скажет, что оно простое. На самом деле это не так :)

  16. К сожалению, вовремя не успел.
    Перем ГлОбед Экспорт;
    Перем НачалоРабДня Экспорт;
    Перем КонецРабДня Экспорт;

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

    ТекГодМесДень = Формат (ТекущаяДата(), “ДФ=ггггММдд”);
    НачалоРабДня = Дата(ТекГодМесДень + “090538”);
    КонецРабДня = Дата(ТекГодМесДень + “181142”);

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

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

    Процедура Выбор(Список)

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

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

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

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

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

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

    КонецПроцедуры
     
    И по структуре:
    Числа = Новый Структура;

    Для Счетчик = 1 По 999 Цикл

    Простое = 1;
    Для Делитель = 2 По Счетчик – 1 Цикл

    Если Счетчик < 4 Тогда
    Прервать;
    КонецЕсли;

    Результат = Счетчик/Делитель; 

    Если Результат = Цел(Результат) Тогда Простое=0;
    Прервать;
    КонецЕсли;

    КонецЦикла;

    Если Простое=1 Тогда
    Числа.Вставить(“Число”+Счетчик, “Простое”);
    Иначе
    Числа.Вставить(“Число”+Счетчик, “Не простое”);
    КонецЕсли;

    КонецЦикла;

    • С числом 1000 не разобрался. Буду смотреть решение.

  17. Денис 20.04.2011 в 22:30

    Отстаю немного: на работе завал все больше и больше… Первую часть выполнил без проблем. Во второй формирование структуры усвоил, а вот “Число1 000” не догадался.

  18. Извиняюсь за опоздание …
    <code>
    Перем конДата;
    Перем глОбед;

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

    текущаяДата = ТекущаяДата();
    началоДня = НачалоДня(текущаяДата);
    начДата = началоДня + ВремяВСекундах(“9:15:38”, “:”);
    конДата = началоДня + ВремяВСекундах(“18:11:42”, “:”);

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

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

    Функция ВремяВСекундах(стрВремя, разделитель)
    позиция = Найти(стрВремя, разделитель);
    часов = Сред(стрВремя, 1, позиция-1);

    стрВремя = Сред(стрВремя, позиция+1, СтрДлина(стрВремя)-позиция);
    позиция = Найти(стрВремя, разделитель);
    минут = Сред(стрВремя, 1, позиция-1);

    секунд = Сред(стрВремя, позиция+1, СтрДлина(стрВремя)-позиция);

    времяВСекундах = 3600*часов + 60*минут + секунд;

    Возврат времяВСекундах;

    КонецФункции // ВремяВСекундах()

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

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

    Функция ВыборОбедаФ(списокЗначений)
    Если списокЗначений.ОтметитьЭлементы(“Выберите обед”) = Ложь Тогда
    ВыборОбедаФ(списокЗначений);
    КонецЕсли;
    КонецФункции // ВыборОбеда()

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

    ВыборОбедаФ(списокЗнач);

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

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

    Структура();

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

    Процедура Структура()

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

    Для счетчик=1 По 1000 Цикл
    Если ПростоеЧисло(счетчик) Тогда
    ключ = “Число” + счетчик;
    сЧисла.Вставить(ключ, счетчик);
    КонецЕсли;
    КонецЦикла;

    Если сЧисла.Свойство(“Число593”) Тогда
    ПоказатьОповещениеПользователя(“Число593”);
    КонецЕсли;
    ключ = “Число7”;
    Если сЧисла.Свойство(ключ) Тогда
    ПоказатьОповещениеПользователя(“Число7”);
    КонецЕсли;

    КонецПроцедуры // Структура()

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

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

    </code>

  19. Перем глОбед;

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

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

    ВидОбеда.ОтметитьЭлементы(“Укажите свой вид обеда”);

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

    КонецЕсли;
    КонецЕсли;

    //ВнешнееОборудование
    МенеджерОборудованияКлиент.ПередЗавершениемРаботыСистемы();
    //Конец ВнешнееОборудование

    КонецПроцедуры
    глОбед =новый СписокЗначений;

    • закончил со структурой.
      Функция ПростоеЛи(Сч)
      Для Делитель=2 По Сч-1 Цикл
      Если Сч%Делитель =0 Тогда
      Возврат “Не простое”;
      прервать;
      КонецЕсли;
      КонецЦикла;
      Возврат “Простое”    ;
      КонецФункции // ПростоеЛи()

      &НаКлиенте
      Процедура структура(Команда)
      Числа=Новый Структура;
      Для Сч=1 По 1000 Цикл
      Числа.Вставить(“Число”+Формат(Сч,”ЧГ=0”),ПростоеЛи(Сч));    
      КонецЦикла;
      сообщить(“Число539″+Строка(Числа.Число539));
      значен=”Число332”;
      Сообщить(Числа.Свойство(значен));

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

  20. Ещё один опоздавший. Задания решил. Из-за нехватки времени – 1000 разбирать не стал, думаю можно “выкрутиться” функцией СтрЗаменить

  21. Дмитрий 18.04.2011 в 19:17

    Немного задержался из-за катастрофической нехватки времени. Вопросов не возникло. Хороший подкол с ключом – “Число1000”.(Решение еще не смотрел)
    Проверка времени
    <code>

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

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

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

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

    Пока глОбед.Количество() = 0 Цикл
    ВыборМенюОбеда();
    КонецЦикла;

    //Проверка
    Сообщить(СтруктураЧисло[“Число591”]);
    КонецПроцедуры
    Процедура ПередЗавершениемРаботыСистемы(Отказ)

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

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

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

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

    ВариантыОбеда.ОтметитьЭлементы(“Укажите вариант обеда.”);

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

    КонецПроцедуры
    глОбед = Новый Массив;
    мНачалоРабочегоДня = Дата(1,1,1,9,05,38);
    мКонецРабочегоДня = Дата(1,1,1,18,11,42);
    Перем глОбед Экспорт;
    Перем мНачалоРабочегоДня, мКонецРабочегоДня;

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

    Процедура ПриНачалеРаботыСистемы()
    Пока глОбед.Количество() = 0 Цикл
    ВыборМенюОбеда();
    КонецЦикла;           
    КонецПроцедуры

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

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

    глОбед = Новый Массив;мНачалоРабочегоДня = Дата(1,1,1,9,05,38);мКонецРабочегоДня = Дата(1,1,1,18,11,42);
    </code>
    По структуре
    <code>

    СтруктураЧисло = Новый Структура;
     
    //Заполнение структуры
    ТекЧисло = 1;
    Пока ТекЧисло <= 1000 Цикл
    ФлагЭтопростоеЧисло = Истина;
    Итератор = 1;
    Пока Итератор <= ТекЧисло Цикл
    Если ТекЧисло%Итератор = 0
    И Итератор <> 1 И Итератор <> ТекЧисло Тогда
    ФлагЭтопростоеЧисло = Ложь;
    Прервать;
    КонецЕсли;

    Итератор = Итератор + 1;
    КонецЦикла;

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

    ТекЧисло = ТекЧисло + 1;
    КонецЦикла;
    //Проверка
    Сообщить(СтруктураЧисло[“Число591”]);

    Х = “Число332”;
    НайденноеЗначение = Неопределено;
    СтруктураЧисло.Свойство(Х, НайденноеЗначение);
    Сообщить(НайденноеЗначение);

    </code>

  22. Александр 18.04.2011 в 17:01

    Задание выполнено. Есть вопрос по поводу ошибки “Неверный формат хранилища данных” при открытии файла внешней обработки. Есть ли выход, кроме периодического сохранения копии в txt?

    • По моим наблюдениям ошибку исправили в последних релизах.
      Я сейчас использую 8.2.13.219 пока полет нормальный.
      У Вас какой релиз?

      • Александр 20.04.2011 в 07:00

        Использую 1С:Предприятие 8.2 (8.2.13.205). Обновлю, помониторю. Спасибо.

  23. S. Bashutin 18.04.2011 в 12:22

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

    • >Если Сч=1000 Тогда
      >Числа.Вставить(«Число1000″, «Не простое»);

      Есть более эффективный способ, см. решение задания.

      • S. Bashutin 18.04.2011 в 13:55

        Спасибо:) Задачу я решил конкретно “в лоб”, не догадался использовать функцию формат. Я её часто раньше использовал при работе с датами, а вот к числам не применял. Задание переделал.

  24. Вячеслав 18.04.2011 в 09:57

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

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

    КонецЕсли;

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

    Число591 = Числа.Число591;
    х = “Число332”;
    Число332 = Числа[х];

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

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

    КонецПроцедуры
    </code>
     
    C заданием справился. но запись тысячного элемента структуры и обращение к структуре по ключу, содержащемуся в переменной сделал только после прочтения комментариев

  25. >ДЗ выполнил возник вопрос с пробелом в 1000
    Посмотрите решение.

  26. Добрый день!
    Весь код ДЗ №4 выполнил в модуле управляемого приложения.
    Вот его код.
    <code>Перем глОбед Экспорт;
    Перем глЧисла Экспорт;

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

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

    ВыбратьОбед(СписокОбедов);

    СоздатьСтруктуруЧисла();

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

    Функция ПроверитьРабочееВремя()

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

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

    лРабочееВремя = Истина;
    Иначе
    лРабочееВремя = Ложь;
    КонецЕсли;
    Возврат лРабочееВремя;
    КонецФункции // ПроверитьРабочееВремя()

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

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

    Процедура ВыбратьОбед(СписокОбедов)

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

    Если глОбед.Количество() = 0 Тогда
    Предупреждение(“Вы забыли выбрать обед! Пожалуйста, сделайте это”, 15);
    ВыбратьОбед(СписокОбедов);
    КонецЕсли;

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

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

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

    Возврат ?(ПростоеЧисло, “Простое”, “Не простое”);
    КонецФункции

    Процедура ТестПоискаПоСтруктуре()
    Перем ЗначПростоеНеПростое;
    // Тест 1
    Сообщить(“Число591 – ” + глЧисла.Число591);

    // Тест 2
    Х = “Число332″;
    глЧисла.Свойство(Х, ЗначПростоеНеПростое);
    Сообщить(Х + ” – ” + ЗначПростоеНеПростое);
    КонецПроцедуры

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

    </code>

  27. Две глобальные переменные –  начало и окончание  рабочего дня. ПередНачаломРаботыСистемы() – проверка. Массив глОбед. ПриЗавершенииРаботыСистемы(). Структура.

  28. Надежда 18.04.2011 в 01:26

    Задания выполнены.
    по первой части особых сложностей не было, но повторно пересматривать уроки и СП пришлось :)  Проверки на вход и выход производила в модуле упр.приложения  процедурами при запуске и перед выходом.
    По второй части задания – долго не получалось вывести значение структуры для ключа X, СинтПомошник и пересмотр уроков не помогли, поэтому обратилась к комментариям в данной теме :) через Стр[x] все сразу заработало. С разделителем в 1000 – справилась через формат(счетчик,”ЧГ =”). Проверку на “простоту” для всех чисел кроме исходных простых 2,3,5,7  производила проверкой остатка от деления на исходные простые числа.

  29. Выполнено.
    В первом для проверки времени сначала определил количество секунд ДАТА(1,1,1,9,5,38)  – Дата(1,1,1)  потом к НачалоДня(ТекущаяДата()) прибавил секунды и сравнивал с текущей датой
    Примерно точно также при завершении работы
    только с вопросом и другой датой.
    Для обеда воспользовался Список.ОтметитьЭлементы. Был удивлен когда ничего не выбрано и нажато ок возвращается Истина.
    Простые и составные числа определил.
     
     

  30. Задание выполнил.
    В модуле управляемого приложения, в процедурах ПередНачаломРаботыСистемы и ПрередЗавершениемРаботыСистемы выполняем проверку рабочего времени.
    В процедуре ПриНачалеРаботыСистемы выбираем обед.
    Работа со структурой тоже проблем не вызывает.

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

  32. Друмов Александр 17.04.2011 в 21:20

    В модуле управляемого приложения ввел две переменные НачалоРабочегоДня и КонецРабочегоДня.  В процедурах ПриНачалеРаботыСистемы и ПриЗавершенииРаботыСистемы повесил ставнение текущего времени с переменными и соответствующие реакции. После проверки на время в цикле прощу выбрать из списка значение меню на сегодня и если есть помеченные элементы заношу их в массив и выхожу из цикла.
    После этого вызывается процедура СформироватьСтруктуруЧислел, в цикле от 1 до 1000 заполняю стуктуру. При этом Ключь = “Число” + Формат(Счетчик,”ЧГ=0″), значение вычисляется в цикле перебором все делителей и сравнение результата и целой части результата.

  33. kuznetsovimail 17.04.2011 в 20:46

    Модуль управляемого приложения
    <code>

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

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

    Процедура ПередЗавершениемРаботыСистемы(Отказ) Время=СтрЗаменить(Строка(ТекущаяДата()),”:”,””); Время=Прав(Строка(Время),6); Если (Число(Время)>090538) ИЛИ (Число(Время)<181142) тогда Ответ=Вопрос(“Вы уверены.”,РежимДиалогаВопрос.ДаНет); Если Ответ=КодВозвратаДиалога.Нет  тогда Отказ=Истина; КонецЕсли; КонецЕсли;                КонецПроцедуры
    </code>
    Модуль формы
    <code>

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

  34. <code></code>
    &НаКлиенте Перем глОбед Экспорт; Перем Числа, КлючЧисла, i, j, ФлагПоискаПЧ, ЗнЭл;
    &НаКлиенте Процедура ПередНачаломРаботыСистемы(Отказ) Перем ДатаСтарта, СекундаСтарта, ВремяНачРабДня, ВремяКонРабДня; //Вопрос – а в этом коде время с сервера придет, а не с компьютера клиента? ДатаСтарта = наСервере_ВремяНаСервере.ПолучитьВремяНаСервере(); //9:05:38 ВремяНачРабДня=9*3600+5*60+38; //18:11:42 ВремяКонРабДня=18*3600+11*60+42; СекундаСтарта = ДатаСтарта-НачалоДня(ДатаСтарта); Если ВремяНачРабДня <= СекундаСтарта И СекундаСтарта <=ВремяКонРабДня Тогда //Запустить конфигурацию удасться Иначе Предупреждение(“Текущая дата и время -“+Строка(ДатаСтарта), 5, “Запуск конфигурации в нерабочее время запрещен!”); Отказ = Истина; КонецЕсли; КонецПроцедуры
    &НаКлиенте Процедура ПриНачалеРаботыСистемы() Перем СЗМеню, УслНачРаб; глОбед = Новый Массив; СЗМеню = Новый СписокЗначений; СЗМеню.Добавить(“курица”); СЗМеню.Добавить(“рыба”); СЗМеню.Добавить(“мясо”); УслНачРаб = Ложь; Пока НЕ УслНачРаб Цикл УслНачРаб = СЗМеню.ОтметитьЭлементы(“Для продолжения работы необходимо выбрать меню”); Если УслНачРаб Тогда //проверю – выбрал? Для каждого СтрокаСЗМеню Из СЗМеню Цикл Если СтрокаСЗМеню.Пометка Тогда глОбед.Добавить(СтрокаСЗМеню.Значение); Если НЕ УслНачРаб Тогда УслНачРаб = Истина; Конецесли; КонецЕсли КонецЦикла; КонецЕсли КонецЦикла;

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

    Числа = Новый Структура; КлючЧисла=”Число”+1; Числа.Вставить(КлючЧисла, “Не простое”); Для i=2 По 1000 Цикл КлючЧисла=”Число”+СтрЗаменить(Формат(i,”ЧРГ=’_'”),”_”,””); j=2; ФлагПоискаПЧ= Истина; Пока j<=i И ФлагПоискаПЧ Цикл Если (i % j)=0 И (i<>j) Тогда ФлагПоискаПЧ=Ложь; КонецЕсли; j=j+1; КонецЦикла; Числа.Вставить(КлючЧисла, ?(ФлагПоискаПЧ,”Простое”,”Не простое”)); КонецЦикла; Предупреждение(“Число591 ” + Числа.Число591); Х = “Число332″; ЗнЭл=””; Если Числа.Свойство(Х, ЗнЭл) Тогда Предупреждение(Х+” “+ ЗнЭл); КонецЕсли;

    //В свойствах общего модуля наСервере_ВремяНаСервере установлен только один флаг компиляции – ‘Сервер’ //и установлен флаг ‘Вызов сервера’ Функция ПолучитьВремяНаСервере() Экспорт Возврат ТекущаяДата();
    КонецФункции // ПолучитьВремяНаСервере()

    <code></code>
    вопрос – Если ТекущаяДата() на стороне сервера вычисляется, тогда значит это значение с компьютера где работает сервер предприятия?

     

    • >Вопрос – а в этом коде время с сервера придет, а не с компьютера клиента?
      Да. Об этом порассуждаем в решении.

      Все используемые переменные вовсе не обязательно объявлять с помощью Перем.
      Ведь переменная создается в момент присвоения ей значения.

      Когда нужно использовать Перем:
      1. Если мы используем переменную, не присваивая ей значение. Например, передаем ее в параметр метода.
      2. Если нужно описать переменную модуля, которая будет использоваться в нескольких методах.