Базовый курс. Решение ДЗ №7
Представляем решение 7-го ДЗ.
К сожалению, у Вас недостаточно прав для просмотра этой записи. Если Вы еще не залогинены на сайте — залогиньтесь. Если Вы оплачивали курс, у Вас активирован токен доступа, Вы залогинены, но Вы видите эту запись — напишите нам на e-mail поддержки.
Задание сделала. Отрабатываю отпускные долги
Разобралась с ДЗ №7. Опыта маловато.наглядные примеры – очень большая помощь.
Спасибо.
Задание выполнил. Делал параллельно решению. Т.е. делаю 1 пункт, потом смотрю решение и т.д. Решение несколько различалось. Немного поработал с процедурой ПриОткрытии().Обращался через РеквизитФормыВЗначение(), чтобы в зависимости от значения флага в “Поступлении товаров” выбирать: Контрагент это или физ.лицо, и скрывать ненужные строки. В Процедуре Печати: ЮрЛицо это или ФизЛицо выбирал прямо из запроса.
Лучше действия по видимости делать в процедуре ПриСозданииНаСервере, то есть вмешаться нужно в сам процесс создания формы.
ДЗ 7 сделал, При вводе на основании выбирается первый документ. Запрос один в один с тем, что в решении показывается, сравнивал неоднократно. Промучался часа 2, ответа так и не нашел. Дробил запросы. Вложенный выбирает последний документ, Товары почему то из первого. Пойду смотреть мастер группу.
Задание выполнил. Проблемы были, т.к. само задание размыто и прикладную задачу по товарам я не знаю. Поэтому пришлось смотреть и делать, раз 5 наверное :-\
+ еще применить решения от других участников и всё проверить. :)
временные таблицы я знаю как пользоваться, но как вы там быстро орудуете перекидываете внутренний запрос во временный – это высший пилотаж – я так не могу…
Сделано. Особых проблем не возникло.
А “ЮрФизЛицо” может надо вывести в качестве реквизита документа “РеализацияТоваров”?
Полагаю, что нет. Какой смысл?
Задание выполнил. Сложностей не возникло, кроме времени.
ДЗ №7 выполнено.
Поступление – одним документом, 2 реквизита юрлицо и физлицо – и настроил управление видимостью в зависимости от кода операции. Реализацию – аналогично.
Хотел бы еще прокомментировать несколько моментов:
1-ый момент касательно “склейки” запроса из кусков (как в эталонном решении в универсальной функции ввода на основании). Есть тенденции (и они уже в типовых присутствуют) делать похожие вещи следующим образом, как преимущество – запрос можно открыть конструктором запроса.
Пример:
ТекстЗапроса =
“ВЫБРАТЬ ПЕРВЫЕ 1
| ПоступлениеТоваров.Ссылка
|ПОМЕСТИТЬ Док
|ИЗ
| Документ.ПоступлениеТоваров КАК ПоступлениеТоваров
|ГДЕ
| ПоступлениеТоваров.Контрагент = &Контрагент
| И ПоступлениеТоваров.Проведен
|
|УПОРЯДОЧИТЬ ПО
| ПоступлениеТоваров.МоментВремени УБЫВ
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ПоступлениеТоваровТовары.Номенклатура,
| ПоступлениеТоваровТовары.Качество,
| ПоступлениеТоваровТовары.ЕдиницаИзмерения,
| ПоступлениеТоваровТовары.Количество,
| ПоступлениеТоваровТовары.Цена,
| ПоступлениеТоваровТовары.Сумма
|ИЗ
| Документ.ПоступлениеТоваров.Товары КАК ПоступлениеТоваровТовары
|ГДЕ
| ПоступлениеТоваровТовары.Ссылка В
| (ВЫБРАТЬ
| Док.Ссылка
| ИЗ
| Док)”;
// ввод документа “РеализацияТоваров”
Если ТипОбъекта = “РеализацияТоваров” тогда
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, “ПоступлениеТоваров”, “РеализацияТоваров”);
КонецЕсли;
2-ой момент касательно механизмов, используемых в типовых конфигурациях. Благо мы подробно их рассматриваем в нашем курсе (в частности, сущности “Качество товара”). В 11 редакции “Управление торговлей” уже нет отдельного справочника и все реализуется с помощью механизма характеристик. Как плюс – не используется дополнительное измерение в регистрах.
1. Ок.
2. В решаемой задаче требуется вести учет товаров в разрезе качества.
В УТ11 нет измерения Качество в регистре ТоварыНаСкладах, соответственно учет остатков по качеству не ведется.
Верно?
Какой Ок, если необходимо еще в запросе указывать “Контактное лицо” – так что не получится через конструктор, если не применить дополнительное шаманство.
Тогда нужно применять дополнительное шаманство )
Может быть я чего то пропустил, но почему нельзя обойтись без вложенного запроса в условие и писать сразу так:
“ВЫБРАТЬ ПЕРВЫЕ 1
| ОснованиеТовары.Номенклатура,
| ОснованиеТовары.ЕдиницаИзмерения,
| ОснованиеТовары.Количество,
| ОснованиеТовары.Цена,
| ОснованиеТовары.Сумма,
| ОснованиеТовары.Качество
| “+?(ИмяДокумента = “РеализацияТоваров”,”,ОснованиеТовары.Ссылка.КонтактноеЛицо КАК КонтактноеЛицо”,””)+ ”
|ИЗ
| Документ.”+ИмяДокумента+”.Товары КАК ОснованиеТовары
|ГДЕ
| ОснованиеТовары.Ссылка.Проведен
| И ОснованиеТовары.Ссылка.Контрагент = &Контрагент
|
|УПОРЯДОЧИТЬ ПО
| ОснованиеТовары.Ссылка.МоментВремени УБЫВ”;
у меня все работает!
А если в табличной части будет 13 строк?
… согласен
Пожалуй, разберем сегодня в мастер-группе.
Наверное сумничал, но сделал не только ВВОД НА ОСНОВАНИИ контрагента, но еще и заполнение ТЧ документа ПРИ СМЕНЕ контрагента. Просто бывают такие моменты в жизнедеятельности организаций.
А вот Контрагента и Подотчетное Лицо фирмы сделал разными реквизитами документа, потому что тоже из опыта работы надо знать реально, кто поставщик, ну и по подотчетному лицу (например, менеджер по закупу) вести учет его активности, от чего может зависеть зряплата того же менеджера.
Вопрос по функции ЧислоПрописью(). Второй параметр “ЧПДС” – это недокументированная “фича”? Обычно я его вообще не указывал и всё работало. Параметры предмета исчисления надо указывать, само собой. Посмотрел ещё раз синтакс-помощник и УПП. Второй параметр должен быть вида: “L=ru_RU; НП=Истина; НД=Истина; ДП=Ложь”. Именно такие значения по умолчанию, что в большинстве случаев и требуется.
Похоже это мой старый багаж, сейчас нет ключа защиты чтобы провести эксперименты, но полагаю вы правы – “ЧПДС” здесь ни к чему…
Поступление делал одним документом. Поставщик составной тип данных (Контрагенты, сотрудники). Последний документ – запросом. Печать с проверкой типа поставщика.
Не совсем понятно, для чего в запросах в п.п.7-9 использован параметр “Ссылка”. Вроде бы явно нигде не используется, хотя и вреда от него нет.
Я сделал чуть иначе методом “конвейерной” обработки. Первый запрос добывает последний по времени документ-основание. Получаем массив из одного элемента:
ДокументОснование = ЗапросПоДокументу.Выполнить().Выгрузить().ВыгрузитьКолонку(0);
В основном запросе меняем условие на:
ДокументОснованиеТовары.Ссылка В (&ДокументОснование)
Контактное лицо в основном запросе не выбираем. Поскольку ссылка на документ-основание лежит отдельно, то:
Если ИмяДокумента = “РеализацияТоваров” Тогда
Объект.КонтактноеЛицо = ДокументОснование[0].КонтактноеЛицо;
КонецЕсли;
Не уверен, что так будет оптимальнее, но вроде бы 1С рекомендует вместо одного сложного запроса использовать несколько простых. Вроде бы серверу БД в этом случае легче построить оптимальный план выполнения запроса.
>для чего в запросах в п.п.7-9 использован параметр «Ссылка»
Это опечатка :)
>1С рекомендует вместо одного сложного запроса использовать несколько простых
Это не так. Нужно быть аккуратными со вложенными запросами.
Но в общем случае один большой запрос оптимальнее, чем два маленьких.
О производительности будем говорить в продвинутом ;)
3 часа сидел над запросом (чтобы получить данные для ввода на основании), честно скажу подсмотрел у вас в решении в 7 видео (именно как взять последний момент времени).
Но мне кажется запрос работает не правильно (берется первый документ, а не последний). Т.е. неправильно отрабатывает условие (вложенный запрос). Я подозреваю, что сначала отрабатывает “ВЫБРАТЬ ПЕРВЫЕ 1”, а затем “Упорядочить” (т.е. упорядочивание накладывается уже на выбранную одну (первую запись)). Подскажите как наложить условие, а то никак не соображу.
Спасибо.
Сегодня в мастер-группе на эту тему пообщаемся )
Извините, я наверное чего-то не понял, но в решении задания, при вводе документа поступление товаров на основании контрагента, документ заполняется не по последнему документу (там цена 5000 руб.), а по первому (с ценой – 100 руб.).
Сегодня разберем в мастер-группе.
Когда создавал автоматически базовую единицу измерения, возникла одна мысль. А что если Единицу измерения номенклатуры (подчиненный элемент) создадим, а Номенклатуру в последний момент не запишем. Т.е. в процедуре ПриЗаписи() установим Отказ = Истина. Как же Единица измерения без владельца останется? Но нет, платформа эту ситуацию отрабатывает. В процедуре ПриЗаписи():
Попытка
БазоваяЕдиницаОбъект.Записать();
Отказ = Истина; // поставил специально только для проверки
Исключение
Сообщить(“Не удалось записать базовыю единицу измерения: ” + ОписаниеОшибки());
Отказ = Истина;
КонецПопытки;
Всё ОК, если Номенклатуру не пишем, то и подчиненная Единица измерения не записывается. Она попадает в ту же транзакцию, что и Номенклатура?
Отлично, спасибо за эксперимент.
Именно потому что все выполняется в одной транзакции, запись единицы не происходит.
Ввод поступления на основании контрагента.
В этом уроке,в запросе Вы передаете параметр ссылку?Зачем?Это опечатка?Система не ругается,хоть этого параметра нет в запросе.
Да, это не нужное действие..
А все-таки стоило ли выносить обработку ввода на основании в общий модуль? А то пришлось делать столько специфических изменений для каждого документа.
Более оптимальное решение нашел один из участников.
Общим модулем, я бы все же воспользовался.
Но описал бы функцию, которая ищет последний документ.
А далее есть метод Скопировать.
Я делал запись ед. измерения в обработке ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи), в чем я не прав?
Запрос у меня был кстати такой же, только с временными таблицами.
После просмотра решения сделал тоже документ авансовый отчет.
Запрос как и ваш не будет работать с документом авансовый отчет, там нет контрагента. Поэтому я дал бывшему реквизиту Сотрудник имя Контрагент и синоним Сотрудник. Наверное это не правильно…лучше наверное было вписать условие в текст запроса?
При программной записи проверка не будет работать.
Также если, для номенклатуры создадут другую форму, проверка не будет работать. Это нужно учитывать.
>лучше наверное было вписать условие в текст запроса?
Да, пожалуй, лучше, поскольку другой разработчик может запутаться в коде…
уговорили)
Почему не будет? Если модуль объекта “ПриЗаписи” перенести в модуль объекта “ПослеЗаписи”? Проверки созданы на уровне объекта и они будут проверяться при программной записи.
ошибся, перенести в модуль формы (а не объекта – там нет этого метода)
Попробуйте программно создать объект и записать, проверьте, отрабатывает ли событие формы ПослеЗаписи()..
Не увидела я в запросе ввода на основании параметр Ссылка. Зачем его устанавливать?
Опечатка :)
А мне было лень создавать форму документа для контакта, настроила многострочный режим на уровне реквизита объекта.
Ваше решение мне нравиться.
Лень – двигатель прогресса ))
Хм… В вводе на основании делал только 1 запрос – вытаскивал ссылку на последний документ, если запрос не пустой, то делал Товары.Загрузить(Выборка.Ссылка.Товары.Выгрузить());
Пока нет привычки все и везде делать запросом – видимо по тому, что проблем с производительностью пока не испытывал… не на том уровне летаю…
Всё познаётся в сравнении, например, затрачиваемое время при запросе или при обработке ТЗ после выборки. Даже сложный запрос быстрее, чем сортировка ТЗ.
Ну Вы замутили в процедуре печати:
СсылкаДокумента = Ссылка[0];
ОбластьЗаголовок.Параметры.ВидДокумента = ?(СсылкаДокумента.Контрагент.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ФизЛицо, “Товарный чек”,”Торг 12″);
Минусы:
1. Групповая печать из списка не получится. Кстати, при групповой печати выводится горизонтальный разделитель страниц.
2. СсылкаДокумента.Контрагент.ЮрФизЛицо – обращение через точку не есть хорошо.
Мое решение:
В запрос добавляем:
| РеализацияТоваров.Контрагент.ЮрФизЛицо ЮрФизЛицо
Ну и, соответственно, в ветке обхода выборки:
ОбластьЗаголовок.Параметры.ВидДокумента = ?(Выборка.ЮрфизЛицо = Перечисления.ЮрФизЛицо.ЮрЛицо, “Торг-12″,”Товарный чек”);
Отличное решение!
По 10 блоку – не принципиально, но можно получать тип контрагента в первом цикле через Если Выборка.Контрагент.Тип, тогда если сразу несколько документов печатать то у каждого будет соответствующий заголовок.
Полностью согласен.
Автосоздание единицы измерения – в Вашем решении не обработана ситуация, когда номенклатура – услуга и базовую единицу заполнять не обязательно. Т.е. нужно наложить условие еще и на заполненность базовой единицы.
Верно!
Нам дают направление ;)
А это – главное, коллега :)