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

Представляем решение 7-го ДЗ.

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

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

  1. Задание сделала. Отрабатываю отпускные долги

  2. Людмила Фролова 26.08.2010 в 07:18

    Разобралась с ДЗ №7. Опыта маловато.наглядные примеры – очень большая помощь.
    Спасибо.

  3. Задание выполнил. Делал параллельно решению. Т.е. делаю 1 пункт, потом смотрю решение и т.д. Решение несколько различалось. Немного поработал с процедурой ПриОткрытии().Обращался через РеквизитФормыВЗначение(), чтобы в зависимости от значения флага в “Поступлении товаров” выбирать: Контрагент это или физ.лицо, и скрывать ненужные строки. В Процедуре Печати: ЮрЛицо это или ФизЛицо выбирал прямо из запроса.

    • Лучше действия по видимости делать в процедуре ПриСозданииНаСервере, то есть вмешаться нужно в сам процесс создания формы.

  4. ДЗ 7 сделал, При вводе на основании выбирается первый документ. Запрос один в один с тем, что в решении показывается, сравнивал неоднократно. Промучался часа 2, ответа так и не нашел. Дробил запросы. Вложенный выбирает последний документ, Товары почему то из первого. Пойду смотреть мастер группу.

  5. Задание выполнил. Проблемы были, т.к. само задание размыто и прикладную задачу по товарам я не знаю. Поэтому пришлось смотреть и делать, раз 5 наверное :-\

    • + еще применить решения от других участников и всё проверить. :)

      • временные таблицы я знаю как пользоваться, но как вы там быстро орудуете перекидываете внутренний запрос во временный – это высший пилотаж – я так не могу…

  6. Сделано. Особых проблем не возникло.

  7. Евгений Ершов 26.07.2010 в 22:09

    А “ЮрФизЛицо” может надо вывести в качестве реквизита документа “РеализацияТоваров”?

  8. Владимир Мединский 26.07.2010 в 17:38

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

  9. Ilya Palatnikov 26.07.2010 в 00:57

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

  10. Сергей Калмыков 25.07.2010 в 17:16

    Поступление – одним документом, 2 реквизита юрлицо и физлицо – и настроил управление видимостью в зависимости от кода операции. Реализацию – аналогично.

  11. Анатолий Белогорцев 25.07.2010 в 16:12

    Хотел бы еще прокомментировать несколько моментов:

    1-ый момент касательно “склейки” запроса из кусков (как в эталонном решении в универсальной функции ввода на основании). Есть тенденции (и они уже в типовых присутствуют) делать похожие вещи следующим образом, как преимущество – запрос можно открыть конструктором запроса.

    Пример:

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

    // ввод документа “РеализацияТоваров”
    Если ТипОбъекта = “РеализацияТоваров” тогда
    ТекстЗапроса = СтрЗаменить(ТекстЗапроса, “ПоступлениеТоваров”, “РеализацияТоваров”);
    КонецЕсли;

    2-ой момент касательно механизмов, используемых в типовых конфигурациях. Благо мы подробно их рассматриваем в нашем курсе (в частности, сущности “Качество товара”). В 11 редакции “Управление торговлей” уже нет отдельного справочника и все реализуется с помощью механизма характеристик. Как плюс – не используется дополнительное измерение в регистрах.

    • 1. Ок.
      2. В решаемой задаче требуется вести учет товаров в разрезе качества.
      В УТ11 нет измерения Качество в регистре ТоварыНаСкладах, соответственно учет остатков по качеству не ведется.
      Верно?

      • Какой Ок, если необходимо еще в запросе указывать “Контактное лицо” – так что не получится через конструктор, если не применить дополнительное шаманство.

        • Тогда нужно применять дополнительное шаманство )

  12. Может быть я чего то пропустил, но почему нельзя обойтись без вложенного запроса в условие и писать сразу так:

    “ВЫБРАТЬ ПЕРВЫЕ 1
    | ОснованиеТовары.Номенклатура,
    | ОснованиеТовары.ЕдиницаИзмерения,
    | ОснованиеТовары.Количество,
    | ОснованиеТовары.Цена,
    | ОснованиеТовары.Сумма,
    | ОснованиеТовары.Качество
    | “+?(ИмяДокумента = “РеализацияТоваров”,”,ОснованиеТовары.Ссылка.КонтактноеЛицо КАК КонтактноеЛицо”,””)+ ”
    |ИЗ
    | Документ.”+ИмяДокумента+”.Товары КАК ОснованиеТовары
    |ГДЕ
    | ОснованиеТовары.Ссылка.Проведен
    | И ОснованиеТовары.Ссылка.Контрагент = &Контрагент
    |
    |УПОРЯДОЧИТЬ ПО
    | ОснованиеТовары.Ссылка.МоментВремени УБЫВ”;

    у меня все работает!

  13. Наверное сумничал, но сделал не только ВВОД НА ОСНОВАНИИ контрагента, но еще и заполнение ТЧ документа ПРИ СМЕНЕ контрагента. Просто бывают такие моменты в жизнедеятельности организаций.
    А вот Контрагента и Подотчетное Лицо фирмы сделал разными реквизитами документа, потому что тоже из опыта работы надо знать реально, кто поставщик, ну и по подотчетному лицу (например, менеджер по закупу) вести учет его активности, от чего может зависеть зряплата того же менеджера.

  14. Константин Павленко 24.07.2010 в 12:50

    Вопрос по функции ЧислоПрописью(). Второй параметр “ЧПДС” – это недокументированная “фича”? Обычно я его вообще не указывал и всё работало. Параметры предмета исчисления надо указывать, само собой. Посмотрел ещё раз синтакс-помощник и УПП. Второй параметр должен быть вида: “L=ru_RU; НП=Истина; НД=Истина; ДП=Ложь”. Именно такие значения по умолчанию, что в большинстве случаев и требуется.

    • Похоже это мой старый багаж, сейчас нет ключа защиты чтобы провести эксперименты, но полагаю вы правы – “ЧПДС” здесь ни к чему…

  15. Михайлов Сергей 24.07.2010 в 00:47

    Поступление делал одним документом. Поставщик составной тип данных (Контрагенты, сотрудники). Последний документ – запросом. Печать с проверкой типа поставщика.

  16. Константин Павленко 23.07.2010 в 19:21

    Не совсем понятно, для чего в запросах в п.п.7-9 использован параметр “Ссылка”. Вроде бы явно нигде не используется, хотя и вреда от него нет.
    Я сделал чуть иначе методом “конвейерной” обработки. Первый запрос добывает последний по времени документ-основание. Получаем массив из одного элемента:
    ДокументОснование = ЗапросПоДокументу.Выполнить().Выгрузить().ВыгрузитьКолонку(0);
    В основном запросе меняем условие на:
    ДокументОснованиеТовары.Ссылка В (&ДокументОснование)
    Контактное лицо в основном запросе не выбираем. Поскольку ссылка на документ-основание лежит отдельно, то:
    Если ИмяДокумента = “РеализацияТоваров” Тогда
    Объект.КонтактноеЛицо = ДокументОснование[0].КонтактноеЛицо;
    КонецЕсли;

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

    • >для чего в запросах в п.п.7-9 использован параметр «Ссылка»
      Это опечатка :)
      >1С рекомендует вместо одного сложного запроса использовать несколько простых
      Это не так. Нужно быть аккуратными со вложенными запросами.
      Но в общем случае один большой запрос оптимальнее, чем два маленьких.
      О производительности будем говорить в продвинутом ;)

  17. Евгений Ершов 23.07.2010 в 18:38

    3 часа сидел над запросом (чтобы получить данные для ввода на основании), честно скажу подсмотрел у вас в решении в 7 видео (именно как взять последний момент времени).
    Но мне кажется запрос работает не правильно (берется первый документ, а не последний). Т.е. неправильно отрабатывает условие (вложенный запрос). Я подозреваю, что сначала отрабатывает “ВЫБРАТЬ ПЕРВЫЕ 1”, а затем “Упорядочить” (т.е. упорядочивание накладывается уже на выбранную одну (первую запись)). Подскажите как наложить условие, а то никак не соображу.
    Спасибо.

    • Сегодня в мастер-группе на эту тему пообщаемся )

  18. Извините, я наверное чего-то не понял, но в решении задания, при вводе документа поступление товаров на основании контрагента, документ заполняется не по последнему документу (там цена 5000 руб.), а по первому (с ценой – 100 руб.).

  19. Константин Павленко 23.07.2010 в 14:51

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

    Всё ОК, если Номенклатуру не пишем, то и подчиненная Единица измерения не записывается. Она попадает в ту же транзакцию, что и Номенклатура?

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

  20. Евгений Пехов 23.07.2010 в 14:23

    Ввод поступления на основании контрагента.
    В этом уроке,в запросе Вы передаете параметр ссылку?Зачем?Это опечатка?Система не ругается,хоть этого параметра нет в запросе.

  21. А все-таки стоило ли выносить обработку ввода на основании в общий модуль? А то пришлось делать столько специфических изменений для каждого документа.

    • Более оптимальное решение нашел один из участников.
      Общим модулем, я бы все же воспользовался.
      Но описал бы функцию, которая ищет последний документ.
      А далее есть метод Скопировать.

  22. Илья Чернов 23.07.2010 в 12:13

    Я делал запись ед. измерения в обработке ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи), в чем я не прав?

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

    Запрос как и ваш не будет работать с документом авансовый отчет, там нет контрагента. Поэтому я дал бывшему реквизиту Сотрудник имя Контрагент и синоним Сотрудник. Наверное это не правильно…лучше наверное было вписать условие в текст запроса?

    • При программной записи проверка не будет работать.
      Также если, для номенклатуры создадут другую форму, проверка не будет работать. Это нужно учитывать.
      >лучше наверное было вписать условие в текст запроса?
      Да, пожалуй, лучше, поскольку другой разработчик может запутаться в коде…

      • Илья Чернов 23.07.2010 в 22:57

        уговорили)

      • Почему не будет? Если модуль объекта “ПриЗаписи” перенести в модуль объекта “ПослеЗаписи”? Проверки созданы на уровне объекта и они будут проверяться при программной записи.

        • ошибся, перенести в модуль формы (а не объекта – там нет этого метода)

        • Попробуйте программно создать объект и записать, проверьте, отрабатывает ли событие формы ПослеЗаписи()..

  23. Не увидела я в запросе ввода на основании параметр Ссылка. Зачем его устанавливать?

  24. А мне было лень создавать форму документа для контакта, настроила многострочный режим на уровне реквизита объекта.

    • Ваше решение мне нравиться.
      Лень – двигатель прогресса ))

  25. Хм… В вводе на основании делал только 1 запрос – вытаскивал ссылку на последний документ, если запрос не пустой, то делал Товары.Загрузить(Выборка.Ссылка.Товары.Выгрузить());
    Пока нет привычки все и везде делать запросом – видимо по тому, что проблем с производительностью пока не испытывал… не на том уровне летаю…

    • Всё познаётся в сравнении, например, затрачиваемое время при запросе или при обработке ТЗ после выборки. Даже сложный запрос быстрее, чем сортировка ТЗ.

  26. Ну Вы замутили в процедуре печати:
    СсылкаДокумента = Ссылка[0];
    ОбластьЗаголовок.Параметры.ВидДокумента = ?(СсылкаДокумента.Контрагент.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ФизЛицо, “Товарный чек”,”Торг 12″);
    Минусы:
    1. Групповая печать из списка не получится. Кстати, при групповой печати выводится горизонтальный разделитель страниц.
    2. СсылкаДокумента.Контрагент.ЮрФизЛицо – обращение через точку не есть хорошо.

    Мое решение:
    В запрос добавляем:
    | РеализацияТоваров.Контрагент.ЮрФизЛицо ЮрФизЛицо
    Ну и, соответственно, в ветке обхода выборки:
    ОбластьЗаголовок.Параметры.ВидДокумента = ?(Выборка.ЮрфизЛицо = Перечисления.ЮрФизЛицо.ЮрЛицо, “Торг-12″,”Товарный чек”);

  27. По 10 блоку – не принципиально, но можно получать тип контрагента в первом цикле через Если Выборка.Контрагент.Тип, тогда если сразу несколько документов печатать то у каждого будет соответствующий заголовок.

  28. Автосоздание единицы измерения – в Вашем решении не обработана ситуация, когда номенклатура – услуга и базовую единицу заполнять не обязательно. Т.е. нужно наложить условие еще и на заполненность базовой единицы.