Базовый курс. Решение ДЗ №9
Представляем решение 9-го задания, состоящее из 25 видео-уроков.
К сожалению, у Вас недостаточно прав для просмотра этой записи. Если Вы еще не залогинены на сайте
— залогиньтесь.
— залогиньтесь.
Если не активировали токен — посмотрите видео-инструкцию (видео N5)
Если вы залогинены, у Вас активирован токен доступа, но вы все равно видите эту запись —
напишите нам на e-mail поддержки.
В процедуре ОбработкаПроведения() док-та РеализацияТоваров в запросе
Запрос.Текст =
“ВЫБРАТЬ
| ОстаткиНоменклатурыОстатки.Номенклатура,
| ОстаткиНоменклатурыОстатки.Качество,
| ОстаткиНоменклатурыОстатки.КоличествоОстаток,
| Товары.НомерСтроки
|ИЗ
| РегистрНакопления.ОстаткиНоменклатуры.Остатки(
| &МоментВремени,
| (Номенклатура, Качество) В
| (ВЫБРАТЬ РАЗЛИЧНЫЕ
| РеализацияТоваровТовары.Номенклатура,
| РеализацияТоваровТовары.Качество
| ИЗ
| Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
| ГДЕ
| РеализацияТоваровТовары.Ссылка = &Ссылка
| И РеализацияТоваровТовары.Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Товар)
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| РеализацияТоваровСоставНаборов.Комплектующая,
| РеализацияТоваровТовары.Качество
| ИЗ
| Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваров.СоставНаборов КАК РеализацияТоваровСоставНаборов
| ПО
| РеализацияТоваровТовары.Номенклатура = РеализацияТоваровСоставНаборов.Набор
| ГДЕ
| РеализацияТоваровСоставНаборов.Ссылка = &Ссылка
| И РеализацияТоваровТовары.Ссылка = &Ссылка
| И РеализацияТоваровТовары.Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Набор))) КАК ОстаткиНоменклатурыОстатки
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
| РеализацияТоваровТовары.Качество КАК Качество,
| МИНИМУМ(РеализацияТоваровТовары.НомерСтроки) КАК НомерСтроки,
| ЕСТЬNULL(РеализацияТоваровСоставНаборов.Комплектующая, РеализацияТоваровТовары.Номенклатура) КАК Номенклатура
| ИЗ
| Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваров.СоставНаборов КАК РеализацияТоваровСоставНаборов
| ПО РеализацияТоваровТовары.Номенклатура = РеализацияТоваровСоставНаборов.Набор
|
| СГРУППИРОВАТЬ ПО
| РеализацияТоваровТовары.Качество,
| ЕСТЬNULL(РеализацияТоваровСоставНаборов.Комплектующая, РеализацияТоваровТовары.Номенклатура)) КАК Товары
| ПО ОстаткиНоменклатурыОстатки.Номенклатура = Товары.Номенклатура
| И ОстаткиНоменклатурыОстатки.Качество = Товары.Качество
|ГДЕ
| ОстаткиНоменклатурыОстатки.КоличествоОстаток < 0”;
в последней части, где делается внутреннее соединение с табл частями для получения номера строки таблицы Товар, нет условия
где РеализацияТоваровТовары.ссылка =&ссылка
И РеализацияТоваровСоставНаборов.ссылка= &ссылка
Это правильно? Я так понимаю, без этого условия соединяются все документы. Но когда я поставила это условие, то не выводятся строки из табл части Товар. Выводятся все необходимые строки только когда убираю условие “РеализацияТоваровСоставНаборов.ссылка= &ссылка” и сделала связи между табличными частями не только по номенклатуре но и по ссылке. Почему не работает когда 2 условия по ссылке?
2 вопрос. ЧЕм отличается метод , который мы использовали при проведении без контроля
Элементы.Список.Обновить() для появления галки проведения у док-та
и ОбновитьОтображениеДанных()?
2 метод не сработал в этой ситуации.
>Я так понимаю, без этого условия соединяются все документы. Но когда я поставила это условие, то не выводятся строки из табл части Товар.
Действительно, это ошибка в решении. Спасибо!
Условие по ссылке, конечно необходимо.
Но условие по ссылке для товаров и для наборов ставить неправильно. Поскольку в табличной части “Наборы” может и не быть данных (поскольку в документе наборы отсутствуют), поэтому условие “Набор.Ссылка = &Ссылка” даст ложный результат, и в этом случае вообще вложенный запрос “Товары” не будет содержать строк, и более того перестанет работать контроль остатков.
А правильный запрос выглядит так: добавляется условие по Ссылке для табличной части Товары и еще одно условие в соединении.
Вот его текст:
ВЫБРАТЬ
ОстаткиНоменклатурыОстатки.Номенклатура,
ОстаткиНоменклатурыОстатки.Качество,
ОстаткиНоменклатурыОстатки.КоличествоОстаток,
Товары.НомерСтроки
ИЗ
РегистрНакопления.ОстаткиНоменклатуры.Остатки(
&МоментВремени,
(Номенклатура, Качество) В
(ВЫБРАТЬ РАЗЛИЧНЫЕ
РеализацияТоваровТовары.Номенклатура,
РеализацияТоваровТовары.Качество
ИЗ
Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
ГДЕ
РеализацияТоваровТовары.Ссылка = &Ссылка
И РеализацияТоваровТовары.Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Товар)
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
РеализацияТоваровСоставНаборов.Комплектующая,
РеализацияТоваровТовары.Качество
ИЗ
Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваров.СоставНаборов КАК РеализацияТоваровСоставНаборов
ПО
РеализацияТоваровТовары.Номенклатура = РеализацияТоваровСоставНаборов.Набор
ГДЕ
РеализацияТоваровСоставНаборов.Ссылка = &Ссылка
И РеализацияТоваровТовары.Ссылка = &Ссылка
И РеализацияТоваровТовары.Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Набор))) КАК ОстаткиНоменклатурыОстатки
ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
РеализацияТоваровТовары.Качество КАК Качество,
МИНИМУМ(РеализацияТоваровТовары.НомерСтроки) КАК НомерСтроки,
ЕСТЬNULL(РеализацияТоваровСоставНаборов.Комплектующая, РеализацияТоваровТовары.Номенклатура) КАК Номенклатура
ИЗ
Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваров.СоставНаборов КАК РеализацияТоваровСоставНаборов
ПО РеализацияТоваровТовары.Номенклатура = РеализацияТоваровСоставНаборов.Набор
И РеализацияТоваровТовары.Ссылка = РеализацияТоваровСоставНаборов.Ссылка
ГДЕ
РеализацияТоваровТовары.Ссылка = &Ссылка
СГРУППИРОВАТЬ ПО
РеализацияТоваровТовары.Качество,
ЕСТЬNULL(РеализацияТоваровСоставНаборов.Комплектующая, РеализацияТоваровТовары.Номенклатура)) КАК Товары
ПО ОстаткиНоменклатурыОстатки.Номенклатура = Товары.Номенклатура
И ОстаткиНоменклатурыОстатки.Качество = Товары.Качество
ГДЕ
ОстаткиНоменклатурыОстатки.КоличествоОстаток < 0
“Но условие по ссылке для товаров и для наборов ставить неправильно. Поскольку в табличной части «Наборы» может и не быть данных (поскольку в документе наборы отсутствуют)”.
Но ведь у нас для этого и делается левое соединение, чтобы вошли записи из таблицы Товар и ( если существуют) записи из таблицы Набор.
И еще интересно узнать ответ на 2 вопрос в пред письме
Да, делается левое соединение, но условие накладывается на результат итогового запроса. Поэтому запрос не возвращает никаких записей.
По поводу второго вопроса.
ОбновитьОтображениеДанных() необходимо использовать в тех, случаях когда необходимо обновить значения в реквизитах управляемой формы, но платформа не делает это самостоятельно. Например, реквизит формы был изменен при вызове общего модуля, и нужно выполнить обновление.
В нашем же случае ситуация иная:
– изменился документ во внешнем вызове (признак Проведен);
– нужно форме сообщить об этом – либо использовать метод Обновить(), либо метод глобального контекста ОповеститьОбИзменении().
Столкнулась с такой проблемой:
При левом соединении 2 ТЧ Товар и набор одного док-та
Выбрать…
Из Товар
ЛЕВОЕ СОЕДИНЕНИЕ Набор
ГДЕ Товар= &ссылка
И Набор=&ссылка
ПО Товар.Номенклатура=Набор.Номенклатура
не выводятся строки из ТЧ Товар. Убираю условие ссылки на Набор, выводятся строки из Товара, которых нет в наборе. Или ставлю с связи
ПО Товар.Номенклатура=Набор.Номенклатура
И Товар.ссылка=Набор.ссылка
Тоже работает нормально.
Не понимаю.
У вас в решении ДЗ №9 в контроле остатков в послених строках запроса
….ВНУТРЕННЕЕ СОЕДИНЕНИЕ
с ТЧ Товар и СоставНаборов вообще нет ссылок на документы. Это правильно? Но если поставить обе ссылки , то строки из ТЧ Товар не выводятся.
Я так понимаю, следующий Ваш комментарий касается этой же проблемы, но более содержательный.
На него я и отвечу.
При обновлении формы списка док Реализаций почему не работает метод ОбновитьОтображениеДанных() ?
Пожалуйста, приведите задачу (проблему) целиком.
В решении не обеспечена устойчивость при перепроведении документов. Так, если поменять “Вид номенклатуры” с товара на услугу, например, изменятся движения по остаткам.
Проще всего запретить изменение вида номенклатуры, если есть проведенные документы по ссылке. Есть еще решение с разноской ТЧ.
Спасибо, Андрей!
Действительно самое эффективное решение – запретить редактировать данный реквизит.
Евгений, а не проще было бы изначально сделать регистр сведений периодическим и проблема тогда отпала бы сама собой – не надо было бы в табличную часть записывать состав набора, не надо было бы заботиться о запретах, всего лишь при пере/проведении брать на нужную дату соответствующий набор.
На самом деле, проблема бы осталась, просто она стала бы менее острой.
Тем не менее, можно было изменить состав набора для существующих записей (период не изменять), тогда документы при перепроведении формировали бы иные движения.
Спасибо за решение! Возникло два вопроса.
1. Отработают ли корректно алгоритмы работы с наборами в том случае, если в табличных частях будут встречаться одинаковые наборы с различным качеством? Например, набор гаек с качеством “Новые ” и набор гаек с качеством “Ржавые” имеющие одинаковый состав комплектующих в регистре сведений?
2. При реализации отчета по прогнозированию фин. результата я использовал одну виртуальную таблицу среза цен, с отбором в параметрах по двум типам в запросе. При этом добавил два вычисляемых поля(цена закупки и цена продажи), которые заполнял в зависимости от типа цены записи, а получившуюся таблицу группировал по полю номенклатура, выбирая максимальное значение от каждого поля цены. Что предпочтительнее – использовать запрос с двумя виртуальным таблицами и одним параметром, или запрос с одной таблицей, двумя параметрами к ней и последующую группировку результата?
1. Кажется, что все будет ОК, комплектующие с разным качеством “перемешиваться” не будут.
2. Наиболее производительное решение – использовать запрос с одной ВТ со списком параметров (т.е. Ваше решение). Хотя разница в скорости будет вряд ли ощутима даже на большом объеме данных.