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

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

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

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

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

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

  1. Ярослав 29.05.2012 в 02:53

    ДЗ решил сам буду еще проверять с вашим решением на оптимальность
    Обратная связь по первому блоку:
    1) Что нового я узнал в первом блоке или в чем поменялись взгляды после изучения
    материала?
    Узнал некоторые простые вещи про запросы на которые просто не обращал внимание.
    Вообще после ваших курсов вся мешанина в голове постепенно выстраивается по полочкам и уже нет такого что одно отлично знаешь а на других вещах идет затык
    2) В какой теме были наибольшие затруднения, и что помогло их преодолеть?
    Взаимодействие клиент сервер просто вникал не с первого раза
    3) Какую тему, имеющую отношение к текущему блоку, вы бы хотели подробнее
    раскрыть в мастер-группе? Незнаю

    • Ярослав 30.05.2012 в 00:09

      Методика решения
      1) Создал справочник контрагенты иерархия реквизит основное контактное лицо
      2) Создал справочник контактные лица и РС контактные лица измерения объект (Конрагент), Конт лицо и ресурс должность
      3)В регистр писал конт лицо и должность и выбирал контактное лицо в реквизит контрагента
      4) Создал справочник номенклатура Иерархия , классификатор единиц и спаравочник единицы измерения Владелец номенклатура реквизит коэффициент реквизит вид номенклатуры перечисление новое создал
      5) В справочнике номенклатура создал динамический список запрос к справочнику единицы измерения без параметра
      6) программный код номенклатуры
      &НаСервере
      Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
          //Вставить содержимое обработчика
          Если Не ЗначениеЗаполнено(Объект.Ссылка) Тогда
              ВидНоменклатуры = Объект.Родитель.ВидНоменклатуры;
          КонецЕсли;
          
          Отбор  = Единицы.Отбор.Элементы;
          ПолеОтбора = Отбор.Добавить(Тип(“ЭлементОтбораКомпоновкиДанных”));
          полеОтбора.ЛевоеЗначение = Новый ПолеКОмпоновкиДанных(“Владелец”);
          ПолеОтбора.ПравоеЗначение = Объект.Ссылка;
          ПолеОтбора.Использование  = Истина;
      КонецПроцедуры

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

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

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

      7) проверка контрагентов Создал обработку
      Код
      Процедура ПроверитьНаСервере()

      Запрос = Новый Запрос;
      Запрос.Текст = “ВЫБРАТЬ
      |    Контрагенты.Ссылка
      |ИЗ
      |    Справочник.Контрагенты КАК Контрагенты
      |ГДЕ
      |    Контрагенты.ОсновноеКонтактноеЛицо = ЗНАЧЕНИЕ(Справочник.КонтактныеЛица.ПустаяСсылка)”;

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

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

      Сообщить(“Не Заполнено контактное лицо у: ” + выборка.ссылка);    

      КонецЦикла;
          

      КонецПроцедуры // ПроверитьНаСервере()

       

    • Dobrenko Oleg 30.05.2012 в 09:43

      Ярослав, спасибо за обратную связь!

  2. про закладку Связи и ЛевоеСоединение так ничестно – не проходили. а в ПриЗаписи() я писал проверку если ли уже базовая единица в Единицах:

     <code>
    СпрЕд = Справочники.Единицы.Выбрать(,ЭтотОбъект.Ссылка,Новый Структура(“Единица”, БазоваяЕдиница));
    Если НЕ СпрЕд.Следующий() Тогда
    СпрЕдНовый = Справочники.Единицы.СоздатьЭлемент();
    СпрЕдНовый.Владелец = ЭтотОбъект.Ссылка;
    СпрЕдНовый.Единица = БазоваяЕдиница;
    СпрЕдНовый.Коэффициент = 1;
    СпрЕдНовый.Записать();
    КонецЕсли;

    </code>
    это плохо лишним запросом к данным сервера? 

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

  3. Еще не понял зачем поиск индекса Единиц Измерения в проверяемых реквизитах? Как его может не быть если мы сами установили выдавать ошибку в свойствах? Мне кажется проверка лишняя, можно просто сразу удалять для услуг.
    Возник вопрос метод  ДанныеЗаполнения.Свойство(“Родитель”,Значение), который используем в обработке заполнения имеет какие-то преимущества перед ДанныеЗаполнения.Родитель?
    Корректно-ли применять там ЗначениеЗаполнено(ДанныеЗаполнения), как это сделал я. (решил, что на основании мы пока ничего не вводим, а вы в первых уроках говорили, что это более производительный метод, чем сравнения.)
     
     

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

      >метод ДанныеЗаполнения.Свойство(«Родитель»,Значение), который используем в обработке заполнения имеет какие-то преимущества перед ДанныеЗаполнения.Родитель
      Да, имеет.
      В вашем случае, если в структуре нет свойства Родитель будет выдаваться ошибка.

      >Корректно-ли применять там ЗначениеЗаполнено(ДанныеЗаполнения)
      Нет, не корректно.
      Данный метод покажет, что в структуре что-то есть, но далеко не факт, что там есть свойство Родитель.
      Что касается производительности, то она отличается не намного, можно не принимать во внимание этот факт.

  4. Я честно говоря не понял пояснения недочетов табличной части в пункте 1. Что мне мешает ссылаться в реквизите документа на справочник КЛ выбранный в данный момент в табличной части. Мы же не строки там заполняем, а вполне конкретные ссылки на справочник контактных лиц и справочник должностей.

    • Ок, простой пример.

      Контрагент Алхимов, два контактных лица – Иванов, Петров.

      Вводим документ №13.. Выбираем Алхимова, выбираем контактное лицо (здесь подразумевается, что открывается список контактов именно для Алхимова).
      Положим выбрали Иванова.
      Провели документ.

      Далее, открываем контрагента Алхимов, удаляем Иванова.

      Вопрос, на каком основании в документе №13 выбрано контактное лицо, не соответствующее контрагенту. Вопрос риторический.

      Это один из примеров, возможно и другие подобные ситуации.

      • Действительно правильней как вы сказали. Я до этого в такой ситуации (не совсем такой, тут регистр сведений я бы ставил наверное) ставил проверку удаления с запросом на поиск первого документа с совпадением (условно там другие были) реквизита и контрагента и не давал удалить. Пойду поправлю у себя:) Спасибо!!!

        • Написал сам не смог прочитать. Я брал запрос который искал первый документ с совпадением двух справочников (один из которых упоминался у меня в табличной части другого) и запрещал удаление, если этот документ находился. Запрос отрабатывает мгновенно (если по одному из проверяемых реквизитов есть индекс).

  5. Добрый день! Ну многое пришлось переделывать.. И кое-что вызывает сомнения. . Согласен, что Контактные лица контрагентов, удобная вещь, но я так и слышу возгласы, типа что вы мне тут справочников вспомогательных наворотили. Понимаете, я так думаю, что на уровне пользователя тоже будет не комфортно.  Неужели нельзя обращаться к табличной части методом, хотя бы «найти».
    ЕЩЕ ВОПРОС, Почему в справочник Виды номенкл-ры нельзя мы не поместили предопределённые (товар, услуга, набор), а вместо этого завели перечисления?
     
    Проверка пустого значения единицы измерения решена, конечно более изящно. Я сотворил всё на уровне формы элемента.
     
    А вот с обработкой. Тут скорее образ мышления, когда ссылка равно нулю. Вот эта идея, что ноль, а что нет, мне не  далась..
    И еще у меня в запросе долго формировалась запись  Контрагенты.Ссылка КАК Ссылка Не знаю почему.
    ВОЗНИК ВОПРОС В чём разница запроса и запроса с обработкой результата?

    Борьбу с наименованием я обычно проводил на уровне форм, либо переименовывая, либо делая невидимым реквизит, при этом прописывая, что объект.Наименование = объект.Реквизит…
    Вот в принципе, и всё. Спасибо большое!

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

      >Неужели нельзя обращаться к табличной части методом, хотя бы «найти».
      Можно, но это не стабильно.
      Представим есть контрагент Альфа. У него заданы контактные лица – Иванов, Петров (в табличной части).
      В документе пользователь выбирает Альфа и его контрактное лицо – Иванов.

      Далее пользователь спокойно удаляет строку Иванов из контактных лиц Альфа.

      Спрашивается, почему есть в системе документ, в котором контрактное лицо не соответствует контрагенту.

      В случае подчиненного справочника такая ситуация становится невозможной в принципе. Кроме того, фильтрация при выборе работает практически на полном автомате.

      >Почему в справочник Виды номенкл-ры нельзя мы не поместили предопределённые (товар, услуга, набор), а вместо этого завели перечисления?
      Все зависит от того будет ли работать наши алгоритмы для видов номенклатуры, которые создаст пользователь вручную (такая возможность есть для справочника).
      Мы будем писать алгоритмы, ориентированные на конкретные значения. Поэтому используем перечисление.
      Если Вы определили справочник, то можете его и оставить.

      >И еще у меня в запросе долго формировалась запись Контрагенты.Ссылка КАК Ссылка Не знаю почему.
      Пока не понятно о чем речь. Приведите более развернутый пример.

      >ВОЗНИК ВОПРОС В чём разница запроса и запроса с обработкой результата?
      Видимо речь о конструкторе? Конструктор запроса с обработкой результат автоматически формирует программный код.
      Поэтому его более удобно использовать для создания новых запросов.
      Править существующие запросы удобно с помощью обычного конструктора запроса.

  6. Сделал работу над ошибками после просмотра вашего решения. Действительно, с номенклатурой я догадался создать подчиненный справочник единиц, а вот с контактными лицами контрагентов пошел по неверному пути с табличной частью. У такой вопрос по решению: вот в МО номенклатуры вы поставили такое условие в обработке заполнения:
    <code>
    Если ТипЗнч(ДанныеЗаполнения) = Тип(“Структура”) И ДанныеЗаполнения.Свойство(“Родитель”, Значение) Тогда

    ВидНоменклатуры = Значение.ВидНоменклатуры;    
    КонецЕсли;
    </code>
    Но в структуре метод Свойство возвращает Неопределено, если свойство не найдено, а вы используете метод в сложном логическом выражении. Результат Неопределено при отсутствии родителя неявно преобразуется в булевскую Ложь ?

    • >Но в структуре метод Свойство возвращает Неопределено, если свойство не найдено
      Немного не так. Если значение не найдено возвращается Ложь, а если найдено – Истина.
      Вот “Значение” в первом случае будет Неопределено. Но для этого условия это не имеем никакого значения.

  7. С интересом посмотрел решение. Спасибо! 
    При решении ДЗ №7 прочувствовал все недочеты своей конфигурации (особенно, особенно аукнулись табличные части в элементах справочников).
    Пришлось все переделать, прежде чем заниматься непосредственно ДЗ7. Вроде все совпало с этим решением:).
    Только смущает один момент – если у КонтактныхЛицКонтрагентов отказаться от стандартного реквизита Наименование, то при дальнейшем использовании элемент будет представляться в виде Кода (в тех же документах). Красиво с этим бороться не получилось и я у себя вернул Наименование (можно при записи заполнять программно).
    Не раз пытался отказаться от Наименования в разных справочниках – и каждый откатываюсь обратно. Рано или поздно представление в виде Кода мне выходит боком.

    • Да, согласен отказ от наименовании не самое лучшее решение. И дальше мы к этому тоже придем :)