Базовый курс. Занятие №4
Занятие по 1-му блоку базового курса.
Необходимо изучить следующие главы 1-го блока.
Глава 1. Типы данных
Глава 2. Контекст выполнения кода
Глава 3. Модули
Глава 4. Синтакс-помощник
Также нужно выполнить домашнее задание, текст которого доступен на странице.
Задание необходимо выполнять в ИБ после предыдущего ДЗ.
В этой же теме необходимо написать отчет о выполнении задания.
ps. Участники курса без доступа в мастер-группу отчитываться по домашним заданиям не могут.
— залогиньтесь.
Если не активировали токен — посмотрите видео-инструкцию (видео N5)
Если вы залогинены, у Вас активирован токен доступа, но вы все равно видите эту запись —напишите нам на e-mail поддержки.
Все замечания в коде в виде комментариев
http://paste.org.ru/?70np38
Добрый день, прошу прощения догоняю группу.
1. Задание выполнил в модуле Управляемого приложения.
глОбед Экспортная переменная, которая инициализируется
при начале работы системы списком значений, в котором
пользователь ставит соответствующие пометки в вызванном
диалоге “.ОтметитьЭлементы()”.
2. Контроль за временем входа и выхода реализован с помощью
двух переменных НачалоДня и КонецДня содержащих количество
секунд с начала суток, при входе пользователя в систему
просходит вычисление текущей секунды с начала суток и
сравнивается с временными интервалами, после чего либо
выдаётся сообщение либо пользователь запускается или
выпускается.
Сдела функция которая возвращает текущую секунду с начала
суток для переданной даты.
Функция ПозицияДня(выбДата)
Возврат (Час(выбДата) * 60 * 60)
+ (Минута(выбДата) * 60)
+ (Секунда(выбДата));
КонецФункции
3. Работа со структурой вызвала сложности в понимании предмет
ной области и потребовала более детального её разбора.
Получилось два вложенных цикла с проверкой на Простое/Непростое,
достаточно интересной оказалась функция “Формат()”
обращение к нужному элементу структуры осуществлял
стрЧисло[“Чсл456”] и
текстНомер = “451”
стрЧисло[“Чсл” + текстНомер]
Выполнил, отчитываюсь.
Условно домашнее задание можно разделить на 4 части:
1) Проверка времени при входе в систему
2) Выбор варианта обеда
3) Проверка времени при выходе из системы
4) Создание структуры простых чисел
1. Проверка времени при входе в систему
Для проверки диапазона времени я использовал следующий прием: как мы помним, в объекте типа Дата на самом деле хранится число секунд, прошедших с 1 января 0001 года. Отсюда следует, что если даты будут иметь одинаковое значение года, месяца и дня, то при их сравнении будут иметь значение только время – количество секунд, прошедших с начала этого дня. А значит для проверки вхождения во временнОй диапазон необходимо создать даты с одинаковыми значениями года, месяца и дня и решить для них простое неравенство:
ДатаНачала <= ПроверяемаяДата <= ДатаОкончания
Далее в случае если текущее время запуска системы не соответствует графику работы предприятия необходимо было сообщить пользователю о невозможности запуска 1С:Предприятия. И здесь возникло первое сомнение: в уроках говорилось, что в процедуре обработки события ПередНачаломРаботыСистемы() недоступны интерфейсные объекты. Поэтому первой мыслью было вынести обработку проверки графика работы в процедуру события ПриНачалеРаботыСистемы(). Однако простая проверка показала, что метод глобального контекста Предупреждение() прекрасно работает в процедуре события ПередНачаломРаботыСистемы(). Более того, даже интерактивные методы СпискаЗначений – ВыбратьЭлемент() и ОтметитьЭлементы() – также работают в этом событии.
Текст кода решения части 1
—
2. Выбор варианта обеда
По условию задачи, переменная глОбед должна быть глобальной, поэтому она объявлена экспортной.
Процедуру обработки выбора варианта обеда логично разместить в процедуре события ПриНачалаРаботыСистемы().
Процедура выбора вариантов обеда использует цикл Пока: он выполняется до тех пор, пока пользователь не выберет хотя бы один пункт из предложенных и не нажмет кнопку “ОК”.
После нескольких попыток в условии цикла осталась только проверка выбранных вариантов. Показ диалогового окна выбора вариантов включен в тело цикла. В нем же анализируется нажатая кнопка и если это была не кнопка “ОК” – используется конструкция Продолжить для повторения ввода.
Текст кода решения 2 части
—
3. Проверка графика работы при выходе из системы
Обработка проверки размещена в процедуре обработки события ПередЗавершениемРаботыСистемы()
В ней проверяется, соответствует ли текущее время времени работы предприятия. Если нет – у пользователя методом глобального контекста Вопрос() запрашивается подтверждение выхода из системы .
Текст кода решения 3 части
—
4. Создание и проверка структуры простых чисел
Создание структуры простых чисел размещено в процедуре инициализации модуля приложения. Проверка этой структуры – в процедуре обработки события ПриНачалеРаботыСистемы()
Проверка простого числа осуществляется простым перебором всех возможных делителей.
При создании ключей структуры возникла проблема: числа больше 999, преобразованные в строку содержали “лишний” символ, не позволявший использовать эту строку в качестве ключа. Обратившись к синтаксис-помощнику удалось выяснить, что у функции глобального контекста Формат() существует параметр “ЧРГ”, отвечающий за символ-разделитель целой части числа. Однако я так и не нашел возможности с помощью этой функции убрать этот символ, так как при использовании в этом параметре пустой строки используется символ неразрывного пробела.
Для корректного преобразования числа в строку я использовал функцию СтрЗаменить(), удаляющую из строкового представления числа символ неразрывного пробела.
Текст код решения 4-й части
————
Текст модуля приложения целиком
Посмотрел решение:
1. Очень понравился пункт о том, что помимо времени выхода пользователя из системы нужно учитывать также и дату выхода
2. Очень хорошо было еще раз понять о разделении клиента и сервера на примере разных часовых поясов клиента и сервера
3. Полезная информация о таймауте Предупреждения и влияние его в нашем конкретном примере на соединения с базой
4. Понял свою невнимательность при чтении синтаксис-помощника по функции Формат: нужно было использовать параметр “ЧГ”, а не “ЧРГ”
5. Конструктор форматной строки – удобная вещь!
6. Узнал о системном перечислении Символы. В своем решении использовал функцию Символ() с соответствующим кодом.
Тимур, очень детальный отчет, спасибо.
Можно писать не так подробно, чтобы не тратить много времени.
Евгений, спасибо за замечание.
Конечно, можно писать и покороче. Однако таким образом лучше закрепляются и запоминаются нюансы, встречавшиеся в домашнем задании.
К тому же мне очень интересно читать, как решали задачи другие участники, находить среди них интересные варианты решения, алгоритмы, способы оформления кода, обсуждать ошибки. Вариться в собственном соку ужасно скучно и, прямо скажем, непродуктивно, поэтому я стараюсь писать о тех тонкостях, с которыми сам столкнулся. Возможно они кому-нибудь пригодятся.
Это было вовсе не замечание.
Скорее наоборот, Ваши отчеты – пример для подражания.
Мне приятно , а другим участникам полезно знакомиться с подобными отчетами, поэтому если есть возможность – продолжайте в том же духе :)
Здравствуйте, Тимур!
Очень понравилось ваше решение со вставкой текстов модулей в отчет о сделанном ДЗ
Поделитесь, пожалуйста, секретом – что это за ресурс, на котором вы разместили текст кода? Как с ним работать?
Спасибо.
Скорей всего это шаблон сайта на ПХП. =)
Здравствуйте, Cos!
Для размещения кода я использую http://paste.org.ru/ – онлайновое хранилище исходных кодов с подсветкой синтаксиса. Есть, конечно, и более продвинутые аналоги, но только в этом я нашел подсветку кода для языка 1С:Предприятия.
Пользоваться им просто. При входе на сайт вы увидите в центре большое поле ввода текста: в него нужно скопировать исходный код. Чуть выше этого поля из выпадающего списка выбирается язык для подсветки синтаксиса – я использую значение “rare: 1C” – и нажимается кнопка “paste” (слева от поля выбора языка). После этого вас переадресует на страницу, на которой будет хранится указанный вами код. Скопируйте адрес страницы из адресной строки браузера – и можете прислать эту ссылку кому хотите. Например, вставить в комментарий к домашнему заданию :)
Здравствуйте, Тимур!
Большое спасибо за подробный ответ!
На первый взгляд – все ясно и понятно.
Обязательно попробую новый сервис для ответа на очередное ДЗ.
Простите, что так поздно сдаю, надеюсь, еще можно.
Простым набором условий обеспечила контроль времени входа в систему.
<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>
Да, можно. Догоняйте группу.
Спасибо!
Не используйте, пожалуйста, короткие имена переменных вроде Сч, СЗ, Эл, ППП, Ств и т.п.
Поверьте, это просто ад для тех, кто будет поддерживать ваш код в дальнейшем.
Задание выполнено. Проблем не возникло, только пришлось вспоминать как определить простое число.
Извините за опоздание.
Задание выполнила не полностью:
Не смогла понять как можно в числе 1000, преобразованного в строковое значение, избавиться от пробела.
Не придумала алгоритм проверки, чтобы пользователь обязательно выбрал обед.
Для проверки времени входа в систему использовала функцию, которая запускалась из процедуры ПередНачаломРаботыСистемы(Отказ). В случае, если время было нерабочее, пользователю выдавалось окно предупреждения, а параметр Отказ = Истина.
После отработки проверки появлялся список значений (использовала метод «ОтметитьЭлементы»). Путем перебора с помощью цикла «Для каждого» значения СпискаЗначений из колонки «Значение» передавались в Массив с именем ГлОбед. Для добавления нового значения в массив использовался метод «Добавить».
Для проверки времени выхода из систему использовала ту же функцию, которая запускалась из процедуры ПередЗавершениемРаботыСистемы(Отказ).
При заполнении значения (простое, не простое) в структуре «Числа» использовала алгоритм перебора всех возможных делителей и если количество делений нацело было меньше либо равно 2, то это число считалось простым. Для поиска значения в Структуре по ключу использовала метод «Свойство»
У меня вопрос такой, в примере Вы показали как определить тип значения путем сравнения. А есть ли возможность определения типа значения методом явным (например: Сообщить ТипЗнч(Элемент))
Приведенный Вами код возможен.
Но есть проблема: в платформе 8.2 отображается только название(а если точнее синоним объекта).
Например, для Элемента типа данных “СправочникСсылка.Номенклатура” будет выдано сообщение “Номенклатура”.
Вопросы к мастер группе
Можно пару хороших наглядных примеров с кэшем Функции общего Модуля и разницей между Модулем объекта и модулем приложения
Чтобы получить хороший ответ желательно задать развернутый вопрос.
Напишите на ящик мастер-группы mg.spec8ru@gmail.com.
>разницей между Модулем объекта и модулем приложения
Точно об этим модулях идет речь?
Ведь они совершенно разные. Первый относится к системе в целом, второй принадлежит конкретному объекту.
Прошу прощения, описАлся, имел ввиду модуль менеджера. Понял насчет ящика
Добрый день пора догонять.
с обедами проблем не было.
Про поводу структуры Нашел в нете как мне показалось простой и очень быстрый алгоритм Решето Сундарама.
<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>
Извиняюсь за дубль поста. Сперва выложил не в той теме.
Выполнил ДЗ. Сравнил с вашим решением. Мне кажется, что моя вариация проверки времени проще читается.
Скрин модуля приложения
http://www.imagepost.ru/?v=eyqaxsgmeymwbgoxcuaalhfutwyskj.jpg
Скрин общего модуля клиента
http://www.imagepost.ru/?v=ydpsflvifyzzoxiuathyytnndpakgq.jpg
Хорошая реализация.
Очень симпатично написано.
Вы используете в качестве счетчиков цикла переменные с именами в другой раскладке. Смотрится хорошо и понятно, но придется при изменении кода постоянно переключать раскладку
Здравствуйте.
Задание выполнено не полностью. Совсем не поняла кусок про управлению кнопками при выборе меню. Решение ДЗ прочитаю после этого отчета
<code>
Перем ГлОбед;
Процедура ПередНачаломРаботыСистемы(Отказ)
//1. Вход в систему
СтрНачалоРабочегоДня = Лев(Строка(ТекущаяДата()),10) + ” 9:05:38″;
НачалоРабочегоДня = Дата(СтрНачалоРабочегоДня);
Если ТекущаяДата() > НачалоРабочегоДня Тогда
Предупреждение(“Вы опоздали. Работа в программе опаздавшим запрещена”,, “Опять не повезло”);
ЗавершитьРаботуСистемы();
КонецЕсли;
//2. Выбор меню
Меню = Новый СписокЗначений;
Меню.Добавить(“Курица”);
Меню.Добавить(“Рыба”);
Меню.Добавить(“Мясо”);
Меню.ОтметитьЭлементы(“Выберите меню”);
ГлОбед = Новый Массив;
Для Каждого Эл Из Меню Цикл
Если Эл.Пометка = Истина Тогда
ГлОбед.Добавить(Эл);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ПередЗавершениемРаботыСистемы(Отказ)
//4. Выход пользователя из системы
СтрКонецРабочегоДня = Лев(Строка(ТекущаяДата()),10) + ” 18:11:42″;
КонецРабочегоДня = Дата(СтрКонецРабочегоДня);
Режим = РежимДиалогаВопрос.ДаНет;
Если ТекущаяДата() < КонецРабочегоДня Тогда
Ответ = Вопрос(“Вы действительно хотите выйти?”,Режим);
Если Ответ = КодВозвратаДиалога.Да Тогда
Отказ = Ложь;
Иначе
Отказ = Истина;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Функция ВычислениеПростыхЧисел(Число)
//5.Работа со структурой
ВидЧисла = “”;
Для счетчик = 2 По Число-1 Цикл
Дробь = Число / Счетчик – Цел(Число / Счетчик);
Если Дробь =0 Тогда
ВидЧисла = “Не простое”;
Прервать;
КонецЕсли;
КонецЦикла;
Если ВидЧисла = “” Тогда
ВидЧисла = “Простое”;
КонецЕсли;
Возврат ВидЧисла;
КонецФункции
Процедура Структура()
Числа = Новый Структура;
Для к = 1 По 50 Цикл
ВидЧисла = ВычислениеПростыхЧисел(к);
Числа.Вставить(“Число”+к,ВидЧисла);
КонецЦикла;
Переменная = “Число28”;
Сообщить(Числа.Свойство(Переменная));
Значение = “”;
Если Числа.Свойство(Переменная, Значение)=Истина Тогда
Сообщить(Значение);
КонецЕсли;
КонецПроцедуры
</code>
Задание выполнил.
Не смотрел причину ошибки по Число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>
В Сервис-Параметры-Основные “Приложение” выбрано “Толстый клиент (управляемое приложение)”
//Модуль управ. приложения
Перем ВремяНачалаРаботы,ВремяОкончанияРаботы;
Перем глОбед, Числа экспорт;
&НаКлиенте
Процедура ПриНачалеРаботыСистемы()
Если ТекущаяДата()<ВремяНачалаРаботы Тогда
Предупреждение(“Сейчас заходить в конфигурацию нельзя!”,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) Тогда
ЧислоИзСтруктуры = Числа[“Число”+Строка(ЦифрыКлюча)];
сообщить(“Число “+Строка(ЦифрыКлюча)+ ” – “+ЧислоИзструктуры);
КонецЕсли;
КонецПроцедуры
Задание выполнил.
Использовались события модуля управляемого приложения ПередНачаломРаботыСистемы, ПриНачалеРаботыСистемы и ПередЗавершениемРаботыСистемы
http://i016.radikal.ru/1104/57/f76c14751243.jpg
Вопрос вдогонку: по последней части задания: в структуре проверяла числа “на простоту” несколько иным способом, мне кажется что он работает намного быстрее, так как является алгоритмическим. Права ли я? (возможно ошибаюсь :) так как с отладчиком и 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 по нему будет простым. Хотя это не так.
Да, это я что-то запуталась в рассуждениях о простых числах… Делаю вывод, что с алг.методом надо быть внимательнее. его имеет смысл прорабатывать при частых обращениях для увеличения производительности (и об этом в предыдущих уроках Вы говорили)… Сейчас пока переделала проверку на простоту как у всех :). Спасибо.
Внезапно решением осенило: добавила проверку на остаток от вычисления квадратного корня проверяемого числа и сразу все заработало. Проверила результаты – число простых чисел совпадает, в частности 121 – стало ка ки положено не простым.
<code>
КореньЧисла = Счетчик%Sqrt(Счетчик);
СуммаОстатков=ДелениеНа2*ДелениеНа3*ДелениеНа5*ДелениеНа7*КореньЧисла ;
КореньЧисла = Счетчик%Sqrt(Счетчик); СуммаОстатков=ДелениеНа2*ДелениеНа3*ДелениеНа5*ДелениеНа7*КореньЧисла ;</code>
Хм, чуть-чуть поперебирал несколько чисел.
И вот Вам пример – 481.
Судя по всему Ваш алгоритм скажет, что оно простое. На самом деле это не так :)
К сожалению, вовремя не успел.
Перем ГлОбед Экспорт;
Перем НачалоРабДня Экспорт;
Перем КонецРабДня Экспорт;
Процедура ПередНачаломРаботыСистемы(Отказ)
ТекГодМесДень = Формат (ТекущаяДата(), “ДФ=ггггММдд”);
НачалоРабДня = Дата(ТекГодМесДень + “090538”);
КонецРабДня = Дата(ТекГодМесДень + “181142”);
Если (ТекущаяДата() < НачалоРабДня) ИЛИ (ТекущаяДата() > КонецРабДня) Тогда
Отказ=1;
Предупреждение(“Сейчас заходить в конфигурацию нельзя!”);
КонецЕсли;
КонецПроцедуры
Процедура Выбор(Список)
Список.ОтметитьЭлементы(“Выберите обед. Можно несколько.”);
Для Каждого ЭлементСписка Из Список Цикл
Если ЭлементСписка.Пометка Тогда
глОбед.Добавить(ЭлементСписка.Значение)
КонецЕсли;
КонецЦикла;
Если глОбед.Количество() = 0 Тогда
Предупреждение(“Вы не выбрали обед!”);
Выбор(Список);
КонецЕсли;
КонецПроцедуры
Процедура ПередЗавершениемРаботыСистемы(Отказ)
Если ТекущаяДата() < КонецРабДня Тогда
Если Вопрос(“Вы уверены что хотите закончить пораньше?”, РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Нет Тогда
Отказ = 1;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура ПриНачалеРаботыСистемы()
ГлОбед = Новый Массив;
Список = Новый СписокЗначений();
Список.Добавить(“курица”);
Список.Добавить(“мясо”);
Список.Добавить(“рыба”);
Выбор(Список);
КонецПроцедуры
И по структуре:
Числа = Новый Структура;
Для Счетчик = 1 По 999 Цикл
Простое = 1;
Для Делитель = 2 По Счетчик – 1 Цикл
Если Счетчик < 4 Тогда
Прервать;
КонецЕсли;
Результат = Счетчик/Делитель;
Если Результат = Цел(Результат) Тогда Простое=0;
Прервать;
КонецЕсли;
КонецЦикла;
Если Простое=1 Тогда
Числа.Вставить(“Число”+Счетчик, “Простое”);
Иначе
Числа.Вставить(“Число”+Счетчик, “Не простое”);
КонецЕсли;
КонецЦикла;
С числом 1000 не разобрался. Буду смотреть решение.
Отстаю немного: на работе завал все больше и больше… Первую часть выполнил без проблем. Во второй формирование структуры усвоил, а вот “Число1 000” не догадался.
Извиняюсь за опоздание …
<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>
Перем глОбед;
Процедура ПередНачаломРаботыСистемы(Отказ)
ТДата=ТекущаяДата();//чтоб 1 раз читать
НачРабДня= Дата( Год(тДата),Месяц(тДата),День(тДата),09,05,38);
КонРабДня= Дата( Год(тДата),Месяц(тДата),День(тДата),18,11,42);
Если ТДата <НачРабДня или ТДата>КонРабДня Тогда
Предупреждение(“конфигурацию не удастся
|запустить в нерабочее время!!”);
Отказ=Истина;
КонецЕсли;
КонецПроцедуры
Процедура ВыборВидаОбеда()
ВидОбеда = Новый СписокЗначений;
ВидОбеда.Добавить(“Курица”);
ВидОбеда.Добавить(“Рыба”);
ВидОбеда.Добавить(“Мясо”);
ВидОбеда.ОтметитьЭлементы(“Укажите свой вид обеда”);
Для Каждого ТекЭлемент Из ВидОбеда Цикл
Если ТекЭлемент.Пометка = Истина Тогда
глОбед.Добавить(ТекЭлемент.Значение);
КонецЕсли;
КонецЦикла;
Если глОбед.Количество() = 0 Тогда
ВыборВидаОбеда() ;
КонецЕсли;
КонецПроцедуры
Процедура ПриНачалеРаботыСистемы()
ВыборВидаОбеда();
КонецПроцедуры
Процедура ПередЗавершениемРаботыСистемы(Отказ)
ТДата=ТекущаяДата();//чтоб 1 раз читать
НачРабДня= Дата( Год(тДата),Месяц(тДата),День(тДата),09,05,38);
КонРабДня= Дата( Год(тДата),Месяц(тДата),День(тДата),18,11,42);
Если ТДата >НачРабДня и ТДата<КонРабДня Тогда
Если Вопрос(“Рабочий день не закончился.
|Всё равно хотите выйти из программы?”,РежимДиалогаВопрос.ДаНет,,КодВозвратаДиалога.Нет,,) = КодВозвратаДиалога.Нет Тогда
Отказ=Истина;
Иначе
КонецЕсли;
КонецЕсли;
//ВнешнееОборудование
МенеджерОборудованияКлиент.ПередЗавершениемРаботыСистемы();
//Конец ВнешнееОборудование
КонецПроцедуры
глОбед =новый СписокЗначений;
закончил со структурой.
Функция ПростоеЛи(Сч)
Для Делитель=2 По Сч-1 Цикл
Если Сч%Делитель =0 Тогда
Возврат “Не простое”;
прервать;
КонецЕсли;
КонецЦикла;
Возврат “Простое” ;
КонецФункции // ПростоеЛи()
&НаКлиенте
Процедура структура(Команда)
Числа=Новый Структура;
Для Сч=1 По 1000 Цикл
Числа.Вставить(“Число”+Формат(Сч,”ЧГ=0”),ПростоеЛи(Сч));
КонецЦикла;
сообщить(“Число539″+Строка(Числа.Число539));
значен=”Число332”;
Сообщить(Числа.Свойство(значен));
КонецПроцедуры
Ещё один опоздавший. Задания решил. Из-за нехватки времени – 1000 разбирать не стал, думаю можно “выкрутиться” функцией СтрЗаменить
Немного задержался из-за катастрофической нехватки времени. Вопросов не возникло. Хороший подкол с ключом – “Число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>
Задание выполнено. Есть вопрос по поводу ошибки “Неверный формат хранилища данных” при открытии файла внешней обработки. Есть ли выход, кроме периодического сохранения копии в txt?
По моим наблюдениям ошибку исправили в последних релизах.
Я сейчас использую 8.2.13.219 пока полет нормальный.
У Вас какой релиз?
Использую 1С:Предприятие 8.2 (8.2.13.205). Обновлю, помониторю. Спасибо.
Задание выполнил. Немножко затормозил с решением. Всё решение реализовал в модуле управляемого приложения. Проверку времени сделал по такому алгоритму:
<code>ВремяНачалаРаботы=Дата(‘00010101090538’);
ВремяКонцаРаботы=Дата(‘00010101181142’);
ВремяЗапускаСистемы=Дата(0001,01,01, Час(ТекущаяДата()),Минута(ТекущаяДата()),Секунда(ТекущаяДата()));
Если ВремяЗапускаСистемы<ВремяНачалаРаботы ИЛИ ВремяЗапускаСистемы>ВремяКонцаРаботы Тогда
…</code>
Объявил две экспортные переменные в модуле управляемого приложения. Потом ввел обращение к ним через внешнею обработку. Всё работает исключительно быстро:) Для поиска простых чисел сначала хотел использовать метод “Решето Сундарама”, но потом решил задачу “в лоб”, код:
<code>
Числа=Новый Структура(“Число1, Число2, Число3″,”Простое”,”Простое”, “Простое”);
Для Сч=4 По 1000 Цикл
ИмяКлюча=”Число”+Сч;
Если Сч=1000 Тогда
Числа.Вставить(“Число1000”, “Не простое”);
Прервать;
КонецЕсли;
Для Делитель=2 По Сч-1 Цикл
Если Сч%Делитель=0 Тогда
Числа.Вставить(ИмяКлюча, “Не простое”);
Прервать;
Иначе
Числа.Вставить(ИмяКлюча, “Простое”);
КонецЕСли;
КонецЦикла;
КонецЦикла;</code>
>Если Сч=1000 Тогда
>Числа.Вставить(«Число1000″, «Не простое»);
Есть более эффективный способ, см. решение задания.
Спасибо:) Задачу я решил конкретно “в лоб”, не догадался использовать функцию формат. Я её часто раньше использовал при работе с датами, а вот к числам не применял. Задание переделал.
<code>
Перем ГлОбед Экспорт;
Перем ВыборПользователя;
Перем НачалоРабочегоДня;
Перем КонецРабочегоДня;
Процедура ПередНачаломРаботыСистемы(Отказ)
ТекГод = Год(ТекущаяДата());
ТекМесяц = Месяц(ТекущаяДата());
ТекДень = День(ТекущаяДата());
НачалоРабочегоДня = Дата(ТекГод,ТекМесяц,ТекДень,09,05,38);
КонецРабочегоДня = Дата(ТекГод,ТекМесяц,ТекДень,18,11,42);
Если ТекущаяДата() < НачалоРабочегоДня или ТекущаяДата() > КонецРабочегоДня Тогда
Предупреждение(“Вход в программу в нерабочее время запрещен!”);
Отказ = Истина;
Иначе
ГлОбед = Новый СписокЗначений;
ГлОбед.Добавить(“Курица”);
ГлОбед.Добавить(“Рыба”);
ГлОбед.Добавить(“Мясо”);
Пока ВыборПользователя = Неопределено Цикл
ВыборПользователя = ГлОбед.ВыбратьЭлемент(“Какой вариант обеда вы предпочитаете?”);
КонецЦикла;
КонецЕсли;
Числа = Новый Структура;
Для СчетчикЧисла = 1 По 1000 Цикл
ЧислоПростое = Истина;
Для СчетчикДелителя = 2 По СчетчикЧисла Цикл
Если СчетчикЧисла = СчетчикДелителя Тогда
Продолжить;
КонецЕсли;
Остаток = СчетчикЧисла % СчетчикДелителя;
Если Остаток = 0 Тогда
ЧислоПростое = Ложь;
Прервать;
КонецЕсли;
КонецЦикла;
Если ЧислоПростое Тогда
Числа.Вставить(“Число”+Формат(СчетчикЧисла, “ЧГ=0”), “Простое”);
Иначе
Числа.Вставить(“Число”+Формат(СчетчикЧисла, “ЧГ=0”), “Непростое”);
КонецЕсли;
КонецЦикла;
Число591 = Числа.Число591;
х = “Число332”;
Число332 = Числа[х];
КонецПроцедуры
Процедура ПередЗавершениемРаботыСистемы(Отказ)
Если не (ТекущаяДата() < НачалоРабочегоДня или ТекущаяДата() > КонецРабочегоДня) Тогда
Ответ = Вопрос(“Рабочий день не закончился. Всё равно хотите выйти из программы?”,РежимДиалогаВопрос.ДаНет,,,,);
Если Ответ = КодВозвратаДиалога.Нет Тогда
Отказ = Истина;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
</code>
C заданием справился. но запись тысячного элемента структуры и обращение к структуре по ключу, содержащемуся в переменной сделал только после прочтения комментариев
>ДЗ выполнил возник вопрос с пробелом в 1000
Посмотрите решение.
Добрый день!
Весь код ДЗ №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>
Две глобальные переменные – начало и окончание рабочего дня. ПередНачаломРаботыСистемы() – проверка. Массив глОбед. ПриЗавершенииРаботыСистемы(). Структура.
Задания выполнены.
по первой части особых сложностей не было, но повторно пересматривать уроки и СП пришлось :) Проверки на вход и выход производила в модуле упр.приложения процедурами при запуске и перед выходом.
По второй части задания – долго не получалось вывести значение структуры для ключа X, СинтПомошник и пересмотр уроков не помогли, поэтому обратилась к комментариям в данной теме :) через Стр[x] все сразу заработало. С разделителем в 1000 – справилась через формат(счетчик,”ЧГ =”). Проверку на “простоту” для всех чисел кроме исходных простых 2,3,5,7 производила проверкой остатка от деления на исходные простые числа.
Выполнено.
В первом для проверки времени сначала определил количество секунд ДАТА(1,1,1,9,5,38) – Дата(1,1,1) потом к НачалоДня(ТекущаяДата()) прибавил секунды и сравнивал с текущей датой
Примерно точно также при завершении работы
только с вопросом и другой датой.
Для обеда воспользовался Список.ОтметитьЭлементы. Был удивлен когда ничего не выбрано и нажато ок возвращается Истина.
Простые и составные числа определил.
Задание выполнил.
В модуле управляемого приложения, в процедурах ПередНачаломРаботыСистемы и ПрередЗавершениемРаботыСистемы выполняем проверку рабочего времени.
В процедуре ПриНачалеРаботыСистемы выбираем обед.
Работа со структурой тоже проблем не вызывает.
Задание выполнено, вопросов не последовало.
В модуле управляемого приложения ввел две переменные НачалоРабочегоДня и КонецРабочегоДня. В процедурах ПриНачалеРаботыСистемы и ПриЗавершенииРаботыСистемы повесил ставнение текущего времени с переменными и соответствующие реакции. После проверки на время в цикле прощу выбрать из списка значение меню на сегодня и если есть помеченные элементы заношу их в массив и выхожу из цикла.
После этого вызывается процедура СформироватьСтруктуруЧислел, в цикле от 1 до 1000 заполняю стуктуру. При этом Ключь = “Число” + Формат(Счетчик,”ЧГ=0″), значение вычисляется в цикле перебором все делителей и сравнение результата и целой части результата.
Модуль управляемого приложения
<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>
<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. Если нужно описать переменную модуля, которая будет использоваться в нескольких методах.