Домашнее задание №5 базового курса

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

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

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

комментариев 125 на “Домашнее задание №5 базового курса”

  1. ДЗ №5 выполнила, делала через объектную модель- без запросов. Достаточно много времени пришлось затратить на задание, поскольку еще нет привычки заранее определять, что доступно/не доступно на сервере/клиенте.

  2. 5-ое задание выполнил, не мог понять только зачем Дата в справочнике обеды :) Но запрос Вы там закрутили, дай бог, очень понравился. Маленькое только замечание к Вам, Евгений: мне кажется лучше не использовать ТекущаяДата() несколько раз в разных функциях, т.к. оно может отличаться – лучше всё-таки ее в переменную занести, либо в глобальную, либо передавать. Из решения вновь узнал много новых тонкостей :)

    • Согласен, если пользователь зайдет в конце секунды 23:59:59, может произойти рассогласование в датах..

  3. Сергей Профьев 19.07.2010 в 12:05

    выполнил, но только с подсказкой из решения…
    Для обычного приложения все решается вообще без общего модуля.
    А для управляемого приложения это невозможно. Но, к сожалению, в уроке 3-28 “Взаимные вызовы различных модулей” не указана возможность выполнения серверных вызовов из модуля приложения. Это дезоориентировало :-(
    Ко всему попытка использовать общий модуль со свойствами “сервер” и “клиент” приводит к ошибкам компиляции. Использование комбинации “сервер” – “вызов сервера” было неочевидно (или я что-то упустил в уроках).
    В остальном практически без проблем.

  4. Bloodwiser 17.07.2010 в 14:29

    Выполнено.
    Немного помучился с множественным выбором из справочника Обеды.

  5. Денис Гончаренко 16.07.2010 в 15:25

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

    По поводу получения значений констант:
    не проще ли в таком случае создать глобальную переменную-структуру, и при начале работы системы считать в нее все значения констант и прочих общих значений (тех же параметров сеансов, например) и в дальнейшем считывать нужные значения из нее?

    • Это вариант.
      Только нужно понимать, что опираться на эти значения можно только при старте системы.
      Если в последующих алгоритмах обращаться к этой структуре, то значения в ней могут быть не актуальными.
      Хотя в типовых как раз используется описанный подход..

      • Денис Гончаренко 17.07.2010 в 14:57

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

        Вопрос: храниться такая структура, я так понимаю, должна на клиенте, что бы избежать постоянных обращений к серверу для получения значений?

        • А по другому никак.
          Модуль упр. приложения полностью компилируется на клиенте.
          Здесь есть следующая неприятность – обратиться к такой структуре с сервера мы не сможем, а такие обращения наверняка будут требоваться.

      • Мне кажется, или здесь видны уши параметров сеанса? Со временем – бог с ним, оно нужно только на старте и завершении работы, по крайней мере пока. А вот текущий пользователь – нужен часто. Собственно в своей реализации я его вынес в параметр сеанса, и синхронизацию пользователей со справочником провожу прямо в модуле сеанса…

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

  6. Абдреев Альберт 15.07.2010 в 16:32

    Выполнено

  7. Шумаев Алексей 14.07.2010 в 15:45

    Выполнено

  8. Сделал. Посмотрим и поучимся у мастера.

  9. Сделано!

  10. Александр Егошин 12.07.2010 в 22:37

    ДЗ №5 выполнил.

  11. Евгений Ершов 12.07.2010 в 15:35

    Ура! Сделал. Теперь буду сравнивать с видео-решением. Есть некоторые вопросы. Если в видео не найду задам позже.

  12. Уффф… Сделано. Трудно дается разделение на клиент и сервер.

  13. ДЗ5 сделала. Споткнулась на открытии и закрытии формы для выбора. Сделала выбор через форму обработки. Пойду смотреть как правильно

  14. Василий 11.07.2010 в 20:44

    Домашнее задание выполнил.

  15. Михайлов Сергей 11.07.2010 в 20:11

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

  16. Выполнено

  17. ДР 5 выполнено успешно.

  18. Задание выполнила. Сложность с доступностью свойств и методов на клиенте/сервере. В частности, при определении признака администратора и текущего пользователя.

  19. ДЗ сделал. В процессе пришлось возвращаться к курсам по клиент-серверным вызовам, подсмотреть ткуда что может вызываться. Пойду смотреть как надо было делать.

  20. 1.А запрос работает быстрее, чем НайтиПо…()?
    2.Я после нахождения Ссылки пользователя, смотрел есть ли пометка удаления и если да, то убирал ее, а то пользователь “на плодит” элементы в справочники с одним и тем же УИ.
    3.С модуле работы на сервере сделал пару универсальных Функций, которые возвращает реквизит справочника по ссылки и наименованию реквизита, и функцию ПолучитьКонстанту, которая возвращает значение константы. Получилось удобней: не надо по каждому поводу писать отдельные.
    4.Зразу запросил на сервере все необходимые значения (Время, пользователь, администратор, Список вариантов обедов,Наличие обедов на сегодня)
    5.У меня почему то при множественном выборе из справочника, даже при выборе одного элемента – тип это Массив, а если не выбрано, то Неопределено.

    • Извините за ошибки :)

    • 1. Запрос более функциональный, поэтому обычно для чтения используют именно его.
      2. Система не должна брать на себя ответственность за действия пользователя..
      5. Интересное поведение. Флаг “Множественный выбор” программно ставите?

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

        • Да, действительно даже при одиночном выборе возвращается массив с одним элементов.
          Так что у меня в решении одно условие лишнее.
          Кстати, в приведенном коде отбор на пометку удаления работать не будет ;)

          • Так как не правильно написано “ПометкаУдалени”Я? Глянешь не замыленным глазом и сразу видно…

  21. Припоминал, где я делал недавно подобное – создание нового Сотрудника, если его не было в справочнике, из текущего Пользователя при входе в 1С Предприятие?
    Вспомнил :) – сделал несколько месяцев назад конфигурацию “Учет выполнения заданий сотрудников”, где это выполняется.
    Причем, если в базе не заведен ни один пользователь, то вообще нельзя было зайти.
    А если у пользователя стоит вид реквизита “Руководитель”, то с заданиями сотрудников выполнялись определенные действия на тему определения просроченных заданий.

  22. ДЗ № 5 Выполнил, пришлось повозиться… Из справочника “ВариантыОбедов” просто выбирал элементы, хотя, это м.б., наверно, сделать запросом. Использовал параметры сеанса для определения текущего пользователя. Вызовы серверных процедур перенес в Общий модуль.
    Процедура ПриНачалеРаботыСистемы()
    глОбед = Новый СписокЗначений;
    ГлОбед = Пользователи.ПолучитьСписокОбедов();
    глОбед.ОтметитьЭлементы(“Выберите сегодняшний обед”);
    Пользователи.ЗаписатьОбеды(глОбед);
    КонецПроцедуры

  23. Ilya Palatnikov 10.07.2010 в 22:02

    ДЗ №5 выполнено.

  24. Анатолий Белогорцев 10.07.2010 в 17:17

    Все-таки добавлю несколько вопросов по теме занятия:

    1) Когда мы создаем элементы справочника в процедурах серверных общих модулей, по-хорошему, запись делать через Попытку-Исключение-КонецПопытки. Раньше в Исключение добавлял – Сообщить(ОписаниеОшибки()). В 8.2 Пока ничего лучше не придумал, чем просто возвращать данную строку из серверной функции, если запись элемента не удалась. Имхо, криво. Есть вариант получше?

    2) Есть общий модуль. Компилируется на клиентах (управл. и обычн) и сервере. Также установил свойство “Вызов сервера”. Пытаюсь в этом модуле создать две процедуры, одна с директивой &НаКлиенте, вторая – &НаСервере. Вызываю из первой процедуры вторую – получаю ошибку проверки на синтаксис “Процедура или функция с указанными именем не определена”. Такой вызов сделать невозможно?

    • 1. Функция Сообщить доступна и на сервере, равно как и Сообщение пользователю
      2. Да, к сожалению такой вызов делать нельзя.
      Единственный вариант – описать еще один серверный общий модуль, и в нем разместить вызываемую функцию.

  25. progr-2008 10.07.2010 в 17:10

    Ну, вроде удалось наконец разобраться с клиентами и серверами. Очень помогло видео Евгения про параметры сеанса, спасибо.
    Сделала, как и рекомендовали, по варианту 5-го задания, без этих параметров, но, зато в этом видео осознала смысл установки флажков для модулей (частично не получалось из-за этого) и принципы вызов клиентом серверных процедур и функций с использованием разных модулей.

  26. saveryanov 10.07.2010 в 16:24

    Задание выполнено.
    Вот только не понятно, что делать, при нескольких заходах пользователя. Сейчас я просто каждый раз дописываю выбранные варианты обедов в таблицу ОбедыПользователей. Можно, конечно проверку сделать, но в задании этого не было сказано, поэтому не стал делать.
    Сложности:
    Был неприятно удивлён, что в модуле управляемого приложения нельзя обращаться к прикладным объектам… Пришлось их вынести в общий модуль. Хотя так более структурно получается.
    Баг или фича?:
    Программное добавление пользователя при его отсутствии в спр.Пользователи делаю в модуле сеанса. Специально сделал роль, у который на спр.Пользователи право только на чтение, и оказалось в модуле сеанса программно можно создавать нового пользователя!!!

    • Фича.
      Модуль сеанса всегда исполняется в привилегированном режиме. Я, кстати, об этом упоминал в видео.

  27. Константин Павленко 10.07.2010 в 14:03

    ДЗ 5 выполнено. Столкнулся с той же проблемой. Общий модуль компилируется на сервере, стоит флажок “Вызов сервера”. Вызываем процедуру ОМ из модуля управляемого приложения. Кстати, в уроке 3-28 о такой возможности не упоминалось, но тем не менее процедура вызывается, метод Сообщить() отрабатывает. Но спотыкается на строке:
    “Если СписокЗначений.ОтметитьЭлементы(“Выберите вариант обеда”) Тогда”
    выдает “Неудачная попытка создания окна”. Хотя по синтакс-помощнику на сервере должна отрабатывать. Ладно, “не серверное это дело” список значений визуализировать. Решил обойтись без общей формы:

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

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

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

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

    • Константин Павленко 10.07.2010 в 15:20

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

  28. Игорь Владимиров 10.07.2010 в 13:40

    ДЗ№5 выполнил.
    Трудности возникли в подборе вариантов обеда из справочника.
    Использование формы выбора справочника, множественный подбор, обработка результатов подбора – тема для меня пока темная.
    Для подбора использовал список значений, опять же, на клиенте доступно одно, на сервере другое, пришлось список несколько раз передавать между процедурами скомпилированными на клиенте и на сервере.
    Таким образом:
    -заполнил список значениями из справочника на сервере;
    -метод Список.ОтметитьЭлементы использовал на клиенте (на сервере система с красным глазом отказалась сформировать окно для пометки, хотя доступность метода Список.ОтметитьЭлементы на Сервере в синтакс-помощнике указана);
    -для заполнения справочника ОбедыПользователей список опять передавал на сервер.

  29. Вообще после 8.1 эти НаКлиенте и НаСервере напрягают… И главное не пойму смысла: Ну пусть по умолчанию НаКлиенте, если процедура или функци не доступна в Клиенте то, значит она на сервере выполняется!Зачем мне то голову морочить?

    • Насчет отдельно НаКлиенте и НаСервере: сами термины и действия понятны, но можно же всю конфигурацию сделать только для Тонкого клиента? Тогда и кода будет меньше :)

      • На тонком клиенте не доступны многие типы данных, на то он и тонкий..

  30. Выполнил. Возникшие проблемы уже описаны:
    Неудачная попытка создания окна…
    Сервер или Клиент…
    СправочникСсылка не доступны реквизиты…

    По поводу что уже было выбрано в это день решил просто: Удалить все на текущий день у текущего пользователя…

  31. Анатолий Белогорцев 10.07.2010 в 10:02

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

  32. ДЗ№ 5 Выполнено. В процессе столкнулся со следующими трудностями – при попытке вызова функции ОтметитьЗначения для списка значений из общего модуля или серверных процедур модуля формы появлялось сообщение – Неудачная попытка создания окна, такая же ошибка появлялась при вызове функции из процедуры ПриОткрытиии. В результате создал общую форму с кнопкой, открываю модально из модулей приложений, при клике по кнопке создается список значений, вызывается серверная процедура, которая заполняет передаваемый ей список, вызывается функция ОтметитьЭлементы, если есть отметки то вызывается серверная процедура, ей передается список и она заполняет справочник. Пытался реализовать поверку чтобы варианты обедов не выдавались повторно, в процедуре ПриСозданииНаСервере (формы которою вызываю модально) делаю запрос, и если он не пустой то переменной Отказ присваиваю Истина, при этом возникает такая ошибка – Значение не является значением объектного типа (ОткрытьМодально). Если есть возможность поясните как в этом случае закрывать форму.

  33. Решено. Проблемные места: для экспротной процедуры рыботы с пользователем создал еще один общий модуль(Сервер+Вызов сервера); выбор обеда сделал через общую форму -сначала пытался использовать динамический список, но так и не понял как там отображать флажки, затем использовал список значений.

    • Кучеров Дмитрий 09.07.2010 в 19:45

      попробуй форма=получитьформу(“справочник.видыобедов.формавыбора
      )
      форма.список.множественныйвыбор=истина
      массивобедов =форма.открытьмодально( )
      боюсь сделать неточность пишу с мобильника

  34. Кучеров Дмитрий 09.07.2010 в 17:10

    Сделал
    Немного припарился с назначением множественного выбора в управляемой форме, а так все ОК

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

    • Кучеров Дмитрий 09.07.2010 в 19:48

      чуть выше множественныйвыбор=истина

  36. Задание выполнено. Сложностей не возникло.

  37. Илья Чернов 09.07.2010 в 12:07

    Выполнено.
    Сделал связь пользователяИБ со справочником через GUID. у справочника пользователи появился новый реквизит, ID с типом УникальныйИдентификатор.

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

  38. Владимир Мединский 09.07.2010 в 11:19

    Задание выполнил.
    Сложность возникла с тем, что из-за контекста модуля УП, там не доступны свойства глобального контекста Справочники и Константы, а для СправочникаСсылка не доступны реквизиты. Сделал серверный общий модуль с возможностью вызова сервера, написал там экспортные функции “ПроверитьВозможностьЗапуска”, “ПроверитьВозможностьЗавершенияРаботы”, все интерфейсные части прописал в модуле УП. После 8.1 немного непривычно.

  39. Собственно проблем не возникло. Единственно, хранить бы обеды пользователя не в справочнике в Регистре сведений.

    • Регистры сведений мы еще не проходили..
      Так что проявите уважение к тем, кто только начинает изучать 1С:8 :)

  40. Выполнено.