Решение ДЗ № 5 Базового курса
Представляем решение пятого домашнего задания.
К сожалению, у Вас недостаточно прав для просмотра этой записи. Если Вы еще не залогинены на сайте — залогиньтесь. Если Вы оплачивали курс, у Вас активирован токен доступа, Вы залогинены, но Вы видите эту запись — напишите нам на e-mail поддержки.
Очень извиняюсь, но у меня есть огромная просьба к участнику Сергею Коцюра в связи с тем что большая часть сообщений в этой теме сделана им:
Не могли бы Вы хотя бы немножко думать самостоятельно прежде чем задавать вопросы Евгению. Кроме того, ИМХО, ему и остальным участникам не слишком интересно читать Ваши эмоциональные всплески и филосовские озарения по поводу многообразия “бяк” и”багофич” в платформе 1С.
В чем собственно проблема?!..
Человек, НЕстесняясь разбирает не понятные для него моменты, наоборот – радует такая дотошность..
над некоторыми поднятыми вопросами даже ка-то особо и не задумывался – воспринимал как само собой разумеещееся – а человек решил разобраться почему именно так..
Лично мне некоторые моменты были – позновательны..
Коллеги давайте не будем больше обсуждать других участников курса.
Все остальные подобные комментарии я удалил.
Отсюда вопрос-пожелание: может быть при конструировании видеорешений не делать особый упор на программный код, а обращать больше внимания на структуру построения решения, почему так, а не иначе, как следует делать, как не следует делать, какой инструментарий надо сиспользовать…
Вот, вообщем-то, и все… Если отмечать для себя как я выполнил ДЗ#5 – затык был только один – с ТекущимПользователем(). Никаких трудностей с контекстами исполнения не возникало (т.е. решалось сразу при ошибке если таковая была). Решение по логике и реализации – практически идентично Учительскому (за исключением запроса – его я повторил в своем решении, форму выбора – не реализовывал).
.
О чем можно задуматься? об оптимальности и минимизации серверных вызовов. О читабельности кода. О балансе между стремлением к оптимальности и читаемостью программы. Как пример:
исполняем на клиенте:
Если Коллекция.Количество() >0
Тогда //серверный вызов
.
спрашивается: можем мы пожертвоать 1-2 серверными вызовами и исключить “этажерку” если – все равно при цикле по пустоу коллекции получим нужный нам результат? – в данном конкретном случае, когда код исполянется для каждого юзера за ВЕСЬ СЕАНС 1 РАЗ – жертва оптимальности в пользу читабельности имхо вполне оправдана (по удаленке все равно терминал выгоднее чем тонкий клиент).
.
спрашивается: зачем код, который относительно невелик по строчкам, выносить в общий модуль, да еще при условии его единственного исполнения за всеь сеанс? – а придется!!! технология такая – даже 1 раз за весь сеанс на клиенте нельзя исполнить обращение к объектам базы) – что есть, то есть.
.
в итоге: в результате данного занятия я четко понял – вся бизнес-логика будет на сервере, клиент – тупой художник, рисующий по кальке с сервера и показывающий “инсталляцию” народу. Это говорилось и ранее, но сейчас я прочувствовал это “лично”…
.
если раньше в 7.7 я заморачивался бизнес-логикой, то и теперь я ею буду заморачиваться, только вдобавок я буду заморачиваться выносом бизнес-логики на сервер, разносокой ее по разным модулям, а потом при анализе своих и чужих решений буду чертыхаясь и ругаясь собирать бизнес-логику разбросанную по куче мест в единую картину, которая будет не сродни картинам Пикассо, а нормальный соц.реализм.
.
Для фомневерующих – пусть посмотрять как реализована печатная форма ТОРГ12 в УТ11… ;-)
.
Вообщем – занятно, занятно… Проблемы у меня пока что чисто с освоением инструментария…
Спасибо за интересные комментарии, Сергей.
Только вот это не совсем правда
>по удаленке все равно терминал выгоднее чем тонкий клиент
Тонкий клиент во многих случаях лучше терминала..
О! а вот об этом хотелось бы поподробнее – почему? какие преимущества? итд – м.б. вынесите в какой-нибудь бонус/обсуждение/мг…? спсб. вопрос закрыт
Об этом есть урок в продвинутом курсе.
Но если коротко, то тонкий клиент менее чувствителен к обрыву канала связи.
Не чувствителен в клиент-серверном варианте… Для файлового режима тонкий клиент не добавляет надежности. Вроде так.
По поводу клиент-сервера вы правы. Есть конечно вариант поднять веб-сервер для файловой базы, но и это будет нехорошим решением.
А вот по поводу утверждения
>Для файлового режима тонкий клиент не добавляет надежности
Что конкретно имеется ввиду?
Глупость сморозил :) тонкий клиент в файловом варианте не работает.
напишу тут. Евгений в бонусе по БП вы говорили про ошибку в СП для метода ПолучитьКартуМаршрута. в 12й платформе СП подлатали. там теперь указан сервер.
Отлично )
непонятка: при рассмотрении выбора обедов из списка формы:
– непонятно в какой момент .формавыбора мутировала в “динамический список”, а потом обратно в .формавыбора (или обратно не мутировала?). так с чем же “работает” юзер (хотя для него это одинаково) – с формой выбора или динамическим списком в даннои примере видеорешения? извините если туплю, но можно ответить развернуто?
Пользователь работает с формой выбора на которой расположен динамический список.
Но я не понял сути вопроса..
Вопрос вот в чем: на рабочем окне мы видим _формусписка справочника_ или некий динамический список, формируемый по неким условиям выборокй элементов справочника? Что есть _формавыбора_? – это форма, на которой в “табличной части” напрямую отображается объет базы данных “справочник в виде списка”? или _формавыбора_ – это просто место, куда мы можем положить любую “таблицу”, в т.ч. и заполняемую “выборкой” из элементов справочника? – вот тут непонятки… может ли быть формавыбора справочника – вообще без табличной части?
> видим _формусписка справочника_ или некий динамический список, формируемый по неким условиям выборокй элементов справочника
В платформе 8.2 эти понятия слились. По умолчанию отображается все содержимое справочника, но при желании мы можем наложить произвольные отборы.
>Что есть _формавыбора_? – это форма, на которой в «табличной части» напрямую отображается объет базы данных «справочник в виде списка»
По умолчанию так.
>или _формавыбора_ – это просто место, куда мы можем положить любую «таблицу», в т.ч. и заполняемую «выборкой» из элементов справочника
При желании можем определить и такое поведение.
>может ли быть формавыбора справочника – вообще без табличной части
Если этого потребует задача и такое возможно. Для осуществления выбора можно использовать метод управляемой формы ОповеститьОВыборе.
Т.е. вообще говоря мы можем открыть любую форму для выбора (не обязательно форму справочника), там разместить алгоритм который будет в родительскую форму возвращать определенный элемент.
сильная “бяка”:
в постановке ДЗ типа “варианты (обедов) берутся из одноименного справочника”… дошел в реализации ДЗ до этого момента и задумался… размышлял недолго, потому как проинтуичил, что работа с выборкой здесь и помещением в СЗ – явно не то, что подразумеватся методологией 1С 8-ой версии, ориентированной на запросы (я хоть и чанйик в 8-ке, хотя и слабое, но общее представление о запросах и их значении в 8-ке имею)… также подумал о возможности выбора нескольких значений из какой-нибудь “формы”/диалога выбора… то есть идейно и общетехнически – понятно как делать. частно-технически – проблемы, тем более что по курсам еще не дошли. Приянл решение посмотреть как сделает Учитель. Порадовало, что мои размышления на 90% совпали с решением Учителя. В частности решения с запросом – не вникал, вообощем понятно (с прямыми запросам немного работаю на 7.7) , а вчастностях – потому как не время, а не зная как правильно – пытаться понять почему так? а не иначе – это запросто мозги свинтить можно.. ;-)
.
в итоге: решение с запросом в данном ДЗ считаю несвоевременным (особенно для новичков, которые далеки от индексов и понимания сути запросов, что выбирается, как ки почему), вдобавок еще навернули вложенные запросы – и с этого момента стройное изложение видеорешения пошло прахом ;-) с обиоием ошибок, наведенных ошибок, предыдущих ошибок (я так и не стал отслеживать почему не сработало условие если выбор обеда уже есть – запрос на выбор обеда не выдавать). Порадовало то, что продумвая решение (еще не просматривая видеорешения) все эти вопросы я для себя отмечал…
Вообщем выборки данных в 1С:8 использовать не рекомендуется.
Речь идет о методе Выбрать и ему подобных.
Есть немаленькая вероятность написать неработающий код у некоторых пользователей.
Подробно об этом в продвинутом курсе, когда рассматриваем RLS.
наблюдение:
Откуда следует что при включении множественного выбора в форме – при выборе одного элемента вернется не массив – как это было озвучено в видеорешении… читая СП “(или массив значений, в случае разрешенного множественного выделения в открываемой форме).” – для меня очевидно было (?) что одно значение – это массив из одного значения – как оно и впоследствии оказалось при обсуждении в комментариях.
.
тут не попытка уличить Учителя в незнании (хотя ничто так не доставляет радости как ошибки учителя – особенно при катании на горных лыжах ;-) а попытка понять общую методику поиска решений “проблем” – либо отсутствует четкое понимание логики классов/методов/параметров либо.. либо.. либо??? что? какова методика по возможности меньенго заглядывания в СП? (это не снимает необходимости его знания и владения).
В СП я на рекомендую заглядывать как можно чаще, тогда быстрее придет понимание работы Системы.
“бяка” или непонятка:
при наложении формата “Дата” на реквизит с типом “Дата” – при записи даты значение приводится к началу даты… Непонятно: накладываемый “формат” – это все-таки получается не формат визуального отображения, а формат приведения типа дата к типу “датаначалодня”..??? где об этом написано? поясните “проблему”, если можно , развернуто – вопрос имхо “грабленаступательный”… аналогично с форматом “время” – непоказываемая дата к чему будет “приводиться” к “нулевой” дате?
Покажите какой код используете при форматировании..
никакого кода, доверяю платформе… (рискнул)
.
Справочник.ВариантыОбедов, реквизит “Дата”, тип = Дата, состав даты = Дата
.
&НаСервере
Процедура прЗапомнитьВыборОбедов(СписокОбедов,Пользователь)
Экспорт
Дата = ТекущаяДата();
Для Каждого Обед из СписокОбедов
Цикл
ВыборОбеда = Справочники.ОбедыПользователей.СоздатьЭлемент();
ВыборОбеда.Владелец = Пользователь;
ВыборОбеда.Дата = Дата;
ВыборОбеда.ВариантОбеда = Обед;
ВыборОбеда.Записать();
КонецЦикла;
КонецПроцедуры //прЗапомнитьВыборОбедов()
.
скриншот http://s57.radikal.ru/i158/1008/0d/01e1a6b9f3a7.jpg
.
если стоав даты = дата и время то пишется штатная дата, а вот если состав даты – дата – записываемая дата приводится к началу дня, + к этому если состав даты изменить из “дата и время” в “дата”, запуститься (может и необязательно?), потом из “дата” перевести в “дата и время” – то данные в базе окажутся приведенными к началу дня… инфа – потреялась… Так что получается, что “состав даты” – это не формат визуального отображения, а некаое преобразование даты во время записи.. или возможно дата с составом даты = дата хранится в базе не с типом datestamp, а типа dаte….???
Да, теперь понял о чем речь.
Действительно, состав даты влияет и на формат хранения данных.
Что касается типов данных, то скорее всего он не меняется (чтобы быть уверенным нужно заглянуть в базу на СУБД), просто время очищается.
наблюдение:
вываливаемся в ошибку:
{МодульУправляемогоПриложения(67)}: Ошибка при вызове метода контекста (прЗапомнитьВыборОбедов)
омИнициализацияПользователя.прЗапомнитьВыборОбедов(глОбед);
по причине:
Ошибка при вызове серверного метода.
по причине:
Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства ‘param’:
форма: Элемент
имя: {http://v8.1c.ru/8.2/managed-application/modules}param
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства ‘Value’:
форма: Элемент
имя: {http://v8.1c.ru/8.1/data/core}Value
по причине:
Ошибка отображения типов:
Отсутствует отображение для типа ‘ЭлементСпискаЗначений’
.
при попытке из клиента передать на сервер в качестве параметра серверной процедуры значениЯ с типом “ЭлементСпискаЗначений”,
вопрос: почему? (с одной сторны вроде понятно что нельзя, а с другой – а почему бы и нет?). и что такое XDTO (совсем конспективно/кратко)?
Тут штука вот какая.
Не все типы данных можно передавать с клиента на сервер.
Эта возможность должна быть явно описана в синтакс-помощнике. Например, для списка значений мы видим “Доступность: Возможен обмен с сервером.”.
А вот для элемента списка значений такой возможности нет.
XDTO – грубо, специальный формат передачи посредством xml, через него осуществляется обмен между тонким клиентом и сервером.
наблюдение:
при записи элемента подчиненного справочника с неинициализированным владельцем – система дает ошибку. это хорошо, в 7.7 это не отлавливалось. Подозреваю, что незаполненность владельца в 8-ке можно определенными методами “переопределить” и разрешить запись такого подчиненного элемента – ну если очень вдруг приспичит ;-)
Если приспичит можно настроить свойство “Проверка заполнения” стандартного реквизита Владелец..
именно так и мыслил. спсб. вопрос закрыт.
“глюкобагофича”:
синтакс-контроль не отлавливает
.
СЗ = Новый СписокЗначений;
СЗ.Загрузить(Выражение);
.
хотя вот он, список значений – на одну строку выше – при исполнении кода вываливаемся, потому как у списка значени1 нет метода Загрузить…
Это нормально.
Ведь перед нами не компилятор, поэтому синтакс-контроль отлавливает только самые грубые синтаксические ошибки.
“дискусс”: тупизна редактора (шаблона?)
вместо
.
если А тогда
.
я предпочитаю писать
.
если А
тогда //здесь пишу комментарий
.
в таком написании ступеньки кода (отступы) становятся более “тяжелыми” и легче визиализируются при просмотре кода, но это – как и предыдущий “дискусс” – на любителя…
.
при таком написании (с переносом тогда/цикл на новую строку – редактор не понимает как правильно делать отступы – работает по началу оператор (если) а не по концу (тогда), короче – “тупит” по-страшному. После 7.7 бесит жутко ;-)
Привыкайте к новой среде разработки.
Мне тоже поначалу было неловко, а сейчас вполне нормально ))
угу.. человек привыкает ко всему, даже плохому… ;-)
“дискусс”
ненавижу многоэтажные если, вложенные в друг друга… прога мгновенно теряет читабельность (по ряду причин). Я предпочитаю (где это возможно) многоэтажные если превращать в линейную структуру по типу:
.
Если А Тогда
если Б Тогда
если С тогда
.
Если А Тогда //не А
//код
Возврат; //Продолжить;
КонецЕсли;
Если Б Тогда //не Б
//код
Возврат; //Продолжить;
КонецЕсли;
.
но это чисто на любителя…
Многоэтажности, конечно, лучше избегать.
Но Если под Если (без отступа) мне не нравиться – не читается. Возможно привычка..
принципиальная “бяка”:
в продемонстрированном видеорешении ДЗ ВСЕ делается в ПередНачаломРаботыСистемы() – что СРАЗУ породило/повлекло усложнение кода и как следствие ошибки при разработке в продемонстрированном видеорешении…
.
имхо*2 налицо провал в логике решения. Вполне очевидно (ну для меня стопудово ;-), что решение о допуске в программу/базу по диапазону времени рабочего дня – следует делать до старта системы (ПередНачаломРаботыСистемы), а вопрос про обеды – при успешном входе в систему ПриНачалеРаботыСистемы). ЭТО – логично. и 1-в-1 кладется на штатные обработчики. Логика разных событий (допуска к работе и выбом меню) – разносится по разным местам. Что облегчает код от многоэтажных “если” и сложных условий.
Не могу не согласиться.
“багофича” или я не знаю:
итак, как указать в константах диапазон рабочего времени = полные сутки..?
зададим литералами:
НачалоДня = ‘00010101000000’;
КонецДня = ‘00010101235959’;
.
в конфигураторе на константы “наложим формат “Время”, только вот незадача: НачалоДня в форме (генерируемой авто) будет отображаться без ноликов… двумя двоеточиями… И тут встает паралелльный вопрос: а как проверить, что константа НачалоДня – незаполнена? Введите в константу на форме 00:00:00 и запишите в базу – как узнать при следующем старте, что констатнта инициализирована?
Формат(НачалоДня,”ДФ=ЧЧммсс”) – возвращает пустую строку… – мне данную задачку решить не удалось… Пришлось, чтобы каждый раз при запуске константан повтроно не инициализировалась “пустым значением” – ввести в константу 00:00:01…
.
ну и попутно: в багзилле 1С записано, что региональные настройки не берутся из настроек ОС (не только в части разделителя разрядов чисел, но и в части отображения времени – у меня настроено отображение времени в 24 часовом формате с выводом ведущих нулей, 1Сина на это плюет и время выводит 7:23:15).
.
Итого: интересный вопрос про автоинициализацию констант (на которых как раз бы и отработать привелигерованный режим – в ДЗ остался незапятнанным ;-)
’00010101000000′ это как раз пустое значение для даты.
Поэтому вариант с первой секундой кажется приемлемым.
да, но тогда в часе получится не 60 секунд, а 59… погрешность вроде небольшая но потенциально грабленаступательная… Вопрос остается: как “идентифицировать” время начала суток и отличить от пустой даты…??? в часть даты запихнуть часть даты, отличную от нуля…??
Да, например, так. 2 января 1-го года.
но вот неполучается в частных случаях… например в задаче про обеды Константы.НачалоРабочегоДня = составдаты=”время”, и выполнение
Константы.НачалоРабочегоДня.Установить(‘00010102000000’) – приводит дату к значению нулевой даты части ГГГГММДД… – итого в упр.форме, сгенеренноа автоматически данная константа отображается не временем начала суток 0:00:00, а по прежнему как : :
т.е. задача “как отобразить врем яначала суток” в данном частном случае остается нерешенной…
“Бяка”:
отсутствие первоначальной автоинициализации констант. Да, зачастую, первым запускается и делает настройки админ. А что будет если зайдет юзер с неинициализированными константами? – или прога рухнет, или не по той ветке пойдет. Мой выбор: автоинициализация констант в случае их “отсутсвия”. Понятно, что делать это надо в привелигированном режиме (модуле сеанса?) – потому как первым может зайти и юзер с минимальными правами – поэтому в автоинициализации или ставим “типово” рабдень типа с 9 до 18, или разрешаем работу круглые сутки с 00 часов до 24 часов. Мой выбор – автоинициализация круглые сутки.
Метод глобального контекста УстановитьПривилегированныйРежим() позволяет на время дать все права любому прохожему..
Модуль сеанса, как вы понимаете, нельзя использовать.
про модуль сеанса – не понимаю, чегой-то упустил.. придется “порыть”…
В одной из последних МГ я показывал почему его нельзя использовать в качестве точки старта исполняющейся на сервере.
Кстати, это был ваш вопрос ;)
Хотя можно сделать одну хитрость, если анализировать значение параметра на Неопределено, то это будет как раз старт приложения.
Посмотрите это видео.
спсб. положил “на отработку”. Слишком много инфы, не усваяется в оперативном режиме… вопрос закрыт.
“Бяка”:
синхронизация пользователей по УИДу – очень не понравилось. Представьте себе, что в диалоге входа пользователь = НачальникПродаж, а в авторах создаваемых документов/отчетов значится “СтаршийМенеджер” – где правда? Да, можно, дополнительно при проверке пользователей “подправлять” и наименования пользователей – но тут другая засада: еще вчера автором сотни документов был “СтаршийМенеджер”, а теперь внезапно стал “НачальникПродаж”… а с учетом того, что бывают переименования пользователей в конфигураторе в соответствии с изменившейся оргштатной структурой, передача ников “по наследству” – такой вариант синхронизации по УИДу – выглядит очен-очень спорным. Мой выбор – появилось новое имя в конфигураторе, появись и новое имя в спр.пользователей.
Скорее будет так, пользователь в конфигураторе Иванов, в справочнике – Иванов Иван Васильевич.
В это случае UID очень помогает.
>а с учетом того, что бывают переименования пользователей в конфигураторе в соответствии с изменившейся оргштатной структурой
А вот от этого нужно уходить. Новых пользователей нужно заводить для новых людей.
уууу!! действительность намного разнообразнее чем “как оно должно быть”… Вопрос закрыт.
“Дискусс” по поводу “делать надо, чтобы работало везде”:
В задании присутствуют пользователи Администратор и Менеджер. На них требуется назначит Полные Права, что вообще сделано. Но очевидно, что Менеджер и Администратор в общем случае – обладают различными правами, не зря же в спр.Пользователи введен реквизит “Админситратор” булево.
.
Для “правильного” и “красивого” решения (что зачастую эквивалентно) хорошо бы при регистрации пользователя в справочнике пользователей автоматом выставлять для пользователей “Администраторов” признак “Администратор” в Иситну… Зададимся вопросом: как? – а вот не нашел! потсратил минут 30 на мелкое исследование как определить что пользователь = Администратор? Интуитивно ясно, что пользователь, у которого хоть в одной из назначенных ролей выставлены ВСЕ ГАЛКИ – администратор, вопрос: как это определить программно (ограничившись, для примера, одной ролью)? Проверять ПравоДоступа() на все объекты(классы) конфигурации? как получить их всех сразу? пробежаться по метаданным…? пока что непонятно. Ладно, поставил для себя простое условие – считаем, что администратором является тот, у кого есть правоДоступа на “Администрирование” – почитал СП – ПравоДоступа(“Администрирование”, АВОТТУТЧТОПИСАТЬВТОРЫМПАРАМЕТРОМ?) – в итоге принял решение что я “туп”, и чисто для тренировки вбабахал Найти(ВРЕГ(ТекущийПользователь),”АДМИНИСТРАТОР”) – решение “тупое”, неправильное – но все лучше чем ничего…
ПравоДоступа(“Администрирование”, Метаданные).
Хотя такой вызов не освящен в документации.
Но мне не кажется, что это правильное решение. Не факт, что перед нами администратор даже если у него административные права.
Имхо, для поставленной задачи не существует красивого и правильного решения без привязки к специфике конкретного предприятия.
Да, согласен, я тоже к такому выводу пришел. Но, как минимум, админстратор “конфигуратора” может быть администратором настроек по де-факто. А как оно де-юре – тут уж не запрограммируешь… Это к тому, что администратору-разработчику д.б. доступну изменение настроек непрограммным способом – чтобы хотя бы функционал отлаживать, иначе запросто можно представить ситуацию когда вследствие отсутсвия настроек админ не сможет войти в свою же прикладную базу.. ;-)
“Находка”:
нет возможности ввести пользователя, пока конфигурация не будет внесена в действующую конфигурацию (актуализирована). Ругается, что отсутствует пользователь с административными правами. Права (роль) нет возможности назначить. Для того, чтобы это стало доступно – конфигурацию надо актуализировать.
Вопрос: почему? Получается, список пользователей хранится отдельно (самостоятельная сущность) и ввиду этого работает только с акутуальной конфигурацией? или как? Просьба “пнуть” в правильном направлении – в какой курсе/главе можно почерпнуть сведения для самостоятельного разрешения данного вопроса? (проблема и решение в видеорешении была озвучена, но почему – осталось неясным)
Список пользователей это обычная таблица в ИБ, как например список документов или элементов справочника.
Правило – обязательно должен быть пользователь с административными функциями (иначе кто же войдет в конфигуратор).
Нет ролей – нет пользователей с административными функциями.
Пока вы не сохранили конфигурацию нет возможности обратиться к ролям. Также если вы создадите справочник в конфигураторе, запустите пользовательский режим без сохранения конфигурации БД, вы не увидите нового справочника.
На мой взгляд все логично.
а по-моему – нелогично. Задекларирована возможность вести разработку конфигурации паралельно с работой пользователей. В этом случае – данная “парадигма” нарушается. Нужно не просто сохранить отладочный вариант конфигурации – но еще и синхронизировать/актуализировать отладочную конфигурацию в рабочую, с которой работают пользователи. Почему-то я могу в отладочной (неактуализировнной) конфигурации насоздавать объектов и работать с ним, а в списке пользователей – нет… нестыковочка…
Запишем ка фичу. Вопрос закрыт.
Вы поймите одно – список пользователей это не объект метаданных.
Его можно сравнить со справочником контрагенты..
да, так гораздо полнятнее и все стало на свои места. спсб. вопрос закрыт.
Возьму на себя смелость “подискутировать”/обсудить данное домашнее задание и попутные вопросы, м.б. впрямую и не относящиеся к сабжу.. но, возможно, кому-то и это пригодится (надеюсь). Естественно, что все – глубочайшее ИМХО.
.
Мне, как заядлому 7-ку, решиние данного ДЗ очень много дало на этом этапе освоения 8-ки, многое интересно, необычно и “ржачно”…
.
Там, где в 7.7 обходились одной сущностью, в 8-ке “налабали” столько, что “мама не горюй”. Понятно, что это неспроста, вызвано и вопросами повышения производительности и прочими “нужностями”, которые должны в целом приводить к определенному выигрышу… другое дело, что для очень большого количества фирм, все это совершенно не нужно, а значит для разработчиков решений для этих фирм – излишняя (необоснованная) нагрузка на разработчика по отработке тех вещей, которые для этой фирмы неактуальны, но ввиду выбранной технологии – обязательны…
.
Цитата Учителя: “Ваша цель – создать работающее решение при любых обстоятельствах.
Качество решения на вашей совести.” – звучит здорово, но, как будет показано ниже – надо что-то делать с таким подходам. Забегая вперед, хочу попросить все-таки при постановке ДЗ указывать минимально необходимый функционал, который ДОЛЖЕН БЫТЬ отработан. Иначе.. иначе – просто погрязнем…
.
Итак, это было вступление. Продолжим…
Cделал. Выбор обеда поместил ПриНачалеРаботыСистемы, так показалось проще. К сожалению цейтнот по времени отстаю. Постараюсь догнать.
Да.. Для меня это тяжелое задание.. Замучилась с разделением между сервером и клиентом. Сделала.
Это полезный опыт ;)
После двухнедельного перерыва промучался с 4-м и 5-м ДЗ, но выполнил. Первоначально начал делать все в модуле управляемого приложения и только потом раскидал все процедуры и функции по общим модулям согласно контексту.
Не могу понять одного, почему процедура
Процедура ЗаписатьОбедыПользователя(СписокОбедов) Экспорт
Запрос = Новый Запрос;
Запрос.Текст = “ВЫБРАТЬ
| ОбедыПользователей.Ссылка КАК Обед
|ИЗ
| Справочник.ОбедыПользователей КАК ОбедыПользователей
|ГДЕ
| ОбедыПользователей.Дата МЕЖДУ &ДатаНач И &ДатаКон
| И ОбедыПользователей.Владелец = &Владелец”;
Запрос.УстановитьПараметр(“ДатаНач”,НачалоДня(ТекущаяДата()));
Запрос.УстановитьПараметр(“ДатаКон”,КонецДня(ТекущаяДата()));
Запрос.УстановитьПараметр(“Владелец”,ПараметрыСеанса.ТекущийПользователь);
СписокСуществующихОбедов = Запрос.Выполнить().Выгрузить();
Для Каждого Обед Из СписокОбедов Цикл
Если Обед.Пометка тогда
Отбор = Новый Структура;
Отбор.Вставить(“Обед”,Обед.Значение);
Если СписокСуществующихОбедов.НайтиСтроки(Отбор).Количество() > 0 тогда
Сообщить(“Обед ” + Строка(Обед) + ” уже выбран ранее”);
Иначе
НовыйОбед = Справочники.ОбедыПользователей.СоздатьЭлемент();
НовыйОбед.Владелец = ПараметрыСеанса.ТекущийПользователь;
НовыйОбед.Дата = ТекущаяДата();
НовыйОбед.ВариантОбеда = Обед.Значение;
НовыйОбед.Наименование = Обед.Значение.Наименование;
НовыйОбед.Записать();
КОнецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
не находит уже существующие обеды. Вроде делаю все правильно
Первое с чего бы я начал – проверил результат запроса.
Таблица значений не пустая?
Нет, не пустая. Сперва была ошибка, передавал просто Обед, получалось, что отбирал по элементу списказначений. Потом стал делать отбор по значению. И в ТЗ и в Отборе ссылки. Сталкивался с подобным, возможно что это РАЗНЫЕ ссылки одного объекта?
Есть подозрение, что в ТЗ и в Отборе ссылки на РАЗНЫЕ элементы справочников.
В одном случае “Варианты обедов”, в другом “Обеды пользователей”.
Проверьте отладчиком.
Кстати, поиск можно делать и по выборке, совсем не обязательно выгружать результат в ТЗ.
Точно, спасибо :)
После ДЗ №6 опят вернулся сюда (в ДЗ №5 много нового подчерпнул для себя).
1. Глобальная переменная ТекущийПользователь в модуле Управляемого приложения получилась не задействована, т.к. все равно передача текущего пользователя у нас происходит через параметры при вызове процедур и функций.
2. И забыли проверку при выходе для Администратора реализовать.
1. Это не страшно, ведь наша цель – наработка навыков.
2. Кажется, что не забыл, есть следующий код:
Если НЕ РаботаСПользователями.ТекущийПользовательАдминистратор(ТекущийПользователь, РабочееВремя) Тогда
Отказ = НЕ РаботаСПользователямиКлиент.РазрешитьЗапуск(РабочееВремя);
КонецЕсли;
Или вы не про это?
Проверка именно вызванная из процедуры ПередЗавершениемРаботыСистемы(Отказ). (проверка по времени не для администраторов). Просто вы начали выполнять ДЗ №5 с чистого листа (наверное из-за предыдущего глюка в ДЗ №4). А эта проверка была реализована в ДЗ №4.
И еще маленькое пожелание не в эту тему:
В видео-ответах, когда используете Синтаксис-помощник может настроите его в “Располагать горизонтально”, тогда лучше будет нам ориентироваться, что открываете и в какой ветке.
По поводу проверки стало ясно.
А с синтакс-помощником не понятно. Что даст горизонтальное расположение?
Т.е. если так настроить окно синтаксис-помощника, то будет два окошка, расположенных горизонтально (одно относительно другого). И ветку с содержанием (левое окошко) будет лучше видно (всю ветку и подветки при разворачивании), т.е. относительное расположение подветок. Да и в правое окошко больше информации войдет. Тогда можно еще расширить влево окно синтаксис-помощника на все видео-окно. Таким образом будет видно одновременно больше информации.
Ну как то так.
Я “рекомендую”, а вы “утверждаете”!
Все, понятно о чем речь.
Утверждаю, по крайней мере попробуем в следующих уроках этот режим.
Немного позновато, но всё-таки:
Решение сделал через парметр сеанса и список значений (после просмотра решения и через форму тоже).
1. На что обратил внимание, представленное решение сделано было только для управляемого приложения, вроде как надо было и для обчычного тоже? Понимаю что разницы не много, но …
Просьба уточнять для каких режимов делать задания или если не указано отдельно принимать что только для управляемого?
2. Если установить множественный выбор, то результат выбора будет всегда в Массиве (даже для одного выбранного элемента). В решение зачем-то приводиласть отдельная обработка…
1. Во всех заданиях, равно как и в жизни, будет определенное количество неизвестных.
Ваша цель – создать работающее решение при любых обстоятельствах.
Качество решения на вашей совести.
2. Да, отдельной обработки не нужно было делать..
Добрый день!
Появилось ряд небольших вопросов.
1 вопрос:
За комбинацию клавиш Alt+”стрелка вниз” спасибо.
А какой комбинацией клавиш открыть плюсик при выборе типа данных:
Т.е. добавили новый реквизит справочника. Далее в свойствах при выборе типа нажали F4. Открылось окно выбора типа. И справочник ссылка имеет несколько типов (существует несколько справочников) и нам нужно развернуть.
2 вопрос:
В part05 после слов “… нам нужно анализировать что возвращает метод РазрешитьЗапуск()” открылось окно “Объект перехода”. Расскажите пожалуйста об этом функционале платформы. В уроках вроде такого не встречал.
3 вопрос:
Нужно ли “НовыйЭлемент.Записать();” при создании нового элемента справочника вставлять в конструкцию Попытка…Исключение…КонецПопытки?
В видео-решении этого не увидел. А возможна ли ситуация, что база будет заблокирована при записи нового объекта в базу, или база может быть заблокирована для записи только при перезаписи уже существующего объекта?
4 вопрос:
Если мы считываем две (или более) константы из ИБ, нужно ли для оптимизации работать через объект КонстантыНабор? Вы в видео-решении применяли считывание по одной. Когда лучше применять этот объект?
5. Да и наверное нужно добавить условие: если констаны не заполнены, тогда не производить проверку по рабочему времени.
Если в видео не получится ответить, то коротко если можно здесь.
Спасибо!
5. Конечно лучше добавить условие.
Остальные вопросы интересные, просьба переслать их в ящик мастер-группы, разберем в видео..
Использовал параметр сеанса ТекущийПользователь, синхронизацию делал по имени, при повторном входе удалял ранее сделанный выбор
Кстати, Евгений, просматривая решение 5го ДЗ, отметил, что:
1. Некоторые вещи топорно и некрасиво сделал я.
(Наверно, сказывается отсутствие опыта программирования в 8ке. Ваше решение было более простым)
2. Кажется, сказанное ранее замечание о том, что после “переписывания” “специалистами” типовых конфигураций (УПП, в частности) начинают они жутко тормозить, стало более понятным для меня.
(эхх, не удалось у меня Йоды стилем мысль изложить :-) )
Мысль вполне понятна :)
Осознание проблемы это начало правильного пути ))
я получал константы следующим образом:
Общий модуль с галками “сервер” и “вызов сервера” имеющий след.функцию:
Если ЗначениеЗаполнено(ИмяКонстанты) Тогда
Возврат Константы[ИмяКонстанты].Получить();
КонецЕсли;
Возврат Неопределено;
КонецФункции
Вывоз функции у примеру такой:
А время вот так:
ТекущееВремя = Дата("00010101")+Число(ТекДата-НачалоДня(ТекДата));
В продвинутом курсе мы будем говорить о том, что число серверных вызовов нужно минимизировать..
Вот чтобы минимизировать, можно было бы сделать
чтобы серверная функция возвращала структуру в которой бы содержалась и ссылка на пользователя и реквизит “Администратор” и константы НачалоРабочегоДня и ОкончаниеРабочегоДня.
Евгений, скажите нет каких то противопоказаний, против того чтобы серверная функция возвращала структуру ?
Абсолютно никаких.
То есть можно пользоваться ? :)
И еще подскажите, я понял что нужно минимизировать количество серверных вызовов со стороны клиента.
А если мы вызвали со стороны клиента серверную процедуру и она(серверная) в свою очередь вызывает несколько серверных процедур. Это более оптимально чем если бы мы со стороны клиента вызывали эти процедуры по отдельности ? Естественно если логика решения позволяет так сделать.
Да, это более оптимальный подход.