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

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

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

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

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

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

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

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

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

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

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

  1. Олег Степанов 09.03.2011 в 11:32

    Отчет по выполнению ДЗ №5
    1. Создал 2 константы НачалоРаботы, ОкончаниеРаботы типа Дата (Состав даты = Время).
    В модуле ОбщиеФункцииКлиент получаем время дня из данных констант, конструируем дату со временем
    2. Создал справочник “Варианты обеда”, добавил 3 предопределенных элемента.
    3. Создал роли пользователей – Администратор, Менеджер. Обновил конфигурацию БД, затем создал пользователей
    и присвоил им соответствующие роли.
    4.Создал справочник “Пользователи”. Вопрос синхронизации со списком пользователей решил следующим образом:
    в модуле Управляемого приложения:
    глПользователь = ОбщиеФункцииСервер.УстановитьПользователя();
    в серверном общем модуле
    Функция УстановитьПользователя() Экспорт – ищет имя текущего пользователя (функция ИмяПользователя()) в справочнике “Пользователи” по наименованию,
    если пользователь не найден – создает новый элемент
    5. Создал справочник “Обеды пользователей”, подчиненный справочнику “Пользователи”
    6. Чтобы не задавать пользователю повторный вопрос о выборе обеда, пришлось создать в серверном общем модуле функцию
    Функция ПользовательУжеВыбралОбед(Дата,Пользователь) Экспорт – возвращает Булево значение
    7. Для записи выбранных вариантов обеда создал процедуру в серверном общем модуле
    Процедура ЗаписатьВыбранныйОбед(Обед,Пользователь) Экспорт    
    СпрОбед =   Справочники.ОбедыПользователей.СоздатьЭлемент();        СпрОбед.Владелец = Пользователь;
    СпрОбед.Дата = ПолучитьДату();
    СпрОбед.ВариантОбеда = Обед;
    СпрОбед.Записать();        
    КонецПроцедуры    
    Данная процедура выполняется на каждой итерации цикла обработки выбора обедов. Думаю, что это не очень оптимально,
    но поскольку в данном случае пользователь может выбрать не так много вариантов (ибо вместимость его желудка конечная),
    то более-менее приемлемо.
    Подскажите, как можно минимизировать количество обращений к базе при записи?

    • >как можно минимизировать количество обращений к базе при записи
      Вариантов несколько:
      1. Передать в серверную процедуру список значений и там его обрабатывать.
      2. Обработать список на клиенте и сформировать массив выбранных обедов, далее этот массив передать один раз на сервер.

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

  3. Задание выполнено. Сложностей не возникло. Использовал один общий модуль “Управление пользователями” с флажками “сервер” и “вызов сервера”. Для хранения текущего пользователя использовал глобальную переменную.
    Выбран ли обед определял так:

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

    ВыбранОбед = ?(Выборка.Пустая(), Ложь, Истина);
    Выборка = Справочники.ОбедыПользователей.НайтиПоРеквизиту(“Дата”, НачалоДня(Дата),, Пользователь); ВыбранОбед = ?(Выборка.Пустая(), Ложь, Истина);
    Список обедов формирую перебором элементов выборки с условием.
    Галочку “администратор” при создании пользователя устанавливаю если РольДоступна(“ПолныеПрава”). Больше не знаю что написать :)

    • Больше и не нужно.
      Такого отчета вполне достаточно :)

  4. Домашнее задание выполнил!
    Сопоставление пользователей делал в модуле сеанса, по наименованию пользователя. (из решения понял, что не самый удачный вариант:))
    С константами тоже проблем особых не возникло.
    Сложности возникли по последнему пункту, разбирался уже на Вашем решении!
    И хочется отметить еще то, что начинаю понимать принципы программирования в 1С (хотя опыта программирования нет совсем). Вот за это огромное спасибо!  Моя радость не знает границ:)!
     

    • Это уже хороший результат, поздравляю! :)

  5. Давыдяк Сергей 23.02.2011 в 20:27

    Задание выполнено.
    Использовал при решении:
    – клиенские и серверные общие модули;
    – запросы для выборки вариантов обедов и определения наличия введённых обедов пользователя;
    – свойство “УникальныйИдентификатор” для синхронизации со списком пользователей;
    – функцию ТекущаяУниверсальнаяДата();
    – свойство глобального контекста ПользователиИнформационнойБазы  и методы Менеджера Пользователей Информационной Базы.

  6. Задание выполнил, сложности были со списком значений, заполненным из справочника. Пользователя записывал в параметр сеанса, искал по имени. По ИД искать не додумался. С остальным затруднений не возникло.

  7. Можно сказать, что сделал. Хотя скорее посмотрел решение – надо догонять, отстаю.

  8. Задание выполнил. Создал константы, справочник, роли – трудности не возникло.
    Трудности возникли с:
    1. Синхронизировал сначала Пользователя по имени, потом переделал по ID, так имя можно менять.
    2. Множественный выбор обедов сделал через форму выбор. – Взял из книги “практическое пособие разработчика”
    С остальным, трудностей больших не было. Тяжко успевать за общим потоком, когда свободного времени мало :(

  9. eavechorek 11.02.2011 в 23:46

    Сделала с трудом. Пришлось несколько раз пересмотреть уроки про общие модули. Трудности возникли, когда нужно было варианты обедов занести всписок значений, а потом из списка выгрузить в справочник “ОбедыПользователей”. Сделала два ОМ: 1 – на сервере с серверным вызовом, где заполняю список значений для выбора обедов и результат выбора обедов заношу в “Обеды пользователей”, 2 – на клиенте, где обрабатывался выбор обеда. Пришла домой и обнаружила, что забыла решение задания на работе. Если актуально еще, то выложу в понедельник.

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

  10. Сделано.
    Только вот для условия  “При первом входе в систему пользователь указал вариант обеда, тогда при втором запуске в эту же дату выбор обеда не предлагать”. Пришлось добавить в справочник ВыбранныеОбедыПользователей реквизит “ДатаОбеда”. Туда писал НачалоДня(Дата). И по нему смотрел.
     

  11. Задание выполнил.
    Создал Константы НачалоРаботы и ОкончаниеРаботы с типом Дата и состав даты Время. Для данных констант определил свойство Проверка заполнения, как Выдавать ошибку.
    С помощью команды контекстного меню ветки Константы «Создать форму констант…» определил общую форму с данными константами. Форму назвал РежимРабочегоДня.
    Создал справочник «Варианты обедов», у которого код сделал длиной 2 (т.е. не более 100 вариантов обеда)  и добавил 3 предопределенных элемента.
    Далее создал подсистему Обеды. С помощью команды Все подсистемы вызвал редактор подсистем, где настроил командный интерфейс. В панель навигации определи спр. Варианты обедов и в панель действий определи также спр. Варианты обедов и общую форму РежимРабочегоДня.
    Создал роль ПраваНаВсеОбъекты с правами на все объекты (команда установить все права) и с установленным флагом «Устанавливать права для новых объектов».
    Создал пользователей в списке пользователе и установил для них роль ПраваНаВсеОбъекты.
    Создал спр. Пользователи и спр. Вариант обеда с владельцем спр. Пользователи и включил их в подсистему Обеды.
    Для синхронизации спр. Пользователи со списком пользователей в модуле сеанса создал обработчик УстановкаПараметровСеанса, где заполняю параметр сеанса (ранее созданный) ТекущийПользователь с типом СправочникСсылка.Пользователи. Для заполнения создал функцию ОпределениеПользователя() которая возвращает ссылку на спр. Пользователи. Внутри функции ищу по наименованию в спр. Пользователи имя получаемое следующим образом ПользователиИнформационнойБазы.ТекущийПользователь().Имя; Если не нахожу, то создаю новый элемент спр-ка.
    Создал ОМ Серверный в нем определи процедуру, которая получает значение констант (через набор т.к. константы две) и знач. реквизита Администратор из парам. сеанса ТекущийПользователь. Далее доработал процедуры модуля упр. приложения (ПередНач.. ПередКон…) на проверку администратора.
    В процедуре ПриНачалеРаботыСистемы из процедуры серверного модуля получаю список значений с обедами из справочника Варианты обедов, если ранее за текущий день не были выбраны обеды. Предаю СЗ (если он не пустой) в функцию ВыбратьОбеды клиентского модуля и на выходе получаю массив выбранных обедов. Далее массив передаю в серверную процедуру ЗаписатьОбеды, где и записываю выбранные обеды в справочник ОбедыПользователей.

  12. А почему администраторов  так жестоко обделили с обедом то? =)
    Все выполнил, проблем не возникло.

    • Администраторы это особый класс людей :)

  13. Задание выполнил (правда снова с опозданием).
    При создании новых объектов ничего особенного не делал кроме того что в подчиненном справочнике ОбедыПользователей убрал название (оно не имеет смысла, достаточно кода все равно главное это дата и сам вариант) + пришлось исправить свойство “Ввод по строке” для данного справочника.
    Для проверки пользователя из  процедуры ПередНачаломРаботыСистемы вызывается серверная функция, которая по свойству ПользователиИнформационнойБазы. ТекущийПользователь() ищет пользователя в справочнике и при необходимости его добавляет.
    Выбор обедов сделал как и раньше через список значений, который заполняется на сервере через объект СправочникВыборка.ВариантыОбеда методом Выборка.Следующий() с проверкой на Ложь стандартного реквизита ПометкаУдаления.
    Проверка ранее выбранного обеда реализована в серверной функции, которая проверяет по количество записей по справочнику ВариантыОбедов методом Выбрать() с установленными параметрами владелец (тек.пользователь) и отбор (тек.дата), и если метод Выбрать.следующий возвращает Истина предложение о выборе обеда не выводится.

    • Но главное, что после изучения материалов переписал свою функцию импорта заказа из Excel, теперь полный импорт обрабатывается всего за одно обращение к серверу (туда передается двух-мерный массив данных). А раньше обращений было ровно столько, сколько позиций в заказе, хотя и ранее алгоритм был организован на основе ТаблицыЗначений.

  14. Задание выполнено. В целом наскоком решить не получилось. Пришлось повторять уроки, забытые моменты. Не сразу сообразил как получить роль для пользователя. Подсмотрел у уже решивших. Метаданные.Роли.<ИмяРоли>.
    Также в какой-то момент получил ошибку, в описании которой много текста.
    {ОбщийМодуль.ОбщиеФункцииКлиент.Модуль(76)}: Ошибка при вызове метода контекста (ЗаписатьОбеды)
    ОбщиеФункцииСервер.ЗаписатьОбеды(Обеды);
    по причине:
    Ошибка при вызове серверного метода.
    по причине:
    Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
    по причине:
    Ошибка преобразования данных XDTO:
    Запись значения свойства ‘param’:
    форма: Элемент
    имя: {http://v8.1c.ru/8.2/managed-application/modules}param
    по причине:
    Ошибка преобразования данных XDTO:
    Запись значения свойства ‘Value’:
    форма: Элемент
    имя: {http://v8.1c.ru/8.1/data/core}Value
    по причине:
    Ошибка отображения типов:
    Отсутствует отображение для типа ‘ЭлементСпискаЗначений’
    С помощью отладчика понял в чем ошибка. В Массив Обеды я записывал значение с типом ЭлементСпискаЗначений –  Обеды.Добавить(Строка) , а надо было Обеды.Добавить(Строка.Значение).
    Вопрос же у меня такой, что это за данные XDTO ?

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

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

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

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

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

  16. ДЗ № 5 выполнил. Самое забавное место было, когда
    заполнять список обедов из справочника ВариантыОбеда пришлось на сервере, справочник ОбедыПользователей там же, а между ними выходить на клиент, чтобы воспользоваться методом списка значений ОТМЕТИТЬЭЛЕМЕНТЫ(). По сравнению с семеркой очень необычно.

    • Тем не менее это правильное разделение задач между клиентом и сервером.

  17. Решено.

  18. Справочнику пользователи добавлен реквизит типа уникальный идентификатор и проверка на существование пользователя осуществляется сравнением с УИДом ТекущегоПользователя().
    Получение даты запуска и констант выполнено в одном серверном вызове с формированием структуры.
    Обеды пользователя и виды обедов получаются в пакетном запросе. Если обеды пользователя Результат[0].Пустой(),  тогда заполняется список значений из выгрузки видов обедов:Результат[1].Выгрузить().ВыгрузитьКолонку() и последующая загрузка СписокЗначений.Загрузить(). Далее добиваемся что бы пользователь хоть что-то выбрал и результат записываем в базу.

  19. Задание выполнено.
    С логикой решения сложностей не возникло.
    Но пришлось долго отлавливать ошибки неправильного применения контекста.
    То в модуле приложения нельзя обратиться к параметрам сеанса.
    То в нем же вызываем функцию сервера, возвращающую ссылку на элемент справочника,
    но вылетает ошибка при попытке обратиться к свойству у этой ссылки.
    Насколько все-таки все проще в толстом клиенте.
    Порядок решения :
    Создали пользователей Администратор и Менеджер, создали роль ПолныеПрава.
    Синхронизацию справочника пользователей со списком пользователей проводим в модуле сеанса.
    Создали параметр сеанса – Пользователь
    В процедуре УстановкаПараметровСеанса(ТребуемыеПараметры)
    проверяем, что ТребуемыеПараметры = Неопределено
    Сначала осуществляем поиск по наименованию в справочнике пользователей.
    Если не находим – создаем пользователя.
    Если наименование – “Администратор”, то устанавливаем свойство Администратор.

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

    Для проверки пользователя на право администрирования создали глобальную переменную в модуле приложения
    ЕстьПраваАдминистратора.
    В процедуре ПередНачаломРаботыСистемы
    устанавливаем ее значение, вызвав функцию общего модуля ОбщиеФункцииСервер,
    которая определяет текущего пользователя из параметров сеанса.

    Далее используем значение переменной ЕстьПраваАдминистратора везде, где от этого зависят дальнейшие действия.
    При определении того, есть ли у пользователя обеды на текущую дату учитываем, что обеды могут быть помечены на  удаление. В этом случае не принимаем их в расчет. Используем отбор по владельцу, т.е. пользователю и по дате, у которой 
    предварительно установили свойство индексирования. Для отбора берем дату на начало дня.
    При сохранении обедов также записываем дату на начало дня.
    Возможно, это не обязательно, т.к. мы указали состав даты – “Дата”.
    Но при отборе без приведения к началу дня выборка была пустой, хотя обеды были.

    • >Возможно, это не обязательно, т.к. мы указали состав даты – «Дата».
      Да, не обязательно.
      >Но при отборе без приведения к началу дня выборка была пустой, хотя обеды были.
      Так как даты хранятся с нулевым временем, то и в отбор нужно передавать соответствующее значение.
      То есть приведение к началу дня обязательно.

  20. Patio-5Element 07.02.2011 в 13:03

    Выполнено
    Добавление объектов
    1. Добавил роль “Полные права” с полным доступом и создал 2 пользователя “Администратор” и “Менеджер”. Этим пользователям устанвил роль “Полные права”.
    2. Добавил 2 константы “Начало работы” и “Окончание работы”.
    3. Добавил справочник “Пользователи” и в этом справочнике реквизит “Администратор”
    4. Добавил справочник”Варианты обедов” с предопределенными элементами.
    5.Добавил подчиненный справочник “ОбедыПользователей” с реквизитами “Дата” и “Вариант обеда”.  Подчинен справочнику “Пользователю”.
    Програмный код
    1. Создал общий модуль со свойствами “Выполнение на сервере” и “Вызов на сервере”.
    2. В модуле описал процедуры и функции по созданию и поиску пользователя, выбора вариантов обеда для пользователя, сохранению выбранных обедов по текущему пользователю, получение значений констант начала и окончания работы, проверка на выбранный обед по текущему пользователю.
    3. В модуле приложения из домашнего задания №4 Описал 2 доп. переменные “ТекПользователь”, “ПользовательЯвляетсяАдмином”. В процедуру “ПередНачаломРаботыСистемы” добавил процедуру по определению пользователя и что он является администратором. В процедурах «ПередНачалоРаботыСистемы» и «ПередзавершениемРаботыСистемы» добавлена проверка, что если пользователь является администратором, то не делать проверки на вход и выход из системы. Такая же проверка добавлена и в функции по выбору обеда.
    В процедуре “ПередНачаломРаботыСистемы” вызывается процедура из общего модуля по получению значений констант «НачалоРаботы», «ОкончаниеРаботы».
    В процедура по выбору обеду добавлены процедуры из общего модуля по формированию списка обедов, проверка на выбранный обед, сохранение выбранного обеда в справочник «Обеды пользователя».

  21. Taranov-SI 07.02.2011 в 12:46

    Отчет по заданию №5; (По тем правилам , которые я сам же и придумал
    1 Для хранения времени начала и конца определяем константы, а также общую форму для управления константами
    2 -6 Создаем согласно задания Необходимые справочники и определяем роли  и пользователей с полными правами.
    Для справочника обеды Пользователей   поле ДАТА индексируем, с цельЮ получения возможности применения отбора при выборки
    Проверяем наличее пользователя в нашем справочнике используя метод менеджераСправочника   ВЫБРАТЬ()
    А также идентифицуруя пользователя посредством метода глобКонтекста  ПользователиИнформационнойБазы. ТекщийПользователь()
    При отсутствии Пользователя  Используя обращение к Объекту Справочника  и метода СОЗДАТЬЭлемент()  записываем нового пользователя
    7 Для исключения  выбора обеда администраторов  осуществляем проверку (на сервере )
    Используем функцию НЕАдмин:
    Если Справочники.Пользователи.НайтиПоНаименованию(ПользователиИнформационнойБазы.ТекущийПользователь().Имя).Администратор Тогда
    Возврат Ложь;
    8  Начало и окончание  рабочего времени определяем так: (для начала)
    НачалоРаботы = Константы.НачалоРаботы.Получить();
    НачалоРаботы = Дата(Год(ДатаЗапуска),Месяц(ДатаЗапуска),День(ДатаЗапуска),Час(НачалоРаботы),Минута(НачалоРаботы),Секунда(НачалоРаботы));
    9  Для заполнения СпискаЗначений (НаборОбедов) блюд  применил отдельную функцию для ее формирования из Справочника:
    ……… НаборОбедов = Справочники.ВариантыОбедов.Выбрать();
    Пока НаборОбедов.Следующий()  Цикл
    Если НЕ НаборОбедов.ПометкаУдаления Тогда
    СписокОбедов.Добавить(НаборОбедов.Наименование);
    КонецЕсли;
    КонецЦикла;
    …………
    10  После выбора Блюд   записываем в справочник , использую конструкцию:
    НовыйЭлемент = Справочники.ОбедыПользователей.СоздатьЭлемент();
    НовыйЭлемент.Наименование = Заказ;
    НовыйЭлемент.Дата = НачалоДня(ТекущаяДата());
    НовыйЭлемент.Владелец = Справочники.Пользователи.НайтиПоНаименованию(Пользователь).Ссылка;
    НовыйЭлемент.Записать();
    Прежде чем  предлагать пользователю выбрать блюда проверяем на наличие заказов
    Мен = Справочники.Пользователи.НайтиПоНаименованию(Пользователь);
    Отбор = Новый Структура(“Дата”,НачалоДня(ТекущаяДата()));
    Заказы = Справочники.ОбедыПользователей.Выбрать(,Мен,Отбор,) ;
    Если Заказы.Следующий()  Тогда
    далее принимаем решение в зависимости от наличия заказоыв “На сегодня”

  22. Домашнее задание выполнено с учетом рекомендаций темы с решением домашнего задания № 4.  Решение модернизировано с использованием рекомендованных структур хранения данных и логики взаимодействия с пользователем.
    Однако, внезапно появился ряд вопросов по методике реализации ограничений и взаимодействия с пользователем в случае с Web клиентом, а именно:
    1. Выполняется ли модуль управляемого приложения при входе пользователя например IE в 1С базу.
    2. Я пользователь открываю IE два параллельно сколько раз выполнится модуль при входе?
    3. А если у меня будет вход через IE и Chrome сколько раз выполнится модуль?
    4. Будут ли вопросы пользователю выглядеть также например отметка списка значений броузер прямо таки покажет пользователю такойже список как и тонкий клиент 1С?
    5. Какой срок жизни переменных модуля тонкого клиента и Web соединений пользователя по умолчанию? Если например пользователь вошел в 1С броузером с удаленного компьютера а потом не закрыл броузер, сколько по умолчанию будет существовать для 1С открытое соединение?

    • 1. Да, но могут быть ограничения обусловленные использованием веб-клиента. Их немного.
      2. По одному разу для каждого соединения. То есть дважды.
      3. Точно также.
      4. Прям так и покажет, можете провести эксперименты (скоро у нас будет сессия о том, как поднимать веб-сервер).
      5. До тех пор пока соединение будет откликаться на запросы сервера оно будет существовать. Переменные соответственно тоже.
      Далее когда падает связь, сервер ждет еще 20 минут, и если отклика нет, то закрывает соединение.

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

  24. Сделано. Долго продирался, но справился :) Дополнительно сделал еще форму заполнения констант. Кстати в константах храню дату в составе “время”, а в справочнике ОбедыПользователей дату в составе “дата”.
     

    • Еще добавлю – для чтения констант я сделал универсальные процедуры:

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

      Текущего пользователя я сделал в параметре сеанса, а в список обедов я записываю уникальный идентификатор, по которому потом (после выбора пользователем)  я получаю ссылку на вариант обеда:

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

      • Пплохо что нельзя изменить пост, даже если он еще не прошел модерирование. В предыдущем посте я не везде заменил глВариантыОбедов на ВариантыОбедов (менял для публикации) и откорректировать невозможно. Плохо.

    • И еще хочу отметить очень большое неудобство в просмотре выложенных кодов – без мониширинного шрифта, без выделения цветом – совершенно нечитабельно :(

      • У нас такое пожелание записано, но оно пока не с высшим приоритетом.

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

  26. Сделал с трудом.
    В модуле сеанса завожу нового пользователя в справочник,  если не найден по наименованию. Помещаю ссылку на справочник в ПараметрыСеанса.текПользователь
    Из модуля управляемого приложения, вызываю процедуру в клиентском общем модуле, а из нее процедуру в серверном общем модуле.
    Сделал с трудом. 
    Были проблемы с контекстами модулей, но … разобрался, все таки.  Провел различные исследования. Получил большой опыт. Хорошо, что задания заставляют САМОМУ найти и почувствовать все детали, необходимые для написания кода в 1С. Пришлось еще раз перепрослушать некоторые материалы. Не думал, что Ваши курсы могут быть настолько полезны. Спасибо!! Не имею сейчас возможности описать все подробности решения. Их очень много. Пользуюсь Вашим разрешением – просто написать, что задачу решил!!
     
     

  27. первая часть задания затруднений не вызвала.
    пришлось заглянуть вперед в главу 11,12,13 ,
    проблемы были с тем, что то процедуры, то конатнты не видны на клиенте. как-то даже получилось это решить.
    добавлена функция, которая проверяет справочник Пользователи и определяет администратор ли текущий пользователь.
    Пользователь = ПользователиИнформационнойБазы.ТекущийПользователь();

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

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