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

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

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

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

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

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

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

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

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

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

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

  1. elcinbektimirov 09.06.2011 в 15:51

    Самостоятельно выполнить не удалось. Просмотрев решение и пошагово повторив, удалось. Пусть и не все моменты удалось понять, уверен в дальнейшем понимание придет.

  2. Тимур 08.06.2011 в 17:02

    Выполнил, отчитываюсь.
     
    При выполнении пришлось забежать вперед и посмотреть главы 12 и 13 для того, чтобы понять, как работать с ролями и пользователями.
    Обнаружились трудности с пониманием того, как и в какие модули разнести процедуры; пришлось повторить и лучше осмыслить тему “Компиляция модулей”.
     
    1. Синхронизация пользователей информационной базы со справочником “Пользователи”
    Использование UID подглядел во время просмотра отчетов других пользователей, когда пытался найти как другие работали с объектами “Пользователи” и “Роли“. На момент выполнения решил не выносить UUID в отдельный реквизит, а использовать идентификатор в ссылке на элемент справочника (т.е. UID ссылки элемента справочника и UID пользователя).
    Сейчас я сомневаюсь в целесообразности такого решения, так как при этом усложняется задача поиска элемента. Я уверен гораздо эффективнее будет вынести UUID в реквизит справочника.
    Алгоритм поиска элемента справочника, соответствующего пользователю информационной базы, я реализовал следующим образом:
     
    1) Получается идентификатор пользователя ИБ
    2) Из него формируется ссылка справочника “Пользователи” с помощью метода менеджера ПолучитьСсылку()
    3) Для поиска элемента используется метод ссылки ПолучитьОбъект(), возвращающий НЕОПРЕДЕЛЕНО если объекта в базе данных нет
     
    2.  Константы режима работы предприятия
    Учел ситуацию, когда при запуске системы константы не были заполнены.
     
    3. Выбор вариантов обеда
    Можно отметить, что для поставленной задачи справочнику “ОбедыПользователей” не нужны стандартные реквизиты “Наименование” и даже “Код“, так как по сути содержание этого справочника представляет собой списочную информацию в разрезе дня; его элементы не имеют самостоятельного значения, сущности.
     
    СписокЗначений, содержащий доступные варианты обеда, формируется на сервере и передается клиенту. На клиенте происходит выбор, затем список выбранных передается на сервер для записи.
     
    Для определение того, необходим ли выбор обеда, используется метод НайтиПоРеквизиту() менеджера справочника ОбедыПользователей:
     
    НайтиПоРеквизиту(“Дата”, НачалоДня( ТекущаяДата() ), , ТекущийПользователь);
     
    Если найден хотя бы один элемент – значит сегодня пользователь уже выбирал обед.
     
    Исходный код решения
    ———————

  3. Тимур 06.06.2011 в 18:13

    Не совсем понятно:  темы “Роли” и “Пользователи” будут рассмотрены только в 12 и 13 главах, а работа с этими объектами предлагается  в 5-м домашнем задании, после глав 5-8.
     
    Так задумано?

    • Действительно есть противоречие, спасибо за информацию.

  4. Функция ПозицияДня(выбДата) Экспорт

    Возврат (Час(выбДата) * 60 * 60) + (Минута(выбДата) * 60) + (Секунда(выбДата));

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

  5. Добрый день, догоняю группу.
    1. Добавил все необходимые объекты в конфигурацию.
    Константы начал и конца дня представляют из себя даты. При работе с ними использовал функция получения секунды с начала суток.
    2. Выборку данных  о пользователе “текПользователь” и “этоАдмин” выполнил при помощи структуры.
    3. Синхронизацию таблицы пользователей и справочника конфигурации пользователей выполнил по ГУИДу
    Все необходимые проверки выполнил передНачаломРаботыСистемы()
    После выполнения и просмотра решения : порадовал приём передачи переменной по ссылке и изменения её значения в функции.

  6. Ярослав 27.05.2011 в 01:21

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

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

    ПользовательАдминистратор  = ОбщийМодульСервер.ПроверитьАдминистратор();

    забил в раздел основной программы и в переменную модуля
    2) Самая проблема возникла с выбором блюд промучился несколько часов пока не сделал форму подбора справочника Варианты обедов 2 ТЧ сверху сам справочник Снизу список выбранных блюд
    Код
    &НаКлиенте
    Процедура ПолеСправочникаОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
    // Вставить содержимое обработчика.
    Если ЗначениеЗаполнено(ВыбранноеЗначение) Тогда
    СписокВыбранныхБлюд.Добавить(ВыбранноеЗначение);
    КонецЕсли;

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

    &НаКлиенте
    Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
    //Вставить содержимое обработчика
    Если Не ЗначениеЗаполнено(СписокВыбранныхБлюд)  Тогда
    Предупреждение(“Вы не выбрали себе обед на сегодня”);
    Отказ = Истина;
    КонецЕсли;
    КонецПроцедуры

    &НаКлиенте
    Процедура ПриОткрытии(Отказ)
    // Вставить содержимое обработчика.
    Отбор = список.Отбор.Элементы;
    УсловиеОтбора = Отбор.Добавить(ТИП(“ЭлементОтбораКомпоновкиДанных”));
    УсловиеОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(“ПометкаУдаления”);
    УсловиеОтбора.видсравнения = видСравнениякомпоновкиДанных.Равно;
    УсловиеОтбора.ПравоеЗначение = Ложь;
    УсловиеОтбора.Использование = Истина;
    КонецПроцедуры

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

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

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

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

    Результат = Запрос.Выполнить();

    Возврат Результат.Пустой();
    КонецФункции
    На будущее пожелание Если вы хотите в ДЗ видеть какие-то хитрые решения то давайте наводки при постановке ДЗ. Просто допустим новички которые изучают с нуля, некоторые вещи будут непонятны и  в какой стороне искать им  решение. это все таки базовый курс.
     
     
     

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

  8. Задание выполнено.
    1. Синхронизацию пользователей выполнял с помощью глобального контекста ИмяПользователя(), после просмотра решения переделал на ГУИД.
    2. График получал при помощи процедуры
    Процедура УстановитьГрафик(ДатаЗапуска, НачалоРаботы, ОкончаниеРаботы) Экспорт
     
    НачалоРаботы = НачалоДня(ДатаЗапуска) + (Константы.ВремяНачалаРаботы.Получить() – ‘00010101’);
    ОкончаниеРаботы = НачалоДня(ДатаЗапуска) + (Константы.ВремяОкончанияРаботы.Получить() – ‘00010101’);
     
    КонецПроцедуры
    3. Использовал выборки вместо запросов т.к. запросы рассматриваются в следующем занятии.
     
    После работы с 8.1 трудно привыкнуть к разделению модулей на клиента и сервер.

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

  10. Светлана 04.05.2011 в 16:28

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

  11. Светлана 04.05.2011 в 16:25

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

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

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

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

    • > то потом из программы уже выйти невозможно, и вопрос уже не задает
      Интересный вопрос.
      Вполне возможно Вы включили в серверном общем модуле кэширование возвращаемых значений. В данном случае такая настройка является лишней.

  12. Здравствуйте.
    Задание выполнила, хотя м.б. и не так красиво как хотелось бы.
    Все элементы конфигуратора были созданы.
    Написание модулей основывалось на представленных вами в ДЗ4
    Модуль управляемого приложения:
    <code>Перем НачалоРаботы;
    Перем ОкончаниеРаботы;
    Перем ДатаЗапуска;
    Перем ГлОбед Экспорт;

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

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

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

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

    Администратор =  СинхронизацияПользователей.Синхронизация();

    //Если Администратор = Ложь Тогда

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

    Обеды = ОбщиеФункцииСервер.ВыбратьОбеды();
    ЛичноеМеню = ВыборОбедов(Обеды);
    ОбщиеФункцииСервер.СохранениеОбедов(ЛичноеМеню);

    КонецЕсли;

    //КонецЕсли;

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

    Функция ВыборОбедов(Обеды)

    ЛичноеМеню = Новый Массив;
    Обеды.ОтметитьЭлементы(“Выберите меню”);

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

    Возврат ЛичноеМеню;

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

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

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

    КонецПроцедуры</code>

    • Общий модуль СинхронизацияПользователей()
      //Св-ва сервер, вызов сервера
      <code>Функция Синхронизация() Экспорт

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

      Элемент = Пользователи.НайтиПоНаименованию(ТекущийПользователь.Имя);

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

      КонецФункции</code>

    • Общий модуль ОбщиеФункцииСервер
      <code>
      Функция ПолучитьДату() Экспорт

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

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

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

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

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

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

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

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

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

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

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

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

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

      Процедура СохранениеОбедов(ЛичноеМеню) Экспорт

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

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

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

      Функция ПервыйЗапуск() Экспорт

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

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

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

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

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

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

      </code>

    • Общие модули ОбщиеФункцииКлиент:
       
      Функция ПолучитьДату()Экспорт

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

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

      Процедура УстановитьГрафик(НачалоРаботы, ОкончаниеРаботы) Экспорт

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

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

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

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

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

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

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

      КонецФункции // ЗапускЗапрещен()

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

      ДатаВыхода = ОбщиеФункцииКлиент.ПолучитьДату();

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

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

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

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

      Меню = Новый СписокЗначений;
      Меню.Добавить(“Курица”);
      Меню.Добавить(“Рыба”);
      Меню.Добавить(“Мясо”);

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

      ВыбраноМеню = Ложь;
      Пока Не ВыбраноМеню Цикл
      Меню.ОтметитьЭлементы(“Выберите меню”);

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

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

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

  13. Задание полностью выполнил.

    Добавил в конфигурацию параметр сеанса для хранения текущего пользователя. В модуле сеанса происходит поиск по наименованию текущего пользователя в справочнике Пользователи и создание нового элемента справочника при необходимости.

    Из функции ВыбратьОбеды() происходит вызов процедуры заполнения списка обедов, компилируемой на сервере. В начале процедуры делается выборка по справочнику ОбедыПользователей с установленным отбором по текущему пользователю и дате.
    В списке обедов название обеда помещается в представление, а в значение помещается ссылка на элемент справочника ВариантыОбедов.

    После выбора пользователем обедов, на сервере происходит создание элементов справочника ОбедыПользователей по каждому помеченному элементу списка обедов.

  14. Константин 01.05.2011 в 15:40

    Выполнил работу над ошибками в ДЗ5: минимизировал количество серверных вызовов (почему-то этот факт не сразу понимается, хотя в курсах не раз об этом проговорено), вместо Наименования текущего пользователя использовал УникальныйИдентификатор, исправил в ошибку в условии в ЗавершениеЗапрещено(тянулась еще от ДЗ4) <code>НачалоДня(ДатаЗапуска)=НачалоДня(ДатаВыхода)</code>
    В связи с этим вопросы:
    1. Почему в решении не рассматривается вариант с незаполненными значениями констант?
    2. Почему реквизит ПользователиИБ не отображается в формах справочника Пользователи?

    • п.1. Такой случай неплохо было бы проверить.
      п.2. Скорее относится к вопросам юзабилити.

  15. 1,2,3) Сделал без вопросов.

    4)Пользователей добавил просмотрев видео

    5,6) Сделал без вопросов.

    7)Общий модуль управляемого приложения

    <code>

    &НаКлиенте

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

    ТипПольз=НаСервере.ПроверитьПользователей();

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

    </code>

     

    Общие модули. На сервере(опция компиляции сервер, вызов сервера)

    <code>

    &НаСервере

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

    Сообщение = Новый СообщениеПользователю;

    Пользователь = ИмяПользователя();

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

    Если ЗначениеЗаполнено(Ссылка) Тогда

    Сообщение.Текст = Пользователь+” Есть в справочнике.”;

    Иначе

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

    НовыйОбъект.Наименование = Пользователь;

    НовыйОбъект.ПолноеИмя = Пользователь;

    НовыйОбъект.Записать();

    Сообщение.Текст = Пользователь+” Добавлен в справочник.”;

    Ссылка = НовыйОбъект;

    КонецЕсли;

    Сообщение.Сообщить();

    Возврат Ссылка.Администратор;

     

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

    </code>

     

    8) В роли ПраваНаВсеОбъекты добавил права на созданные константы и справочники

     

    все остальное)

    Общий модуль управляемого приложения

    <code>

    &НаКлиенте

    Перем глОбед Экспорт;

    Перем ДатаСтарта Экспорт;

    Перем ДатаВыхода Экспорт;

    Перем СЗМеню Экспорт;

     

    &НаКлиенте

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

    ТипПольз=НаСервере.ПроверитьПользователей();

    ДатаСтарта = наСервере_ВремяНаСервере.ПолучитьВремяНаСервере();

    Если Не ТипПольз Тогда

    Отказ = ПроверитьВремяРаботы();

    КонецЕсли;

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

     

    &НаКлиенте

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

    ТипПольз=НаСервере.ПроверитьПользователей();

    Если Не ТипПольз Тогда

    Отказ = ПроверитьВремяРаботыВых();

    КонецЕсли;

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

     

    &НаКлиенте

    Функция ПроверитьВремяРаботы()

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

    ВремяНачРабДня=НаСервере.ВремяНачРаб();

    ВремяКонРабДня=НаСервере.ВремяОкнРаб();

    Если ВремяНачРабДня <= ВремяЗапуска И ВремяЗапуска <=ВремяКонРабДня Тогда

    ИтогРаб = Ложь;

    Иначе

    Предупреждение(“Текущая дата и время -“+Строка(ДатаСтарта), 5, “Запуск конфигурации в нерабочее время запрещен!”);

    ИтогРаб = Истина;

    КонецЕсли;

    Возврат ИтогРаб;

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

     

    &НаКлиенте

    Функция ПроверитьВремяРаботыВых()

    ДатаВыхода = наСервере_ВремяНаСервере.ПолучитьВремяНаСервере();

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

    ВремяНачРабДня=НаСервере.ВремяНачРаб();

    ВремяКонРабДня=НаСервере.ВремяОкнРаб();

    ИтогРаб = Ложь;

    Если НачалоДня(ДатаСтарта) = НачалоДня(ДатаВыхода) И ВремяВыхода < ВремяКонРабДня Тогда

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

    ИтогРаб = Истина;

    КонецЕсли

    КонецЕсли;

    Возврат ИтогРаб;

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

     

     

     

    &НаКлиенте

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

    Перем УслНачРаб;

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

    СЗМеню = Новый СписокЗначений;

    ФлагМеню = НаСервере.ВыбратьМеню(СЗМеню, ДатаСтарта);

    Если ФлагМеню Тогда

    УслНачРаб = Ложь;

    Пока НЕ УслНачРаб Цикл

    УслНачРаб = СЗМеню.ОтметитьЭлементы(“Для продолжения работы необходимо выбрать меню”);

    Если УслНачРаб Тогда

    Для каждого СтрокаСЗМеню Из СЗМеню Цикл

    Если СтрокаСЗМеню.Пометка Тогда

    глОбед.Добавить(СтрокаСЗМеню.Значение);

    Если НЕ УслНачРаб Тогда

    УслНачРаб = Истина;

    Конецесли;

    КонецЕсли

    КонецЦикла;

    КонецЕсли

    КонецЦикла;

    НаСервере.ЗаписатьМеню(глОбед, ДатаСтарта);

    КонецЕсли;

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

    </code>

     

    Общие модули. На сервере(опция компиляции сервер, вызов сервера)

    <code>

    &НаСервере

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

    Сообщение = Новый СообщениеПользователю;

    Пользователь = ИмяПользователя();

    СсылкаНаПользователя = Справочники.Пользователи.НайтиПоНаименованию(Пользователь,Истина);

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

    Сообщение.Текст = Пользователь+” Есть в справочнике.”;

    Иначе

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

    НовыйОбъект.Наименование = Пользователь;

    НовыйОбъект.ПолноеИмя = Пользователь;

    НовыйОбъект.Записать();

    Сообщение.Текст = Пользователь+” Добавлен в справочник.”;

    СсылкаНаПользователя = НовыйОбъект;

    КонецЕсли;

    Сообщение.Сообщить();

    Возврат СсылкаНаПользователя.Администратор;

     

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

     

    &НаСервере

    Функция ВремяНачРаб() Экспорт

    Возврат Константы.ВремяНачалоРаботы.Получить();

    КонецФункции // ВремяНачРаб()

     

    &НаСервере

    Функция ВремяОкнРаб() Экспорт

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

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

     

    &НаСервере

    Функция ВыбратьМеню(СЗМеню, ДатаСтарта) Экспорт

    Пользователь = ИмяПользователя();

    СсылкаНаПользователя = Справочники.Пользователи.НайтиПоНаименованию(Пользователь,Истина);

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

    ФлОбр = Истина;

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

    Если НачалоДня(ВыборкаВыбрОбедов.Дата)= НачалоДня(ДатаСтарта) Тогда

    ФлОбр = Ложь;

    КонецЕсли;

    КонецЦикла;

    Если ФлОбр Тогда

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

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

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

    СЗМеню.Добавить(Выборка.Наименование);

    КонецЕсли;

    КонецЦикла;

    КонецЕсли;

    Возврат ФлОбр;

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

     

    Процедура ЗаписатьМеню(глОбед, ДатаСтарта) Экспорт

    Пользователь = ИмяПользователя();

    СсылкаНаПользователя = Справочники.Пользователи.НайтиПоНаименованию(Пользователь,Истина);

    Для Каждого Строка из глОбед Цикл

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

    СсылкаНаОбед = Справочники.ВариантыОбедов.НайтиПоНаименованию(Строка,Истина);

    Если ЗначениеЗаполнено(СсылкаНаОбед) Тогда

    МенюДневное.ВариантОбеда = СсылкаНаОбед;

    КонецЕсли;

    МенюДневное.Владелец = СсылкаНаПользователя;

    МенюДневное.Дата = ДатаСтарта;

    МенюДневное.Записать();

    КонецЦикла;

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

    </code>

  16. Денис 26.04.2011 в 21:54

    Задание выполнил. Трудностей не возникло.

  17. Задание выполнил.
    Добавил все необходимые константы, справочники.
    В общий модуль вынес серверные функции
    1. Для проверки наличия пользователя в справочнике и его добавления + возвращает наличие признака “Администратор”.
    2. Функция, возвращающая значения констант.
    3. Заполнение списка по справочнику “Варианты обедов”.
    4. Запись ОбедовПользователей.
    5. Проверка на предмет повторного выбора.
    В модуле управляемого приложения изменились некоторые условия ЕСЛИ, и добавились вызовы серверных функций.
     

  18. Вячеслав 24.04.2011 в 18:30

    Модуль управляемого приложения почему-то прописался дважды. Не хотел я этого…  :)

  19. Вячеслав 24.04.2011 в 18:23

    Всё получилось. Прошу прощения за задержку – по объективным обстоятельствам не смог выполнить раньше.
    Модуль управляемого приложения:
    Перем НачалоРаботы;
    Перем ОкончаниеРаботы;
    Перем ДатаЗапуска;
    Перем глОбед Экспорт;
    Перем Администратор;
    Перем МестнаяДата;

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

    Числа = Новый Структура();

    Для Сч=1 По 1000 Цикл

    Простое = Истина;
    Для Д=2 По Сч-1 Цикл

    Если Сч%Д = 0 Тогда

    Простое = Ложь;
    Прервать;

    КонецЕсли;

    КонецЦикла;

    Числа.Вставить(“Число”+Формат(Сч, “ЧГ=0”), ?(Простое, “Простое”, “Не простое”));

    КонецЦикла;

    Х = “Число591”;
    У = Неопределено;
    Найдено = Числа.Свойство(Х, У);

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

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

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

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

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

    Модуль “ОбщиеФункцииСервер”:
    Функция ПолучитьДату() Экспорт

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

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

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

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

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

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

    Модуль “ОбщиеФункцииКлиент”
    Функция ПолучитьДату() Экспорт

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

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

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

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

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

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

    КонецЕсли;

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

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

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

    ДатаВыхода = ОбщиеФункцииКлиент.ПолучитьДату();

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

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

    КонецЕсли;

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

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

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

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

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

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

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

    КонецЦикла;

    КонецЦикла;

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

    КонецФункции // ВыбратьОбеды() Эскорт()

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

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

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

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

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

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

    Числа = Новый Структура();

    Для Сч=1 По 1000 Цикл

    Простое = Истина;
    Для Д=2 По Сч-1 Цикл

    Если Сч%Д = 0 Тогда

    Простое = Ложь;
    Прервать;

    КонецЕсли;

    КонецЦикла;

    Числа.Вставить(“Число”+Формат(Сч, “ЧГ=0”), ?(Простое, “Простое”, “Не простое”));

    КонецЦикла;

    Х = “Число591”;
    У = Неопределено;
    Найдено = Числа.Свойство(Х, У);

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

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

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

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

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

  20. S. Bashutin 24.04.2011 в 12:52

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

    • S. Bashutin 24.04.2011 в 15:19

      Посмотрел решение, переделал проверку пользователя по ГУИД. Переделал обращение к функциям, где необходима была переменная “ДатаЗапуска”. Реализовал вариант выбора обедов через открытие формы выбора справочника, как было сделано в решении ДЗ.

  21. Светлана 24.04.2011 в 10:21

    Самостоятельно выполнить задание не получилось. После просмотра решения во всем разобралась. Спасибо.

  22. Созданы 2 Константы:
    НачалоРабДня и КонецРабДня
    Тип = Дата
    Состав даты = Время
    Создан справочник ВариантыОбедов.
    Созданы необходимые предопределенные элементы данного справочника.
    Роли – это мое слабое место. Начал выполнять дом.задание, до конца не пройдя урок (остановился на уроке «Событие “ПередУдалением()”. Пример вызова» 8-ой главы.
    Исходя из вышеизложенного, поступил по своему разумению:
    Создал роль ОнМожетВсе;
    Установил все галочки прав в самом верху дерева метаданных.
    В списке пользователей созданы 2 пользователя, которым назначена роль ОнМожетВсе.
    Создан справочник «Пользователи».
    В нем определен реквизит «Администратор» с типом «Булево».
    Создал справочник «ОбедыПользователей», подчиненный справочнику «Пользователи».
    В нем определил реквизиты:
    «Дата»  Тип Дата
    «ВариантОбеда» Тип СправочникСсылка.ВариантыОбедов
    Пришлось повозиться при определении текущего пользователя. Не уверен, что путь оптимален, но выкрутился.
    Создал ОбщийМодульСервера.
    В свойствах указал «Сервер» и «ВызовСервера»
    Кроме того, этому же модулю пришлось установить параметр «Привилегированный», т.к. иначе не получалось искать в справочнике пользователей пользователю с неполными правами.
    Вот код этого модуля:
    <code>
    Функция ПроверитьПользователяВСправочнике() Экспорт
    ТекПользовательИмя = ПользователиИнформационнойБазы.ТекущийПользователь().Имя;
    СправочникПользователи = Справочники.Пользователи;
    НайденнаяСсылка = СправочникПользователи.НайтиПоНаименованию(ТекПользовательИмя);
    Если НайденнаяСсылка = СправочникПользователи.ПустаяСсылка() Тогда
    ПользовательОбъект = СправочникПользователи.СоздатьЭлемент();
    ПользовательОбъект.Наименование = ТекПользовательИмя;
    Если РольДоступна(“ОнМожетВсе”) Тогда
    ПользовательОбъект.Администратор = Истина;
    КонецЕсли;
    ПользовательОбъект.Записать();
    НайденнаяСсылка = ПользовательОбъект.Ссылка;
    КонецЕсли;
    ПараметрыСеанса.глПользователь = НайденнаяСсылка;
    Возврат НайденнаяСсылка.Администратор;
    КонецФункции

    Функция ПроверитьРабочееВремя() Экспорт
    НачалоРабочегоДня = Константы.НачалоРабДня.Получить();
    КонецРабочегоДня = Константы.КонецРабДня.Получить();
    ДатаНачалаРабДня = НачалоДня(ТекущаяДата()) + Час(НачалоРабочегоДня) * 3600 + Минута(НачалоРабочегоДня) * 60 + Секунда(НачалоРабочегоДня);
    ДатаОкончанияРабДня = НачалоДня(ТекущаяДата()) + Час(КонецРабочегоДня) * 3600 + Минута(КонецРабочегоДня) * 60 + Секунда(КонецРабочегоДня);

    Если (ТекущаяДата() > ДатаНачалаРабДня) И
    (ТекущаяДата() < ДатаОкончанияРабДня) Тогда

    лРабочееВремя = Истина;
    Иначе
    лРабочееВремя = Ложь;
    КонецЕсли;
    Возврат лРабочееВремя;
    КонецФункции // ПроверитьРабочееВремя()

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

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

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

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

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

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

    Все отлажено, все работает.
    Т.к. я ставлю признак «Администратор» в элементе справочника «Пользователи» автоматом, при регистрации в системе пользователя с ролью «ОнМожетВсе», то для проверки работоспособности кода контроля рабочего времени и кода выбора обеда ввел еще одну роль – «Малая», с минимально необходимыми правами для запуска тонкого клиента. А также ввел в систему пользователя с ролью «Малая».

    • Евгений, добрый день!
      Хотелось бы получить обратную связь о качестве выполнения мной дом. заданий. В частности – этого.
      Домашние задания выполняю строго “по-честному” – до того момента, пока не отошлю ответ, не просматривая ни комментариев коллег по группе, ни ваших решений.

      • Добрый день!

        Мы не проверяем индивидуально решение каждого, равно как и не выставляем оценок.
        Для нас критерий один – сделал/не сделал.
        Полноту выполнения Вы можете оценить самостоятельно, посмотрев решение преподавателя.
        А если возникают вопросы – обращайтесь в мастер-группу.

        • Хочу сказать, что это недостаток.
          Даже не формы обучения как таковой, а ваших конкретных курсов.
          Ученику обратная связь с тренером необходима.
          А так ваши курсы уподобляются видеодискам типа “самостоятельное изучение у-шу” против изучения у-шу в очной группе.
          В частности, именно для живого общения на профессиональные темы я и купил этот курс. А вы мне в нем отказываете. :(

          • Непонятные, интересные и спорные темы-вопросы мы рассматриваем в мастер-группах.
            Ваше пожелание понятно, мы его запишем и будем анализировать.
            Но пока методика ведения курса останется прежней.

  23. Опоздавший. Был в командировке. Выполнил Д.З. (Понятия не имею как его отобразить здесь!!!)
    Присутствуют вопросы и просьбы:
    1 просьба. Самое актуальное: уникальный идентификатор.  (Может в мастер группе по подробнее разобрать. Просто много задач связанных с синхронизацией информации между различными базами: БП – БП, УТ – БП и др)
    2. Вопрос.
    Почему значение переменной в модуле объекта (формы) в разделе основной программы  всякий раз инициализируется заново при любых действиях и не запоминает свое значение?
    (Глава 8 Методы модуля объекта 2 минута. Получается переменные лучше определять не в процедурах открытия, создания, а вне основного кода модуля объекта (вне всех процедур)?
    Почему значение переменной в модуле объекта (формы) в разделе основной программы  всякий раз инициализируется заново при любых действиях и не запоминает свое значение? (Глава 8 Методы модуля объекта). Получается переменные лучше определять в процедурах открытия, создания, чем в основном коде модуля объекта (вне всех процедур)?
    (И все же, как отчитываться о выполненном Д.З., когда Д.З.  занимает несколько модулей?)
     

    • 1. В 1-ом блоке мы рассматриваем этот вопрос (в теме взаимной связи двух справочников).
      Также можно ознакомиться с решением 5-го задания.
      Если после этого останутся вопросы – задавайте в мастер-группу.
      2. Подобное наблюдается для серверных переменных.
      Они действительно “помнят” свое значение только в рамках серверного вызова.
      Поэтому можно использовать клиентские переменные.
      Если значение нужно запоминать именно на сервере, то есть следующие решения:
      – использовать реквизит формы (для контекстных вызовов);
      – использовать временное хранилище.

    • Отчет по ДЗ может быть кратким, без кода – 3-4 основных пункта решения.
      При желании можно приводить код.

  24. Надежда 23.04.2011 в 23:57

    Отчитываюсь с опозданием, так как по результатам просмотра решения ДЗ 4 пришлось вносить довольно много оптимизационных поправок.
    Задание 5  выполнено, все работает, но ощущала сложности с тем, где какие функции и процедуры выполнять, какие значения возвращаются и разбираться почему они никак не присваиваются.
    Плюс – так как отчитываюсь с опозданием то имею возможность оценить качество выполненного ДЗ (после беглого просмотра решения). Из совсем грубых ошибок – проверка пользователей по имени а не по ГУИДУ (я вообще этот реквизит в спр. Пользователей не сделала); дублирование кода вместо того, чтобы вынести в гл.переменные.
    Другие расхождения с “правильным” решением происходят скорее из-за недостатка опыта и знаний, которые будут получены в будущих уроках. Но в любом случае серьезная работа по доработке ДЗ 5 еще предстоит.
    В предыдущих комментариях было что-то про неинтересность задания – не согласна, для новичков есть над чем задумываться, всю вторую часть простой не назову (переделка выбора и записи обедов новым способом). Спасибо за подробные и понятные разборы решений

  25. Константин 23.04.2011 в 14:27

    Добрый день!
    В ДЗ№4 выполнил работу над ошибками. Было некорректно составлено условие проверки дат на входе, плюс учел временные пояса и работу в толстом клиенте обычного приложения
    В ДЗ№5 возникли трудности с пониманием условия в части синхронизации справочника Пользователи, и программной обработкой пользователей системы.
    Решил с помощью поиска по Базе с курсами. Немного опоздал с выполнением – неделя была напряженной(
    Еще возник вопрос по ролям. Почему при добавлении Полных прав роли “Полные”, права на константы и некоторые справочники(не все) не установились автоматически на полные? Приходилось вручную перелопачивать все объекты и проверять права

    • Константин 23.04.2011 в 14:28

      Задание №5 выполнил . Болше трудностей не возникало.,

    • Добрый день!

      Вы использовали меню “Действия – Установить все права”?
      Должны были все права и проставиться. Удается ли подобное повторить еще раз?
      Если да, то можно прислать конфигурацию в мастер-группу, разберем этот момент.

      • Константин 23.04.2011 в 21:34

        Про “Действия – Установить все права”  не знал. Использовал “Отметить все элементы”, установил галочку “Устанавливать права для новых объектов” и “Устанавливать права для реквизитов и табличных частей”. Видимо часть объектов, созданных после добавления роли, создалась с полными правами, а те объекты которые были до ее создания, пришлось руками подправлять

        • Константин 23.04.2011 в 21:48

          и почему-то недогадался про

          "ПараметрыСеанса.ТекущийПользователь". Про это говорилось в курсах?
          • Нет, параметры сеанса изучаем в продвинутом. Посмотрите решение задания.

        • Все понятно, так и есть.
          Кнопка “Отметить все элементы” влияет только на выделенную строку в дереве.

  26. Задание делал уже ночью, после напряженной рабочей недели, поэтому со сроками несколько запоздал. Никаких затруднений не было, текущий пользователь хранится в параметрах сеанса. Из всех пяти имеющихся ДЗ это задание показалось самым скучным и обыденным, без нюансов, изюминок и тонкостей.
    На сайте по-прежнему нет кнопки для вставки кода.

    • >На сайте по-прежнему нет кнопки для вставки кода.
      Пока приходится вручную вставлять этот тег.

  27. Решение у меня получилось, в целом, как и у всех. Неожиданным оказалось требование продолжить предыдущее ДЗ. Я к этому времени уже его изрядно “изуродовал” в экспериментах. В дальнейшем можно ли указывать, что решение будет использовано в последующих ДЗ. Много времени заняло “разделение” на клиентскую и серверную часть. Похоже в моей голове получилась каша в части “места” выполнения модулей(глобальных,приложения,сеанса …). В части выбора обеда я пошел путем выбора из списка справочника с настроенным отбором, но не смог самостоятельно решить таким способом. Меня синтаксис помощник “утащил” в систему компоновки, где я и завяз. Посмотрел Ваше решение сейчас, оказывается все проще. Но я не понял синтаксис помощник в части ОткрытьФорму. Поэтому вопрос: а где нибудь кроме синтаксис помощника это можно прочитать? Например, на ИТС я не нашел. Ну а в целом пошел исправлять ошибки, повторять пройденное.

    • >В дальнейшем можно ли указывать, что решение будет использовано в последующих ДЗ.
      Все задания будут выполняться на базе предыдущего.
      >Поэтому вопрос: а где нибудь кроме синтаксис помощника это можно прочитать?
      В документации что-то должно быть написано. Но возможно не самым живым языком.
      Вообще процесс открытия форм разбираем в продвинутом, но некоторых моментов будем касаться и в базовом.