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

  1. Aleksandr.nett 30.01.2016 в 21:22

    Домашнее задание № 5 Блок 0.
    Создаем все объекты по заданию.
    В модуле управляемого приложения реализуем агоритм.
    <

    Перем глОбед;
    Перем НачПериода;
    Перем КонПериода;
    Перем Числа;
    Перем Администратор;

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

    Процедура ПриНачалеРаботыСистемы()
        Перем Значение;
    ОбщиеНастройкиСервер.СинхронизироватьПользователей(Администратор);

        Если НЕ Администратор Тогда
            ОпросПрользователя();
        КонецЕсли;
    КонецПроцедуры

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

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

    В общем модуле выполняемом на клиенте.
    <

    Процедура ЗаписатьОбедыПользователя()   Экспорт
        ПараметрыОтбора = Новый Структура("ПометкаУдаления", Ложь);
        Параметры = Новый Структура();
        Параметры.Вставить("РежимВыбора",Истина );
        Параметры.Вставить("Отбор",ПараметрыОтбора);    
        ОткрытьФорму("Справочник.ВариантыОбедов.ФормаВыбора",Параметры);   
    КонецПроцедуры
    <

    В общем модуле выполняемом на сервере реализуем следующий алгоритм.
    <

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

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


    Процедура ПолучитьПериодРабочегоДня(НачПериода,КонПериода)   Экспорт
        Перем НачДата;
        Перем КонДата;
       
        Дата =  Формат(ТекущаяДата(),"ДФ=yyyyMMdd");
         НачДата =  Константы.НачалоРабочегоДня.Получить();
         КонДата =  Константы.ОкончаниеРабочегоДня.Получить(); 
        НачВремя = СтрЗаменить(Сред(НачДата,12),":","");
        КонВремя = СтрЗаменить(Сред(КонДата,12),":","");
        Если СтрДлина(НачВремя) = 5 Тогда 
            НачВремя = "0"+СтрЗаменить(Сред(НачДата,12),":",""); 
        ИначеЕсли СтрДлина(КонВремя) = 5 Тогда
           
            КонВремя = "0"+СтрЗаменить(Сред(КонДата,12),":","");
        Иначе 
        КонецЕсли;
        НачПериода = Дата(Строка(Дата+НачВремя));
        КонПериода = Дата(Строка(Дата+КонВремя));
    КонецПроцедуры // ПолучитьПериодРабочегоДня()

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

      НачДата =  Константы.НачалоРабочегоДня.Получить();
      КонДата =  Константы.ОкончаниеРабочегоДня.Получить();
    КонецПроцедуры // ПолучитьДатыРабочегоДня()


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

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

    Функция ПроверитьВыборОбедаПользователем()  Экспорт
       
        Запрос = Новый Запрос;
        Запрос.Текст =
            "ВЫБРАТЬ
            |   ОбедыПользователей.Ссылка,
            |   НАЧАЛОПЕРИОДА(ОбедыПользователей.Дата, ДЕНЬ) КАК Дата
            |ИЗ
            |   Справочник.ОбедыПользователей КАК ОбедыПользователей
            |ГДЕ
            |   ОбедыПользователей.Владелец = &Владелец
            |   И НАЧАЛОПЕРИОДА(ОбедыПользователей.Дата, ДЕНЬ) = &Дата";
        Запрос.УстановитьПараметр("Владелец", ПолучитьТекущегоПользователя());
        Запрос.УстановитьПараметр("Дата", НачалоДня(ТекущаяДата()));
        Выборка = Запрос.Выполнить().Выбрать();
       
        Если Выборка.Следующий()   Тогда
       
        Возврат Истина;
    Иначе;
        Возврат Ложь;
       
        КонецЕсли;

    КонецФункции // ПроверитьВыборОбедаПользователем()

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

    Для справочника ВариантыОбедов создаем форму выбора ,  в модуле формы описываем следующий алгоритм:

    <<code>
    &НаКлиенте
    Процедура СписокВыборЗначения(Элемент, Значение, СтандартнаяОбработка)
       
        СтандартнаяОбработка = Ложь;
        Элемент.МножественныйВыбор = Истина;
        СписокВыборЗначенияНаСервере(Значение);
    КонецПроцедуры

    &НаСервереБезКонтекста
    Процедура СписокВыборЗначенияНаСервере(Значение)  
        ОбщиеНастройкиСервер.ЗаписатьОбедыПользователя(Значение);
    КонецПроцедуры
    <