Базовый курс. Решение ДЗ №4

Представляем решение четвертого домашнего задания.

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

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

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

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

комментариев 27 на “Базовый курс. Решение ДЗ №4”

  1. elcinbektimirov 06.06.2011 в 11:33

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

    • Эльчин, математика для программирования все-таки необходима, хотя бы на самом простом уровне.

  2. Равшан Абдуллаев 09.05.2011 в 12:44

    При выполнени  д.з. испытал трудности перечитал все главы заново и после просмотра готового д.з. понял
    . прощу прощения за опоздание

  3. PakushinDenis 29.04.2011 в 16:43

    Задание 4 выполнено – затруднений не вызвало ничего, кроме работы с временем – были сняты галки перехода на летнее вревя – как только поставил – все заработало

  4. Ринат Исхаков 24.04.2011 в 10:56

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

    • Ринат Исхаков 24.04.2011 в 10:58

      если тайм аут убираю, то при интерактивном нажатии Да, Нет всё работает…

      • Ринат Исхаков 24.04.2011 в 11:57

        и ещё вопрос
        почему МестноеВремя(ОбщиеФункцииСервер.ПолучитьДату())
        может возвращать время больше времени компьютера на 1час.
        ТекущаяУниверсальнаяДата()    24.04.2011 7:50:14
        МестноеВремя()   24.04.2011 14:52:03
        а время компьютера    24.04.2011 13:52:03
        часовой пояс (UTC+06:00) Алматы, Новосибирск
        галочка переход на летнее время убрана, так как в алматы не переходят.
         
         
         

        • Интересно.
          Используется файловый вариант работы?
          Возможно проблема именно с флагом перехода на летнее время.
          Если его установить, то система будет возвращать правильное значение?

          • Ринат Исхаков 24.04.2011 в 19:11

            Да файловый вариант.
            Сейчас попробовал, да если галочку установить то тогда всё правильно возвращается…
            ОС Windows 7
            возможно сделать, чтобы учитывалось, что мы не переходим на летнее время, кстати РФ тоже в скором времени)))
            есть метод ПолучитьДопустимыеЧасовыеПояса(), может используя его подобирать часовой пояс?
             

    • Система выполняет ровно то, то Вы ей укажите.
      В вашем условии отказ от выхода будет только в том случае, когда пользователь нажмет “Да”.
      Завершение таймаута равносильно закрытию диалогового окна вопроса (нажатие на крестик или Esc). Соответственно система закрывается.
      Указание кнопки по умолчанию влияет лишь на то, где по умолчанию спозиционирован курсор (активная кнопка).

      Как я понял вы хотите реализовать такую логику – если прошел таймаут, то нужно остаться в системе.
      В этом случае можно поменять логику вопроса, например, так – “Точно выходим?”, и выход делать только тогда, когда пользователь отвечает “Да”, во всех остальных случаях “Отказ = Истина”.

      • Ринат Исхаков 24.04.2011 в 19:16

        Да я хотел попробовать, что получиться с 4 параметром, кнопкой по умолчанию…
        Кстати (активная кнопка) это кнопка “да” при закрытии 1С, и всё равно после тайм аута срабатывает “нет”

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

    Создал костанты тип – дата, состав – время. Создал форму констант и оставил только ее в ком. интерфейсе раб. стола. В модуле упр. прил. “ПередНачаломРаботыСистемы”:
    Не стал исп. параметр сеанса для тек. польз-ля, а передавал его параметром.
    <code>Перем ТекСправочникПользователь;
    ЭтоАдмин = ОбщиеФункцииСервер.ПроверитьСоздатьПользователя(ТекСправочникПользователь);
    Если НЕ ЭтоАдмин Тогда //проверяем и спрашиваем…
    ОбщиеФункцииСервер.ПрочитатьГрафик(НачалоРаботы, ОкончаниеРаботы);</code>…

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

    На сервере же читаю константы и передаю их значения параметрами. При проверках
    возможности начала и заверш. работы, проверяю эти даты на пустоту. Если конст.
    содержала пустую дату – разрешаю действие.
    Мод. упр. прил. “ПриНачалеРаботыСистемы” проверяю выбраны ли сегодня обеды польз-лем и
    сохраняю их при необх-сти:

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

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

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

    В кл. ф-ии ВыбратьОбеды
    <code>СписокОбедов = ОбщиеФункцииСервер.ПолучитьСписокОбедов();</code>

    В серверном модуле:
    <code>СписокОбедов = ОбщиеФункцииСервер.ПолучитьСписокОбедов();</code>
    Где на сервере выборкой обхожу спр. “ВариантыОбедов” и заполняю СписокОбедов
    не пом. на уд. ссылками.

  6. Андрей Кусанов 18.04.2011 в 21:22

    Я понял условие, что обед можно выбрать только один и обошелся без пометок.
    Понравилось как Вы раскидали все по общим модулям, но по-моему, из задания не очевидно, что нужно реализовывать это. Если Вы хотели добиться он учеников этого, по-моему нужно более конкретно дать задание. Я вообще написал допущение – только тонкий клиент).
    А вот расчет простых чисел наоборот, оказывается только на технику работы со структурой…
     

    • Андрей Кусанов 18.04.2011 в 21:27

      Да, еще, чем хуже обращение по ключу?
      Ключ = «Число332″;
      ТипЧисла332 = Числа[Ключ];

      • Ничем не хуже, это просто разные обращения.
        При использовании обращения по индексу [], если указываемый ключ в структуре не существует будет ошибка во время исполнения.
        А при использовании метода Свойства, просто будет возвращена Ложь.

    • Спасибо за замечание.
      Давайте уточним. В тексте задания хотелось бы указать, что возможен запуск в режиме обычного приложения? Или что-то еще?

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

        Думаю, намека было бы достаточно. Например: “Подумайте над разными вариантами, возможными на практике.”

        • Спасибо, отметим этот момент, будем анализировать.

  7. Майор 18.04.2011 в 20:32

    Небольшое замечание:
    Как было показано в разборе ДЗ, в режиме управляемого приложения система игнорировала наш вопрос об окончании работы при выборе пункта меню “Файл – Выход”. При этом в режиме обычного приложения данный “фокус” не проходит – ответ на вопрос обязателен.

    • Да, это ошибка в управляемом интерфейсе. Разработчики платформы о ней знают.

  8. kuznetsovimail 18.04.2011 в 19:30

    Вы говорите , что сравнение строк при проверке времени не всегда корректно. Посмотрите мой вариант, разве я что-то не учел.

    • Ваш вариант является правильным.
      Но сравниваете Вы не строки, а числа.

  9. Поучительно и полезно …
    В цикле выбора списка обедов, НАВЕРНОЕ, все же универсальным будет  сначала проверять нажатие кнопки “Отмена”, что-то  вроде
    Выбор = СписокОбедов.ОтметитьЭлементы(“выберите обед”)
    Если Выбор = Истина …..
    …ведь СписокОбедов изначально можно было заполнить со всеми пометками:
    СписокОбедов.Добавить(“Курица”,,1);
    …..

    • Да, такую проверку можно сделать.
      Но, в представленном программном коде она смысла не имеем, и ведет к усложнению кода (а значит, к усложнению его понимания).

      Поэтому я бы не стал делать подобную проверку, если не предполагается установка флажков при добавлении элементов в список.