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

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

Необходимо изучить следующие главы 1-го блока.
Глава 5. Свойства конфигурации
Глава 6. Подсистемы
Глава 7. Константы
Глава 8. Справочники

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

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

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

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

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

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

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

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

  1. Решение ещё не смотрела
    Задание выполнила
    А на строчку в модуле сеанса
    <code>ПараметрыСеанса.ТекущийПользователь</code>
    ни у кого не ругается?
    И ещё ругется на модуль управляемого приложения:
    {МодульУправляемогоПриложения(9,1)}: Определения процедур и функций должны размещаться перед операторами тела модуля
    <<?>>Процедура ПередНачаломРаботыСистемы(Отказ), хотя я переменные не вставляла.

    И как вставить решения домашего задания в конфигурацию? Pdf-ки с горем поподам вставила (сделала папкуHomeworks и перенесла туда все), но видео не видит

    • >А на строчку в модуле сеанса
      Приведите строчку целиком.
      А также сообщение об ошибке.
      >И ещё ругется на модуль управляемого приложения
      Возможно после одного из методов поставили “;”. Этот момент мы разбирали в одной из недавних мастер-групп, посмотрите эти матириалы.
      >И как вставить решения домашего задания в конфигурацию?
      Чуть-чуть подождать, мы сами их вставим.

      • <code>ПараметрыСеанса.ТекущийПользователь = ТекущийПользователь;</code>
        Я посмотрела решение и поняла, что модуль сеанса для синхронизации пользователей вообще не надо было использовать.

        • Именно, не нужно.
          И посмотрите последнюю сессию ответов на вопросы, там разбираем подобный вопрос.

  2. А в нашем потоке сколько учащихся? :)

    • Важно не сколько учится, а сколько человек выполняют ДЗ.

      • Андрей Кусанов 23.04.2011 в 11:26

        Фарит, а почему мои ДЗ висят уже второй день “в ожидании модерации”?

        • Потому что окончательное суждение выносит Евгений, а он сейчас между Барнаулом и Новосибирском…

  3. Задание выполнил.
    В параметры сеанса определяю пользователя

    <code>
    Процедура УстановкаПараметровСеанса(ТребуемыеПараметры)
     ТекущийПользователь = УправлениеПользователями.ОпределитьПользователя();
     ПараметрыСеанса.ТекущийПользователь = ТекущийПользователь;
    КонецПроцедуры
    </code>

    Модуль приложения выглядит так

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

    Все вспомогательные функции в общем серверном модуле и разрешением вызова сервера

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

  4. Елена 23.04.2011 в 03:41

    ДЗ №5
    Справочнике «Пользователи»
    Код- Строка 50
    Справочнике ОбедыПользователя :
    Реквизит «Дата»- установлено «Индексировать»
     
    Модуль Сеанса
    <code>
    Функция УстановитьПараметрСеансаТекущийПользователь()    экспорт
    ИмяПользователя=ИмяПользователя();
    ПолноеИмяПользователя=ПолноеИмяПользователя();
    Ссылка=Справочники.Пользователи.НайтиПоКоду(ИмяПользователя);
    Если Ссылка=справочники.Пользователи.ПустаяСсылка() Тогда
    СсылкаНового = Справочники.Пользователи.ПолучитьСсылку();
    ОбъектПользователь = Справочники.Пользователи.СоздатьЭлемент();
    ОбъектПользователь.Код          = ИмяПользователя;
    ОбъектПользователь.Наименование = ПолноеИмяПользователя;
    ОбъектПользователь.УстановитьСсылкуНового(СсылкаНового);
    Попытка
    ОбъектПользователь.Записать();
    Исключение
    ВызватьИсключение “Возникла ошибка при создание при добавления пользователя в справочник ” + ИмяПользователя+”.” + ОписаниеОшибки();
    КонецПопытки;
    Ссылка = ОбъектПользователь.Ссылка;
    КонецЕсли;
    ПараметрыСеанса.ТекущийПользователь = Ссылка;
    КонецФункции
    </code>
     
    Модуль Управляемого Приложения:
    <code>
    Процедура ПередНачаломРаботыСистемы(Отказ)
    ОбщийМодульКлиент.ПолучитьСписокПростыхЧисел();
    Отказ = ОбщийМодульКлиент.ЗапускЗапрещен();
    КонецПроцедуры
     
    Процедура ПередЗавершениемРаботыСистемы(Отказ)
    Отказ = ОбщийМодульКлиент.ВыходЗапрещен();
    КонецПроцедуры
     
    Процедура ПриНачалеРаботыСистемы()
    Если ОбщийМодульСервер.ТекущийПользовательАдминистратор() = Ложь тогда
    ОбщийМодульКлиент.ВывестиМенюОбедаДляВыбора();
    конецЕсли;
    КонецПроцедуры
    </code>
    Модуль ОбщийМодульКлиент:
    Функция ЗапускЗапрещен()   экспорт
     
    ТекущийГод = Год(ТекущаяДата());
    ТекущийМесяц = Месяц(ТекущаяДата());
    ТекушийДень = День(ТекущаяДата());
    ПустаяДата=Дата(1,1,1);
     
    НачалоРаботыПоГрафику = ОбщийМодульСервер.ПолучитьЗначениеКонстанты(“НачалоРаботыПоГрафику”);
    КонецРаботыПоГрафику = ОбщийМодульСервер.ПолучитьЗначениеКонстанты(“КонецРаботыПоГрафику”);
     
    Если НЕ (НачалоРаботыПоГрафику=ПустаяДата или КонецРаботыПоГрафику=ПустаяДата )тогда
    НачалоРаботыПоГрафику = Дата(ТекущийГод,ТекущийМесяц,ТекушийДень,Час(НачалоРаботыПоГрафику),Минута(НачалоРаботыПоГрафику),Секунда(НачалоРаботыПоГрафику));
    КонецРаботыПоГрафику = Дата(ТекущийГод,ТекущийМесяц,ТекушийДень,Час(КонецРаботыПоГрафику),Минута(КонецРаботыПоГрафику),Секунда(КонецРаботыПоГрафику));
    если ТекущаяДата() < НачалоРаботыПоГрафику или ТекущаяДата() > КонецРаботыПоГрафику тогда
    Предупреждение(“Вход запрещен!”,60);
    возврат Истина;
    конецЕсли;
    конецЕсли;
     
    Возврат Ложь
    КонецФункции
     
     
    Функция ВыходЗапрещен()  экспорт
    НачалоРаботыПоГрафику = ОбщийМодульСервер.ПолучитьЗначениеКонстанты(“НачалоРаботыПоГрафику”);
    КонецРаботыПоГрафику = ОбщийМодульСервер.ПолучитьЗначениеКонстанты(“КонецРаботыПоГрафику”);
     
    ТекущийГод = Год(ТекущаяДата());
    ТекущийМесяц = Месяц(ТекущаяДата());
    ТекущийДень = День(ТекущаяДата());
     
    НачалоРаботыПоГрафику = Дата(ТекущийГод,ТекущийМесяц,ТекущийДень,Час(НачалоРаботыПоГрафику),Минута(НачалоРаботыПоГрафику),Секунда(НачалоРаботыПоГрафику));
    КонецРаботыПоГрафику = Дата(ТекущийГод,ТекущийМесяц,ТекущийДень,Час(КонецРаботыПоГрафику),Минута(КонецРаботыПоГрафику),Секунда(КонецРаботыПоГрафику));
     
    если ТекущаяДата() < КонецРаботыПоГрафику и ТекущаяДата() > НачалоРаботыПоГрафику  тогда
    Ответ = Вопрос(“Рабочий день не закончился! Вы уверенны, что хотите покинуть программу? “,
    РежимДиалогаВопрос .ДаНет,30,кодвозвратаДиалога.Нет,”Выход из программы”,кодвозвратаДиалога.Да);
    Возврат ?(Ответ=КодВозвратаДиалога.Нет,Истина,Ложь);
    конецЕсли;
     
    Возврат Ложь
    КонецФункции
     
    процедура ВывестиМенюОбедаДляВыбора()  экспорт
     
    спГлОбед=ОбщийМодульСервер.ЗаполнитьСписокОбеда();
    Если Не спГлОбед=Неопределено тогда
    флВыбора=Ложь;
    Пока Не флВыбора Цикл
    спГлОбед.ОтметитьЭлементы(“Укажите, что вы будете на обед”);
    Для Каждого Элемента из спГлОбед Цикл
    Если Элемента.Пометка=Истина тогда
    ОбщийМодульСервер.ДобавитьОбед(Элемента.значение);
    флВыбора=Истина;
    конецЕсли;
    КонецЦикла;
    КонецЦикла;
    конецЕсли;
    КонецПроцедуры
    </code>
    ОбщийМодульСервер:
    <code>
    Функция ТекущийПользовательАдминистратор() экспорт
    возврат ПараметрыСеанса.ТекущийПользователь.Администратор;
    КонецФункции
     
    Функция ПолучитьЗначениеКонстанты(имяКонстанты)  экспорт
    Константа=Константы.СоздатьНабор(имяКонстанты);
    Константа.Прочитать();
    Возврат Константа[имяКонстанты];
    КонецФункции
     
    процедура ДобавитьОбед(ВыбОбед) Экспорт
    ДатаОбеда=НачалоДня(ТекущаяДата());
    ОбъектОбеды=Справочники.ОбедыПользователей.СоздатьЭлемент();
    ОбъектОбеды.Владелец=ПараметрыСеанса.ТекущийПользователь.Ссылка;
    ОбъектОбеды.ВариантыОбеда=ВыбОбед;
    ОбъектОбеды.Дата=ДатаОбеда;
    ОбъектОбеды.Записать();
     
    конецПроцедуры
     
    функция ЗаполнитьСписокОбеда()   экспорт
    спГлОбед=Новый СписокЗначений();
    ДатаОбеда=НачалоДня(ТекущаяДата());
    Ссылка=Справочники.ОбедыПользователей.НайтиПоРеквизиту(“Дата”,ДатаОбеда);
    если Ссылка=Справочники.ОбедыПользователей.ПустаяСсылка()тогда
    ВыборкаОбед=Справочники.ВариантыОбеда.Выбрать();
    Пока выборкаОбед.Следующий() цикл
    если ВыборкаОбед.ПометкаУдаления=0 тогда
    спГлОбед.Добавить(ВыборкаОбед.Ссылка,ВыборкаОбед.Наименование);
    конецЕсли;
    конецЦикла;
    возврат спГлОбед
    иначе
    возврат Неопределено;
    конецЕсли;
    КонецФункции // ВыборОбеда()
    </code>
    Общий модуль «Пользователи»:
    Функция УстановитьПараметрСеансаТекущийПользователь()    экспорт
    ИмяПользователя=ИмяПользователя();
    ПолноеИмяПользователя=ПолноеИмяПользователя();
    Ссылка=Справочники.Пользователи.НайтиПоКоду(ИмяПользователя);
    Если Ссылка=справочники.Пользователи.ПустаяСсылка() Тогда
    СсылкаНового = Справочники.Пользователи.ПолучитьСсылку();
    ОбъектПользователь = Справочники.Пользователи.СоздатьЭлемент();
    ОбъектПользователь.Код          = ИмяПользователя;
    ОбъектПользователь.Наименование = ПолноеИмяПользователя;
    ОбъектПользователь.УстановитьСсылкуНового(СсылкаНового);
    Попытка
    ОбъектПользователь.Записать();
    Исключение
    ВызватьИсключение “Возникла ошибка при создание при добавления пользователя в справочник ” + ИмяПользователя+”.” + ОписаниеОшибки();
    КонецПопытки;
    Ссылка = ОбъектПользователь.Ссылка;
    КонецЕсли;
    ПараметрыСеанса.ТекущийПользователь = Ссылка;
    КонецФункции
     
     

  5. Дмитрий 23.04.2011 в 00:54

    Задание выполнил.
    Обычно я не использую метод “Выбрать()”, но т.к. мы еще не прошли запросы :0), сначала решил использовать именно его. Следующий код почему-то не отработал.
    <code>
    СтруктураОтбор = Новый Структура(“Дата”, НачалоДня(Дата));
    Выборка = Справочники.ВариантыОбедов.Выбрать(, Пользователь, СтруктураОтбор);
    </code>
    У реквизита “Дата” проставил индексирование, менял имя. Подскажите, пожалуйста, что делаю не так.
    В итоге плюнул и решил использовать запрос.
    //Модуль сеанса
    <code>

    Процедура УстановкаПараметровСеанса(ТребуемыеПараметры)

    ПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь();
    Если НЕ ЗначениеЗаполнено(ПользовательИБ.Имя) Тогда
    Возврат;
    КонецЕсли;

    ТекПользователь = Справочники.Пользователи.НайтиПоНаименованию(ПользовательИБ.ПолноеИмя, Истина);
    Если НЕ ЗначениеЗаполнено(ТекПользователь) Тогда
    ПользовательОбъект = Справочники.Пользователи.СоздатьЭлемент();
    ПользовательОбъект.Наименование = ПользовательИБ.ПолноеИмя;
    ПользовательОбъект.Администратор = (ПользовательИБ.Имя = “Администратор”);
    ПользовательОбъект.Записать();

    ТекПользователь = ПользовательОбъект.Ссылка;
    КонецЕсли;

    ПараметрыСеанса.ТекущийПользователь = ТекПользователь;

    КонецПроцедуры
    Процедура УстановкаПараметровСеанса(ТребуемыеПараметры) ПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь(); Если НЕ ЗначениеЗаполнено(ПользовательИБ.Имя) Тогда Возврат; КонецЕсли; ТекПользователь = Справочники.Пользователи.НайтиПоНаименованию(ПользовательИБ.ПолноеИмя, Истина); Если НЕ ЗначениеЗаполнено(ТекПользователь) Тогда ПользовательОбъект = Справочники.Пользователи.СоздатьЭлемент(); ПользовательОбъект.Наименование = ПользовательИБ.ПолноеИмя; ПользовательОбъект.Администратор = (ПользовательИБ.Имя = “Администратор”); ПользовательОбъект.Записать(); ТекПользователь = ПользовательОбъект.Ссылка; КонецЕсли; ПараметрыСеанса.ТекущийПользователь = ТекПользователь; КонецПроцедуры
    </code>
    //Модуль управляемого приложения
    <code>

    Перем глОбед;
    Перем мНачалоРабочегоДня, мКонецРабочегоДня;

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

    Если НЕ Общий.ВыполнятьПроверкуМоментаВходаВыхода() Тогда
    Возврат;
    КонецЕсли;

    Если НЕ ЗначениеЗаполнено(мНачалоРабочегоДня) ИЛИ НЕ ЗначениеЗаполнено(мКонецРабочегоДня) Тогда
    Возврат;
    КонецЕсли;

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

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

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

    МенюПользователя = Общий.ПолучитьМенюПользователя(ТекущаяДата());

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

    Общий.ЗаписатьМенюПользователя(ТекущаяДата(), глОбед);

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

    Если НЕ Общий.ВыполнятьПроверкуМоментаВходаВыхода() Тогда
    Возврат;
    КонецЕсли;

    Если НЕ ЗначениеЗаполнено(мНачалоРабочегоДня) ИЛИ НЕ ЗначениеЗаполнено(мКонецРабочегоДня) Тогда
    Возврат;
    КонецЕсли;

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

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

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

    ВариантыОбеда = Общий.ПолучитьСписокОбедов();
    ВариантыОбеда.ОтметитьЭлементы(“Укажите вариант обеда.”);

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

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

    </code>
    //Общий модуль
    <code>

    &НаСервере
    Функция ПолучитьЗначениеКонстанты(Имя) Экспорт

    Возврат Константы[Имя].Получить();

    КонецФункции
     
    &НаСервере
    Функция ПолучитьСписокОбедов() Экспорт

    Выборка = Справочники.ВариантыОбедов.Выбрать();

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

    СписокОбедов.Добавить(Выборка.Ссылка);
    КонецЦикла;

    Возврат СписокОбедов;

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

    &НаСервере
    Функция ПолучитьМенюПользователя(Дата) Экспорт

    //СтруктураОтбор = Новый Структура(“Дата”, НачалоДня(Дата));
    //Выборка = Справочники.ВариантыОбедов.Выбрать(, Пользователь, СтруктураОтбор);

    Запрос = Новый Запрос;
    Запрос.Текст =
    “ВЫБРАТЬ
    | ОбедыПользователей.Ссылка
    |ИЗ
    | Справочник.ОбедыПользователей КАК ОбедыПользователей
    |ГДЕ
    | (НЕ ОбедыПользователей.ПометкаУдаления)
    | И ОбедыПользователей.Владелец = &Владелец
    | И ОбедыПользователей.Дата = &Дата”;

    Запрос.УстановитьПараметр(“Владелец”, ПараметрыСеанса.ТекущийПользователь);
    Запрос.УстановитьПараметр(“Дата”, НачалоДня(Дата));

    Выборка = Запрос.Выполнить().Выбрать();

    МенюПользователя = Новый СписокЗначений;
    Пока Выборка.Следующий() Цикл
    МенюПользователя.Добавить(Выборка.Ссылка);
    КонецЦикла;

    Возврат МенюПользователя;

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

    &НаСервере
    Процедура ЗаписатьМенюПользователя(Дата, МенюПользователя) Экспорт

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

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

    &НаСервере
    Функция ВыполнятьПроверкуМоментаВходаВыхода() Экспорт

    Возврат (ЗначениеЗаполнено(ПараметрыСеанса.ТекущийПользователь) И НЕ ПараметрыСеанса.ТекущийПользователь.Администратор);

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

    </code>

    • >Следующий код почему-то не отработал.
      Визуально в коде проблем нет.
      Я так понимаю возвращается пустая выборка.
      Думаю, что проблема в параметрах. Посмотрите значение переменных Пользователь и Дата, обратите внимание на типы данных.

      • Дмитрий 23.04.2011 в 20:54

        Говорит “Недопустимое значение параметра (параметр номер ‘3’)”
        В отладчике первым делом проверил
        Пользователь – Значение = “Менеджер” Тип “СправочникСсылка.Пользователи”
        Дата – Значение= 22.04.2011 0:00:00 Тип = “Дата”
        Права на реквизите “Дата” в справочнике стоят 80\

        • Дмитрий 23.04.2011 в 21:04

          Извиняюсь, очевидная ошибка. Делал ночью после трудовой недели. Делаю выборку не по тому справочнику. Вопрос закрыт.

  6. Код – http://imagepost.ru/images/d/z5/dz5_code.png
    Скриншот после захода под пользователем “Администратор” – http://imagepost.ru/images/d/z5/dz5_screen.png
    Для выбора обедов создал форму выбора для справочника “Виды обедов” с возможностью множественного выбора и фильтрацией помеченных на удаление.

  7. Виталий Межаков 23.04.2011 в 00:12

    Домашнее задание №5
    Видоизменил алгоритмы согласно заданию.
    Измененный модуль ПриНачалеРаботыСистемы()
    Добавленные серверные процедуры

  8. 1. Добавил все справочники и константы
    2. В параметры сеанса закинул тек-го пользователя
    3. Завел в мод-е упр-го прилож-я для дальнейшей проверки перем Администратор(булево,цепляется с тек-го пользователя)
    4. Подцепил константы в график работы
    5. ПриНачалеРаботыСистемы добавил проверку на нового пользователя и переделал выбор обеда под условия задания
      
    Все представлено на скринах
    Модуль сеанса:
    http://imagepost.ru/?v=wxhlzbiaqarzczcfcgbcsxqxybxdji.JPG
    Модуль Упр-го Прилож-я
    http://imagepost.ru/?v=roejwdiifflbnitttswxuviydwkwaj.JPG
    ОбщиеФункцииСервер
    http://imagepost.ru/?v=ser1_1.JPG
    http://imagepost.ru/?v=ser2.JPG
    ОбщиеФункцииКлиент
    http://imagepost.ru/?v=client.JPG
    P.S. надеюсь успел =), а то запарка со временем думал не неуспею

  9. Задание выполнила, не большие проблемки были только с разнесением на сервер и клиент, но я думаю это дело привычки.

  10. Выполнил:
    1.Модуль УправляемогоПриложения:
    http://s43.radikal.ru/i102/1104/fa/fb5acfe82573.gif
    2. ОбщиеФункцииКлиент:
    http://s001.radikal.ru/i193/1104/0c/2e3ad2fe1e6b.gif
    3.ОбщиеФункцииСервер:
    http://s49.radikal.ru/i126/1104/3d/8f3e296bf70e.gif
    4.МодульСеанса:
    http://s41.radikal.ru/i092/1104/da/de7a79a7f16f.gif

  11. С заданием справился. Ведь насколько я понял нет необходимости приводить весь листинг программы? а задавать лишь возникшие вопросы куратору проекта?

    • Необходимо коротко описать ход решения (можно 3-мя пунктами). А можно и привести листинг, по Вашему желанию.

  12. И Вопрос, после того как все написал отладил, и понял что местами, стандартные реквизиты справочника такие как Наименование не нужны, попытался убрать Длина наименования = 0,
    Получил ошибку !!!Справочник.ОбедыПользователей: Указано неверное поле для ввода по строке: Наименование. Где это исправить?

    • В окне редактирования объекта на закладке “Формы” поработайте со свойством “Ввод по строке”.

      • Спасибо, сразу нашел в нижней части формы. Все ОК.

  13. Вдогонку
    Реквизит Дата в Справочнике ОбедыПользователей свойство Индексировать = Индексировать, так как использовал в отборе

  14. Отчет о выполнении ДЗ5
     
    Создал:
     
     Константы: НачалоРаботы и КонецРаботы – свойство Состав даты = Время;
     
    Справочники:
    ВариантыОбедов, создал предопределенные элементы;
     ОбедыПользователей – свойство Владельцы = Справочник.Пользователи
     Пользователи;
     
    Роли:
    ПолныеПрава – взвел флаг устанавливать права для новых объектов;
     
    Параметры сеанса:
    ТекущийПользователь – Тип СправочникСсылка.Пользователи;
     
    Список пользователей:
    Администратор и Менеджер;
     
    Синхронизация пользователей. Использовал УникальныйИдентификатор
     
    Модуль сеанса.
    <code>Процедура УстановкаПараметровСеанса(ТребуемыеПараметры)
     
                    Пользователи.ОпределитьТекущегоПользователя();
     
    КонецПроцедуры </code>
     
    Новый общий модуль Пользователи – свойства Сервер, Вызов сервера
    <code>Процедура ОпределитьТекущегоПользователя() Экспорт
     
                    ИдентификаторПользователяИБ = ПользователиИнформационнойБазы.ТекущийПользователь().УникальныйИдентификатор;
                    ИмяПользователя = ПользователиИнформационнойБазы.ТекущийПользователь().Имя;
     
                    Запрос = Новый Запрос;
                    Запрос.Параметры.Вставить(“ИдентификаторПользователяИБ “, ИдентификаторПользователяИБ);
                   
                    Запрос.Текст =
                    “ВЫБРАТЬ ПЕРВЫЕ 1
                    |             Пользователи.Ссылка КАК Ссылка
                    |ИЗ
                    |             Справочник.Пользователи КАК Пользователи
                    |ГДЕ
                    |             Пользователи.ИдентификаторПользователяИБ = &ИдентификаторПользователяИБ”;
                    РезультатПользователи = Запрос.Выполнить();
     
                    Если РезультатПользователи.Пустой() Тогда
                                   СсылкаНового = Справочники.Пользователи.ПолучитьСсылку();
                                   ПараметрыСеанса.ТекущийПользователь = СсылкаНового;
                                  
                                   НовыйПользователь = Справочники.Пользователи.СоздатьЭлемент();
                                   НовыйПользователь.ИдентификаторПользователяИБ = ИдентификаторПользователяИБ;
                                   НовыйПользователь.Наименование                = ИмяПользователя;
                                   НовыйПользователь.УстановитьСсылкуНового(СсылкаНового);
                                  
                                   Попытка
                                                   НовыйПользователь.Записать();
                                   Исключение
                                                   //Сообщить(“!”);
                                   КонецПопытки;
                                  
                    Иначе
                                   Выборка = РезультатПользователи.Выбрать();
                                   Выборка.Следующий();
                                   ПараметрыСеанса.ТекущийПользователь = Выборка.Ссылка;
                    КонецЕсли;
                   
    КонецПроцедуры</code>
     
    Реализовал проверки: Администратору можно работать всегда и без еды, Менеджеру обязательно выбрать обед один раз в день и ограничение времени
     
    Модуль управляемого приложения
     
    <code>Перем НачалоРаботы;
    Перем ОкончаниеРаботы;
    Перем ДатаЗапуска;
     
     
    Процедура ПередНачаломРаботыСистемы(Отказ)
                   
                    ОбщиеФункцииКлиент.УстановитьГрафик(НачалоРаботы, ОкончаниеРаботы);
                   
                    Если НЕ ОбщиеФункцииСервер.ПоверкаНаАдминистратора() Тогда
                                   Отказ = ОбщиеФункцииКлиент.ЗапускЗапрещен(НачалоРаботы, ДатаЗапуска, ОкончаниеРаботы);
                    КонецЕсли;
                   
    КонецПроцедуры
     
    Процедура ПриНачалеРаботыСистемы()
                   
                    Если НЕ ОбщиеФункцииСервер.ПоверкаНаАдминистратора()
                                   И НЕ ОбщиеФункцииСервер.ЗаказалПользовательОбед() Тогда
                                  
                                   ОбщиеФункцииСервер.ЗаписатьОбедПользователя(ОбщиеФункцииКлиент.ВыбратьОбеды());
                                  
                    КонецЕсли;
                   
    КонецПроцедуры
     
    Процедура ПередЗавершениемРаботыСистемы(Отказ)
                   
                    Отказ = ОбщиеФункцииКлиент.ЗавершениеЗапрещено(ОкончаниеРаботы, ДатаЗапуска);
                   
    КонецПроцедуры</code>
     
    Общий модули ОбщиеФункцииКлиент
    Здесь изменений мало, только рабочее время получаю из констант.
     <code>Функция ПолучитьДату() Экспорт
     
                    Возврат МестноеВремя(ОбщиеФункцииСервер.ПолучитьДатуСервер());
     
    КонецФункции // ПолучитьДату() Экспорт()
     
    Процедура УстановитьГрафик(НачалоРаботы, ОкончаниеРаботы) Экспорт
     
                    ДатаЗапуска = ОбщиеФункцииКлиент.ПолучитьДату();
                   
                    // получаю рабочее время из констант
                    КоллекцияРабочееВремя = ОбщиеФункцииСервер.ПолучитьРабочееВремя();
                   
                    НачалоРаботы = Дата(Год(ДатаЗапуска),Месяц(ДатаЗапуска),День(ДатаЗапуска),
                                                                                   Час(КоллекцияРабочееВремя.НачалоВремя),Минута(КоллекцияРабочееВремя.НачалоВремя),Секунда(КоллекцияРабочееВремя.НачалоВремя));
                    ОкончаниеРаботы = Дата(Год(ДатаЗапуска),Месяц(ДатаЗапуска),День(ДатаЗапуска),
                                                                                   Час(КоллекцияРабочееВремя.ОкончаниеВремя),Минута(КоллекцияРабочееВремя.ОкончаниеВремя),Секунда(КоллекцияРабочееВремя.ОкончаниеВремя));
     
    КонецПроцедуры
     
    Функция ЗапускЗапрещен(НачалоРаботы, ДатаЗапуска, ОкончаниеРаботы) Экспорт
     
                    ДатаЗапуска = ОбщиеФункцииКлиент.ПолучитьДату();
                   
                    Если ДатаЗапуска<НачалоРаботы ИЛИ ДатаЗапуска>ОкончаниеРаботы Тогда
                   
                                   Предупреждение(“Не время работать!”, 5);
                                   Возврат Истина;
                   
                    КонецЕсли;
                   
                    Возврат Ложь;
     
    КонецФункции // ЗапускЗапрещен(НачалоРаботы) Экспорт()
     
     
    Функция ЗавершениеЗапрещено(ОкончаниеРаботы, ДатаЗапуска) Экспорт
     
                    ДатаВыхода = ОбщиеФункцииКлиент.ПолучитьДату();
                   
                    Если ДатаВыхода<ОкончаниеРаботы Тогда
                   
                                   Если Вопрос(“Еще поработаем?!”, РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Да Тогда
                                                   Возврат Истина;
                                   КонецЕсли;
                   
                    КонецЕсли;
                   
                    Возврат Ложь;
     
    КонецФункции // ЗавершениеЗапрещено(ОкончаниеРаботы) Экспорт()
     
     
    Функция ВыбратьОбеды() Экспорт
     
                    Массив = Новый Массив;
                    СписокОбедов = Новый СписокЗначений;
                   
                    //Варианты обеда беру из одноименного справочника
                    СписокОбедов.ЗагрузитьЗначения(ОбщиеФункцииСервер.ПрочитатьВариантыОбедов());
                   
                    Пока Не СписокОбедов.ОтметитьЭлементы(“Выберите обед”) Цикл
                                   Сообщить(“Нужно выбрать хотя бы один вариант обеда!”);
                    КонецЦикла;
     
                    Для каждого ЭлементСписка Из СписокОбедов Цикл
                                   Если ЭлементСписка.Пометка Тогда
                                                   Массив.Добавить(ЭлементСписка.Значение);
                                   КонецЕсли;
                    КонецЦикла;
     
                    Возврат Массив;
                   
    КонецФункции // ВыбратьОбеды() Эскорт()</code>
     
    Общие модули ОбщиеФункцииСервер
    Здесь изменений не мало: администратора достаю из ПараметровСеанса, Константы структурой, Читаю варианты обедов из справочника, записываю ОбедыПользователя и проверяю выбрал ли пользователь на дату обед.
     <code>Функция ПолучитьДатуСервер() Экспорт
     
                    Возврат ТекущаяУниверсальнаяДата();
     
    КонецФункции // ПолучитьДату() Экспорт()
     
    Функция ПоверкаНаАдминистратора() Экспорт
     
                    Возврат ПараметрыСеанса.ТекущийПользователь.Администратор;             
     
    КонецФункции // ПоверкаАдминистратора()
     
    Функция ПолучитьРабочееВремя() Экспорт
     
                    Возврат Новый Структура(“НачалоВремя,ОкончаниеВремя”,
                                                                                                  Константы.НачалоРаботы.Получить(),
                                                                                                  Константы.КонецРаботы.Получить());
     
    КонецФункции // ПолучитьРабочееВремя()
     
    Функция ПрочитатьВариантыОбедов() Экспорт
     
                    МассивВариантовОбедов = Новый Массив;
                   
                    ВыборкаСправочника = Справочники.ВариантыОбедов.Выбрать();
                    Пока ВыборкаСправочника.Следующий() Цикл
                                  
                                   //выбираем только непомеченные на удаление
                                   Если НЕ ВыборкаСправочника.Ссылка.ПометкаУдаления Тогда
                                                   МассивВариантовОбедов.Добавить(ВыборкаСправочника.Ссылка);                                                                                          
                                   КонецЕсли;
                                  
                    КонецЦикла;
     
                    Возврат МассивВариантовОбедов;
                   
    КонецФункции // ПрочитатьВариантыОбедов()
     
    Функция ЗаписатьОбедПользователя( МассивВыбранныхОбедов ) Экспорт
     
                    Для каждого Элемент Из МассивВыбранныхОбедов Цикл
                   
                                   НовыйОбъект                                                                = Справочники.ОбедыПользователей.СоздатьЭлемент();
                                   НовыйОбъект.Владелец                          = ПараметрыСеанса.ТекущийПользователь;
                                   НовыйОбъект.Дата                                     = ТекущаяДата();
                                   НовыйОбъект.ВариантОбеда                = Элемент;
                                   НовыйОбъект.Записать();
                   
                    КонецЦикла;  
                   
    КонецФункции // ЗаписатьОбедПользователя()
     
    Функция ЗаказалПользовательОбед() Экспорт
     
                    Отбор = Новый Структура( “Дата”, НачалоДня(ТекущаяДата()) );
                    ВыборкаПодчиненныхЭлементов = Справочники.ОбедыПользователей.Выбрать(,ПараметрыСеанса.ТекущийПользователь, Отбор);            
     
                    Пока ВыборкаПодчиненныхЭлементов.Следующий() Цикл
                                  
                                   Возврат Истина;
                                  
                    КонецЦикла;
                   
                    Возврат Ложь;
                   
    КонецФункции // ПроверитьОбедПользователяНаСегодня()</code>

    • Расскажите, каким образом вставляете табуляцию?

      • Самому не нравиться такой разброс. Весь отчет оформляю в Word-е, затем Вам в коммены, в комментах вставляю еще теги и вот результат. Решил следующий отчет напрямую выдать без Word-а.

        • На мой взгляд такой отчет является хорошо читаемым.
          Без табуляций было бы гораздо хуже…

  15. Yuri Golovko 22.04.2011 в 20:38

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

    • Yuri Golovko 22.04.2011 в 21:38

      Обработчики событий ПередНачаломРаботыСистемы и ПриНачалеРаботыСистемы в модуле управляемого приложения следует исправить следующим образом:
      <code>
      Процедура ПередНачаломРаботыСистемы(Отказ)
       ОбщиеФункцииКлиент.УстановитьГрафик(НачалоРаботы, ОкончаниеРаботы);
       Если ЗначениеЗаполнено(НачалоРаботы) И ЗначениеЗаполнено(ОкончаниеРаботы) Тогда
        Отказ = ОбщиеФункцииКлиент.ЗапускЗапрещен(ДатаЗапуска, НачалоРаботы, ОкончаниеРаботы);
       КонецЕсли;
      КонецПроцедуры
      Процедура ПриНачалеРаботыСистемы()
       Если Не ОбщиеФункцииСервер.ПроверитьПолномочияАдминистратора() И Не ОбщиеФункцииСервер.ПроверитьВыборОбеда() Тогда   
        ОбщиеФункцииКлиент.ВыбратьОбеды();
       КонецЕсли; 
      КонецПроцедуры
      </code>

  16. Майор 22.04.2011 в 19:13

    Создал константы, справочники, роли, пользователей в соответствии с заданием.
    Внёс изменения в алгоритмы в связи с использованием справочников (в основном – ОбщиеФункцииСервер).
    Немного задумался, когда вылитела ошибка, связанная с неустановкой значения Владельца при добавлении записи в справочник ОбедыПользователей. Решение привожу:
    <code>
    Процедура ЗаписьОбедовНаСервере(глОбед) Экспорт

    НовыйЭлемент = Справочники.ОбедыПользователей.СоздатьЭлемент();

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

    КонецПроцедуры // ЗаписьОбедовНаСервере(глОбед)
    </code>

    В остальном – проблем не было.

    Приведу ещё функцию, которая проверяет – был ли уже сегодня выбран обед пользователем (не первый вход в систему):
    <code>
    Функция ПроверкаОбедВыбран(ТекущийПользователь) Экспорт
    Выборка = Справочники.ОбедыПользователей.Выбрать();
    ОбедВыбран = Ложь;
    Пока Выборка.Следующий() Цикл
    Если Строка(Выборка.Владелец) = ТекущийПользователь Тогда
    Если НачалоДня(Выборка.Дата) = НачалоДня(ПолучитьДату()) Тогда
    ОбедВыбран = Истина;
    Иначе
    ОбедВыбран = Ложь;
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;
    Возврат ОбедВыбран;
    КонецФункции
    </code>

    • Майор 22.04.2011 в 19:37

      Почитал отчёты коллег…. задумался…. код надо целиком выкладывать? (мне не трудно, просто где-то звучало, что не стОит…)
      Вопрос не по делу, сисадмин – не человек? Зачем его без обеда оставили?
      Вопрос по делу: в задании звучало – “Варианты обеда берутся из одноименного справочника (как минимум 3 варианта,  но пользователь может добавить собственные)”. Варианты обеда берутся – имеется ввиду берутся при старте системы, для того, чтоб пользователь выбрал обед? Но пользователь может добавить собственные – добавить уже после выбора и входа, я так понял – добавить в справочник (соответственно новый обед возможно будет выбрать только на следующий день). По-крайней мере я сделал исходя из таких соображений…. Или переделать надо?

      • >код надо целиком выкладывать
        Нет, этого не требуется. Но если очень хочется, то можно :)

        Упростил формулировку, сейчас она выглядит так:
        • Варианты обеда выбираются из одноименного справочника, но выбирать нужно элементы, не помеченные на удаление

  17. Юрий Торговцев 22.04.2011 в 18:58

    Задание выполнил.  За основу взял Ваш вариант решения домашнего задания №4.
    Модуль управляемого приложения приобрел следующий вид
    <code>
    Перем НачалоРаботы;
    Перем ОкончаниеРаботы;
    Перем ДатаЗапуска;
    Перем глОбед Экспорт;

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

    ОбщиеФункцииКлиент.УстановитьГрафик(НачалоРаботы, ОкончаниеРаботы);

    ОбщиеФункцииСервер.ДобавитьПользователя();

    Если Не ОбщиеФункцииСервер.ТекущийПользовательАдминистратор() Тогда

    Отказ = ОбщиеФункцииКлиент.ЗапускЗапрещен(НачалоРаботы, ДатаЗапуска, ОкончаниеРаботы);

    КонецЕсли;

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

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

    ОбщиеФункцииКлиент.УстановитьГрафик(НачалоРаботы, ОкончаниеРаботы);

    Если Не ОбщиеФункцииСервер.ТекущийПользовательАдминистратор() Тогда

    Отказ = ОбщиеФункцииКлиент.ЗавершениеЗапрещено(ОкончаниеРаботы, ДатаЗапуска);

    КонецЕсли;

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

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

    Если Не ОбщиеФункцииСервер.ТекущийПользовательАдминистратор() И Не ОбщиеФункцииСервер.ВыборОбедаСделан() Тогда

    глОбед = ОбщиеФункцииКлиент.ВыбратьОбеды();

    ОбщиеФункцииСервер.ЗаписатьВыборОбеда(глОбед);

    КонецЕсли;

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

    </code>
    В модуль ОбщиеФункцииСервер были добавлены следующие процедуры и функции
    <code>
    Процедура ДобавитьПользователя() Экспорт

    АктивныйПользователь = ПользователиИнформационнойБазы.ТекущийПользователь();
    Ссылка = Справочники.Пользователи.НайтиПоНаименованию(АктивныйПользователь);

    Если Ссылка = Справочники.Пользователи.ПустаяСсылка() Тогда

    НовыйЭлемент = Справочники.Пользователи.СоздатьЭлемент();
    НовыйЭлемент.Наименование = АктивныйПользователь;
    НовыйЭлемент.Записать();

    КонецЕсли;

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

    Функция ТекущийПользовательАдминистратор() Экспорт

    АктивныйПользователь = ПользователиИнформационнойБазы.ТекущийПользователь();
    Ссылка = Справочники.Пользователи.НайтиПоНаименованию(АктивныйПользователь);

    Если Ссылка.ПолучитьОбъект().Администратор Тогда

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

    КонецЕсли;

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

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

    Процедура ЗаполнитьСписокОбедов(СписокОбедов) Экспорт

    Выборка = Справочники.ВариантыОбедов.Выбрать();

    Пока Выборка.Следующий() Цикл

    Если Не Выборка.ПометкаУдаления Тогда

    СписокОбедов.Добавить(Выборка.ПолучитьОбъект().Наименование);

    КонецЕсли;

    КонецЦикла;

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

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

    АктивныйПользователь = ПользователиИнформационнойБазы.ТекущийПользователь();
    СсылкаВладелец = Справочники.Пользователи.НайтиПоНаименованию(АктивныйПользователь);

    Для каждого Элемент Из Обеды Цикл

    НовыйЭлемент = Справочники.ОбедыПользователей.СоздатьЭлемент();

    НовыйЭлемент.Наименование = Элемент;
    СсылкаЭлемент = Справочники.ВариантыОбедов.НайтиПоНаименованию(Элемент);
    НовыйЭлемент.ВариантОбеда = СсылкаЭлемент;
    НовыйЭлемент.Дата = НачалоДня(ТекущаяДата());
    НовыйЭлемент.Владелец = СсылкаВладелец;
    НовыйЭлемент.Записать();

    КонецЦикла;

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

    Функция ВыборОбедаСделан() Экспорт

    АктивныйПользователь = ПользователиИнформационнойБазы.ТекущийПользователь();

    СсылкаВладелец = Справочники.Пользователи.НайтиПоНаименованию(АктивныйПользователь);

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

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

    КонецЕсли;

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

    КонецФункции
    </code>
    В модуле ОбщиеФункцииКлиент внесены изменения в функциию ВыбратьОбеды()
    Функция ВыбратьОбеды() Экспорт

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

    ОбщиеФункцииСервер.ЗаполнитьСписокОбедов(СписокОбедов);

    Обеды = Новый Массив;
    ВыбранОбед = Ложь;

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

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

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

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

    КонецЦикла;

    КонецЦикла;

    Возврат Обеды;

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

     
     

  18. kuznetsovimail 22.04.2011 в 17:47

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

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

    Функция ЭтоАдминистратор() Экспорт
    ТекПольз=ПользователиИнформационнойБазы.ТекущийПользователь();
    Если Строка(ТекПольз)=”Администратор” тогда
    Возврат Истина;
    Иначе Возврат Ложь;
    КонецЕсли;

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

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

    КонецФункции
     
    Процедура Синхронизация() Экспорт
    ТекПольз=ПользователиИнформационнойБазы.ТекущийПользователь();
    Если  Справочники.Пользователи.НайтиПоНаименованию(ТекПольз)=
    Справочники.Пользователи.ПустаяСсылка() Тогда
    НовыйЭлемент=Справочники.Пользователи.СоздатьЭлемент() ;
    НовыйЭлемент.Наименование=ТекПольз ;
    Если Строка(ТекПольз)=”Администратор” тогда
    НовыйЭлемент.Администратор=Истина;
    КонецЕсли;
    НовыйЭлемент.Записать() ;
    КонецЕсли;

    КонецПроцедуры
    Функция ЗаполнениеСписка() Экспорт
    Список= Новый Массив;
    Выборка=Справочники.ВариантыОбедов.Выбрать();
    Пока Выборка.Следующий() Цикл
    Список.Добавить(Выборка.Наименование);
    КонецЦикла;
    Возврат Список;
    КонецФункции
    Процедура ЗаписьЭлемента(Элемент) Экспорт
    Спр=Справочники.ОбедыПользователей.СоздатьЭлемент();
    Спр.дата=ТекущаяДата();
    Вариант=Справочники.ВариантыОбедов.НайтиПоНаименованию(Элемент);
    Спр.ВариантОбеда=Вариант;
    Пользователь=Справочники.Пользователи.
    НайтиПоНаименованию(ПользователиИнформационнойБазы.ТекущийПользователь());
    Спр.Владелец=Пользователь;
    Спр.записать();
    КонецПроцедуры
     
    Функция ПроверкаНаПовтор()Экспорт
    Пользователь=Справочники.Пользователи.
    НайтиПоНаименованию(ПользователиИнформационнойБазы.ТекущийПользователь());
    Обеды=Справочники.ОбедыПользователей;
    Выборка=Обеды.Выбрать(,Пользователь);
    Пока Выборка.Следующий() Цикл
    Если День(Выборка.Дата)=День(ТекущаяДата()) тогда
    Возврат Истина;
    КонецЕсли;
    КонецЦикла;
    Возврат Ложь;
    КонецФункции
    </code>

  19. Задание выполнил.
    1) Общий модуль сервера:
    http://i041.radikal.ru/1104/f5/12816a11be13.png
    2) Общий модуль клиента:
    http://s15.radikal.ru/i189/1104/9a/ce5daf726ef8.png
    3) Модуль упр приложения
    http://s50.radikal.ru/i128/1104/d7/4301f6da0f35.png
    Когда создал справочник обеды пользователей пытался убрать код и наименование, но система выдала “Указано неверное поле ввода по строке: Код, Наименование”, ссылку ни на какую строку кода не выдало.
    На всякий случай тут выгрузка базы http://ifolder.ru/23126070

  20. задание выполнил, проблем не возникло

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

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

    ПроверкаАдм = СервПроверкаНаРаботуССистемой.ПроверкаНаАдминистратора(Ложь);

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

    Если НЕ проверкаВремени И НЕ ПроверкаАдм Тогда

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

    проверкаВремени = Истина;
    СервПроверкаНаРаботуССистемой.ПроверкаНаВыход(проверкаВремени);
    Если НЕ проверкаВремени И Не ПроверкаАдм Тогда

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

    СервПроверкаНаРаботуССистемой.ПроверитьПользователя();

    ПроверкаАдм = СервПроверкаНаРаботуССистемой.ПроверкаНаАдминистратора(Ложь);
    ПроверкаОбед = СервПроверкаНаРаботуССистемой.ПроверкаНаОбед(Ложь);

    Если НЕ ПроверкаАдм И НЕ ПроверкаОбед Тогда
    СписокЗН = Новый СписокЗначений;

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

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

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

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

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

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

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

    Результат = Результат*Счетчик;
    КонецЦикла;
    Возврат Результат;
    КонецЕсли;
    КонецФункции // Факториал()
     
    &НаСервере
    Процедура ПроверитьПользователя() Экспорт

    ПользовательСистемы = ПользователиИнформационнойБазы.ТекущийПользователь();
    Пользователь = НайтиПользователя();

    Если Не ЗначениеЗаполнено(Пользователь) Тогда
    НовыйПользователь = Справочники.Пользователи.СоздатьЭлемент();
    НовыйПользователь.Наименование =  ПользовательСистемы.Имя;
    НовыйПользователь.Записать();
    КонецЕсли;
    КонецПроцедуры // ПроверитьПользователя()
     
    &НаСервере
    Функция ПроверкаНаАдминистратора(МеткаП) Экспорт
     
    Пользователь = НайтиПользователя();
     
    Если ЗначениеЗаполнено(Пользователь) Тогда
    МеткаП = Пользователь.Администратор = Истина;
    КонецЕсли;
    Возврат МеткаП;
    КонецФункции // ПроверкаНаАдминистратора()
     
    &НаСервере
    Процедура СоздатьОбед(ВариантОбеда) Экспорт

    Пользователь = ПользователиИнформационнойБазы.ТекущийПользователь();

    НовыйОбед = Справочники.ОбедыПользователей.СоздатьЭлемент();
    НовыйОбед.Наименование = Пользователь.Имя+Строка(ТекущаяДата());
    НовыйОбед.Дата = ТекущаяДата();
    НовыйОбед.ВариантОбеда = ВариантОбеда;
    НовыйОбед.Владелец = Справочники.Пользователи.НайтиПоНаименованию(Пользователь.Имя);
    НовыйОбед.Записать();
     
    КонецПроцедуры // СоздатьОбед()
     
    &НаСервере
    Функция ПроверкаНаОбед(МеткаОб) Экспорт

    Пользователь = ПользователиИнформационнойБазы.ТекущийПользователь();
    Польз = НайтиПользователя();
    Выборка = Справочники.ОбедыПользователей.Выбрать(,Польз);

    Пока Выборка.Следующий() Цикл

    Если НачалоДня(Выборка.Дата) = НачалоДня(ТекущаяДата()) И Выборка.Владелец  = Польз Тогда

    МеткаОб = Истина
    КонецЕсли;
    КонецЦикла;
    Возврат МеткаОб;
    КонецФункции // ПроверкаНаОбед()
     
    &НаСервере
    Функция НайтиПользователя()

    НовыйПользователь = ПользователиИнформационнойБазы.ТекущийПользователь();
    ИмяПольз = НовыйПользователь.Имя;
    Пользователь = Справочники.Пользователи.НайтиПоНаименованию(ИмяПольз);
    Возврат Пользователь;
    КонецФункции // НайтиПользователя()
    </code>
    Модуль формы
    <code>

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

    Для каждого Строка Из Список Цикл
    Если Строка.Пометка Тогда

    Ошибка = Ошибка +1;
    КонецЕсли;
    КонецЦикла;

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

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

    СписокСправ = Новый СписокЗначений;
    СоздатьСписок(СписокСправ);
    Список = СписокСправ;
     
    КонецПроцедуры
     
    &НаКлиенте
    Процедура Команда1(Команда)
    КонецПроцедуры
     
    &НаСервере
    Процедура СоздатьСписок(СписокСправ)

    Выборка = Справочники.ВариантыОбедов.Выбрать();
    Кол = 3;
    Пока Выборка.Следующий() И Кол <> 0 Цикл
    Если НЕ Выборка.ПометкаУдаления Тогда
    //СписокСправ.ТипЗначения(“СправочникСсылка.ВариантыОбедов”);
    СписокСправ.Добавить(Выборка.Ссылка, Выборка.Наименование);
    Кол = Кол – 1;
    КонецЕсли;
    КонецЦикла;
    КонецПроцедуры
    </code>

    Простите за не оптимальность, писал быстро , т.к. у жены сегодня День Рождения :)

     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     

    • >писал быстро , т.к. у жены сегодня День Рождения :)
      Хороший прием экстремального программирования :)

  22. модуль сеанса
    Процедура УстановкаПараметровСеанса(ТребуемыеПараметры)
    ТекПользователь = ПользователиИнформационнойБазы.ТекущийПользователь().Имя;
    ПараметрыСеанса.ТекущийПользователь= ОбщиеФункцииСервер.ПолучитьПолПриЗапуске(ТекПользователь);
    КонецПроцедуры
    Модуль упр прилож
    Перем НачалоРаботы;
    Перем ОкончаниеРаботы;
    Перем ДатаЗапуска;
    Перем глОбед Экспорт;

    Процедура ПередНачаломРаботыСистемы(Отказ)
    Если  ОбщиеФункцииСервер.ПроверитьАдминТекущегоПользователя()=ложь Тогда    
    ДатаЗапуска = ОбщиеФункцииКлиент.ПолучитьДату();
    Если ОбщиеФункцииСервер.ПроверкаЗаполнения() тогда
    ОбщиеФункцииСервер.УстановитьГрафик(НачалоРаботы, ОкончаниеРаботы, ДатаЗапуска);

    Отказ = ОбщиеФункцииКлиент.ЗапускЗапрещен(НачалоРаботы, ОкончаниеРаботы);

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

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

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

    Процедура ПриНачалеРаботыСистемы()
    Если  ОбщиеФункцииСервер.ПроверитьАдминТекущегоПользователя()=ложь Тогда

    Если ОбщиеФункцииСервер.ЕстьОбед(ДатаЗапуска).Пустая()Тогда

    глОбед = ОбщиеФункцииКлиент.ВыбратьОбеды();

    ОбщиеФункцииСервер.ЗаписатьОбед(глОбед,ДатаЗапуска);
    КонецЕсли

    конецЕсли;    
    КонецПроцедуры

    общ функ сервера
    Функция ПолучитьДату() Экспорт

    Возврат ТекущаяУниверсальнаяДата();

    КонецФункции // ПолучитьДату() Экспорт()
    Процедура УстановитьГрафик(НачалоРаботы, ОкончаниеРаботы, ДатаЗапуска) Экспорт
    НачРабДня = Константы.ВремяНачала.Получить();
    ОконРабДня = Константы.ВремяОкончания.Получить();    

    НачалоРаботы = Дата(Год(ДатаЗапуска),Месяц(ДатаЗапуска),День(ДатаЗапуска),ЧАС(НачРабДня),Минута(НачРабДня),Секунда(НачРабДня));
    ОкончаниеРаботы = Дата(Год(ДатаЗапуска),Месяц(ДатаЗапуска),День(ДатаЗапуска),ЧАС(ОконРабДня),Минута(ОконРабДня),Секунда(ОконРабДня));

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

    КонецЕсли;

    КонецФункции // ПроверкаЗаполнения()
    Функция ПолучитьПолПриЗапуске(ТекПользователь) Экспорт
    СпрПольз = Справочники.Пользователи.НайтиПоНаименованию(ТекПользователь);
    Если  СпрПольз = Справочники.Пользователи.ПустаяСсылка() Тогда
    СпрПольз = Справочники.Пользователи.СоздатьЭлемент();
    СпрПольз.Наименование = ТекПользователь;
    Если ТекПользователь = “Администратор” тогда
    СпрПольз.Администратор     = Истина;
    иначе
    СпрПольз.Администратор = Ложь;    
    КонецЕсли;
    СпрПольз.Записать();
    КонецЕсли;
    Возврат СпрПольз.Ссылка;
    КонецФункции

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

    общ функц клиента
    Функция ПолучитьДату() Экспорт

    Возврат МестноеВремя(ОбщиеФункцииСервер.ПолучитьДату());

    КонецФункции // ПолучитьДату() Экспорт()

    Функция ЗапускЗапрещен(НачалоРаботы, ОкончаниеРаботы) Экспорт

    ДатаЗапуска = ОбщиеФункцииКлиент.ПолучитьДату();

    Если ДатаЗапуска<НачалоРаботы ИЛИ ДатаЗапуска>ОкончаниеРаботы Тогда

    Предупреждение(“Не время работать!”, 5);
    Возврат Истина;

    КонецЕсли;

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

    КонецФункции // ЗапускЗапрещен(НачалоРаботы) Экспорт()

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

    Если ДатаВыхода<ОкончаниеРаботы Тогда

    Если Вопрос(“Еще поработаем?!”, РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Да Тогда
    Возврат Истина;
    КонецЕсли;

    КонецЕсли;

    Возврат Ложь;
    КонецЕсли;
    КонецФункции // ЗавершениеЗапрещено(ОкончаниеРаботы) Экспорт()

    Функция ВыбратьОбеды() Экспорт
    СписокОбедов=ОбщиеФункцииСервер.ПолучитьОбеды();

    Обеды = Новый Массив;
    ВыбранОбед = Ложь;

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

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

    КонецЦикла;

    КонецЦикла;

    Возврат Обеды;

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

     

  23. Постарался все обращения к данным перекинуть в модуль сервера
    Модуль управляемого приложения
    Процедура ПередНачаломРаботыСистемы(Отказ)
    //Синхрониация пользователей

    Отказ = ОбщийМодульСервер.ПроверитьВремяВхода();

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

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

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

    ОбщийМодульКлиент.ВыбратьОбед();
    //СтруктураЧисла();
    КонецПроцедуры

    Процедура ПередЗавершениемРаботыСистемы(Отказ)
    // Вставить содержимое обработчика.
    Отказ = ОбщийМодульСервер.ПроверитьВремяВыхода();

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

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

    Модуль сеанса
    Функция СинхронизироватьПользователей()

    ГлПользователь = Справочники.Пользователи.НайтиПоНаименованию(ПользователиИнформационнойБазы.ТекущийПользователь().Имя);
    Если ГлПользователь = Справочники.Пользователи.ПустаяСсылка() Тогда
    НовыйПользователь = Справочники.Пользователи.СоздатьЭлемент();
    НовыйПользователь.Наименование = ПользователиИнформационнойБазы.ТекущийПользователь().Имя;
    НовыйПользователь.Записать();
    ГлПользователь = НовыйПользователь.Ссылка;
    КонецЕсли;    
    Возврат ГлПользователь;
    КонецФункции

    Процедура УстановкаПараметровСеанса(ТребуемыеПараметры)
    // Вставить содержимое обработчика.
    ПараметрыСеанса.ГлПользователь = СинхронизироватьПользователей();
    КонецПроцедуры

    Модуль Общего модуля клиента
    Процедура ВыбратьОбед() Экспорт

    СписокВидовОбеда = Новый СписокЗначений;
    Если не ОбщийМодульСервер.ПроверитьВыборОбеда(СписокВидовОбеда) Тогда
    Пока не СписокВидовОбеда.ОтметитьЭлементы(“Выберите желаемые виды обеда на “+Формат(ТекущаяДата(),”ДФ=dd.MM.yyyy”)) Цикл
    КонецЦикла;    
    ОбщийМодульСервер.ЗаписатьВыборОбеда(СписокВидовОбеда);
    КонецЕсли;    

    КонецПроцедуры
     
    Модуль общего модуля сервера

    Функция ПолучитьТекВремя(ВремяНачалаРаботы,ВремяКонцаРаботы)
    ВремяНачалаРаботы = Константы.ВремяНачалаРаботы.Получить();
    ВремяКонцаРаботы = Константы.ВремяКонцаРаботы.Получить();
    Возврат Дата(1,1,1,Час(ТекущаяДата()),Минута(ТекущаяДата()),Секунда(ТекущаяДата()));
    КонецФункции    

    Функция ПроверитьВремяВхода() Экспорт
    Перем ВремяНачалаРаботы,ВремяКонцаРаботы;
    Отказ = Ложь;
    Если ПараметрыСеанса.ГлПользователь.Администратор Тогда
    Возврат Отказ;
    КонецЕсли;    

    ТекВремя = ПолучитьТекВремя(ВремяНачалаРаботы,ВремяКонцаРаботы);

    Если ТекВремя < ВремяНачалаРаботы ИЛИ ТекВремя > ВремяКонцаРаботы Тогда
    Отказ = Истина;
    КонецЕсли;    

    Если не ЗначениеЗаполнено(ВремяКонцаРаботы) Тогда
    Отказ = Ложь;
    КонецЕсли;

    Возврат Отказ;
    КонецФункции

    Функция ПроверитьВремяВыхода() Экспорт
    Перем ВремяНачалаРаботы,ВремяКонцаРаботы;
    Отказ = Ложь;
    Если ПараметрыСеанса.ГлПользователь.Администратор Тогда
    Возврат Отказ;
    КонецЕсли;    
    ТекВремя = ПолучитьТекВремя(ВремяНачалаРаботы,ВремяКонцаРаботы);

    Если ТекВремя >= ВремяНачалаРаботы И ТекВремя <= ВремяКонцаРаботы Тогда
    Отказ = Истина;
    КонецЕсли;    

    Если не ЗначениеЗаполнено(ВремяКонцаРаботы) Тогда
    Отказ = Ложь;
    КонецЕсли;

    Возврат Отказ;
    КонецФункции

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

    СпрВариантыОбедов = Справочники.ВариантыОбедов.Выбрать();
    Пока СпрВариантыОбедов.Следующий() Цикл
    СписокВидовОбеда.Добавить(СпрВариантыОбедов.Ссылка,СпрВариантыОбедов.Наименование);
    КонецЦикла;

    Возврат Ложь;
    КонецФункции

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

    • Забыл включить проверку на удаленность ВидовОбедов
      Пока СпрВариантыОбедов.Следующий() Цикл
      Если не СписокВидовОбеда.ПометкаУдаления Тогда
      СписокВидовОбеда.Добавить(СпрВариантыОбедов.Ссылка,СпрВариантыОбедов.Наименование);
      КонецЕсли;
      КонецЦикла;

  24. Мария 22.04.2011 в 13:54

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

    Обед=ОбщиефункцииСервер.ВыбранОбед(ДатаЗапуска);
    Если  НЕ ОбщиеФункцииСервер.ПолучитьТекПол() И НЕ Обед Тогда
    Список=ОбщиеФункцииКлиент.ВыбратьОбеды();
    ОбщиеФункцииСервер.ЗаполнитьСправочник(Список,ДатаЗапуска);
    КонецЕсли;
    В функции ВыбранОбед осуществляется  выборка  дат с параметром по владельцу равному текущему пользователю из справочника ОбедыПользователей. Если находится дата равная началу дня от даты запуска, то диалог выбора обеда не предлагается.
    На сервере формируется список из выборки по справочнику ВариантыОбеда и передается в клиентскую функцию ВыбратьОбеды.
    В ней по старому алгоритму формируется интерактивный список для пользователя и выбранные элементы записываются в массив.
    Правда еще добавила условие на не повторяемость

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

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

     

  25. Андрей Кусанов 22.04.2011 в 10:08

    Поправка: последний кусочек кода, после слов “В серверном модуле:” не читать.

  26. Андрей Кусанов 21.04.2011 в 23:59

    Да, форум не удобный…

    • Андрей Кусанов 22.04.2011 в 10:04

      Кстати обнаружил, к своему облегчению, что в Opera, при установке вида “Подогнать по ширине”, текст внутри тегов <code> благополучно помещается.

    • Это не форум, это блог :)

  27. Задание выполнила.
    1. Проверку на существование пользователя сделала в модуле сеанса,  создала параметр сеанса “Текущий пользователь”, который в дальнейшем использовала при работе с обедами, перед началом работы системы присваивала глобальной переменной глАдминистратор значение флага “Администратор” и в зависимости от значения этой переменной делала проверки.
    2. Получение начала работы и конца работы перенесла в серверный общий модуль (т.к. обращаемся к константам)
    3.  По обедам: в при начале работы системы вызывается процедура общего модуля (клиентская) ВыбратьОбеды
    Общий модуль на клиенте:
    <code> Процедура ВыбратьОбеды() Экспорт

    // 1. проверка был ли уже выбор обеда
    ЕстьОбед = ОбщиеФункцииСервер.ЕстьОбед();

    // 2. если выбора не было, то делаем
    Если Не ЕстьОбед Тогда
    СписокОбедов = ОбщиеФункцииСервер.ПолучитьСписокОбедов();
    ВыбранОбед = Ложь;

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

    КонецПроцедуры // ВыбратьОбеды() </code>
    общий модуль на сервере:
    <code> Функция ПолучитьСписокОбедов() Экспорт
    Возврат  Справочники.ВариантыОбедов.ПолучитьДанныеВыбора(Новый Структура(“Отбор,СтрокаПоиска,ВыборГруппИЭлементов”,Новый Структура(“ПометкаУдаления”,Ложь),Неопределено,ИспользованиеГруппИЭлементов.Элементы));            
    КонецФункции // ВыбратьОбеды()

    Процедура ДобавитьОбедВСправочник(Значение) Экспорт

    Спр = Справочники.ОбедыПользователей.СоздатьЭлемент();
    Спр.ВариантОбеда = Значение;
    Спр.Владелец     = ПараметрыСеанса.ТекущийПользователь;
    Спр.Дата         = НачалоДня(ПолучитьДату());
    Спр.Наименование = “Обед за ” + Формат(ПолучитьДату(),”ДФ=dd.MM.yyyy”);

    Спр.Записать();    
    КонецПроцедуры // ДобавитьОбедВСправочник(Значение)()

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

    </code>
     
     

  28. Задание выполнил. Поскольку специально не оговаривалось в задании, сделал сверку пользователей ИБ и пользователей в справочнике по наименованию. Для проверки признака пользователей тоже подумал, что лучше завести или глобальную переменную или параметр сеанса, уж очень часто приходится к нему обращаться. Очень непривычно отсылать на сервер все обработчики связанные с объектами. Все работает.

  29. Андрей Красник 21.04.2011 в 20:12

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

  30. Задание выполнено.
    Модуль управляемого приложения:
    <code>
    Перем НачалоРаботы;
    Перем ОкончаниеРаботы;
    Перем ДатаЗапуска;

    Процедура ПередНачаломРаботыСистемы(Отказ)
    ОбщиеФункцииКлиент.УстановитьГрафик(НачалоРаботы, ОкончаниеРаботы);
    Если  ОбщиеФункцииСервер.ПроверитьАдминТекущегоПользователя()=ложь Тогда
    Отказ = ОбщиеФункцииКлиент.ЗапускЗапрещен(НачалоРаботы, ДатаЗапуска, ОкончаниеРаботы);
    КонецЕсли;
    КонецПроцедуры

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

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

    Модуль сеанса
     
    <code>
    Процедура УстановкаПараметровСеанса(ТребуемыеПараметры)
    ТекПользователь = ПользователиИнформационнойБазы.ТекущийПользователь().Имя;
    ПараметрыСеанса.ТекущийПользователь= ОбщиеФункцииСервер.ПолучитьПользователяПриЗапуске(ТекПользователь);
    КонецПроцедуры
    </code>
    Модуль   ОбщиеФункцииСервер
    <code>
    Функция ПолучитьДату() Экспорт
    Возврат ТекущаяУниверсальнаяДата();
    КонецФункции

    Функция ПолучитьДатуНачалаРаботы() Экспорт
    Возврат  Константы.НачалоРаботы.Получить();
    КонецФункции

    Функция ПолучитьДатуОкончанияРаботы() Экспорт
    Возврат Константы.ОкончаниеРаботы.Получить();
    КонецФункции

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

    Функция ПроверитьАдминТекущегоПользователя() Экспорт
    Возврат ПараметрыСеанса.ТекущийПользователь.Администратор;    
    КонецФункции

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

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

    Процедура ЗаписатьОбеды(Обед,ДатаЗапуска) Экспорт
    Для Каждого стр из Обед Цикл
    ОбъектОбед = Справочники.ОбедыПользователей.СоздатьЭлемент();
    ОбъектОбед.Владелец = ПараметрыСеанса.ТекущийПользователь.Ссылка;
    ОбъектОбед.Дата = НачалоДня(ДатаЗапуска);
    ОбъектОбед.ВариантОбеда = стр;
    ОбъектОбед.Записать();    
    КонецЦикла;
    КонецПроцедуры
    </code>
    Модуль ОбщиеФункцииКлиент
    <code>
    Функция ПолучитьДату() Экспорт
    Возврат МестноеВремя(ОбщиеФункцииСервер.ПолучитьДату());
    КонецФункции

    Процедура УстановитьГрафик(НачалоРаботы, ОкончаниеРаботы) Экспорт
    ДатаЗапуска = ОбщиеФункцииКлиент.ПолучитьДату();
    НачалоРаботы = ОбщиеФункцииСервер.ПолучитьДатуНачалаРаботы();
    ОкончаниеРаботы = ОбщиеФункцииСервер.ПолучитьДатуОкончанияРаботы();
    НачалоРаботы = Дата(Год(ДатаЗапуска),Месяц(ДатаЗапуска),День(ДатаЗапуска),Час(НачалоРаботы),Минута(НачалоРаботы),Секунда(НачалоРаботы));
    ОкончаниеРаботы = Дата(Год(ДатаЗапуска),Месяц(ДатаЗапуска),День(ДатаЗапуска),Час(ОкончаниеРаботы),Минута(ОкончаниеРаботы),Секунда(ОкончаниеРаботы));
    КонецПроцедуры

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

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

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

  31. В параметрах сеанса (лишь в целях исследования) завел объект ТекущийПользователь типа СправочникСсылка.Пользователи.  В модуле сеанса инициализирую эту переменную, предварительно введя нового пользователя, если надо:
    Процедура УстановкаПараметровСеанса(ТребуемыеПараметры)
    Если ТребуемыеПараметры = Неопределено Тогда //первый запуск
    ПараметрыСеанса.ТекущийПользователь = ПолучитьПользователя();
    КонецЕсли;
    КонецПроцедуры

    Функция ПолучитьПользователя()
    ИмяПользователя = ПользователиИнформационнойБазы.ТекущийПользователь().Имя;
    ТекПользователь = Справочники.Пользователи.НайтиПоНаименованию(ИмяПользователя,Истина); //точное соответствие
    Если НЕ ЗначениеЗаполнено(ТекПользователь) Тогда
    НовыйПользователь                     = Справочники.Пользователи.СоздатьЭлемент();
    НовыйПользователь.Наименование      = ИмяПользователя;
    НовыйПользователь.Администратор     = Ложь; //пока так. Если у пользователя есть права, то он сам установит признак Администратор
    НовыйПользователь.Записать();

    ТекПользователь = НовыйПользователь.Ссылка;
    КонецЕсли;
    Возврат ТекПользователь;
    КонецФункции
     
    В общем серверном модуле ввел новые функции 1) получения значений констант по имени, 2) проверки работы администратора, 3) получения и записи меню обедов НА ЗАДАННУЮ дату (в справочнике ОбедыПользователей реквизит Дата – индексированный. Все элементы обедов пользователя записываю на НАЧАЛО даты)
    Функция ЗначениеКонстантыПоИмени(ИмяКонстанты) Экспорт
    Возврат Константы[ИмяКонстанты].Получить();
    КонецФункции // ЗначениеКонстантыПоИмени()

    Функция ЭтоАдминистратор() Экспорт
    Возврат ПараметрыСеанса.ТекущийПользователь.Администратор;
    КонецФункции // ЗначениеКонстантыПоИмени()

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

    Процедура ЗаписатьМеню(Меню, НаДату)  Экспорт
    //Меню – массив элементов типа Ссылка
    Для Сч = 0 По Меню.Количество() – 1 Цикл
    Вариант             = Меню[Сч];

    НовыйОбед            = Справочники.ОбедыПользователей.СоздатьЭлемент();
    НовыйОбед.Владелец          = ПараметрыСеанса.ТекущийПользователь;
    НовыйОбед.Дата              = НачалоДня(НаДату);
    НовыйОбед.ВариантОбеда      = Вариант;
    НовыйОбед.Наименование      = Вариант.Наименование;
    НовыйОбед.Записать();
    КонецЦикла;
    КонецПроцедуры
    В модуле приложения переписал процедуру УстановитьГрафик() с целью проверки пустых (или возможно равных!)  констант (путем предоставления возможности работать 24 часа в сутки)
    Процедура УстановитьГрафик(НачалоРаботы, ОкончаниеРаботы) Экспорт
    ДатаЗапуска = ОбщиеФункцииКлиент.ПолучитьДату();

    ВремяНачало        =  ОбщиеФункцииСервер.ЗначениеКонстантыПоИмени(“НачалоРабДня”);
    ВремяОкончание        =  ОбщиеФункцииСервер.ЗначениеКонстантыПоИмени(“ОкончаниеРабДня”);
    Если ЗначениеЗаполнено(ВремяОкончание) Тогда //если реквизит не заполнен – значит понимаем окончание дня
    ОкончаниеРаботы     = Дата(Год(ДатаЗапуска),Месяц(ДатаЗапуска),День(ДатаЗапуска),Час(ВремяОкончание),Минута(ВремяОкончание),Секунда(ВремяОкончание));
    Иначе
    ОкончаниеРаботы     = ‘00010101235959’;
    КонецЕсли;

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

    Если НачалоРаботы = ОкончаниеРаботы Тогда
    НачалоРаботы         = НачалоДня(НачалоРаботы);
    ОкончаниеРаботы     = КонецДня(ОкончаниеРаботы)
    КонецЕсли;

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

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

  33. Какие вы шустрые… А я ещё не делал =) Время есть до 22-го включительно?
    <code>Проверка
    </code>

  34. 1. Справочник “Пользователи” синхронизируется по “УникальномуИдентификатору”
    http://imagepost.ru/images/2/1./21.04_5.jpg
    2.Далее по заданию, общий модуль:
    http://imagepost.ru/images/0/5z/05z.jpg
    модуль приложения:
    http://imagepost.ru/images/0/5l/05l.jpg
    Наткнулся на ситуацию, когда массив значений типа “ЭлементСпискаЗначений” по протоколу обмена клиент-сервер не передается на сервер, а сам тип СписокЗначений передается. Наверное это тема последующих занятий.
     

  35. Елена 21.04.2011 в 00:01

    Вопрос по заданию: Если константы не заполнены, как должна вести себя система?

    • В этом случае проверка на время входа не должна работать.

  36. Задание выполнил. Извиняюсь для длину кода.

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

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

    Функция ТекущийПользователь()
    ТекПользователь=ПользователиИнформационнойБазы.ТекущийПользователь();
    СпрПользователь=Справочники.Пользователи.НайтиПоНаименованию(Строка(ТекПользователь),Истина);
    Если ЗначениеЗаполнено(СпрПользователь) Тогда
    Возврат СпрПользователь.Ссылка;
    КонецЕсли;
    Возврат Неопределено;
    КонецФункции // ТекущийПользователь()

    Процедура УстановкаПараметровСеанса(ТребуемыеПараметры)
    РаботаСПользователемПриВходеВСистему();
    ПараметрыСеанса.ТекущийПользователь=ТекущийПользователь();
    КонецПроцедуры
    </code>

    Модуль ОбщиеФункцииСервер.

    <code>
    Функция ПолучитьДату() Экспорт
    Возврат ТекущаяУниверсальнаяДата();
    КонецФункции // ПолучитьДату() Экспорт()

    Функция ТекущийПользователь() Экспорт
    Возврат ПараметрыСеанса.ТекущийПользователь;
    КонецФункции // ТекущийПользователь()

    Функция ТекущийПользовательЭтоАдминистратор() Экспорт
    Возврат ПараметрыСеанса.ТекущийПользователь.Администратор;
    КонецФункции // ТекущийПользовательЭтоАдминистратор()

    Функция ПолучитьЗначениеКонстантыПоИмени(ИмяКонстанты) Экспорт
    НаборКонстант = Константы.СоздатьНабор(ИмяКонстанты);
    НаборКонстант.Прочитать();
    Возврат НаборКонстант[ИмяКонстанты];
    КонецФункции // ПолучитьЗначениеКонстантыПоИмени()

    Функция У_ПользователяУжеЗаданОбед(ДатаЗапуска,Польз) Экспорт
    СтруктураПоДатеОбеда=Новый Структура();
    СтруктураПоДатеОбеда.Вставить(“ДатаОбеда”, НачалоДня(ДатаЗапуска));
    ВыборкаОбедов=Справочники.ОбедыПользователей.Выбрать(,Польз,СтруктураПоДатеОбеда);
    Возврат ВыборкаОбедов.Следующий();
    КонецФункции // У_ПользователяУжеЗаданОбед()

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

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

    Модуль ОбщиеФункцииКлиент.

    <code>
    Функция ПолучитьДату() Экспорт
    Возврат МестноеВремя(ОбщиеФункцииСервер.ПолучитьДату());
    КонецФункции // ПолучитьДату() Экспорт()

    Процедура УстановитьГрафик(НачалоРаботы, ОкончаниеРаботы) Экспорт
    ДатаЗапуска = ОбщиеФункцииКлиент.ПолучитьДату();
    ВНРД=ОбщиеФункцииСервер.ПолучитьЗначениеКонстантыПоИмени(“ВремяНачалаРабочегоДня”);
    ВКРД=ОбщиеФункцииСервер.ПолучитьЗначениеКонстантыПоИмени(“ВремяОкончанияРабочегоДня”);
    НачалоРаботы = Дата(Год(ДатаЗапуска),Месяц(ДатаЗапуска),День(ДатаЗапуска),Час(ВНРД),Минута(ВНРД),Секунда(ВНРД));
    ОкончаниеРаботы = Дата(Год(ДатаЗапуска),Месяц(ДатаЗапуска),День(ДатаЗапуска),Час(ВКРД),Минута(ВКРД),Секунда(ВКРД));
    КонецПроцедуры

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

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

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

    Если ОбщиеФункцииСервер.У_ПользователяУжеЗаданОбед(ДатаЗапуска,ОбщиеФункцииСервер.ТекущийПользователь()) Тогда
    Возврат Ложь;
    КонецЕсли;

    СписокОбедов=ОбщиеФункцииСервер.ВариантыОбедов();

    ВыбранОбед = Ложь;
    Пока Не ВыбранОбед Цикл
    СписокОбедов.ОтметитьЭлементы(“”+ОбщиеФункцииСервер.ТекущийПользователь()+”, выберите обед.”);
    ВыбранОбед = ОбщиеФункцииСервер.ЗаписатьВыбранныеОбеды(ОбщиеФункцииСервер.ТекущийПользователь(),СписокОбедов,ДатаЗапуска);
    КонецЦикла;

    Возврат ВыбранОбед;
    КонецФункции // ВыбратьОбеды() Экспорт()
    </code>

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

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

    Процедура ПередНачаломРаботыСистемы(Отказ)
    ОбщиеФункцииКлиент.УстановитьГрафик(НачалоРаботы, ОкончаниеРаботы);
    Отказ = ОбщиеФункцииКлиент.ЗапускЗапрещен(НачалоРаботы, глДатаЗапуска, ОкончаниеРаботы);
    КонецПроцедуры

    Процедура ПередЗавершениемРаботыСистемы(Отказ)
    Отказ = ОбщиеФункцииКлиент.ЗавершениеЗапрещено(ОкончаниеРаботы, глДатаЗапуска);
    КонецПроцедуры

    Процедура ПриНачалеРаботыСистемы()
    ОбщиеФункцииКлиент.ВыбратьОбеды();
    КонецПроцедуры
    </code>

  37. Задание выполнять лучше на своей базе или на той которая была впредставлена в решении ДЗ №4?

    • Цитата из текста данной записи: “Задание необходимо выполнять в ИБ после предыдущего ДЗ.” :)

  38. А почему у меня не IE8 не в Opera 11.10 не видно тегов
    code img и т.д. ?

    • Его и не должно быть видно. Зато должен быть виден результат.
      Используйте следующий синтаксис:
      22

  39. Выполнила. Время начала и окончания были в константах с прошлого задания,  выбор был в общей форме. Изменить пришлось только все связанное с  переменной глОбеды(оставила старый код в комментариях). Текущий пользователь хранится в параметре сеанса, при  создании  нового пользователя права администратора проверяются по наличии в  составе его ролей роли Полныеправа.
    Тексты модулей Обеды и Обеды сервер
    [img]http://imagepost.ru/images/1/ht/1ht_1.jpg[/img]
    Все, связанное с пользователями:
    [img]http://imagepost.ru/images/2/cl/2cl.jpg[/img]
    Изменения в общей форме выбора обедов, внесенные в связи с переходом с ГлОбеды на справочник обедов:
    [img]http://imagepost.ru/images/3/zq/3zq.jpg[/img]
    [img]http://imagepost.ru/images/4/qu/4qu.jpg[/img]

    • Я прошу прощения, а с каким тэгом нужно вставлять картинки?

      • Попробуйте img

        • Попробую исправить картинки

          <img src = “http://imagepost.ru/images/1/ht/1ht_1.jpg” alt = “МодулиОбедов”/>

          <img src = “http://imagepost.ru/images/2/cl/2cl.jpg” alt = “Пользователи”/>

          <img src = “http://imagepost.ru/images/3/zq/3zq.jpg” alt = “Общая форма 1″/>

          <img src = “http://imagepost.ru/images/4/qu/4qu.jpg” alt = “Общая форма 2″/>

          • Пока не отображается, разбираемся почему..

            • Кавычки может не те? вставляла из блокнота..

    • Майор 22.04.2011 в 19:45

      Немного не понял вот это место: “при создании нового пользователя права администратора проверяются по наличии в составе его ролей роли ПолныеПрава”. Это такое для чего проверяется? Может я упустил что-то? (без стёба, серьёзно спрашиваю)

      • Я понял это так: администратором считается тот пользователь, у которого установлена роль ПолныеПрава (как минимум).

      • У меня в базе было две роли – Общая и Администратор. Флаг ЭтоАдминистратор для пользователя ставился, если в составе ролей была  роль Администратор.
        <code>РольАдминистратор = Метаданные.Роли.Администратор;
        фАдминистратор = ПользователиИнформационнойБазы.ТекущийПользователь().Роли.Содержит(РольАдминистратор);</code>