Базовый курс. Домашнее задание №4
Первое задание по 1-му блоку базового курса.
Для выполнения рекомендуется изучить следующие главы 1-го блока.
Глава 1. Типы данных
Глава 2. Контекст выполнения кода
Глава 3. Модули
Глава 4. Синтакс-помощник
К сожалению, у Вас недостаточно прав для просмотра этой записи. Если Вы еще не залогинены на сайте — залогиньтесь. Если Вы оплачивали курс, у Вас активирован токен доступа, Вы залогинены, но Вы видите эту запись — напишите нам на e-mail поддержки.
ДЗ № 4 выполнила.
1. Сразу же споткнулась при попытке вызова константы из модуля приложения-))) Пересмотрела уроки, обошла ситуацию через создание общего модуля со свойством “вызов сервера”. Процедуру ПередНачаломРаботыСистеммы() заменила на ПриНачалеРаботыСистемы(), иначе не получалось выводить предупреждение пользователю о завершении работы.
2. Для определения времени рабочего дня завела константы , состав даты – Время. Оказалось, что, в таком формате, н-р, НачалоРабДня – это дата
00010101 9:05:38. Время сравнивала след. образ.:
ТекДата = ТекущаяДата();
ч = Час (ТекДата);
м = Минута (ТекДата);
с = Секунда (ТекДата);
ТекущееВремя = Дата(1,1,1,ч,м,с);
Т.о. даты как бы приведены к общему знаменателю и их можно сравнивать на время. Наверно можно красивее, допишу отчет, гляну что придумали светлые головы-))
3. Со списком значений сложностей не возникло.
Задание выполнил.
Создал 2 константы с типом Дата (Время), с которыми сравниваю текущее время. Пришлось повозиться с контекстами, зато разобрался. Улыбнуло, что в общих модулях можно создавать процедуры и функции с одинаковыми названиями, но разными контекстами.
Долго думал почему глОбед должна быть массивом, спасибо форуму, просветился :)
Поясните, пожалуйста, почему “долго думал” про массив? Должен быть какой-то другой тип данных? И как Вас просветили?
Задание сделано.
Особых трудностей не возникло.
Глобальная переменная глОбед – объявлена в модуле управляемого приложения и заполняется выбранными вариантами обедов. Текущее время определяется функцией ТекущаяДата().
При решении задания были использованы события глобального контекста вида:
ПередНачаломРаботыСистемы() ;
ПриНачалеРаботыСистемы() ;
ПередЗавершениемРаботыСистемы() .
Задание выполнила.
Проверку на вход/выход сделала в процедурах ПередНачаломРаботыСистемы и ПередЗавершениемРаботыСистемы, при необходимости использую параметр Отказ. Рабочее время проверяю в функции куда передаю текущую дату.
Функция РабочееВремя(текДата)
ВремяНачало = Дата(Год(текДата),Месяц(текДата),День(текДата), 9, 05, 38);
ВремяКонец = Дата(Год(текДата),Месяц(текДата),День(текДата), 18, 11, 42);
Возврат текДата >= ВремяНачало И текДата <= времяКонец;
КонецФункции
Функция РабочееВремя(текДата)
ВремяНачало = Дата(Год(текДата),Месяц(текДата),День(текДата), 9, 05, 38);
ВремяКонец = Дата(Год(текДата),Месяц(текДата),День(текДата), 18, 11, 42);
Возврат текДата >= ВремяНачало И текДата <= времяКонец;
КонецФункции
Обед запрашиваю так(глОбед -глобальная экспортная переменная)
Процедура ПриНачалеРаботыСистемы()
глОбед = Новый Массив;
СпЗнач = Новый СписокЗначений;
СпЗнач.Добавить(“Курица”);
СпЗнач.Добавить(“Рыба”);
СпЗнач.Добавить(“Мясо”);
Если СпЗнач.ОтметитьЭлементы(“Выберите вид обеда”) Тогда
Для каждого Элемент из СпЗнач Цикл
Если Элемент.Пометка Тогда
глОбед.Добавить(Элемент.Значение);
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Задание сделал, синтаксис помошник и другие помошники (кнопка доступных функций) здорово помогли!
Все сделал в модуле управляемого приложения :
Перем ГлОбед Экспорт;
Перем ВремяНач, ВремяКон;
Процедура ПередНачаломРаботыСистемы(Отказ)
текдат=ТекущаяДата();
д=Сред(Строка(ТекДат),1,2);
м=Сред(Строка(ТекДат),4,2);
г=Сред(Строка(ТекДат),7,4);
ВремяНач=Дата(г,м,д,09,05,38);
ВремяКон=Дата(г,м,д,18,11,42);
Если ТекДат<ВремяНач или ТекДат>ВремяКОн тогда
Предупреждение(“В нерабочее время работать запрещено”);
Отказ=Истина;
КонецЕсли;
КонецПроцедуры
Процедура ПриНачалеРаботыСистемы()
ГлОбед=Новый Массив;
Меню = Новый СписокЗначений;
Меню.Добавить(“Куриное”);
Меню.Добавить(“Рыбное”);
Меню.Добавить(“Мясное”);
Если Меню.ОтметитьЭлементы(“Пожалуйста выберите меню”) Тогда
Для Каждого зн из меню Цикл
Если зн.Пометка тогда
глОбед.Добавить(зн.Значение);
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Процедура ПередЗавершениемРаботыСистемы(Отказ)
текдат=ТекущаяДата();
Если ТекДат>ВремяНач или ТекДат<ВремяКОн тогда
Режим=РежимДиалогаВопрос.ДаНет;
Если Вопрос(“Вы уверены что хотите выйти из программы? Рабочий день, еще не закончился”,Режим,0)=КодВозвратаДиалога.Нет тогда
Отказ=Истина;
КонецЕсли
КонецЕсли;
КонецПроцедуры
Выполнено
Глобальный модуль
Перем ДатаНачалаРаботыСистемы;
Перем ДатаОкончанияРаботыСистемы;
…..
ДатаНачалаРаботыСистемы = ПолучитьДатуРаботыСистемы(ДатаЗапуска, ДатаНачалаРаботыСистемы);
…..
Функция ПолучитьДатуРаботыСистемы(ДатаЗапуска, ДатаВозврата)
Возврат Дата(Год(ДатаЗапуска), Месяц(ДатаЗапуска), День(ДатаЗапуска),
Час(ДатаВозврата), Минута(ДатаВозврата), Секунда(ДатаВозврата));
КонецФункции // ПолучитьДатуРаботыСистемы()
…..
ДатаНачалаРаботыСистемы = ‘0001,01,01,09,05,38’;
ДатаОкончанияРаботыСистемы = ‘0001,01,01,19,11,42’;
Доброго дня всем. Евгений возник вопросик по общему модулю: создал общий модуль с опциями- Сервер,Вызов сервера в нем определил процедуру
&НаКлиенте
Процедура Клиентская() Экспорт
Сообщить(“На клиенте”);
КонецПроцедуры // Клиентская()
в модуле приложения пытаюсь вызвать эту процедуру. Т.к. модуль приложения компилируется на клиенте соответственно вызывается сообщеие что процедура не найдена(потому что галка клиент не стоит), далее убираю директиву компиляции у процедуры и все начинает работать. Галки клиент так и не стоит соответственно экземпляр компиляции только 1 серверный, а контекст вызова клиентский. Почему все работает ?
пересмотрел видео. разобрался
Флагом “Вызов сервера” вы как раз и установили возможность обращения к данному серверному методу со стороны клиента.
Поэтому все правильно.
Подробнее см. начальные уроки 1-го блока про модули..
1. Определял время начала и окончания рабочего дня для Текущей даты и сравнивал с ТекущаяДата() в ПередНачаломРаботыСистемы(Отказ). Выдавал Предупрдеждение с таймаутом=5 и Отказ=Истина.
2. ПриНачалеРаботыСистемы() формировал СписокЗначений и вызывал метод ОтметитьЗначения() . Далее перебор Для Каждого и Если Пометка Тогда добавлял в массив значение ЭлементаСпискаЗначений.
3. ПередЗавершениемРаботыСистемы(Отказ) сравнивал ТекущаяДата() с ОкончаниемРабочегоДня для ТекущейДаты. Анализировал Вопрос и если надо то Отказ=Истина.
Справилась с заданием быстро :)
Все делала в модуле управляемого приложения.
Основные действия:
1. Определила переменные ВремяНачРаб, ВремяКонРаб и глОбед (эспортная);
2. В основном теле программы определила
глОбед = Новый Массив;
ВремяНачРаб = “08:05:38”;
ВремяКонРаб = “18:11:42″;
В принципе, начало и окончание времени работы можно было определить как константы :)
3. Использовала стандартные процедуры
Процедура ПередНачаломРаботыСистемы(Отказ)
ТекВремя = Формат(ТекущаяДата(),”ДЛФ=В”);
Если ТекВремя<ВремяНачРаб Тогда
Предупреждение(“Рано еще работать, выпейте КОФЕ!!!”);
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
Процедура ПередЗавершениемРаботыСистемы(Отказ)
ТекВремя = Формат(ТекущаяДата(),”ДЛФ=В”);
Если ТекВремя<ВремяКонРаб Тогда
Режим = РежимДиалогаВопрос.ДаНет;
Ответ = Вопрос(“Еще не закончился рабочий день! Вы хотите выйти из программы?”,Режим,0);
Если Ответ = КодВозвратаДиалога.Нет Тогда
Отказ = Истина;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура ПриНачалеРаботыСистемы()
СписокЗначенийОбед = Новый СписокЗначений;
СписокЗначенийОбед.Добавить(“Курица”);
СписокЗначенийОбед.Добавить(“Рыба”);
СписокЗначенийОбед.Добавить(“Мясо”);
Если СписокЗначенийОбед.ОтметитьЭлементы(“Что вы будете на обед?”) Тогда
Для Каждого Элемент Из СписокЗначенийОбед Цикл
Если Элемент.Пометка Тогда
глОбед.Добавить(Элемент.Значение);
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
————————————–
Есть вопрос. Если бы мы использовали обычное приложение, то процедура ПередНачаломРаботыСистемы не позволяют выводить сообщения пользователю, то в данном случае пришлось бы все описывать в процедуре ПриНачалеРаботыСистемы или можно как-то рассказать пользователю, что еще рано заходить до основного запуска программы???
В случае обычного приложения для выдачи сообщений нужно:
1. Использовать обработчик ПриНачалеРаботыСистемы
2. Применять метод ЗавершитьРаботуСистемы().
Задание выполнила в модуле управляемого приложения. Проверка на возможность начала работы выполняется в процедуре
Процедура ПередНачаломРаботыСистемы(Отказ)
// Окно еще не открыто, можно отказаться от запуска 1С
ВремяНачалаРаботы=”090538″;
ТекДата=ТекущаяДата() ;
СравниваемоеЗначениеДатыВремени=Дата(Формат(ТекДата,”ДФ=””ггггММдд”””)+ВремяНачалаРаботы);
Если СравниваемоеЗначениеДатыВремени>ТекДата Тогда
Отказ=Истина;
Возврат;
КонецЕсли;
КонецПроцедуры
Аналогично в процедуре ПередЗавершениемРаботыСистемы проверяется возможность выхода. Список значений, объявленный как экспортная переменная в модуле управляемого приложения и отмеченный пользователем виден в клиентской части в течение всего сеанса.
Затруднение возникло, когда я захотела усложнить себе жизнь и использовать параметры сеанса для хранения времени начала и окончания работы.
В модуле сеанса отрабатывает присвоение
ПараметрыСеанса.НачалоРаботы= Дата(Формат(ТекДата,”ДФ=””ггггММдд”””)+ВремяНачалаРаботы);
ПараметрыСеанса.ОкончаниеРаботы= Дата(Формат(ТекДата,”ДФ=””ггггММдд”””)+ВремяОкончанияРаботы);
Но потом эти параметры не видно в модуле управляемого приложения. Пробовала создать процедуру в общем модуле, с отметкой сервер и вызов сервера. Эта процедура считывает параметры сеанса и доступна из другого контекста, например из формы справочника. Но не доступна в модуле управляемого приложения. Что делать?
Можно в общем модуле (Сервер + Вызов сервера) создать функции, которые возвращают значения параметров сеанса.
Но использовать параметры сеанса для этой задачи – лишнее..
Посмотрела еще раз пример в учебной базе, поняла в чем была ошибка. Теперь работает из параметров сеанса. Понимаю, что лишнее, просто интересно использовать новый объект…
ДЗ №4 выполнено, затруднений не было.
Для хранения начала и окончания рабочего дня создал периодический (день) регистр сведений с двумя ресурсами соответственно. Состав меню оставил зашитым в код, нечего работников баловать разнообразием :)
Весь код написан в модуле управляемого приложения.
Создал 3 процедуры:
ПередНачаломРаботыСистемы(Отказ)
ПриНачалеРаботыСистемы()
ПередЗавершениемРаботыСистемы(Отказ).
В процедурах ПередНачаломРаботыСистемы(Отказ) и ПередЗавершениемРаботыСистемы(Отказ)выполняется проверка, если не рабочее время то Отказ=Истина. При выходе проверка, если время рабочее то РежимДиалогаВопрос.ДаНет.
В процедуре ПриНачалеРаботыСистемы() создаю ГлОбед и СписокЗначений отмечаю нужные обеды при помощи метода списка значений ОтметитьЭлементы.
Пробовал разные варианты с ограничением входа, выхода и выбором обедов.
Весь код написан в модуле управляемого приложения.
Создал 3 процедуры:
ПередНачаломРаботыСистемы(Отказ)ПриНачалеРаботыСистемы()ПередЗавершениемРаботыСистемы(Отказ).
В процедурах ПередНачаломРаботыСистемы(Отказ) и ПередЗавершениемРаботыСистемы(Отказ) выполняется проверка, если не рабочее время то Отказ=Истина. При выходе проверка, если время рабочее то РежимДиалогаВопрос.ДаНет.
В процедуре ПриНачалеРаботыСистемы() создаю ГлОбед и СписокЗначений выбор обедов при помощи метода ОтметитьЭлементы.
Задание выполнено. Затруднений не возникло.
Я конечно извиняюсь, а где сами материалы 1 блока? Я вижу только “дополнительные” в виде слайдов и все.
Да Вы не поверите – на сайте.
1. Нажать в меню пункт “Базовый курс” (не подменю!)
2. Найти запись от 02 ноября (внизу страницы)
Предполагаем, что конфигурация может работать в режиме
обычного и управляемого приложения.
1. Общий модуль “ОбщегоНазначенияКлиент”, в котором
реализованы процедуры:
ПередНачаломРаботыСистемы(Отказ)
– проверка возможности входа в программу.
ПриНачалеРаботыСистемы(глОбед)
– выбор пользователем вариантов обеда.
ПередЗавершениемРаботыСистемы(Отказ)
– вопрос о целесообразности закрытия программы.
2. В модуль управляемого приложения созданы
обработчики событий:
ПередНачаломРаботыСистемы(Отказ),
ПриНачалеРаботыСистемы(),
ПередЗавершениемРаботыСистемы(Отказ),
которые вызывают соответствующие
процедуры модуля “ОбщегоНазначенияКлиент”
3. Аналогично для модуля обычного приложения.
PS. Cобытие ПередЗавершениемРаботыСистемы
возникает при нажатии на “крестик” окна программы.
А если закрывать через главное меню: Файл->Закрыть,
то не возникает! Это нормально?
>Это нормально?
Это совсем не нормально. Сообщили о проблеме разработчикам, они зафиксировали ошибку..
Задание выполнил. Затруднений не возникло.
Все сделано в модуле Упр. приложения :
объявил переменную глОбед.
Проверка возможности работы пользователя по времени выполняется в процедуре ПередНачаломРаботыСистемы(Отказ)
время начала и окончания работы задал так:
НачалоРабочегоДня = НачалоДня(ТекущаяДата()) + 09*3600+05*60+38;
ОкончаниеРабочегоДня = НачалоДня(ТекущаяДата()) + 18*3600+11*60+42;
Вопрос о выходе из программы до окончания дня обрабатывается в процедуре ПередЗавершениемРаботыСистемы(Отказ)
Список обедов и наполнение массива переменной глОбед происходит в процедуре ПриНачалеРаботыСистемы()
1. Для проверки на рабочее время добавил в конфигурацию две константы: ВремяНачалаСмены и ВремяОкончанияСмены, тип “Дата”, Состав даты: “Время”.
Перед началом работы системы вызывается функция ПолучитьРазрешениеНаНачалоРаботы(ДатаВремяРазрешить) общего модуля ОбщийМодуль1 (флаги “Сервер”, “Вызов сервера”), в параметре передаётся текущая дата.
В функции ПолучитьРазрешениеНаНачалоРаботы() первоначально выполняется проверка РольДоступна(“ПолныеПрава”): пользователь с полными правами должен иметь возможность зайти в любое время, чтобы отредактировать начало и конец рабочего дня. Кроме того, права на редактирование констант – только для него.
Для прочих пользователей вызывается функция ПолучитьСтруктуруРабочегоДня() общего модуля РаботаСКонстантами (флаги “Сервер”, “Привилегированный”). В ней выполняется:
СекундДоНачалаСмены = Константы.ВремяНачалаСмены.Получить() – ‘0001-01-01’;
СтруктураРабочегоДня.Вставить(“НачалоСмены”, НачалоДня(ТекущаяДата()) + СекундДоНачалаСмены);
Аналогично про окончание – в процедуре ПриОкончанииРаботыСистемы(), только проверка для всех пользователей и задается вопрос.
Прочитал комментарии и вспомнил, что материал про константы предполагался неизученным, но я уж его прочитал. Зато попробовал работу с доступом в привилегированном режиме.
Про обеды – как будто всё просто, только список выбранных блюд пользователю продемонстрировать не догадался, а лишь смотрел в отладчике.
Здорово придумано про проверку прав. И правда хоть кто-то должен заполнить константы :)
Задание выполнено.
Приведу лишь свой вариант проверки времени, остальное достаточно тривиально.
НачалоРабочегоДня = Дата(Формат(ТекущаяДата(), “ДФ=yyyyMMdd”) + “090538”);
КонецРабочегоДня = Дата(Формат(ТекущаяДата(), “ДФ=yyyyMMdd”) + “181142”);
ВремяВходаПользователяВБазу = ТекущаяДата();
Если ВремяВходаПользователяВБазу < НачалоРабочегоДня ИЛИ ВремяВходаПользователяВБазу > КонецРабочегоДня Тогда
Предупреждение(“Вход в базу в нерабочее время запрещен!”, 30);
Отказ = Истина;
КонецЕсли;
НачалоРабочегоДня = Дата(Формат(ТекущаяДата(), “ДФ=yyyyMMdd”) + “090538”); КонецРабочегоДня = Дата(Формат(ТекущаяДата(), “ДФ=yyyyMMdd”) + “181142”); ВремяВходаПользователяВБазу = ТекущаяДата(); Если ВремяВходаПользователяВБазу < НачалоРабочегоДня ИЛИ ВремяВходаПользователяВБазу > КонецРабочегоДня Тогда Предупреждение(“Вход в базу в нерабочее время запрещен!”, 30); Отказ = Истина; КонецЕсли;
Прошу удалить задвоенный участок листинга.
Как понял проблема с задвоением присутствует не у всех. Не понятно с чем связано? Браузер?
ps Использую Хром 7. В сл. раз попробую отправить через огнелиса.
Пока проблема расследуется..
Затруднений не возникло. В простейшем случае все так. Но, есть особенности:
1) если с базой работают пользователи из разных часовых поясов (филиалы), тогда лучше использовать ТекущаяДатаСеанса();
2) Раз уж стоит вопрос ограничения доступа, следует учитывать, что в файловом варианте будет браться текущая системная дата компьютера пользователя. Т.е. средствами ОС нужно запретить пользователям менять системные дату/время.
Задание выполнил.
Перем глОбед;
Процедура ПриНачалеРаботыСистемы()
Если (ТекущаяДата() – НачалоДня(ТекущаяДата()) < 32738) или (ТекущаяДата() – НачалоДня(ТекущаяДата()) > 65502) Тогда
Предупреждение(“Время для доступа к конфигурации еще не наступило!”,5);
ЗавершитьРаботуСистемы(Ложь);
КонецЕсли;
Обед();
КонецПроцедуры
Процедура ПередЗавершениемРаботыСистемы (Отказ)
Режим = РежимДиалогаВопрос.ДаНет;
Если ТекущаяДата() – НачалоДня(ТекущаяДата()) < 65502 Тогда
Ответ = Вопрос(“Солце еще высоко, вы действительно хотите завершить работу?”,Режим,0);
Если Ответ = КодВозвратаДиалога.Нет Тогда
Отказ = КодВозвратаДиалога.Нет;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура Обед()
Список = Новый СписокЗначений;
Список.Добавить(“Курица”);
Список.Добавить(“Рыба”);
Список.Добавить(“Мясо”);
Если Список.ОтметитьЭлементы(“Что вы съедите в обед?”) Тогда
глОбед = Новый Массив;
Для Каждого Стр из Список Цикл
Если Стр.Пометка=Истина Тогда
глОбед.Добавить(Стр.Значение);
КонецЕсли;
КонецЦикла;
Иначе
Сообщить(“Значит работать вам без обеда.”);
КонецЕсли;
КонецПроцедуры
Перем глОбед;Процедура ПриНачалеРаботыСистемы() Если (ТекущаяДата() – НачалоДня(ТекущаяДата()) < 32738) или (ТекущаяДата() – НачалоДня(ТекущаяДата()) > 65502) Тогда Предупреждение(“Время для доступа к конфигурации еще не наступило!”,5); ЗавершитьРаботуСистемы(Ложь); КонецЕсли; Обед();КонецПроцедуры
Процедура ПередЗавершениемРаботыСистемы (Отказ) Режим = РежимДиалогаВопрос.ДаНет; Если ТекущаяДата() – НачалоДня(ТекущаяДата()) < 65502 Тогда Ответ = Вопрос(“Солце еще высоко, вы действительно хотите завершить работу?”,Режим,0); Если Ответ = КодВозвратаДиалога.Нет Тогда Отказ = КодВозвратаДиалога.Нет; КонецЕсли; КонецЕсли;КонецПроцедуры
Процедура Обед() Список = Новый СписокЗначений; Список.Добавить(“Курица”); Список.Добавить(“Рыба”); Список.Добавить(“Мясо”); Если Список.ОтметитьЭлементы(“Что вы съедите в обед?”) Тогда глОбед = Новый Массив; Для Каждого Стр из Список Цикл Если Стр.Пометка=Истина Тогда глОбед.Добавить(Стр.Значение); КонецЕсли; КонецЦикла; Иначе Сообщить(“Значит работать вам без обеда.”); КонецЕсли;КонецПроцедуры
В дальнейшем обязательно листинг модуля выкладывать, или можно обойтись основными моментами?
Можно и нужно обойтись основными моментами :)
Добрый день, задание сделал.
Особенности выполнения:
1. В модуле управляемого приложения обрабатываю в событии ПередНачаломРаботыСистемы(Отказ) попадает ли текущая дата в рабочий диапазон. Для этого определил переменную ДатаСтартаСистемы = ТекущаяДата(); сделал потому что считаю что есть ненулевая вероятность того, что текущая дата может измениться во время анализа, а это не есть хорошо.
2. Сложностей не возникло, воспользовался методом ОтметитьЭлементы() для выбора нескольких элементов списка значений.
3. Сделал очень похоже на первую часть, т.е. завел переменную ДатаОкончанияРаботыСистемы = ТекущаяДата() и ее анализирую. Если она попадает в рабочий диапазон, то задаем пользователю вопрос действительно ли он хочет завершить работу, ведь рабочий день еще не закончен, и если пользователь отвечает “Да”, то завершаем работу системы. Обрабатываю в модуле управляемого приложения в процедуре ПередЗавершениемРаботыСистемы(Отказ).
P.S. Маленький вопросик. Насколько правильно пользоваться функцией ТекущаяДата() ? Ведь это время компьютера, которое можно изменить. Может быть правильнее пользоваться функцией РабочаяДата() ?
Да, забыл написать, что в том же модуле управляемого приложения завел переменную ГлОбед, т.е. Перем ГлОбед и в теле основной программы написал ГлОбед = Новый Массив; Таким образом получается, что ГлОбед всегда будет массивом, пусть даже пустым, если пользователь отказался от выбора.
Текущую дату использовать достаточно корректно.
Ведь рабочую дату тоже пользователь может поменять (в обычном интерфейсе), либо она наследуется от текущей даты.
А вот для клиент-серверного варианта текущая дата будет браться с сервера.
ps. РабочаяДата это свойство, а не метод.
Да, на счет рабочей даты ошибся, действительно свойство.
Перем глОбед Экспорт;
Процедура ПриНачалеРаботыСистемы()
Если Не РабочееВремя() Тогда
Предупреждение(“Нерабочее время!”,,”Невозможно войти в систему”);
ЗавершитьРаботуСистемы(Ложь);
Возврат;
КонецЕсли;
СписокБлюд = Новый СписокЗначений;
СписокБлюд.Добавить(“Курица”);
СписокБлюд.Добавить(“Рыба”);
СписокБлюд.Добавить(“Мясо”);
Если СписокБлюд.ОтметитьЭлементы(“Выберете вариан обеда”) Тогда
глОбед = Новый Массив;
Для Каждого Блюдо из СписокБлюд Цикл
Если Блюдо.Пометка тогда
глОбед.Добавить(Блюдо.Значение);
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Процедура ПередЗавершениемРаботыСистемы(Отказ)
Если РабочееВремя() и КодВозвратаДиалога.Нет
= Вопрос(“Рабочий день еще не закончился. Выдти из программы?”,РежимДиалогаВопрос.ДаНет,,КодВозвратаДиалога.Нет) Тогда
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
Функция РабочееВремя()
ТД = ТекущаяДата();
ТекущееВремя = ТД – НачалоДня(ТД);
Возврат 65502 > ТекущееВремя и ТекущееВремя > 32788
КонецФункции
Задание сделала.
С сравнением текущего времени с границами рабочего дня может несколько наворочено, но работает:
Если (ТекущаяДата() < Дата(Год(ТекущаяДата()),Месяц(ТекущаяДата()),День(ТекущаяДата()),9,5,38)) или (ТекущаяДата() > Дата(Год(ТекущаяДата()),Месяц(ТекущаяДата()),День(ТекущаяДата()),18,11,42)) Тогда
Предупреждение(“Нельзя работать в нерабочее время!”, 10);
Отказ=Истина;
КонецЕсли;
С обедами все получилось красиво:
СЗ = Новый СписокЗначений;
СЗ.Добавить(“Курица”);
СЗ.Добавить(“Рыба”);
СЗ.Добавить(“Мясо”);
Зн = СЗ.ОтметитьЭлементы (“Что Вы хотите на обед?”);
глОбед = Новый Массив;
Для Каждого Эл из СЗ цикл
Если Эл.Пометка=Истина Тогда
глОбед.Добавить(Эл.Значение);
КонецЕсли;
КонецЦикла;
Перед завершением работы системы использовала Вопрос(…).
Задание выполнила, все сделала в модуле управляемого приложения
Для Проверки времени использовала сравнение текущей даты с
Дата(Год(ТекДата), Месяц(ТекДата), День(ТекДата), 18, 11, 42)
Для заполнения массива использовала
Для Каждого ЭлСписка Из Список Цикл
Если ЭлСписка.Пометка Тогда
глОбед.Добавить(ЭлСписка.Значение);
КонецЕсли;
КонецЦикла;
Для Каждого ЭлСписка Из Список Цикл
Если ЭлСписка.Пометка Тогда
глОбед.Добавить(ЭлСписка.Значение);
КонецЕсли;
КонецЦикла;
Интересное задание, достаточно легко решается.
Вот мой листинг.
Модуль управляемого приложения.
Перем глОбед Экспорт;
Процедура ПередНачаломРаботыСистемы(Отказ)
ТекущееВремя=формат(ТекущаяДата(),”ДЛФ=В”);
Если не(ТекущееВремя>”090538″ и ТекущееВремя<“181142”) тогда
Предупреждение(“Рабочий день уже заврешен-“+ТекущееВремя,10,”Блокировка Входа”);
отказ=истина;
иначе
список=новый списокзначений();
список.Добавить(“Курица”);
список.Добавить(“Рыба”);
список.Добавить(“Мясо”);
глОбед=новый массив;
Если Список.ОтметитьЭлементы(“Выберите кормЁшку!”) тогда
Для каждого Элемент Из Список Цикл
Если Элемент.Пометка тогда
глОбед.Добавить(элемент);
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура ПередЗавершениемРаботыСистемы(Отказ)
ТекущееВремя=формат(ТекущаяДата(),”ДЛФ=В”);
Если ТекущееВремя>”090538″ и ТекущееВремя<“181142” тогда
Если Вопрос(“Рабочий день еще не завершен.-“+ТекущееВремя+” Вы уверены что хотите Выйти?”,РежимДиалогаВопрос.ДаНет)=КодВозвратаДиалога.нет тогда
отказ=истина;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Я правильно описал глобальную переменную?
Да, правильно.
Задание выполнил.
1.Создал Общий модуль ПроверкаВремени с клиентским исполнением.
Там написал 3 функции:
а.РабочееВремя()
возвращает ложь, когда ТекущаяДата()<НачалоРабДня или ТекущаяДата()>КонецРабДня;
б. ПередНачаломРаботы() Экспорт
Отказ = НЕ РабочееВремя();
Если Отказ – то Предупреждение(), возврат Отказ;
в.ПередЗавершениемРаботы() Экспорт
Если РабочееВремя(), то Вопрос(“Завершить работу ?”,РежимДиалогаВопрос.ДаНет) и
возврат Истина для ответа Нет;
2.В модулях управляемого и обычного приложения определил :
а. глобальную переменную:
Перем глОбед Экспорт;
глОбед = Новый Массив;
б. &НаКлиенте ПередНачаломРаботыСистемы(Отказ)
Отказ = ПроверкаВремени.ПередНачаломРаботы();
в. &НаКлиенте ПередЗавершениемРаботыСистемы(Отказ)
Отказ = ПроверкаВремени.ПередЗавершениемРаботы();
г. &НаКлиенте ПриНачалеРаботыСистемы()
Форма = ПолучитьФорму(“ОбщаяФорма.ВыборБлюда”);
Форма.ОткрытьМодально();
3. Создал перечисление СписокБлюд, в значения -> курица, мясо, рыба.
4. Создал Общую форму ВыборБлюда, в ней – реквизит Блюда с типом СписокЗначений,
типом значения – ПеречислениеСсылка.СписокБлюд. Вынес ее на рабочий стол через
командный интерфейс рабочего стола.
5. Обработчики формы (все на клиенте):
а. ПриОткрытии(Отказ)
Блюда.ЗагрузитьЗначения(глОбед);
б. ПриЗакрытии()
глОбед.Очистить();
глОбед=Блюда.ВыгрузитьЗначения();
в. БлюдаЗначениеОбработкаВыбора() и БлюдаОбработкаВыбора() проверяют список на заполнение повторами.
г. БлюдаПередОкончаниемРедактирования() проверяет элемент на пустоту.
При запуске в рабочее время модально открывается форма “ВыборБлюда”.
Через кнопки “Добавить” или “Подбор” осуществляется выбор одного или нескольких значений,
при закрытии формы выборка помещается в глобальную переменную.
Последующие открытия формы производятся с рабочего стола, через панель действий Сервис,
при этом данные в форму загружаются из глОбед.
При попытке выйти в рабочее время система запрашивает подтверждение.
Для хранения времени начала и окончания рабочего дня удобно использовать локальные переменные модуля приложения и инициализировать их в разделе основной программы следующим образом:
ВремяНачалаРрабочегоДня = Дата(Год(ТекущаяДата()),Месяц(ТекущаяДата()), День(ТекущаяДата()), 9, 5 , 38)
и аналогично для ВремениОкончанияРабочегоДня
проверку на попадание текущего времени (функция ТекущаяДата()) в этот интервал лучше делать в процедуре ПередНачаломРаботыСистемы(), если не попадает, выдавать предупреждение пользователю и присваивать параметру Отказ значение истина, что блокирует запуск системы.
Выбор обеда лучше производить в процедуре ПриНачалеРаботыСистемы() и поскольку необходимо предусмотреть возможность выбора сразу нескольких вариантов, то необходимо воспользоваться методом ОтметитьЭлементы коллекции СписокЗначений, затем в цикле проверять установку Пометки и если она установлена добавлять соответствующий элемент списка в массив глОбед. Хороший пример работы метода ОтметитьЭлементы есть в Синтакс-Помощнике.
Проверять окончание рабочего дня лучше в процедуре ПередЗавершениемРаботыСистемы поскольку в ней можно отказаться от выхода если пользователь ответит на вопрос о выходе (функция Вопрос()) отрицательно.
Модуль приложения:
Перем ГлОбед Экспорт;
Процедура ПередНачаломРаботыСистемы(Отказ)
ТекДата=ТекущаяДата();
НачалоРаботы=НачалоДня(ТекДата)+9*60*60+5*60+38;
КонецРаботы=НачалоДня(ТекДата)+18*60*60+11*60+42;
Если ТекДата<НачалоРаботы ТОгда //Еще рано
Отказ=Истина;
ИначеЕсли ТекДата>КОнецРаботы ТОгда //Уже поздно
Отказ=Истина;
КонецЕсли;
КонецПроцедуры
Процедура ПриНачалеРаботыСистемы()
СписокБлюд=Новый СписокЗначений;
СписокБлюд.Добавить(“Курица”);
СписокБлюд.Добавить(“Рыба”);
СписокБлюд.Добавить(“Мясо”);
Если СписокБлюд.ОтметитьЭлементы(“Чего изволите?”) Тогда
Массив=Новый массив;
Для Каждого ТЕкЭлемент Из СписокБлюд Цикл
Если ТекЭлемент.Пометка ТОгда
Массив.Добавить(ТекЭлемент.Значение);
КонецЕсли;
КОнецЦикла;
ГлОбед=Массив;
КОнецЕсли;
КонецПроцедуры
Процедура ПередЗавершениемРаботыСистемы(Отказ)
ТекДата=ТекущаяДата();
КонецРаботы=НачалоДня(ТекДата)+18*60*60+11*60+42;
Если ТекДата<=КонецРаботы ТОгда
Если Вопрос(“Солнце ещё высоко ! Вы уверены ?”,РежимДиалогаВопрос.ДаНет)=КодВозвратаДиалога.Нет ТОгда
Отказ=Истина;
КОнецЕсли;
КонецЕсли;
КонецПроцедуры
ДЗ №4
Задание выполнил. Проблем не возникло. Из особенностей отмечу, что для контроля рабочего времени и при входе и при выходе нужно проверять выполнение двух условий (и начало рабочего дня и конец рабочего дня).
При выборе варианта обеда я бы добавил проверку на факт осуществления выбора (т.е. сообщил бы пользователю, что именно он выбрал) и необходимость подтверждения, если не отмечена ни одна позиция обеда.
PS. Маленький вопрос. Мой отчет о выполнении задания по ДЗ№3 у меня до сих пор висит с припиской “Ваш комментарий в ожидании модерации” – уже очень давно, с 03.11.2010. Может он просто потерялся?
Нет, не потерялся, сейчас проверим :)
Д.З. №4 Выполнил.
Краткое описание решения:
Для модуля управляемого приложения в процедуре ПередНачаломРаботыСистемы задал условие запуска конфигурации в виде:
Если ТекущаяДата()<НачалоДня(ТекущаяДата())+32738 ИЛИ ТекущаяДата()>НачалоДня(ТекущаяДата())+65502 Тогда
Предупреждение(“Работа разрешена только с 9:05:38 до 18:11:42”);
Отказ=ИСТИНА;
КонецЕсли;
В процедуре ПередЗавершениемРаботыСистемы реализовал следующее условие окончания работы программы:
Если ТекущаяДата()<НачалоДня(ТекущаяДата())+65502 Тогда
Если Вопрос(“Рабочий день еще не закончен. Вы действительно хотите выйти?”, РежимДиалогаВопрос.ДаНетОтмена)=КодВозвратаДиалога.Да Тогда
Отказ=ЛОЖЬ;
Иначе
Отказ=Истина;
КонецЕсли;
КонецЕсли;
В процедуре при начале работы системы создал новый массив ГлОбед , заполнил список значений и реализовал выборку отмеченных позиций и запись этих позиций в массив, следующим кодом:
ЕСЛИ СписокЗначений.ОтметитьЭлементы(“Выберите блюда из предложенного меню.”) ТОГДА
Для КАЖДОГО Значение из СписокЗначений Цикл
Если Значение.Пометка Тогда
ГлОбед.Добавить(Значение);
КонецЕсли;
КонецЦикла;
Вывел в виде сообщения заполненный массив блюд:
Для КАЖДОГО Блюдо из ГлОбед Цикл
Сообщить(Блюдо);
КонецЦикла;
Задание выполнила.
Проверки на возможность открытия/закрытия базы вставила в процедуры ПередНачаломРаботыСистемы и ПередЗавершениемРаботыСистемы. Отдельно вынесла функцию, получающую текущее время и проверяющую, попадает ли оно в интервал рабочего времени. Для выдачи сообщений пользователю использовала Предупреждение.
Глобальную переменную объявила в модуле управляемого приложения и заполнила ее выбранными вариантами обедов в процедуре ПриНачалеРаботыСистемы.
Время проверяла так:
Функция ВремяРабочее()
ТекВремя = Формат(ТекущаяДата(), “ДФ=ЧЧ:мм:сс”);
Возврат (ТекВремя>=”09:05:38″) И (ТекВремя<=”18:11:42″)
КонецФункции
Выполнил ДЗ.
Вот мой вариант решения:
Перем глОбед Экспорт;
Перем ВремяНачалаРабочегоДня,ВремяОкончанияРабочегоДня;
Функция ПроверитьВозможножностьРаботы()
ТекДата = ТекущаяДата();
Нач = (ТекДата-НачалоДня(ТекДата))-(ВремяНачалаРабочегоДня-Дата(1,1,1));
Кон = (ТекДата-НачалоДня(ТекДата))-(ВремяОкончанияРабочегоДня-Дата(1,1,1));
Если НЕ (Нач>0 И Кон<0) Тогда
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;
КонецФункции
Процедура ПередНачаломРаботыСистемы(Отказ)
Отказ = ПроверитьВозможножностьРаботы();
Если Отказ Тогда
#Если НаКлиенте Тогда
Предупреждение(“В данный момент заходить в конфигурацию нельзя!”);
#КонецЕсли
Иначе
сзОбед = Новый СписокЗначений;
сзОбед.Добавить(“Курица”);
сзОбед.Добавить(“Рыба”);
сзОбед.Добавить(“Мясо”);
ОбедВыбран = сзОбед.ОтметитьЭлементы(“Выбирайте обед.”);
Если ОбедВыбран Тогда
Для Каждого СтрокаСписка из сзОбед Цикл
Если СтрокаСписка.Пометка Тогда
глобед.Добавить(СтрокаСписка.Значение,СтрокаСписка.Представление);
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура ПередЗавершениемРаботыСистемы(Отказ)
ТекДата = ТекущаяДата();
Если (ТекДата-НачалоДня(ТекДата))-(ВремяОкончанияРабочегоДня-Дата(1,1,1))<= 0 Тогда
Ответ = Вопрос(“Ай-ай-ай! Выходите в рабочее время?”,РежимДиалогаВопрос.ДаНет);
Если Ответ = КодВозвратаДиалога.Нет Тогда
Отказ=Истина;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
ВремяНачалаРабочегоДня = Дата(‘00010101170538’);
ВремяОкончанияРабочегоДня = Дата(‘00010101181142’);
глОбед = Новый СписокЗначений;
Сделал. Перем ГлОбед Экспорт ;
Процедура ПередНачаломРаботыСистемы(Отказ)
ДатаНачалаРаботы = НачалоДня(ТекущаяДата()) + (9*60*60) + (5*60) + 38;
Если ТекущаяДата() < ДатаНачалаРаботы Тогда
Сообщить(“Сейчас заходить в конфигурацию нельзя, начало рабочего дня в ” + Строка(ДатаНачалаРаботы));
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
Процедура ПриНачалеРаботыСистемы()
СписокБлюд = Новый СписокЗначений;
СписокБлюд.Добавить(“Курица”,,,);
СписокБлюд.Добавить(“Рыба”,,,);
СписокБлюд.Добавить(“Мясо”,,,);
СписокБлюд.ОтметитьЭлементы(“Выберете желаемые блюда”);
ГлОбед = Новый Массив;
Для каждого ТекСтрока Из СписокБлюд Цикл
Если ТекСтрока.Пометка Тогда
ГлОбед.Добавить(ТекСтрока.Значение);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ПередЗавершениемРаботыСистемы(Отказ)
ДатаКонцаРаботы = НачалоДня(ТекущаяДата()) + (18*60*60) + (11*60) + 42;
Если ТекущаяДата() < ДатаКонцаРаботы Тогда
Если Вопрос(“Еще не закончен рабочий день, вы уверены что хотите выйти”
,РежимДиалогаВопрос.ДаНет,,КодВозвратаДиалога.Нет,”Важно”,) = КодВозвратаДиалога.Нет Тогда
Отказ = Истина;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
поторопился) все получилось.
Евгений доброго дня. а можно ли сделать множественный выбор обедов без создания доп. формы?
Да, можно.
См. метод списка значений ОтметитьЭлементы.
Задание выполнено.
Для проверки возможности работы в программе использовал процедуру ПередНачаломРаботыСистемы() модуля Управляемого приложения. Из этой процедуры вызывается экспортная функция РазрешенВходВСистему() общего модуля РаботаПриложенияСервер (галочки Сервер, Вызов сервера). Эта функция сверяет время текущего сеанса со временем начала работы и возвращает результат сравнения, который присваивается параметру Отказ.
Затем в процедуре ПриНачалеРаботыСистемы() модуля Управляемого приложения инициализирую глобальную переменную глОбед, как динамический массив. Создаю список значений ВидыОбедов. Далее вызываю метод ОтметитьЭлементы(), перебираю элементы с пометкой и добавляю их в массив глОбед.
Ну и наконец, в процедуре ПередЗавершениемРаботыСистемы() организую проверку на выход из программы. Из этой процедуры вызывается экспортная функция РазрешенВыходИзСистемы() общего модуля РаботаПриложенияСервер (галочки Сервер, Вызов сервера). Эта функция сверяет время текущего сеанса со временем окончания работы и возвращает результат сравнения. Если результат сравнения показывает, что рабочий день еще не закончился, то задаем вопрос пользователю, уверен ли он в своем решении, используя Вопрос(). Если пользователь не уверен в своем решении, тогда Отказ = истина.
Перем ГлОбед Экспорт, НачалоДня, КонецДня;
Процедура ПередНачаломРаботыСистемы(Отказ)
НачалоДня = Дата(Строка(Формат(ТекущаяДата(),”ДФ=dd.MM.yyyy”))+” 09:05:38″);
КонецДня = Дата(Строка(Формат(ТекущаяДата(),”ДФ=dd.MM.yyyy”))+” 18:11:42″);
Если ТекущаяДата()<= НачалоДня Или ТекущаяДата()>= КонецДня Тогда
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
Процедура ПриНачалеРаботыСистемы()
ГлОбед = Новый Массив;
СЗ = Новый СписокЗначений;
СЗ.Добавить(“Курица”);
СЗ.Добавить(“Рыба”);
СЗ.Добавить(“Мясо”);
СЗ.ОтметитьЭлементы();
Для Каждого Эл Из СЗ Цикл
Если Эл.Пометка Тогда
ГлОбед.Добавить(Эл.Значение);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ПередЗавершениемРаботыСистемы(Отказ)
Если ТекущаяДата()<КонецДня Тогда
Если Вопрос(“Закончить работу системы до конца рабочего дня?”,РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Нет Тогда
Отказ = Истина;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Предполагаю, что работа происходит в режиме управляемого приложения. В модуле управляемого приложения добавила объявление переменных:
Перем ГлОбед Экспорт, НачалоДня, КонецДня;
В процедуре ПередНачалом РаботыСистемы определяю начало и конец рабочего дня
НачалоДня = Дата(Строка(Формат(ТекущаяДата(),”ДФ=dd.MM.yyyy”))+” 09:05:38″);
КонецДня = Дата(Строка(Формат(ТекущаяДата(),”ДФ=dd.MM.yyyy”))+” 18:11:42″);
Сравниваю с текущей датой. Если дата не между НачалоДня и КонецДня, то Отказ = Истина;
В процедуре ПриНачалеРаботыСистемы создаю список значений, даю отметить СЗ.ОтметитьЭлементы() и перебором всех элементов СЗ добавляю в массив строки с Пометкой.
Другого варианта выгрузить в Массив помеченные значения не обнаружила.
В процедуре ПередЗавершениемРаботыСистемы если раб. день не закончился, Вопрос(“Закончить работу системы до конца рабочего дня?”,РежимДиалогаВопрос.ДаНет)
Если ответ Нет, то Отказ = Истина
Сначала вставила модуль, затем решила его удалить и написать вкратце :) К сожалению, отправилось оба варианта и модуль и краткий вариант.
Ок :)
// ДЗ №4
Перем глСегодня, глОбед;
Процедура ПриНачалеРаботыСистемы()
глОбед = Новый Массив;
Меню = Новый СписокЗначений;
Меню.Добавить(“Курица”);
Меню.Добавить(“Рыба”);
Меню.Добавить(“Мясо”);
Если Меню.ОтметитьЭлементы(“Выберите обед”) Тогда
Для каждого Элемент из Меню Цикл
Если Элемент.Пометка Тогда
глОбед.Добавить(Элемент.Значение);
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Процедура ПередНачаломРаботыСистемы(Отказ)
Сейчас = ТекущаяДата();
глСегодня = Новый Структура(“Год, Месяц, День”, Год(Сейчас), Месяц(Сейчас), День(Сейчас));
Если Сейчас < Дата(глСегодня.Год, глСегодня.Месяц, глСегодня.День, 9, 5, 38)
Или Сейчас > Дата(глСегодня.Год, глСегодня.Месяц, глСегодня.День, 18, 11, 42) Тогда
Предупреждение(“В это время нельзя включать базу !”);
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
Процедура ПередЗавершениемРаботыСистемы(Отказ)
Сейчас = ТекущаяДата();
Если Сейчас < Дата(глСегодня.Год, глСегодня.Месяц, глСегодня.День, 18, 11, 42) Тогда
Если Вопрос(“Рабочий день еще не закончен, все равно выйти ?”,РежимДиалогаВопрос.ДаНет)=КодВозвратаДиалога.Нет Тогда
Отказ = Истина;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Задание сделал.
В процедуре ПередНачаломРаботыСистемы условие – если слишком рано чтобы работать, тогда Предупреждение + Отказ=Истина.
В процедуре ПриНачалеРаботыСистемы создаю ГлОбед и СписокЗначений, который заполняется протеинами. После отработки модального окна, в цикле выбранные значения заполняют массив ГлОбед.
В процедуре ПередЗавершениемРаботыСистемы условие – если слишком рано чтобы уходить, тогда Вопрос и в случае положительного ответа – Отказ=Истина.