Базовый курс. Занятие №4
Занятие по 1-му блоку базового курса.
Необходимо изучить следующие главы 1-го блока.
Глава 1. Типы данных
Глава 2. Контекст выполнения кода
Глава 3. Модули
Глава 4. Синтакс-помощник
Также нужно выполнить домашнее задание, текст которого доступен на странице.
Задание необходимо выполнять в ИБ после предыдущего ДЗ.
В этой же теме необходимо написать отчет о выполнении задания.
ps. Участники курса без доступа в мастер-группу отчитаться по домашним заданиям не получиться.
— залогиньтесь.
Если не активировали токен — посмотрите видео-инструкцию (видео N5)
Если вы залогинены, у Вас активирован токен доступа, но вы все равно видите эту запись —напишите нам на e-mail поддержки.
Задание выполнено. Все делал в модуле управляемого приложения. В процедуре ПередНачаломРаботыСистемы проверка времени входа.
<code>
Процедура ПередНачаломРаботыСистемы(Отказ)
ТекДата = ТекущаяДата();
НачалоРабДня = Дата(Формат(ТекДата,”ДФ=ггггММдд”)+”090538″);
КонецРабДня = Дата(Формат(ТекДата,”ДФ=ггггММдд”)+”181142″);
Если (ТекДата<НачалоРабДня) или (ТекДата>КонецРабДня) Тогда
Предупреждение(“В нерабочее время доступ запрещен!”,5);
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
</code>
Похожим образом в процедуре ПередЗавершениемРаботыСистемы проверка время выхода и, при необходимости, Вопрос о подтверждении выхода.
Выбор обеда в процедуре ПриНачалеРаботыСистемы. Создаем Список значений, заполняем, создаем массив глОбед и далее:
<code>
Пока глОбед.Количество()=0 Цикл
Если СписокБлюд.ОтметитьЭлементы(“Выберите обед”) Тогда
Для каждого Блюдо Из СписокБлюд Цикл
Если Блюдо.Пометка Тогда
глОбед.Добавить(Блюдо.Значение);
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
</code>
Заполнение структуры простыми числами:
<code>
Числа = Новый Структура;
Для Число=1 по 1000 Цикл
Простое=Истина;
Для Сч=2 по Число/2 Цикл
Если Цел(Число/Сч)=Число/Сч Тогда
Простое=Ложь;
Прервать;
КонецЕсли;
КонецЦикла;
Если Простое Тогда
Числа.Вставить(“Число”+Число,Число);
КонецЕсли
КонецЦикла;
</code>
Проверку наличия ключа делал через метод структуры Свойство.
Тоже не совсем понял какой именно должна быть структура, увидел пример в задании, исправляю код:
<code>
Для Число=1 по 1000 Цикл ТипЧисла=”Простое”; Для Сч=2 по Число/2 Цикл Если Цел(Число/Сч)=Число/Сч Тогда ТипЧисла=”Не простое”; Прервать; КонецЕсли; КонецЦикла; Числа.Вставить(«Число»+Число,ТипЧисла); КонецЦикла;
</code>
То есть сейчас понимание задачи однозначное?
да, сейчас все понятно :)
И еще одно исправление, добавлять в структуру надо так
Числа.Вставить(“Число”+Формат(Число,”ЧГ=0”),ТипЧисла);
все время забываю, что система группирует разряды целой части при переводе числа в строку :(
Задание выполнено.
В принципе особых проблем не возникло.
1. Для режима работы использовал регистр сведений(может быть чуть вперед забежал), Измерения: ВремяНачала и ВремяОконачния – тип Дата(состав время). При старте и заверешении сравнивал текущее время со значениями в РС с помощью формата (“ДФ=ЧЧммсс”, с ведущими нулями).
2. Выбор обеда с помощью рекурсивной процедуры
3. Подстава в виде разделителя триад. Для 1000 при преобразовании пришлось убивать Символ(160) с помощью СтрЗаменить.
1. Проверка на соответствие времени рабочему -если не использовать Предупреждение() есть ли в 8.2 способ реализации остановки выполнения кода (Pause), кроме использования WShell, ВК?
2. По обедам – вопросов нет.
3. Заполнение массива простых чисел – ОК.
4. Максимальное число элементов структуры 999.
1. Вы перечислили основные способы.
Есть еще один способ – запускать цикл, до тех пор пока не появится некоторый семафор.
Например, файл на диске, либо определенный элемент в справочнике.
Но этот способ будет достаточно сильно грузить систему.
4. Не совсем так. Количество элементов в структуре можно считать неограниченным.
Действительно, убрал разделитель из “1 000” – ОК.
1. Проверка пользователя при входе в конф. на время сделал в Модуле управляемого приложения:
<code>
Процедура ПередНачаломРаботыСистемы(Отказ)
РазрешенноеВремя = НачалоДня(ТекущаяДата()) + 9*3600 + 300 + 38;
Если ТекущаяДата() < РазрешенноеВремя Тогда
Предупреждение(“Вход в систему запрещен!”);
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
Процедура ПередНачаломРаботыСистемы(Отказ) РазрешенноеВремя = НачалоДня(ТекущаяДата()) + 9*3600 + 300 + 38;
Если ТекущаяДата() < РазрешенноеВремя Тогда Предупреждение(“Вход в систему запрещен!”);
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
</code>
2. При успешном входе пользователя предложить выбор обеда, тоже в Модуле упр. приложения:
<code>
Перем глОбед Экспорт;
Процедура ПриНачалеРаботыСистемы()
СписокВыбора = Новый СписокЗначений;
СписокВыбора.Добавить(“Курица”);
СписокВыбора.Добавить(“Рыба”);
СписокВыбора.Добавить(“Мясо”);
ВыбЗначение = Неопределено;
Пока ВыбЗначение = Неопределено Цикл
ВыбЗначение = СписокВыбора.ВыбратьЭлемент(“Какой вариант обеда вы предпочитаете?”);
КонецЦикла;
глОбед = ВыбЗначение.Значение;
СоздатьСтруктуруЧисла();
КонецПроцедуры
</code>
3. При выходе пользователя из системы напомнить об окончании раб. времени, также модуль упр. приложения:
<code>
Процедура ПередЗавершениемРаботыСистемы(Отказ)
РазрешенноеВремя = НачалоДня(ТекущаяДата()) + 18*3600 + 660 + 42;
Если ТекущаяДата() < РазрешенноеВремя Тогда
Режим = РежимДиалогаВопрос.ДаНет;
Ответ = Вопрос(“Рабочее время еще не закончилось, закрыть программу?”, Режим);
Если Ответ = КодВозвратаДиалога.Нет Тогда
Отказ = Истина;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
</code>
4. И последнее задание сделал в модуле упр. приложения, выше виден вызов процедуры СоздатьСтруктуруЧисла(), вот ее описание. Ответы на позадания я вывел в сообщении:
<code>
Процедура СоздатьСтруктуруЧисла() СтруктураЧисла = Новый Структура; Для й = 1 По 1000 Цикл Если ЧислоПростое(й) Тогда СтруктураЧисла.Вставить(“Число” + й, “Простое”); Иначе СтруктураЧисла.Вставить(“Число” + СтрЗаменить(й, Символы.НПП, “”), “Не простое”); КонецЕсли; КонецЦикла; Сообщить(“Значение по известному ключу (Число591): ” + СтруктураЧисла[“Число591”]); Х = “Число332”; Сообщить(“Значение по известному ключу, содержащемуся в переменной Х (Число332): ” + СтруктураЧисла[Х]); КонецПроцедуры Функция ЧислоПростое(Число) Для й = 2 По Число-1 Цикл Если (Число%й) = 0 Тогда Возврат Ложь; КонецЕсли; КонецЦикла; Возврат Истина; КонецФункции
</code>
Перем глОбед Экспорт;
Процедура ПередНачаломРаботыСистемы(Отказ)
ТекДата = ТекущаяДата();
НачДня = НачалоДня(ТекДата);
Результат = ТекДата – НачДня;
Если Результат > 32738 И Результат < 65502 Тогда
ВариантОбеда();
Иначе
Предупреждение(“Вы не можете зайти в конфигурацию в нерабочие время!!!”, 10, “Завершение работы системы”);
ЗавершитьРаботуСистемы();
КонецЕсли;
КонецПроцедуры
Процедура ПередЗавершениемРаботыСистемы(Отказ)
ТекДата = ТекущаяДата();
НачДня = НачалоДня(ТекДата);
Результат = ТекДата – НачДня;
Если Результат > 32738 И Результат < 65502 Тогда
Если Вопрос(“Может еще рано выходить?”, РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Да Тогда
Отказ = Истина;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Функция ВариантОбеда()
СписокОбеда = Новый СписокЗначений;
СписокОбеда.Добавить(“Курица”);
СписокОбеда.Добавить(“Рыба”);
СписокОбеда.Добавить(“Мясо”);
Если СписокОбеда.ОтметитьЭлементы() Тогда
глОбед = СписокОбеда.ВыгрузитьЗначения();
Иначе
ВариантОбеда();
КонецЕсли;
КонецФункции // ВариантОбеда()
По моему я не смог решить задачу хранит результат в массиве! В этом примере массив присваивается все три значение:
глОбед = СписокОбеда.ВыгрузитьЗначения();
И последние задание мне не понятно :(
Необходимо обойти элементы структуры с помощью цикла “Для каждого … из …” и выбрать в массив только те элементы, где установлена отметка.
>И последние задание мне не понятно :(
Необходимо при старте приложения вызывать соответствующую функцию, которая создает структуру, содержащую числа от 1 до 1000.
Что именно в тексте не понятно?
Если СписокОбеда.ОтметитьЭлементы() Тогда
Для каждого Элм Из СписокОбеда Цикл
Если Элм.Пометка Тогда
глОбед.Добавить(Элм.Значение);
КонецЕсли;
КонецЦикла;
Иначе
Верно.
Что то типо такого
<code>
Перем глОбед Экспорт;
Перем Числа Экспорт;
Процедура ПередНачаломРаботыСистемы(Отказ)
НачалоРабочегоДня = НачалоДня(ТекущаяДата()) + 9*60*60 + 5*60 + 38;
КонецРабочегоДня = НачалоДня(ТекущаяДата()) + 18*60*60 + 11*60 + 42;
Если ТекущаяДата() < НачалоРабочегоДня Тогда
Предупреждение(“Приходите после 09:05:38”,, “А ну-ка поспите ещё!”);
Отказ = Истина;
ИначеЕсли ТекущаяДата() > КонецРабочегоДня Тогда
Предупреждение(“Пора спать. Рабочий день заканчивается в 18:11:42”,, “А ну ка спать!”);
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
Процедура ПриНачалеРаботыСистемы()
СписокЗн = Новый СписокЗначений;
СписокЗн.Добавить(“Курица”);
СписокЗн.Добавить(“Рыба”);
СписокЗн.Добавить(“Мясо”);
ВашВыбор = Ложь;
Сообщение = “Что Вы хотите сегодня на обед?”;
Пока ВашВыбор = Ложь Цикл
ВашВыбор = СписокЗн.ОтметитьЭлементы(Сообщение);
Сообщение = “А я хочу явного ответа. Что Вы хотите сегодня на обед?”;
КонецЦикла;
МассивОтветов = Новый Массив;
Для Каждого Элемент из СписокЗн Цикл
Если Элемент.Пометка Тогда
МассивОтветов.Добавить(Элемент.Значение);
КонецЕсли;
КонецЦикла;
глОбед = МассивОтветов;
Для Каждого Элемент из глОбед Цикл
Сообщить(Элемент);
КонецЦикла;
Числа = Новый Структура(“Код, Простое”);
Для Сч = 1 По 1000 Цикл
Код = “Число” + Строка(Сч);
Если Сч < 4 Тогда
Значение = “Простое”;
ИначеЕсли Простое(Сч) Тогда
Значение = “Простое”;
Иначе
Значение = “Не простое”;
КонецЕсли;
Числа.Вставить(“Код”,Код);
Числа.Вставить(“Простое”,Значение);
КонецЦикла;
КонецПроцедуры
Процедура ПередЗавершениемРаботыСистемы(Отказ)
КонецРабочегоДня = НачалоДня(ТекущаяДата()) + 18*60*60 + 11*60 + 42;
Если ТекущаяДата() < КонецРабочегоДня Тогда
Ответ = Вопрос(“Вы действительно хотите Выйти?”, РежимДиалогаВопрос.ДаНет);
Если Ответ = КодВозвратаДиалога.Нет Тогда
Отказ = Истина;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Функция Простое(Число)
Корень = Цел(Sqrt(Число));
Для Счетчик = 2 По Корень Цикл
Если Число%Счетчик = 0 Тогда
Возврат Ложь;
КонецЕсли;
КонецЦикла;
Возврат Истина;
КонецФункции
</code>
Но как то или не совсем понял задание со структурой, но в табло кажись то показывает.
>Но как то или не совсем понял задание со структурой, но в табло кажись то показывает.
Действительно не так поняли.
В структуре ключ вида “Число999”, а значение – строка, просто число или нет.
В вашем случае будет примерно такой код:
Числа.Вставить(Код, Значение).
А далее будут проблемы с числом 1000.
Все понятно,… я то сначала не понял почему про 1000 спрашиваете, а почитав отзывы других стало все на место свое. :)
Первое задание:
Перем глОбед Экспорт;
Перем ТекВремя;
Процедура ПередНачаломРаботыСистемы(Отказ)
Если (ТекВремя < “09.05.38”) или (ТекВремя > “18.11.42”)Тогда
Предупреждение(“Вход воспрещен!”);
Отказ=Истина;
КонецЕсли;
КонецПроцедуры
Процедура ПриНачалеРаботыСистемы()
глОбед=новый Массив;
СписокЗначений = Новый СписокЗначений;
СписокЗначений.Добавить(“Курица”);
СписокЗначений.Добавить(“Рыба”);
СписокЗначений.Добавить(“Мясо”);
Если СписокЗначений.ОтметитьЭлементы(“Выберите обед”) Тогда
Для каждого Значение из СписокЗначений Цикл
Если Значение.Пометка Тогда
глОбед.Добавить(Значение);
КонецЕсли;
КонецЦикла;
Для каждого Элемент из глОбед Цикл
Сообщить(“Вы выбрали – “+Элемент);
КонецЦикла;
Иначе
Предупреждение(“Нельзя отказываться от обеда!”);
ПриНачалеРаботыСистемы();
КонецЕсли;
СтруктураПростогоЧисла();
КонецПроцедуры
Процедура ПередЗавершениемРаботыСистемы(Отказ)
Режим=РежимДиалогаВопрос.ДаНет;
Если (ТекВремя > “09.05.38”) или (ТекВремя < “18.11.42”)Тогда
Ответ=Вопрос(“Рабочий день еще не окончился!
|Выйти из программы?”,Режим);
Если Ответ=КодВозвратаДиалога.Нет Тогда
Отказ=Истина;
Иначе
Отказ=Ложь;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
ТекВремя=Формат(ТекущаяДата(),”ДФ=ЧЧ.мм.сс”);
Второе задание выполнить не смогла.
>Если (ТекВремя «18.11.42″)Тогда
Это опасное сравнение. В решении поговорим почему.
Задание Выполнено.
Перем ВремяНачалаРаботы;
Перем ВремяОкончанияРаботы;
Перем ГлОбед Экспорт;
Процедура ПередНачаломРаботыСистемы(Отказ)
ТекДата=ТекущаяДата();
ТекВремя=Дата(1,1,1,Час(ТекДата),Минута(ТекДата),Секунда(ТекДата));
Если (ТекВремя<ВремяНачалаРаботы) ИЛИ (ТекВремя>ВремяОкончанияРаботы)
Тогда
Предупреждение(“Сейчас заходить в конфигурацию нельзя!”);
Отказ=Истина;
КОнецЕсли;
КонецПроцедуры
Процедура ПередЗавершениемРаботыСистемы(Отказ)
ТекДата=ТекущаяДата();
ТекВремя=Дата(1,1,1,Час(ТекДата),Минута(ТекДата),Секунда(ТекДата));
Если (ТекВремя>=ВремяНачалаРаботы)И(ТекВремя<=ВремяОкончанияРаботы)
ТОгда
Если Не (Вопрос(“Рабочий день еще не закончен. Выйти?”,РежимДиалогаВопрос.ДаНетОтмена)=КодВозвратаДиалога.Да)
тогда Отказ=Истина;
конецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура ПриНачалеРаботыСистемы()
ВариантыОбеда= Новый СписокЗначений;
ВариантыОбеда.Добавить(“курица”);
ВариантыОбеда.Добавить(“рыба”);
ВариантыОбеда.Добавить(“мясо”);
ГлОбед = Новый Массив;
ПовторитьВыбор=Истина;
Пока ПовторитьВыбор Цикл
ВариантыОбеда.ОтметитьЭлементы(“Выберите вариант Обеда”);
Для Каждого Элемент из ВариантыОбеда Цикл
Если (Элемент.Пометка=Истина) Тогда
ГлОбед.Добавить(Элемент.Значение);
ПовторитьВыбор=Ложь;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Числа= Новый Структура;
Для Номер=1 по 1000 Цикл
Ключ=”Число”+Формат(Номер,”ЧГ=0″);
Числа.Вставить(Ключ,ЧислоПростое(Номер));
КонецЦикла;
Если Числа.Свойство(“Число591”)=Истина тогда
Сообщить(“Число591=”+Числа.Число591);
КонецЕсли;
х=”Число332”;
Если Числа.Свойство(х)=Истина тогда
Сообщить(х+”=”+Числа[х]);
КонецЕсли;
КонецПроцедуры
Функция ЧислоПростое(Число)
Признак=Истина;
Если (Число>3)
Тогда
Корень=Цел(Sqrt(Число));
Для Счетчик=2 По Корень Цикл
Если (Число%Счетчик=0) тогда
Признак=Ложь;
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если Признак=Истина
Тогда Возврат “Простое”
Иначе Возврат “Не простое”
КонецЕсли;
КонецФункции
ВремяНачалаРаботы=Дата(1,1,1,9,5,38);
ВремяОкончанияРаботы=Дата(1,1,1,18,11,42);
Задание выполнено.
По части задания по предприятию немного смущает функция ” ОтсутствуютВыбранныеЭлементы”. В ней осуществляется цикл по списку значений, а затем, после возврата в основной цикл проверки, происходит еще один цикл по тому же списку значений, но с целью добавить помеченные элементы в массив. Кажется, что можно объединить, но пока не догадался как.
<code>
Перем глОбед Экспорт;
Процедура ПередНачаломРаботыСистемы(Отказ)
Если НЕ ВремяРабочее(ТекущаяДата()) Тогда
Отказ = Истина;
Вопрос(“Время нерабочее!”, РежимДиалогаВопрос.ОК);
КонецЕсли;
КонецПроцедуры
Процедура ПриНачалеРаботыСистемы()
глОбед = Новый Массив();
ВариантыВыбораОбеда = Новый СписокЗначений();
ВариантыВыбораОбеда.Добавить(“Курица”);
ВариантыВыбораОбеда.Добавить(“Рыба”);
ВариантыВыбораОбеда.Добавить(“Мясо”);
КоличествоВыбранных = 0;
Пока (НЕ ВариантыВыбораОбеда.ОтметитьЭлементы(“Выберите вариант обеда”))
ИЛИ(ОтсутствуютВыбранныеЭлементы(ВариантыВыбораОбеда)) Цикл
КонецЦикла;
Для Каждого Элемент из ВариантыВыбораОбеда Цикл
Если Элемент.Пометка Тогда
глОбед.Добавить(Элемент.Значение);
КонецЕсли;
КонецЦикла;
Сообщить(“Выбранный обед:”);
Для Каждого СтрокаМассива Из глОбед Цикл
Сообщить(СтрокаМассива);
КонецЦикла;
КонецПроцедуры
Функция ВремяРабочее(ТекущаяДатаВремя)
ВремяНачалаРаботы = Дата(Год(ТекущаяДатаВремя), Месяц(ТекущаяДатаВремя),
День(ТекущаяДатаВремя), 09, 05, 38);
ВремяОкончанияРаботы = Дата(Год(ТекущаяДатаВремя), Месяц(ТекущаяДатаВремя),
День(ТекущаяДатаВремя), 18, 11, 42);
Если ТекущаяДатаВремя < ВремяНачалаРаботы ИЛИ
ТекущаяДатаВремя > ВремяОкончанияРаботы Тогда
Возврат ложь;
Иначе
Возврат Истина;
КонецЕсли;
КонецФункции
Функция ОтсутствуютВыбранныеЭлементы(СписокВыбора)
КоличествоВыбранных = 0;
Для Каждого Элемент из СписокВыбора Цикл
Если Элемент.Пометка Тогда
Возврат Ложь;
КонецЕсли;
КонецЦикла;
Возврат Истина;
КонецФункции
Процедура ПередЗавершениемРаботыСистемы(Отказ)
Если ВремяРабочее(ТекущаяДата()) Тогда
Если Вопрос(“Вы уверены, что хотите выйти из программы в рабочее время?”
,РежимДиалогаВопрос.ДаНет)=КодВозвратаДиалога.Нет Тогда
Отказ = Истина;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
</code>
По структуре с целыми числами признаюсь честно, подсмотрел в википедии один из алгоритмов расчета и перенес его на 1С. Быстрее,может и есть,но проще – вряд-ли.
<code>
Числа = Новый структура;
Для ЦелоеЧисло = 1 По 1000 Цикл
Числа.Вставить(“Число”+Формат(ЦелоеЧисло, “ЧГ=0”),ЧислоПростое(ЦелоеЧисло));
КонецЦикла;
Функция ЧислоПростое(ЦелоеЧисло)
Если ЦелоеЧисло <= 1 тогда
Возврат “Не простое”;
КонецЕсли;
Счетчик = 2;
Пока Счетчик*Счетчик <= ЦелоеЧисло Цикл
Если (ЦелоеЧисло%Счетчик)=0 Тогда
Возврат “Не простое”;
КонецЕсли;
Счетчик = Счетчик + 1;
КонецЦикла;
Возврат “Простое”;
КонецФункции
</code>
первую часть задания выполнил, в принципе все с ним не очень сложно, вопрос только есть: для обычного приложения тоже нужно выполнять первую часть задания? (во второй явно задано, что для управляемого приложения, а с первой не понятно)
а вот со второй частью так и несправился
Да, желательно учесть, что может запускаться обычное приложение.
Выполнено “в лоб”, приписыванием всех необходимых алгоритмлв в модуле управляемого приложения. Было очень познавательно. Привожу листинг только формирования структуры простых чисел.
Процедура СоздатьСтруктуруПростыхЧисел(структура)
Для Сч = 2 По 1000 Цикл
ДобавитьПростоеЧисло = Истина;
Для Каждого Элемент из структура Цикл
Если Сч % Элемент.Значение = 0 Тогда
ДобавитьПростоеЧисло = Ложь;
Прервать;
КонецЕсли;
КонецЦикла;
Если ДобавитьПростоеЧисло Тогда
структура.Вставить(“Число”+Сч,Сч);
КонецЕсли;
КонецЦикла;
структура.Вставить(“Число1″+1);
КонецПроцедуры
Я не смог до конца написать программу это первый часть заданий (нужно еще работу сделать :) ) :
Процедура ПередНачаломРаботыСистемы(Отказ)
ТекДата = ТекущаяДата();
НачДня = НачалоДня(ТекДата);
Резултать = ТекДата – НачДня;
Если Резултать > 32738 И Резултать < 65502 Тогда Сообщить("Можно зайти"); Иначе Предупреждение("Вы не можете зайти в конфигурацию в нерабочие время!!!", 10, "Завершение работы системы"); ЗавершитьРаботуСистемы(); КонецЕсли; КонецПроцедуры
перем глОбед;
Процедура обед()
Список = новый СписокЗначений;
Список.Добавить(“Курица”);
Список.Добавить(“Мясо”);
Список.Добавить(“Рыба”);
Список.ОтметитьЭлементы(“Что Вы будете на обед?”);
флаг = Ложь;
для Каждого стр из Список Цикл
если стр.Пометка Тогда
глОбед.Добавить(стр.Значение);
флаг=Истина;
КонецЕсли;
КонецЦикла;
если не флаг Тогда
обед();
КонецЕсли;
КонецПроцедуры
Процедура ПередЗавершениемРаботыСистемы(Отказ)
если Формат(ТекущаяДата(), “ДФ = ЧЧ:мм:сс”)<“18.11.42” Тогда
ответ = Вопрос(“Вы уверены?”,РежимДиалогаВопрос.ДаНет,,,”Рабочий день еще не закончен!”);
если ответ = КодВозвратаДиалога.Да Тогда
ЗавершитьРаботуСистемы(Ложь);
иначе
Отказ = Истина;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура ПередНачаломРаботыСистемы(Отказ)
если Формат(ТекущаяДата(), “ДФ = ЧЧ:мм:сс”)<“09.05.38” или Формат(ТекущаяДата(), “ДФ = ЧЧ:мм:сс”)>”18.11.42″ Тогда
Предупреждение(“Сейчас заходить нельзя!”);
отказ = Истина;
КонецЕсли;
//
Числа = новый Структура;
для сч=1 по 1000 Цикл
ТипЧисла = определение(сч);
если сч=1000 Тогда
сч=””;
для счет = 1 по СтрДлина(строка(1000)) Цикл
симв = Сред(строка(1000),счет,1);
если КодСимвола(симв)<>160 Тогда
сч=сч+симв;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Числа.Вставить(“Число”+сч,ТипЧисла);
КонецЦикла;
КонецПроцедуры
Функция определение(сч)
если сч=1 Тогда
Возврат “НеПростое”;
ИначеЕсли сч=2 Тогда
Возврат “Простое”;
КонецЕсли;
для счет=2 по сч-1 Цикл
если сч%счет=0 Тогда
Возврат “НеПростое”;
КонецЕсли;
КонецЦикла;
Возврат “Простое”;
КонецФункции
Процедура ПриНачалеРаботыСистемы()
Обед();
КонецПроцедуры
глОбед = новый Массив;
перем глОбед;
Процедура обед() Список = новый СписокЗначений; Список.Добавить(“Курица”); Список.Добавить(“Мясо”); Список.Добавить(“Рыба”); Список.ОтметитьЭлементы(“Что Вы будете на обед?”); флаг = Ложь; для Каждого стр из Список Цикл если стр.Пометка Тогда глОбед.Добавить(стр.Значение); флаг=Истина; КонецЕсли; КонецЦикла; если не флаг Тогда обед(); КонецЕсли; КонецПроцедуры
Процедура ПередЗавершениемРаботыСистемы(Отказ) если Формат(ТекущаяДата(), “ДФ = ЧЧ:мм:сс”)<“18.11.42” Тогда ответ = Вопрос(“Вы уверены?”,РежимДиалогаВопрос.ДаНет,,,”Рабочий день еще не закончен!”); если ответ = КодВозвратаДиалога.Да Тогда ЗавершитьРаботуСистемы(Ложь); иначе Отказ = Истина; КонецЕсли; КонецЕсли;
КонецПроцедуры
Процедура ПередНачаломРаботыСистемы(Отказ) если Формат(ТекущаяДата(), “ДФ = ЧЧ:мм:сс”)<“09.05.38” или Формат(ТекущаяДата(), “ДФ = ЧЧ:мм:сс”)>”18.11.42″ Тогда Предупреждение(“Сейчас заходить нельзя!”); отказ = Истина; КонецЕсли; // Числа = новый Структура; для сч=1 по 1000 Цикл ТипЧисла = определение(сч); если сч=1000 Тогда сч=””; для счет = 1 по СтрДлина(строка(1000)) Цикл симв = Сред(строка(1000),счет,1); если КодСимвола(симв)<>160 Тогда сч=сч+симв; КонецЕсли; КонецЦикла; КонецЕсли; Числа.Вставить(“Число”+сч,ТипЧисла); КонецЦикла; КонецПроцедуры
Функция определение(сч)
если сч=1 Тогда Возврат “НеПростое”; ИначеЕсли сч=2 Тогда Возврат “Простое”; КонецЕсли; для счет=2 по сч-1 Цикл если сч%счет=0 Тогда Возврат “НеПростое”; КонецЕсли; КонецЦикла; Возврат “Простое”; КонецФункции
Процедура ПриНачалеРаботыСистемы() Обед(); КонецПроцедуры
глОбед = новый Массив;
================
1) Числа.Число591
Или через переменную:
Х = «Число591″;
Числа[Х]
2) Числа.свойство(“Число332”) выдаст истину в нашем случае.
Часть1
Создал константы для хранения времени начала и окончания работы (час, минута , секунда).
Проверку времени при входе пользователя в конфигурацию разместил в обработчике события “ПередНачаломРаботыСистемы” модуля управляемого приложения. Поскольку этот модуль компилируется на стороне клиента, то для получения значения констант я создал общий модуль с флагом компиляции “Сервер” и выбранным параметром “Вызов сервера”.
Проверка условий запуска конфигурации заключается в сравнивании текущей секунды дня со значениями секунды начала работы и секунды окончания работы.
Аналогичным образом работает проверка завершения работы в обработчике события “ПередЗавершениемРаботыСистемы”.
В процедуре “ПриНачалеРаботыСистемы” разместил код для выбора обеда. Функцию ВариантыОбеда.ОтметитьЭлементы(“Выберите обед”) разместил в цикле с условием. Цикл закончится если будет хотя бы один отмеченный элемент в списке значений ВариантыОбеда.
Часть 2
В модуле управляемого приложения создал структуру Числа и заполнил её. При этом использовал простой алгоритм поиска простых чисел (цикл в цикле). При преобразовании числа 1000 в строку, появляется символ разделения групп разрядов. Добавления в структуру ключа с таким символом вызвало ошибку. Избавился от него при помощи функции СтрЗаменить.
Обратился к данным структуры:
Сообщить(Числа.Число1);
х = “Число332”;
Сообщить(Числа[х]);
Сообщить(Числа.Число591);
х = “Число332”;
Сообщить(Числа[х]);
Перем глОбед Экспорт;
Перем Числа;
Функция ВремяДаты( ТекДата )
Возврат ТекДата-НачалоДня(ТекДата);
КонецФункции
Процедура ПриНачалеРаботыСистемы()
ВариантыОбеда = Новый СписокЗначений;
ВариантыОбеда.Добавить( “КУРИЦА”, “Курица” );
ВариантыОбеда.Добавить( “РЫБА”, “Рыба” );
ВариантыОбеда.Добавить( “МЯСО”, “Мясо” );
РабочийДеньНачало = Дата(1,1,1,9,5,38);
Если ВремяДаты(ТекущаяДата()) < ВремяДаты(РабочийДеньНачало) Тогда
Предупреждение(“Рабочий день начинается в 09:05:38! Зайдите позже.”);
ЗавершитьРаботуСистемы(Ложь);
Иначе
глОбедКоличество = глОбед.Количество();
Пока глОбедКоличество = 0 Цикл
ВариантыОбеда.ОтметитьЭлементы( “Выберите обед” );
Для Каждого Элемент Из ВариантыОбеда Цикл
Если Элемент.Пометка Тогда
глОбед.Добавить(Элемент.Значение);
глОбедКоличество = 1;
КонецЕсли;
КонецЦикла;
Если глОбедКоличество Тогда
Предупреждение(“Выбор обеда обязателен”);
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Процедура ПередЗавершениемРаботыСистемы(Отказ)
РабочийДеньКонец = Дата(1,1,1,18,11,42);
Если ВремяДаты(ТекущаяДата()) < ВремяДаты(РабочийДеньКонец) Тогда
ТекстВопроса = “Рабочий день заканчинается в 18:11:42! Вы покидаете работу?”;
Отказ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Нет;
КонецЕсли;
КонецПроцедуры
Функция ЭтоПростоеЧисло( ТекущееЧисло )
Результат = Ложь;
Счетчик = 2;
Пока НЕ Результат И Цел(ТекущееЧисло/Счетчик)>=2 Цикл
Результат = (ТекущееЧисло%Счетчик)=0;
Счетчик = Счетчик + 1;
КонецЦикла;
Возврат НЕ Результат;
КонецФункции
глОбед = Новый Массив;
Числа = Новый Структура;
Для ТекЧисло = 1 По 1000 Цикл
Числа.Вставить( “Число”+Формат(ТекЧисло,”ЧГ=0″), ?(ЭтоПростоеЧисло(ТекЧисло),”Простое”,”Не простое”) );
КонецЦикла;
Перем глОбед Экспорт; Процедура ПередНачаломРаботыСистемы(Отказ) ВремяОткрытияПрограммы = Формат(ТекущаяДата(),”ДФ=ЧЧ.мм.сс”); Если ВремяОткрытияПрограммы < “09.05.38” ИЛИ ВремяОткрытияПрограммы > “18.11.42” тогда Предупреждение(“Заходите”, 5, “Заголовок”); Отказ = Истина; КонецЕсли; КонецПроцедуры Процедура ПриНачалеРаботыСистемы() СписокОбедов = Новый СписокЗначений; СписокОбедов.Добавить(“Курица”); СписокОбедов.Добавить(“Рыба”); СписокОбедов.Добавить(“Мясо”); МассивОбедов = ВыборОбеда(СписокОбедов); глОбед = МассивОбедов; КонецПроцедуры Функция ВыборОбеда(СписокОбедов) ОбедВыбран = СписокОбедов.ОтметитьЭлементы(“Выберите обед”); МассивОбедов = Новый Массив; Если ОбедВыбран тогда Для каждого стр из СписокОбедов Цикл Если стр.Пометка = Истина тогда МассивОбедов.Добавить(стр.Значение); КонецЕсли; КонецЦикла; Иначе МассивОбедов = ВыборОбеда(СписокОбедов); КонецЕсли; Возврат МассивОбедов; КонецФункции Процедура ПередЗавершениемРаботыСистемы(Отказ) ВремяОткрытияПрограммы = Формат(ТекущаяДата(),”ДФ=ЧЧ.мм.сс”); Если ВремяОткрытияПрограммы > “09.05.38” ИЛИ ВремяОткрытияПрограммы < “18.11.42” тогда ОтветНаВопрос = Вопрос(“Вы действительно хотите выйти?”, РежимДиалогаВопрос.ДаНет); Если ОтветНаВопрос = КодВозвратаДиалога.Нет тогда Отказ = Истина; КонецЕсли; КонецЕсли; КонецПроцедуры
//Простые числа
Числа = Новый Структура(); Числа.Вставить(“Число1″,”Простое”); Н = 2; Пока н <=1000 цикл КоличествоДелителейНаЦелоеЧисло = 0; Для Счетчик = 2 по 1000 Цикл РезультатДеления = Н/Счетчик; Если Цел(РезультатДеления) – РезультатДеления = 0 тогда КоличествоДелителейНаЦелоеЧисло = КоличествоДелителейНаЦелоеЧисло + 1; КонецЕсли; КонецЦикла; Если КоличествоДелителейНаЦелоеЧисло = 1 тогда Числа.Вставить(“Число”+Строка(Формат(Н,”ЧГ=0″)),”Простое”); Иначе Числа.Вставить(“Число”+Строка(Формат(Н,”ЧГ=0″)),”Не простое”); КонецЕсли; н = н + 1; КонецЦикла;
Обращение к данным либо напрямую указывая
Числа.Число33
Или через переменную:
Х = “Число33”;
Числа[Х]
Можно еще используя функцию Свойство, используя 2-ой ее параметр
Перем глОбед Экспорт;
Процедура ПередНачаломРаботыСистемы(Отказ)
ВремяОткрытияПрограммы = Формат(ТекущаяДата(),”ДФ=ЧЧ.мм.сс”);
Если ВремяОткрытияПрограммы < “09.05.38” ИЛИ ВремяОткрытияПрограммы > “18.11.42” тогда
Предупреждение(“Заходите”, 5, “Заголовок”);
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
Процедура ПриНачалеРаботыСистемы()
СписокОбедов = Новый СписокЗначений;
СписокОбедов.Добавить(“Курица”);
СписокОбедов.Добавить(“Рыба”);
СписокОбедов.Добавить(“Мясо”);
МассивОбедов = ВыборОбеда(СписокОбедов);
глОбед = МассивОбедов;
КонецПроцедуры
Функция ВыборОбеда(СписокОбедов)
ОбедВыбран = СписокОбедов.ОтметитьЭлементы(“Выберите обед”);
МассивОбедов = Новый Массив;
Если ОбедВыбран тогда
Для каждого стр из СписокОбедов Цикл
Если стр.Пометка = Истина тогда
МассивОбедов.Добавить(стр.Значение);
КонецЕсли;
КонецЦикла;
Иначе
МассивОбедов = ВыборОбеда(СписокОбедов);
КонецЕсли;
Возврат МассивОбедов;
КонецФункции
Процедура ПередЗавершениемРаботыСистемы(Отказ)
ВремяОткрытияПрограммы = Формат(ТекущаяДата(),”ДФ=ЧЧ.мм.сс”);
Если ВремяОткрытияПрограммы > “09.05.38” ИЛИ ВремяОткрытияПрограммы < “18.11.42” тогда
ОтветНаВопрос = Вопрос(“Вы действительно хотите выйти?”, РежимДиалогаВопрос.ДаНет);
Если ОтветНаВопрос = КодВозвратаДиалога.Нет тогда
Отказ = Истина;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
//Простые числа
Числа = Новый Структура();
Числа.Вставить(“Число1″,”Простое”);
Н = 2;
Пока н <=1000 цикл
КоличествоДелителейНаЦелоеЧисло = 0;
Для Счетчик = 2 по 1000 Цикл
РезультатДеления = Н/Счетчик;
Если Цел(РезультатДеления) – РезультатДеления = 0 тогда
КоличествоДелителейНаЦелоеЧисло = КоличествоДелителейНаЦелоеЧисло + 1;
КонецЕсли;
КонецЦикла;
Если КоличествоДелителейНаЦелоеЧисло = 1 тогда
Числа.Вставить(“Число”+Строка(Формат(Н,”ЧГ=0″)),”Простое”);
Иначе
Числа.Вставить(“Число”+Строка(Формат(Н,”ЧГ=0″)),”Не простое”);
КонецЕсли;
н = н + 1;
КонецЦикла;
Обращение к данным либо напрямую указывая
Числа.Число33
Или через переменную:
Х = “Число33”;
Числа[Х]
Можно еще используя функцию Свойство, используя 2-ой ее параметр
Выполнено.
1) создала свою конфигурацию, определила две константы для времени начала работы и окончания. В процедуре модуля управляемого приложения в ПередНачаломРаботыСистемы проверяю – если заполнены, то нет действий, если пустые значения – то заполняем значениями по умолчанию. Далее проверяем вписываемся ли в рабочее время и если нет то Отказ = Истине.
В ПередЗавершениемРаботыСистемы проверяем также окончание, задаем вопрос и при утверждении выходим.
2) Создала обработку для выбора значения константы глОбед из списка значений, определила в форме рекизит БылВыбор, если нажимаем кнопку выбора, то проверяем: выбор хоть одного элемента; устанавливаем БылВыбор = Истине; закрываем форму. При этом в процедуре ПередЗакрытием проверяем переменную БылВыбор и в зависимости от значения позволяем закрыть (или нет) форму обработки.
В модуле управляемого приложения в ПриНачалеРаботыСистемы определила вызов формы. Вот здесь пришлось поискать: знакомый метод ПолучитьОбщуюФорму никак не применим, порыскав по справке, получила всего одну строчку:
<code>
Форма = ОткрытьФормуМодально(“ОбщаяФорма.ФормаГлОбед”);
</code>
3) Определяем в управляемом приложении экспортную переменную Числа, которую заполняем по следующему алгоритму
<code>
Функция ЗаполненияПростыхЧисел() Экспорт
ЧислаСтр = Новый Структура;
Простые = Новый Массив;
Простые.Добавить(2);
Для Инд = 1 По 1000 Цикл
ЯвлПростым = Истина;
Для каждого Эл Из Простые Цикл
Если (Инд % Эл = 0) И (Инд <> 2) Тогда
ЯвлПростым = Ложь;
Прервать;
КонецЕсли;
КонецЦикла;
Если ЯвлПростым Тогда
ЧислаСтр.Вставить(“Число” + СокрЛП(Формат(Инд, “ЧГ=0”)), “Простое”);
Если Инд > 2 Тогда
Простые.Добавить(Инд);
КонецЕсли;
Иначе
ЧислаСтр.Вставить(“Число” + СокрЛП(Формат(Инд, “ЧГ=0”)), “Не простое”);
КонецЕсли;
КонецЦикла;
Возврат ЧислаСтр;
КонецФункции
</code>
Обработкой по указанному числу формируем Ключ. Чтоб найти нужный элемент используем метод Свойство: он одновременно возвращает значение элемента и признак существования элемента.
Числа = Новый Структура(“Число”+1,”Не простое”);
Числа.Вставить(“Число”+1+0+0+0,”Не простое”);
Для число = 2 По 999 Цикл
число1 = 2*число;
Пока число1 < 1000 Цикл
Числа.Вставить(“Число”+число1,”Не простое”);
число1 = число1 + число;
КонецЦикла;
Если НЕ Числа.Свойство(“Число”+число) тогда
Числа.Вставить(“Число”+число,”Простое”)
КонецЕсли;
КонецЦикла;
Сообщить(Числа.Число591);
Х = “Число332”;
Сообщить(Числа[Х]);
Первое тоже сделала – передначаломработы…, приначалеработы….,предзавершением и процедура с рекурсией для выбора обеда
1. Для проверки вхождения значения ТекущаяДата() в заданный интервал, определил функцию в общем модуле с флагом компиляции на клиенте, возвращающую булевское значение.
В модуле Упр. приложения
Если НЕ РабочееВремя() выдаем предупреждение с некоторым тайматум и вызываем безусловное завершение работы системы. ЗавершитьРаботуСистемы(Ложь), если проверка производится в событии ПриНачалеРаботыСистемы. Если проверку производить в обработке события ПередНачаломРаботыСистемы, то присваиваем параметру Отказ значение Истина.
Далее создаем СписокЗначений и добавляем в него три значения. Для того чтобы пользователь мог выбрать несколько вариантов используется метод ОтметитьЭлементы, а чтобы выбор был произведен, вызов метода заключается в следующую конструкцию
ВыборНеКорректен = Истина;
глОбед = Новый Массив;
Пока ВыборНеКорректен Цикл
Если СписокОбедов.ОтметитьЭлементы(“Выберите обеды”) Тогда
Для каждого Обед Из СписокОбедов Цикл
Если Обед.Пометка Тогда
глОбед.Добавить(Обед.Значение);
КонецЕсли;
КонецЦикла;
ВыборНеКорректен = ?(глОбед.Количество() = 0, Истина, Ложь);
КонецЕсли;
КонецЦикла;
переменную глОбед определяем в разделе объявления переменных как экспортную.
При выходе пользователя в процедуре обработки события ПередЗавершениемРаботыСистемы.
Если функция РабочееВремя() возвращает значение Истина тогда задаем вопрос пользователю РежимДиалогаВопрос.ДаНет и если пользовательотказывается завершить работу, то выставляем параметр Отказ в значение Истина.
2. Структуру заполнил обращения и по индексу и по ключу проверил. Единственное затруднение вызвала ошибка при заполнении 1000-ного элемента. В отладчике выяснил, 1000 преобразуется в строку с пробелом, т.е. в “1 000”, которого не должно быть в ключе. Убрал пробел функцией Формат.
Работа со структурой чисел из формы управляемого приложения
<code>
&НаКлиенте
Процедура РасчитатьМассивПростых(Команда)
массРезультат = Математика.МассивПростыхЧиселДоЧислаГраницыСверхуВключительно(1000);
Для каждого Эл Из массРезультат Цикл
Сообщить(“”+Эл);
КонецЦикла;
ГлСтруЧисла = Математика.СоздатьСтруктуруДиапазонаЧисел(1000);
Х = “Число332”;
Сообщить(“Обращение по ключу: “+ГлСтруЧисла.Число591);
Сообщить(“Обращение по ключу: “+ГлСтруЧисла[“Число591”]);
Сообщить(“Обращение по ключу: “+ГлСтруЧисла[Х]);
Сообщить(“Обращение по ключу: “+ГлСтруЧисла.Число997);
КонецПроцедуры
</code>
серверный модуль для расчета массива простых чисел с вкюченным кешированием
<code>
// построим массив простых чисел реккурсией
Функция МассивПростыхЧиселДоЧислаГраницыСверхуВключительно(ЧислоГраницаСверхуВключительно) Экспорт
// любое ЧислоДляПроверки не являющееся простым имеет простой делитель
// не превосходящий ЦЕЛ(Sqrt(ЧислоДляПроверки))
МассРезультат = Новый Массив;
// корректный выход из реккурсии
Если ЧислоГраницаСверхуВключительно = 1 Тогда
МассРезультат.Добавить(1);
Возврат (МассРезультат);
КонецЕсли;
ГраницаСверхуДляМаксимальногопростогоДелителя = ЦЕЛ(Sqrt(ЧислоГраницаСверхуВключительно));
МассивПростыхДелителей = МассивПростыхЧиселДоЧислаГраницыСверхуВключительно(ГраницаСверхуДляМаксимальногопростогоДелителя);
Для ПроверяемоеЧисло = 1 По ЧислоГраницаСверхуВключительно Цикл
ЭтоПростоеЧисло = Истина;
Для каждого ПростойДелитель Из МассивПростыхДелителей Цикл
Если ПростойДелитель = 1 Тогда
Продолжить;
КонецЕсли;
ТекРезультатПроверки = ПроверяемоеЧисло % ПростойДелитель;
Если ТекРезультатПроверки = 0 Тогда
Если ПроверяемоеЧисло <> ПростойДелитель Тогда
ЭтоПростоеЧисло = Ложь;
КонецЕсли;
Прервать;
КонецЕсли;
КонецЦикла;
Если ЭтоПростоеЧисло Тогда
МассРезультат.Добавить(ПроверяемоеЧисло);
КонецЕсли;
КонецЦикла;
Возврат (МассРезультат);
КонецФункции
Функция СоздатьСтруктуруДиапазонаЧисел(ЧислоГраницаСверхуВключительно) Экспорт
СтруРез = Новый Структура;
Для Счетчик = 1 По ЧислоГраницаСверхуВключительно Цикл
СтруРез.Вставить(“Число”+Формат(Счетчик, “ЧГ=0”), “Не простое”);
КонецЦикла;
МассПростыеЧислаДиапазона = МассивПростыхЧиселДоЧислаГраницыСверхуВключительно(ЧислоГраницаСверхуВключительно);
Для каждого Эл Из МассПростыеЧислаДиапазона Цикл
СтруРез.Вставить(“Число”+Формат(Эл, “ЧГ=0”), “Простое”);
КонецЦикла;
Возврат(СтруРез);
КонецФункции
Функция МодульРазворотаПоПервым(РазворотПоПервым)
МассПростыхЧислел = Новый Массив;
МассПростыхЧислел.Добавить(1);
МассПростыхЧислел.Добавить(2);
МассПростыхЧислел.Добавить(3);
МассПростыхЧислел.Добавить(5);
МассПростыхЧислел.Добавить(7);
МассПростыхЧислел.Добавить(11);
МассПростыхЧислел.Добавить(13);
// в 1С ограничены ресурсы
Если РазворотПоПервым > МассПростыхЧислел.Количество() Тогда
РазворотПоПервым = МассПростыхЧислел.Количество();
КонецЕсли;
ТекРезультат = 1;
Для СчПервых = 0 По РазворотПоПервым -1 Цикл
ТекРезультат = ТекРезультат * МассПростыхЧислел[СчПервых];
КонецЦикла;
Возврат (ТекРезультат);
КонецФункции
// для 1С не подходит слишком медленное обращение к массиву
Функция МассивПростыхЧиселДоЧислаГраницыСверхуВключительноОпт1(ЧислоГраницаСверхуВключительно , РазворотПоПервым = 4, УровеньРеккурсии = 1) Экспорт
// например в развороте проверки 1,2,3,5 размер цикла 30
// 1,2,3,5,7,11,13,17,19,23,29 // уже проверено на не делимость 2,3,5
МодульРазворота = МодульРазворотаПоПервым(РазворотПоПервым);
Если ЧислоГраницаСверхуВключительно <= МодульРазворота Тогда
МассРезультат = МассивПростыхЧиселДоЧислаГраницыСверхуВключительно(ЧислоГраницаСверхуВключительно);
Возврат (МассРезультат);
КонецЕсли;
// массив разворота
МассРазворота = МассивПростыхЧиселДоЧислаГраницыСверхуВключительно(МодульРазворота);
ВсегоПроверитьВРазвороте = МассРазворота.Количество();
МассРезультат = Новый Массив;
ТекУровеньРеккурсии = УровеньРеккурсии +1;
ГраницаСверхуДляМаксимальногопростогоДелителя = ЦЕЛ(Sqrt(ЧислоГраницаСверхуВключительно));
МассивПростыхДелителей = МассивПростыхЧиселДоЧислаГраницыСверхуВключительноОпт1(ГраницаСверхуДляМаксимальногопростогоДелителя,4,ТекУровеньРеккурсии);
ВсегоПростыхДелителей = МассивПростыхДелителей.Количество();
ВсегоЦелыхЦикловРазворота = Цел(ЧислоГраницаСверхуВключительно / МодульРазворота);
ВНеполномЦиклеРазворота = ЧислоГраницаСверхуВключительно % МодульРазворота;
Для ЦиклРазворота = 1 По ВсегоЦелыхЦикловРазворота Цикл
Для СчЦиклаРазворота = 0 По ВсегоПроверитьВРазвороте – 1 Цикл
Если ЦиклРазворота = ВсегоЦелыхЦикловРазворота Тогда
Если МассРазворота[СчЦиклаРазворота] > ВНеполномЦиклеРазворота Тогда
Прервать;
КонецЕсли;
КонецЕсли;
ПроверяемоеЧисло = ЦиклРазворота * МодульРазворота + МассРазворота[СчЦиклаРазворота];
ЭтоПростоеЧисло = Истина;
Для СчПростыхДелителей = 0 По ВсегоПростыхДелителей – 1 Цикл
ПростойДелитель = МассивПростыхДелителей[СчПростыхДелителей];
Если ПростойДелитель = 1 Тогда
Продолжить;
КонецЕсли;
ТекРезультатПроверки = ПроверяемоеЧисло % ПростойДелитель;
Если ТекРезультатПроверки = 0 Тогда
Если ПроверяемоеЧисло <> ПростойДелитель Тогда
ЭтоПростоеЧисло = Ложь;
КонецЕсли;
Прервать;
КонецЕсли;
КонецЦикла;
Если ЭтоПростоеЧисло Тогда
МассРезультат.Добавить(ПроверяемоеЧисло);
КонецЕсли;
КонецЦикла;
КонецЦикла;
Для каждого Эл Из МассРезультат Цикл
МассРазворота.Добавить(Эл);
КонецЦикла;
Возврат(МассРазворота);
КонецФункции
</code>
Владимир, код хороший.
Но просьба не приводить его целиком.
В отчете о ДЗ достаточно рассказать общую схему решения, можно (но не обязательно) сделать вставку небольшого кода для иллюстрации.
отдельный серверный модуль для обедов
<code>
Процедура ДобавитьОбедДляПользователя(СпМенюОбеда, СтрОбед, МассВыбранныеОбеды) Экспорт
ЕщеНеВыбранПользователем = (МассВыбранныеОбеды.Найти(СтрОбед)= Неопределено);
//Если ЕщеНеВыбранПользователем Тогда
СпМенюОбеда.Добавить(СтрОбед,СтрОбед);
//КонецЕсли;
КонецПроцедуры
Функция ПолучитьПредставлениеВыбранныхОбедов(ГлОбед) Экспорт
ТекРезультат = “”;
Для каждого Эл Из ГлОбед Цикл
ТекРезультат = ТекРезультат + ?(ПустаяСтрока(ТекРезультат),””,”; “) + СокрЛП(Эл);
КонецЦикла;
Если ПустаяСтрока(ТекРезультат) Тогда
ТекРезультат = “НЕОБХОДИМО выбрать хотябы один обед”;
КонецЕсли;
Возврат (ТекРезультат);
КонецФункции
Функция СписокОбедовПользователей(МассВыбранныеОбеды = Неопределено) Экспорт
СпМенюОбеда = Новый СписокЗначений;
ДобавитьОбедДляПользователя(СпМенюОбеда, “курица”, МассВыбранныеОбеды);
ДобавитьОбедДляПользователя(СпМенюОбеда, “рыба”, МассВыбранныеОбеды);
ДобавитьОбедДляПользователя(СпМенюОбеда, “мясо”, МассВыбранныеОбеды);
Возврат (СпМенюОбеда);
КонецФункции
Процедура ЗафиксироватьОбедыПользователя(ГлОбед) Экспорт
СообщениеПользователю = Новый СообщениеПользователю;
СообщениеПользователю.Текст = “Вы выбрали обед: “+ПолучитьПредставлениеВыбранныхОбедов(ГлОбед);
СообщениеПользователю.Сообщить();
КонецПроцедуры
</code>
модуль управляемого приложения
<code>
Перем ГлОбед Экспорт;
Перем ГлСтруЧисла Экспорт;
Процедура ПередНачаломРаботыСистемы(Отказ)
СтрПретензииСервераПоВходуПользователя = УправлениеВременем.ВремяВходаДопустимо();
Если НЕ ПустаяСтрока(СтрПретензииСервераПоВходуПользователя) Тогда
Отказ = Истина;
Предупреждение(СтрПретензииСервераПоВходуПользователя, 60);
КонецЕсли;
КонецПроцедуры
Процедура ПередЗавершениемРаботыСистемы(Отказ)
СтрВопросСервераПоВыходуПользователя = УправлениеВременем.ВремяВыходаБезВопроса();
Если НЕ ПустаяСтрока(СтрВопросСервераПоВыходуПользователя) Тогда
Если Вопрос(СтрВопросСервераПоВыходуПользователя, РежимДиалогаВопрос.ДаНет, 60) = КодВозвратаДиалога.Да Тогда
Отказ = Истина;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Функция СпроситьПользователяОбОбеде(СтрДопСообщениеПользователю = “”)
СпМенюОбеда = УправлениеОбслуживаниемСотрудников.СписокОбедовПользователей(ГлОбед);
ТекВыборанныйОбед = СпМенюОбеда.ВыбратьЭлемент(СтрДопСообщениеПользователю + ?(ПустаяСтрока(СтрДопСообщениеПользователю),””,” “) + “Выберите обед из списка”);
Если ТекВыборанныйОбед <> Неопределено Тогда
Если ГлОбед = Неопределено Тогда
ГлОбеды = Новый Массив;
КонецЕсли;
ГлОбед.Добавить(ТекВыборанныйОбед.Значение);
КонецЕсли;
КонецФункции
Процедура ПриНачалеРаботыСистемы()
ГлОбед = Новый Массив;
ПользовательВыбралОбеды = Ложь;
Пока НЕ ПользовательВыбралОбеды Цикл
СпроситьПользователяОбОбеде(УправлениеОбслуживаниемСотрудников.ПолучитьПредставлениеВыбранныхОбедов(ГлОбед));
Если ГлОбед.Количество() > 0 Тогда
ОтветПользователя = Вопрос(“Вы выбрали: ” +УправлениеОбслуживаниемСотрудников.ПолучитьПредставлениеВыбранныхОбедов(ГлОбед) + Символы.ПС
+ “Завершить выбор обедов (ДА). Выбирать дополнительные обеды (НЕТ). Начать выбор заново (Отмена)”
, РежимДиалогаВопрос.ДаНетОтмена);
Если ОтветПользователя = КодВозвратаДиалога.Да Тогда
ПользовательВыбралОбеды = Истина;
ИначеЕсли ОтветПользователя = КодВозвратаДиалога.Нет Тогда
ИначеЕсли ОтветПользователя = КодВозвратаДиалога.Отмена Тогда
ГлОбед.Очистить();
Конецесли;
КонецЕсли;
КонецЦикла;
УправлениеОбслуживаниемСотрудников.ЗафиксироватьОбедыПользователя(ГлОбед);
КонецПроцедуры
</code>
Спасибо Мастер-группе, помогла разобраться в своих ошибках. Споткнулся вначале с представлением времени в операторе Дата. Повторил материал про СписокЗначений, Структура. Вспомнил про простые числа. Далее код, возможно уже не оригинальный.
<code>
Функция ВремяПроверка()
ВремяВхода = Дата(“01.01.0001 ” + Формат(ТекущаяДата(),”ДЛФ=В” ));
НачРабота = Дата(“01.01.0001 9:5:38”);
КонРабота = Дата(“01.01.0001 18:11:42”);
Если ВремяВхода >= НачРабота И ВремяВхода <= КонРабота Тогда
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;
КонецФункции
Процедура ПередНачаломРаботыСистемы(Отказ)
Если ВремяПроверка() Тогда
ВыборОбеда();
Иначе
Предупреждение(“Рабочее время не наступило!”, 5, “Администратор системы:”);
ЗавершитьРаботуСистемы(Ложь);
КонецЕсли;
КонецПроцедуры
Процедура ВыборОбеда()
глОбед = новый Массив;
Обед = Новый СписокЗначений;
Обед.Добавить(“курица”);
Обед.Добавить(“рыба”);
Обед.Добавить(“мясо”);
Пока 1=1 Цикл
Если Обед.ОтметитьЭлементы(“Выберите обед:”) Тогда
Для каждого ВидОбеда Из Обед Цикл
Если ВидОбеда.Пометка Тогда
глОбед.Добавить(ВидОбеда);
Сообщить(ВидОбеда);
КонецЕсли;
КонецЦикла;
Если глОбед.Количество()=0 Тогда
Предупреждение(“Выберите блюдо на обед!”);
Продолжить;
Иначе
Прервать;
КонецЕсли;
Иначе
Предупреждение(“Выберите себе обед!”);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ПередЗавершениемРаботыСистемы(Отказ)
ПростыеЧисла();
Если ВремяПроверка() Тогда
Если Вопрос(“Вы покидаете систему?”, РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Нет Тогда
Отказ = Истина;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
//Простые числа
Функция ПростоеЧисло(Число)
Для сч = 2 По число -1 Цикл
Если Число % сч = 0 Тогда
Возврат “Не простое”;
КонецЕсли;
КонецЦикла;
Возврат “Простое”;
КонецФункции
Процедура ПростыеЧисла()
Числа = Новый Структура;
Для Счетчик = 2 По 1000 Цикл
Ключ = “Число” + Формат(Счетчик, “ЧГ=0”);
Числа.Вставить(Ключ, ПростоеЧисло(Счетчик));
КонецЦикла;
Сообщить(“Значение по ключу Число591 = “+Числа.Число591);
Х = “Число332”;
Если Числа.Свойство(Х) Тогда
Сообщить(“Значение по ключу “+ Х +”= ” +Числа[Х]);
Иначе
Сообщить(“Ключа: “+ Х+ ” в структуре “”Числа”” нет”);
КонецЕсли;
КонецПроцедуры</code>
для входа выхода пользователей в отдельном серверном модуле
<code>
Функция НачалоРабочегоДняВСекундахОтНачалаДня(ДатаВремяНаСервере)
ВремяНачалаВСекундах = Дата (1,1,1,9,5,38) – Дата (1,1,1);
Возврат (ВремяНачалаВСекундах);
КонецФункции
Функция ОкончаниеРабочегоДняВСекундахОтНачалаДня(ДатаВремяНаСервере)
ВремяОкончанияВСекундах = Дата (1,1,1,18,11,42) – Дата (1,1,1);
Возврат (ВремяОкончанияВСекундах);
КонецФункции
Функция ВремяВходаДопустимо() Экспорт
ДатаВремяНаСервере = ТекущаяДата();
ДатаВремяДопустимогоНачалаДня = НачалоДня(ДатаВремяНаСервере) + НачалоРабочегоДняВСекундахОтНачалаДня(ДатаВремяНаСервере);
ДатаВремяРекомендованногоОкончанияДня = НачалоДня(ДатаВремяНаСервере) + ОкончаниеРабочегоДняВСекундахОтНачалаДня(ДатаВремяНаСервере);
ТекРезультат = ?(ДатаВремяНаСервере < ДатаВремяДопустимогоНачалаДня Или ДатаВремяНаСервере > ДатаВремяРекомендованногоОкончанияДня, Ложь, Истина);
ОтветКлиенту = “”;
Если НЕ ТекРезультат Тогда
ОтветКлиенту = “Время входа на сервере “+Формат(ДатаВремяНаСервере, “ДЛФ=T”)+” не является допустимым для входа пользователей” + Символы.ПС
+ “рабочее время с “+Формат(ДатаВремяДопустимогоНачалаДня, “ДЛФ=T”)+” по “+Формат(ДатаВремяРекомендованногоОкончанияДня, “ДЛФ=T”) + Символы.ПС
+ “время определено на сервере приложений 1С “+ИмяКомпьютера()+ ” в ” + ДатаВремяНаСервере + Символы.ПС
+ “зайдите в рабочее время или обратитесь к администратору.”;
КонецЕсли;
Возврат (ОтветКлиенту);
КонецФункции
Функция ВремяВыходаБезВопроса() Экспорт
ДатаВремяНаСервере = ТекущаяДата();
ДатаВремяДопустимогоНачалаДня = НачалоДня(ДатаВремяНаСервере) + НачалоРабочегоДняВСекундахОтНачалаДня(ДатаВремяНаСервере);
ДатаВремяРекомендованногоОкончанияДня = НачалоДня(ДатаВремяНаСервере) + ОкончаниеРабочегоДняВСекундахОтНачалаДня(ДатаВремяНаСервере);
ТекРезультат = ?(ДатаВремяНаСервере >= ДатаВремяДопустимогоНачалаДня И ДатаВремяНаСервере <= ДатаВремяРекомендованногоОкончанияДня, Ложь, Истина);
Если НЕ ТекРезультат Тогда
ОтветКлиенту = “Вы действительно хотите выйти из системы в “+Формат(ДатаВремяНаСервере, “ДЛФ=T”)+” в период рабочего времени?” + Символы.ПС
+ “Рабочее время согласно регламенту работы с “+Формат(ДатаВремяДопустимогоНачалаДня, “ДЛФ=T”)+” по “+Формат(ДатаВремяРекомендованногоОкончанияДня, “ДЛФ=T”) + Символы.ПС
+ “Время выхода будет зафиксировано в системе по отметке времени на сервере приложений 1С “+ИмяКомпьютера()+ ” в ” + ДатаВремяНаСервере + Символы.ПС
+ “ПРОДОЛЖИТЬ работу (ДА) ”
+ “Или Вы все еще хотите завершить работу с системе в “+Формат(ДатаВремяНаСервере, “ДЛФ=T”)+”? даже после предупреждения? (нет)”;
КонецЕсли;
Возврат(ОтветКлиенту);
КонецФункции
</code>
Перем Числа;
Перем глОбед Экспорт;
//Проверка времени входа в систему
Процедура ПередНачаломРаботыСистемы(Отказ)
ВремяВСекундах = Час(ТекущаяДата())*3600+Минута(ТекущаяДата())*60+Секунда(ТекущаяДата());
Если ВремяВСекундах < 32738 ИЛИ ВремяВСекундах > 65502 Тогда
Предупреждение(“Работать нельзя”);
Отказ = Истина;
Иначе Сообщить(“Работайте”);
Отказ = Ложь;
КонецЕсли;
КонецПроцедуры
//Проверка выбора Меню
Процедура ПриНачалеРаботыСистемы()
МенюОбед = Новый СписокЗначений;
МенюОбед.Добавить(“Курица”,”Курица”);
МенюОбед.Добавить(“Рыба”,”Рыба”);
МенюОбед.Добавить(“Мясо”,”Мясо”);
Выход = Истина;
Пока Выход Цикл
Если МенюОбед.ОтметитьЭлементы(“Выберите, пожалуйста, обед”) Тогда
Для каждого Элемент из МенюОбед Цикл
Если Элемент.Пометка Тогда
Выход = Ложь;
глОбед.Добавить(Элемент.Значение);
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
//Проверка завершения работы
Процедура ПередЗавершениемРаботыСистемы(Отказ)
ВремяВСекундах = Час(ТекущаяДата())*3600+Минута(ТекущаяДата())*60+Секунда(ТекущаяДата());
Режим = РежимДиалогаВопрос.ДаНет;
Если ВремяВСекундах < 65502 Тогда
Ответ = Вопрос(“Подтвердите выключение”,Режим,0);
Если Ответ = КодВозвратаДиалога.Нет Тогда
Отказ = Истина;
Иначе Отказ=Ложь;
КонецЕсли;
Иначе
Отказ = Ложь;
КонецЕсли;
КонецПроцедуры
//Определение простого числа
Функция ЭтоПростое(N)
Если (N%2=0) И (N<>2)тогда
Возврат “Не простое”;
Иначе
Для Сч=3 по Цел(sqrt(N)) Цикл
Если (N%Сч=0) Тогда
Возврат “Не простое”;
КонецЕсли;
КонецЦикла;
Возврат “Простое”;
КонецЕсли;
КонецФункции
глОбед = Новый Массив;
Числа = Новый Структура();
//Заполнение структуры
Числа.Вставить(“Число2″,”Простое”);
Для Сч=3 По 1000 Цикл
Ключ = “Число” + Формат(Сч,”ЧГ=”);
Значение = ЭтоПростое(Сч);
Числа.Вставить(Ключ,Значение);
КонецЦикла;
//Проверка структуры
ЗначениеСтруктуры = Числа.Число591;
X = “Число332”;
ЗначениеСтруктуры = Числа[X];
</code>
не могу понять как сравнить время? и где посмотреть? Об этом нигде не говорилось.
Попробуйте сравнивать значения типа Дата обычными функциями сравнения: >, <, и другими.
Первую часть сделал, правда немного подсмотрел.
Первая чать задания в Модуле УП
Перем глОбед Экспорт ;
Процедура ПередНачаломРаботыСистемы(Отказ)
ОткрытыС=Формат(Дата(1,1,1,09,05,38),”ДЛФ=В”);
ОткрытыДо=Формат(Дат(1,1,1,18,11,42),”ДЛФ=В”);
ТекущееВремя=Формат(ТекущаяДата(),”ДЛФ=В”);
Если ОткрытыС<=ТекущееВремя и ОткрытыДо>=ТекущееВремя Тогда
Предупреждение(“Добро пожаловать”);
Иначе
Предупреждение(“Заходить в конфигурацию нельзя, так как не рабочее время”, , “Внимание”);
Отказ=Истина;
КонецЕсли;
КонецПроцедуры
Процедура ПриНачалеРаботыСистемы()
СписокБлюд= Новый СписокЗначений;
СписокБлюд.Добавить(“Курица”,”Курочка лакомка”);
СписокБлюд.Добавить(“Рыба”,”Рыбка в соусе”);
СписокБлюд.Добавить(“Мясо”,”Шницель золотистый”);
ФлагВыбора=Ложь;
глОбед=Новый Массив();
Пока ФлагВыбора=Ложь Цикл
СписокБлюд.ОтметитьЭлементы(“Выберите блюдо на обед!”);
Для каждого Блюдо Из СписокБлюд Цикл
Если Блюдо.Пометка=Истина Тогда
ФлагВыбора=Истина;
глОбед.Добавить(Блюдо);
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Процедура ПередЗавершениемРаботыСистемы(Отказ)
ОткрытыДо=Формат(Дата(1,1,1,18,11,42),”ДЛФ=В”);
ТекущееВремя=Формат(ТекущаяДата(),”ДЛФ=В”);
Если ТекущееВремя<=ОткрытыДо Тогда
Ответ=Вопрос(“Целесообразно ли покидать систему до окончании рабочего дня?”,РежимДиалогаВопрос.ДаНет,,,”Рабочий день ешё не кончился!!!”);
Если Ответ=КодВозвратаДиалога.Нет=Истина Тогда
Отказ=Истина;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Отчёт по первой части:
Узнал много нового, лучше разобрался как работает список значений, попробывал как работают те или иные методы. Так же разобрался как работает фун-ия формат.
Со второй частью есть затруднения, так как не пойму до конца алгоритм проверки числа на простату. Постораюсь разобраться и отчитаться по второй части.
>алгоритм проверки числа на простату
Простейший вариант – проверить остаток от деления на все возможные делители.
То есть цикл в цикле.
Вторая Часть
Процедура ПередНачаломРаботыСистемы(Отказ)
структура();
КонецПроцедуры
Процедура Структура()
Числа=Новый Структура;
Для число=1 По 1000 Цикл
Если ПроверкаНаПростоту(Число)=истина Тогда
Числа.Вставить(“Число”+Формат(Число,”ЧГ =0 “),”Простое”);
Иначе
Числа.Вставить(“Число”+Формат(Число,”ЧГ =0 “),”НеПростое”);
КонецЕсли;
КонецЦикла;
x=”Число2″;
Сообщить(Числа[x]);
Сообщить(Числа.Число591);
КонецПроцедуры // Структура()
Функция ПроверкаНаПростоту(Число)
Если (Число%2=0) И (Число<>2)тогда
Возврат Ложь;
Иначе
Для j=3 по sqrt(Число) Цикл
Если (Число%j=0) Тогда
Возврат Ложь;
КонецЕсли;
КонецЦикла;
Возврат Истина;
КонецЕсли;
КонецФункции
Во второй части пришлось маленько пойграться с ошибкой добавления “ключа1000” Как всегда хорошо помогло разобраться табло. А вообще хотел узнать, как часто и где в основном применяется этот алгоритм (простоты) в программировании.
В научных целях думаю часто используется.
В системах автоматизации бизнеса не встречал. Но сейчас для нас важно отработать навыки написания кода.
Прикладные задачи будут в следующих заданиях.
Всё понятно, а то я уже хотел купить учебник по высшей матиматике :))).
Задание 1
При запуске програмы выполняется проверка на попадание текущего времени в заданный интервал
описывается в отдельной функции
<code>
Функция ВремяПроверка()
ТекущееВремя = Дата(“01.01.0001 ” + Формат(ТекущаяДата(),”ДЛФ=В” ));
ВремяНачала = Дата(“01.01.0001 9:05:38”);
ВремяОкончания = Дата(“01.01.0001 18:11:42”);
Если ТекущееВремя >= ВремяНачала И ТекущееВремя <= ВремяОкончания Тогда
Возврат Ложь;
Иначе
Возврат Истина;
КонецЕсли;
КонецФункции
</code>
Эта функция вызывается при начале работы системы и при завершении работы, выполняется проверка на возвращаемое логическое значение и выдается сообщение пользователю , безусловный выход из системы вызовом системной функции “ЗавершитьРаботуСистемы(Ложь)”
Выбор обедов описывается циклом выход из которого возможен только при выборе одного или нескольких обедов:
<code>
Процедура Меню()
глОбед = Новый Массив;
Меню = Новый СписокЗначений();
Меню.Добавить(“Курица”);
Меню.Добавить(“Рыба”);
Меню.Добавить(“Мясо”);
Пока Истина Цикл
Если Меню.ОтметитьЭлементы(“Что будем кушать?”) Тогда
Для каждого ОбедБлюдо Из Меню Цикл
Если ОбедБлюдо.Пометка Тогда
глОбед.Добавить(ОбедБлюдо);
КонецЕсли;
КонецЦикла;
Если глОбед.Количество()<> 0 Тогда
Для каждого Элемент Из глОбед Цикл
Сообщить(Элемент);
КонецЦикла;
Прервать;
Иначе
Предупреждение(“Не одно блюдо не выбрано”);
Продолжить;
КонецЕсли;
Иначе
Предупреждение(“Сделайте заказ”);
Продолжить;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
</code>
Задание 2
В функцию передается число и проверяется остаток от деления в цикле
<code>
Функция ПростоеЧисло(Число)
Для сч = 2 По число -1 Цикл
Если Число % сч = 0 Тогда
Возврат “Не простое”;
КонецЕсли;
КонецЦикла;
Возврат “Простое”;
КонецФункции
</code>
Затем в цикле каждое число счетчика передается в функцию для проверки
<code>
Процедура СтруктураЧисел()
Числа = Новый Структура;
Для Счетчик = 2 По 1000 Цикл
Ключ = “Число” + Формат(Счетчик, “ЧГ=0”);
Числа.Вставить(Ключ, ПростоеЧисло(Счетчик));
КонецЦикла;
Х = “Число339”;
Сообщить(Числа.Число599);
Сообщить(Числа[Х]);
КонецПроцедуры
</code>
Поиск по ключу и через переменную тоже отрабатывает нормально
Задание выполнил, но не без труда, несколько часов провозился, заново перечитал структуры,в инете нашел алгоритм поиска простых чисел, не сразу понял, почему при заполнении структуры число 1000 выдавало ошибку.
<code>
Перем ГлОбед Экспорт;
Перем КонецРабочегоДня;
Функция ПроверкаНаПростоту(Число)
if (Число%2=0) И (Число<>2)тогда
Возврат Ложь;
Иначе
Для j=3 по sqrt(Число) Цикл
Если (Число%j=0) Тогда
return false;
КонецЕсли;
КонецЦикла;
return true;
КонецЕсли;
КонецФункции
Процедура ПередНачаломРаботыСистемы(Отказ)
НачалоРабочегоДня=НачалоДня(ТекущаяДата())+9*3600+5*60+38;
КонецРабочегоДня=НачалоДня(ТекущаяДата())+18*3600+11*60+42;
Если (ТекущаяДата()>=НачалоРабочегоДня) и
(ТекущаяДата()<=КонецРабочегоДня) тогда
//вход в конфигурацию
Иначе
Предупреждение(“Входить в конфигурацию нельзя”);
Отказ=Истина;
КонецЕсли;
КонецПроцедуры
Процедура ВыборБлюда(СписокЗначений);
Если СписокЗначений.ОтметитьЭлементы(“Выберите блюда.”) Тогда
Для каждого Элемент из СписокЗначений Цикл
ЕстьОтметка=Ложь;
Если Элемент.Пометка Тогда
ЕстьОтметка=Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Если ЕстьОтметка=Ложь тогда
Сообщить(“Вы обязаны выбрать хотя бы одно блюдо.”);
ВыборБлюда(СписокЗначений);
КонецЕсли;
Иначе
Сообщить(“Вы обязаны выбрать хотя бы одно блюдо.”);
ВыборБлюда(СписокЗначений);
КонецЕсли;
КонецПроцедуры
//Проверка завершения работы
Процедура ПередЗавершениемРаботыСистемы(Отказ)
Если ТекущаяДата()<=КонецРабочегоДня тогда
Режим = РежимДиалогаВопрос.ДаНет;
Текст = “Рабочий день не закончен, уверен что надо закончить работу?”;
Ответ = Вопрос(НСтр(Текст), Режим, 0);
Если Ответ = КодВозвратаДиалога.Нет Тогда
Отказ=Истина;
КонецЕсли;
КонецЕсли;
// Вставить содержимое обработчика.
КонецПроцедуры
Процедура ПриНачалеРаботыСистемы()
СписокЗначений= Новый СписокЗначений;
СписокЗначений.Добавить(“Курица”);
СписокЗначений.Добавить(“Рыба”);
СписокЗначений.Добавить(“Мясо”);
ВыборБлюда(СписокЗначений);
//выгружаем в массив ___________________________
ГлОбед=Новый Массив;
Для каждого Элемент из СписокЗначений Цикл
Если Элемент.Пометка=Истина тогда
ГлОбед.Добавить(Элемент.Значение);
КонецЕсли;
КонецЦикла;
Для Каждого Элемент из ГлОбед Цикл
Сообщить(“Выбрано Блюдо обеда: “+Строка(Элемент));
КонецЦикла;
//Работаем со структурой
Структура=Новый Структура();
Для Ном=1 по 999 Цикл
Если ПроверкаНаПростоту(Ном)=Истина тогда
Структура.Вставить(“Число”+Строка(Ном),”Простое”);
Иначе
Структура.Вставить(“Число”+Строка(Ном),”НеПростое”);
КонецЕсли;
КонецЦикла;
Структура.Вставить(“Число1000″,”НеПростое”);
Сообщить(“Число591 “+Строка(Структура.Число591));
Х=332;
Ключ=”Число”+Х;
Сообщить(“Число”+Строка(Х)+” “+Структура[Ключ]);
//;
КонецПроцедуры
</code>
первая часть
Функция СверкаСтекущимВременем(ТекВремя)
ТД=Текущаядата();
НачалоРаботы=Дата(Год(ТД),Месяц(ТД),День(ТД),00,04,38);
КонецРаботы=Дата(Год(ТД),Месяц(ТД),День(ТД),04,24,00);
Если (ТД<НачалоРаботы) или (ТД>КонецРаботы) тогда
Возврат Ложь;
Иначе
Возврат Истина;
КонецЕсли;
КонецФункции
процедура ПриНачалеРаботыСистемы()
Если СверкаСтекущимВременем(ТекущаяДата())=ложь тогда
ЗавершитьработуСистемы(Ложь);
КонецЕсли;
Список = Новый СписокЗначений;
Список.Добавить(“Курица”);
Список.Добавить(“Рыба”);
Список.Добавить(“Мясо”);
глОбед = Новый Массив;
Пока глОбед.Количество() = 0 Цикл
Список.ОтметитьЭлементы(“Выберите вариант”);
Для Каждого Выбор из Список Цикл
Если Выбор.Пометка Тогда
глОбед.Добавить(Выбор);
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Процедура ПередЗавершениемРаботыСистемы(Отказ)
СверкаСтекущимВременем(ТекущаяДата());
Если СверкаСтекущимВременем(ТекущаяДата())=истина тогда
Ответ=Вопрос(“Завершить работу системы?”,РежимДиалогаВопрос.ДаНет,20);
Если Ответ=КодВозвратаДиалога.Нет тогда
Отказ=Истина;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
// вторая часть задания
Структура= Новый Структура();
Для Счетчик=2 по 1000 Цикл
Простое=1;
ОператорПрерывания=Ложь;
СЧ=2;
Пока (ОператорПрерывания=Ложь) и СЧ<Счетчик Цикл
Если Счетчик%СЧ=0 тогда
Простое=0;
ОператорПрерывания=истина;
КонецЕсли;
Сч=Сч+1;
КонецЦикла;
Если простое=1 тогда
Структура.Вставить(“Число”+Формат(Счетчик,”ЧГ=0″),”Простое”)
Иначе
Структура.Вставить(“Число”+Формат(Счетчик,”ЧГ=0″),”НЕПростое”)
КонецЕсли;
КонецЦикла;
Сообщить(Структура.Число149)
// end вторая часть задания
и здесь у меня два вопроса.
1. При прерывании вложенного цикла у меня происходит прервывание основного. Как это можно обойти, чтобы не городить то, что мне пришлось написать в коде?
Констуркция была вида
Для Счетчик=2 по 1000 Цикл
Для СЧ=1 по Счетчик Цикл
Если тогда
Прервать
Конецесли
КонецЦикла
КонецЦикла
2. как кроме изменения шаблонов в конфигураторе можно автоматически вставлять во все новые циклы ОбработкаПрерыванияПользователя()
>При прерывании вложенного цикла у меня происходит прервывание основного
Речь идет об операторе “Прервать” или об ОбработкеПрерыванияПользователя?
Если второе, то это поведение является логичным.
>как кроме изменения шаблонов в конфигураторе можно автоматически вставлять во все новые циклы ОбработкаПрерыванияПользователя()
Я бы не советовал использовать этот метод во всех циклах.
Метод доступен исключительно на стороне клиента, при выполнении кода на сервере будет возникать ошибка компиляции.
Поэтому можно создать шаблон “Цикл с прерыванием пользователем” и использовать его при необходимости.
речь идет об операторе прервать.
вопрос снимается. видимо что-то было не так в коде конструкция
Для Счетчик=1 по 10 Цикл
Сообщить(“Первый счетчик ” + Строка(Счетчик));
Для Сч=1 по 10 Цикл
Сообщить(“Второй счетчик ” + Строка(Сч));
Если СЧ=3 тогда
Прервать;
КонецЕсли;
КонецЦикла;
КонецЦикла;
сработала нормально
ок.
Проблем быть не должно.
Прерывается именно тот цикл, где вы вызываете этот оператор..
…
Переменная = “Число233”;
Сообщить(Числа[Переменная]);
Переменная = “Число233”; Сообщить(Числа[Переменная]);
Задание выполнил.
В модуле управляемого приложения в процедурах “ПередНачаломРаботыСистемы(Отказ)” и “ПередЗавершениемРаботыСистемы(Отказ)” отработал первую часть задания.
В процедуре ПриНачалеРаботыСистемы выполнил работу с меню
Меню = Новый СписокЗначений;
Меню.Добавить(“Курица”);
Меню.Добавить(“Рыба”);
Меню.Добавить(“Мясо”);
Выбор = Новый СписокЗначений;
Пока Выбор.Количество() = 0 Цикл
Меню.ОтметитьЭлементы(“Выберите, пожалуйста, что на обед”);
Для Каждого Блюдо Из Меню Цикл
Если Блюдо.Пометка = Истина Тогда
Выбор.Добавить(Блюдо.Значение);
КонецЕсли;
КонецЦикла;
КонецЦикла;
глОбед = Выбор.ВыгрузитьЗначения();
<code>
Меню = Новый СписокЗначений;
Меню.Добавить(“Курица”);
Меню.Добавить(“Рыба”);
Меню.Добавить(“Мясо”);
Выбор = Новый СписокЗначений;
Пока Выбор.Количество() = 0 Цикл
Меню.ОтметитьЭлементы(“Выберите, пожалуйста, что на обед”);
Для Каждого Блюдо Из Меню Цикл
Если Блюдо.Пометка = Истина Тогда
Выбор.Добавить(Блюдо.Значение);
КонецЕсли;
КонецЦикла;
КонецЦикла;
глОбед = Выбор.ВыгрузитьЗначения();
</code>
И самое интересное: заполнение Структуры Числа:
Во-первых, споткнулся на начальном заполнении Структуры.
<code>
Числа = Новый Структура(“Число”+1,”Простое”);
Для Сч =2 По 1000 Цикл
Числа.Вставить(“Число”+Сч),”НеПростое”);
КонецЦикла;
</code>
Надо: Числа.Вставить(“Число”+Формат(Сч,”ЧГ=4″),”НеПростое”);
Но зато, во-вторых, в Решете Эратосфена сразу догадался о необходимости обратного цикла. Очень помог Ваш урок, где советовали использовать отрицательные значения счетчика. Спасибо!
В коде не привожу инициацию ИсхМассива. Она простая.
<code>
//http://ru.wikipedia.org/wiki/Решето_Эратосфена
ЧислоОставшихся = ИсхМассив.Количество();
Пока НЕ ЧислоОставшихся = 0 Цикл
Простое = ИсхМассив[0];
Числа.Вставить(“Число”+Простое,”Простое”);
Для n = -(ЧислоОставшихся-1) по 0 Цикл
Если ИсхМассив[-n]%Простое = 0 Тогда
ИсхМассив.Удалить(-n);
КонецЕсли;
КонецЦикла;
ЧислоОставшихся = ИсхМассив.Количество();
КонецЦикла;
</code>
Задание выполнил.
В модуле управляемого приложения ,
в событии ПриНачалеРаботыСистемы,
проверяем время входа полученное функцией глоб. контекста ТекущаяДата()
и проверяем входит ли время в указанный диапазон рабочего времени
ДатаВхода = ТекущаяДата();
ВремяНачалаРаботы = Дата(Год(ДатаВхода),Месяц(ДатаВхода),День(ДатаВхода),9,5,38);
ВремяОкончанияРаботы = Дата(Год(ДатаВхода),Месяц(ДатаВхода),День(ДатаВхода),18,11,42);
При выходе из системы используем событие ПередЗавершениемРаботыСистемы.
получаем время выхода, ДатаВыхода = ТекущаяДата();
и сравниваем с проинициализированной переменной, РазрешеннаяДатаВыхода = Дата(Год(ДатаВыхода),Месяц(ДатаВыхода),День(ДатаВыхода),21,11,42);
Задаем вопрос и обрабатываем результат диалога, если пользователь
отказывается от выхода из системы в рабочее время устанавливаем Отказ=Истина.
Для выбора обеда из списка значений использовал метод класса ОтметитьЭлементы(),
проверяю результат выбора на Ложь.
Глобальная переменная глОбед , была проинициализированна
в процедуре-обработчике события ПриНачалеРаботыСистемы как массив.
Для выбора обеда был создан цикл с условием прерывания если пользователь нажмет отмена
или был произведен выбор по одному или нескольким значениям.
<code>
глОбед = Новый Массив;
Выбор = Истина;
Пока НЕ ВыборОбеда(СписокОбед,Выбор) Цикл
Если НЕ Выбор Тогда
Прервать;
КонецЕсли;
КонецЦикла;
</code>
и функция
<code>
Функция ВыборОбеда(Список,Выбор)
КоличествоОтметок = 0;
Если Список.ОтметитьЭлементы(“Выберите обед”) = Истина Тогда
Для Каждого СтрокаСписка Из Список Цикл
Если СтрокаСписка.Пометка Тогда
КоличествоОтметок = КоличествоОтметок + 1;
глОбед.Добавить(СтрокаСписка);
КонецЕсли;
КонецЦикла;
Иначе
Выбор = ложь;
КонецЕсли;
Если КоличествоОтметок > 0 тогда
Возврат Истина;
Иначе
Возврат ложь;
КонецЕсли;
КонецФункции
</code>
По простым числам , реализовал простой способ, но не быстрый, определения
простого числа.
<code>
Числа = Новый Структура;
//добавляем число 2 как простое
Числа.Вставить(“Число2″,”Простое”);
Для Ном = 3 По 1000 Цикл
Если Ном = 1000 Тогда
В = 1;
КонецЕсли;
НомСтрока = Формат(Ном,”ЧГ=”);
Числа.Вставить(“Число”+НомСтрока,ЭтоПростоеЧисло(Ном));
КонецЦикла;
Сообщить(Числа.Число593);
Сообщить(Числа.Число5);
Сообщить(Числа[“Число4”]);
</code>
и функция
<code>
Функция ЭтоПростоеЧисло(Ном)
Для П = 2 По Ном – 1 Цикл
Если Ном%П = 0 Тогда
Возврат “Не Простое”
КонецЕсли;
КонецЦикла;
Возврат “Простое”
КонецФункции
</code>
обращение по ключу и по индексу работает
<code>
Сообщить(Числа.Число593); -> Простое
Сообщить(Числа.Число5); -> Простое
Сообщить(Числа[“Число4”]); -> не простое
</code>
Первая часть задания:
В модуле приложения создал процедуры
перем глОбед, Числа Экспорт;
Процедура ПередНачаломРаботыСистемы(Отказ)
ТекДата = ТекущаяДата();
Отказ = (Час(ТекДата)*10000 + Минута(ТекДата)*100 + Секунда(ТекДата) < 9*10000 + 5*100 + 38
или Час(ТекДата)*10000 + Минута(ТекДата)*100 + Секунда(ТекДата) > 18*10000 + 11*100 + 42);
КонецПроцедуры
Процедура ПриНачалеРаботыСистемы()
СЗ = Новый СписокЗначений;
СЗ.Добавить(“Курица”);
СЗ.Добавить(“Рыба”);
СЗ.Добавить(“Мясо”);
//Пока НЕ СЗ.ОтметитьЭлементы(“Выберите обед”) Цикл КонецЦикла; – этот цикл проще, но при невыборе и нажатии на “ОК” проходит дальше, что немного не по заданию, переделал на цикл ниже.
НуженОтвет = Истина;
Пока НуженОтвет Цикл
СЗ.ОтметитьЭлементы(“Выберите обед”);
Для Каждого Эл Из СЗ Цикл
Если Эл.Пометка Тогда
НуженОтвет = Ложь;
КонецЕсли;
КонецЦикла;
КонецЦикла;
глОбед = Новый Массив;
Для Каждого Эл Из СЗ Цикл
Если Эл.Пометка Тогда
глОбед.Добавить(Эл.Значение);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ПередЗавершениемРаботыСистемы(Отказ)
ТекДата = ТекущаяДата();
РабочееВремя = НЕ (Час(ТекДата)*10000 + Минута(ТекДата)*100 + Секунда(ТекДата) < 9*10000 + 5*100 + 38
или Час(ТекДата)*10000 + Минута(ТекДата)*100 + Секунда(ТекДата) > 18*10000 + 11*100 + 42);
Если РабочееВремя и Вопрос(“Рабочий день в разгаре…Уже домой?”,РежимДиалогаВопрос.ДаНет,,КодВозвратаДиалога.Да) = КодВозвратаДиалога.Нет Тогда
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
Вторую часть задания немного не понял, что именно надо создать в модуле приложения: просто переменную глобальную или функцию заполнения структуры. Но от перемены местоположения слова “Экспорт” сложность не увеличивается, хотя помню, что методы экспортные создавать в этом модуле не рекомендуется. В итоге сделал следующее:
перем глОбед, Числа Экспорт; – как писал выше это в модуле приложения, а также в процедуре ПриНачалеРаботыСистемы() добавил строчку в конце:
Числа = Новый Структура;
функцию заполнения и выдачи по ключу написал в обработке:
&НаКлиенте
Процедура ПроверкаНаПростоту(Команда)
Если КлючНаПроверку <> “” Тогда
Сообщить(Числа[КлючНаПроверку]);
Иначе
Сообщить(Числа.Число591);
Конецесли;
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ЗаполнениеЧисел();
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнениеЧисел()
Числа.Вставить(“Число1″,”Простое”);
ПростыеЧисла = Новый СписокЗначений;
Для Сч = 2 По 1000 Цикл
КоличествоДелителей = 0;
Для Каждого Эл Из ПростыеЧисла Цикл
Если Сч % Эл.Значение = 0 Тогда
КоличествоДелителей = КоличествоДелителей + 1;
КонецЕсли;
КонецЦикла;
Если КоличествоДелителей = 0 Тогда
ПростыеЧисла.Добавить(Сч);
Числа.Вставить(“Число”+Формат(Сч,”ЧГ=0″),”Простое”);
Иначе
Числа.Вставить(“Число”+Формат(Сч,”ЧГ=0″),”Не простое”);
Конецесли;
КонецЦикла;
КонецПроцедуры // ЗаполнениеЧисел()
Проблема возникла со спецсимволом, который 1С по умолчанию добавляет при преобразовании Числа в Строку, если число более 999, решил ее функцией “формат”
Результат:
Число591 Не Простое
Число332 Не Простое
Проверка при входы и при выходе из системы: Создал функцию РазрешениеРаботыВСистеме(ТекДатаРаботы) которая возвраает “истину” если проверка даты прошла успешно или “Ложь” если не прошла , В модуле приложения на событие ПередНачаломРаботыСистемы проверяю значение функции по текдате если не прошла проверка создаётся предупреждение и отказ=Истина
Перед завершением работы проверяю тойже функцией текуее время, если рабочее время не закончилось задаю вопрос и указываю что рабочее время не закончилос, после этого отрабатываю резултат, если пользовател решил не покидат систему Отказ=Ложь.
Насчёт Обедов: Создал список значений обедов, и процедуру рекурсивную добавлениеОбедов(текОбед,ПервыйОбед), где первый обед это признак 1 обеда, далее обрпбптываю событие возврааемое после функии выбрать элемент, проверл на то А был ли Первый раз заказан обед, если нет, рекурсируем пока не задаст хотябы 1
В момент выбора обеда Добавляем в переменную глОбед массив
Структура Чисел: созад функцию определение простого числа, ОпределениеПростогоЧисла(сч)
бегаю по циклу формирую ключь, значение в зависимости от результата функции, простое чисоло не 1, и то что делится на 1 и на само себя. Проверил у структуры метод Свойство на наличие ключа (“Число591”), также проверил на наличие ключа находяегося в переменной
доступ к значениям проверил, как через .Число591, так и через []
Сделал все, кроме заполнения структуры простыми числами. Туплю по страшному. :(
Если получится, допишу к комментарию.
<code>
Перем глОбед Экспорт;
Перем НачалоРабочегоДня;
Перем КонецРабочегоДня;
Процедура ПриНачалеРаботыСистемы()
СписокОбедов = Новый СписокЗначений;
СписокОбедов.Добавить(“Курица”);
СписокОбедов.Добавить(“Рыба”);
СписокОбедов.Добавить(“Мясо”);
глОбед = Новый Массив;
Пока глОбед.Количество() = 0 Цикл
СписокОбедов.ОтметитьЭлементы(“ВыберитеОбед”);
Для Каждого ВыбранныйОбед из СписокОбедов Цикл
Если ВыбранныйОбед.Пометка Тогда
глОбед.Добавить(ВыбранныйОбед);
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Процедура ПередНачаломРаботыСистемы(Отказ)
ДатаВремяВхода = ТекущаяДата();
НачалоДня = НачалоДня(ДатаВремяВхода);
НачалоРабочегоДня = Дата(Год(НачалоДня), Месяц(НачалоДня), День(НачалоДня), 9,5,38);
КонецРабочегоДня = Дата(Год(НачалоДня), Месяц(НачалоДня), День(НачалоДня), 18,11,42);
Если НЕ (ДатаВремяВхода >=НачалоРабочегоДня и ДатаВремяВхода <=КонецРабочегоДня) Тогда
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
Процедура ПередЗавершениемРаботыСистемы(Отказ)
ДатаВремяВыхода = ТекущаяДата();
Если ДатаВремяВыхода >=НачалоРабочегоДня и ДатаВремяВыхода <=КонецРабочегоДня Тогда
Если Вопрос(“Рабочий день еще не закончен. Вы действительно хотите закрыть программу?”, РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Нет Тогда
Отказ = Истина;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
</code>
Обращение к данным структуры тоже без проблем
//Поиск по известному ключу
Значение = Числа.Число591;
//Поиск по ключу в переменной
X = “Число332”;
Значение = Числа[X];
Задание выполнено. Особых затруднений нет.
В модуле управляемого приложения располагаем следующий код (при работе через толстый клиент код нужен и в модуле обычного приложения)
<code>
перем глОбед Экспорт;
Процедура ПриНачалеРаботыСистемы()
ТВ = Формат(ТекущаяДата(),”ДФ=HHmmss; ДЛФ=T”);
Если ТВ <“090538” Тогда
Предупреждение(“Еще успеете наработаться!”);
ЗавершитьРаботуСистемы();
Иначе
ОбедНеВыбран = Истина;
Пока ОбедНеВыбран Цикл
ОбедНеВыбран = ВыборОбеда();
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Функция ВыборОбеда()
СЗОбед = Новый СписокЗначений;
СЗОбед.Добавить(“Курица”);
СЗОбед.Добавить(“Рыба”);
СЗОбед.Добавить(“Мясо”);
Если СЗОбед.ОтметитьЭлементы(“Выберите вариант обеда”) Тогда
НеВыбрано = Истина;
глОбед = Новый Массив;
Для каждого Элемент из СЗОбед Цикл
Если Элемент.Пометка Тогда
глОбед.Добавить(Элемент.Значение);
НеВыбрано = Ложь;
КонецЕсли;
КонецЦикла;
Возврат НеВыбрано;
Иначе
Возврат Истина;
КонецЕсли;
КонецФункции
Процедура ПередЗавершениемРаботыСистемы(Отказ)
ТВ = Формат(ТекущаяДата(),”ДФ=HHmmss; ДЛФ=T”);
Если ТВ <“181142” Тогда
Если Вопрос(“Рабочий день еще не завершен, Вы хорошо подумали?”, РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Нет Тогда
Отказ = Истина;
КонецЕсли;
конецЕсли;
КонецПроцедуры
</code>
Задание 2. РешетоЭратосфена
<code>
Функция РешетоЭратосфена()
Массив = Новый Массив;
//Число 1 исключаем сразу
Для Счетчик = 2 По 1000 Цикл
Массив.Добавить(Счетчик);
КонецЦикла;
Счетчик = 0;
ВерхняяГраница = 998;
Пока Счетчик<ВерхняяГраница Цикл
Делитель = Массив[Счетчик];
//Перебираем массив сверху вниз, чтобы удаление элемента не сдвинуло указатель на один элемент
//Интервал цикла уменьшаем на один элемент, чтобы исключить деление числа на само себя
Для ВнутреннийСчетчик = -ВерхняяГраница По -(Счетчик+1) Цикл
ВнЗначение = -ВнутреннийСчетчик;
Если Массив[ВнЗначение]%Делитель = 0 Тогда
Массив.Удалить(ВнЗначение);
КонецЕсли;
КонецЦикла;
Счетчик = Счетчик + 1;
ВерхняяГраница = Массив.ВГраница();
КонецЦикла;
Решето = Новый Структура();
Для Счетчик = 2 По 1000 Цикл
ЧислоСчетчик = “Число”+Формат(Счетчик,”ЧГ=”);
Если Массив.Найти(Счетчик) = Неопределено Тогда
Решето.Вставить(ЧислоСчетчик,”Не простое”);
Иначе
Решето.Вставить(ЧислоСчетчик,”Простое”);
КонецЕсли;
КонецЦикла;
Сообщить(Решето.Число591);
Сообщить(Решето.Число5);
x = “Число332”;
Сообщить(Решето[x]);
КонецФункции
</code>