Всем доброго дня!
Просьба подсказать, как на СКД реализовать следующие задачи:
1) Есть 2 запроса, они выбирают данные из табличной части документов СборкаЗапасов и РасходнаяНакладная, группировки следующие:
ВЫБРАТЬ
СборкаЗапасовПродукция.ЗаказПокупателя КАК ЗаказПокупателя,
СборкаЗапасовПродукция.Количество КАК КоличествоПроизводство,
СборкаЗапасовПродукция.Номенклатура КАК Номенклатура,
СборкаЗапасовПродукция.Ссылка КАК СсылкаПроизводство
ИЗ
Документ.СборкаЗапасов.Продукция КАК СборкаЗапасовПродукция
ГДЕ
СборкаЗапасовПродукция.ЗаказПокупателя.Проведен
И СборкаЗапасовПродукция.ЗаказПокупателя.ПометкаУдаления = ЛОЖЬ
И СборкаЗапасовПродукция.ЗаказПокупателя <> ЗНАЧЕНИЕ(Документ.ЗаказПокупателя.ПустаяСсылка)
И СборкаЗапасовПродукция.Ссылка.Проведен
И СборкаЗапасовПродукция.Ссылка.ПометкаУдаления = ЛОЖЬ
Показать
2)
ВЫБРАТЬ
РасходнаяНакладнаяЗапасы.Ссылка КАК СсылкаОтгрузка,
РасходнаяНакладнаяЗапасы.Номенклатура КАК Номенклатура,
РасходнаяНакладнаяЗапасы.Количество КАК КоличествоОтгрузка,
РасходнаяНакладнаяЗапасы.Заказ КАК ЗаказПокупателя
ИЗ
Документ.РасходнаяНакладная.Запасы КАК РасходнаяНакладнаяЗапасы
ГДЕ
РасходнаяНакладнаяЗапасы.Заказ.Проведен
И РасходнаяНакладнаяЗапасы.Заказ.ПометкаУдаления = ЛОЖЬ
И РасходнаяНакладнаяЗапасы.Заказ <> ЗНАЧЕНИЕ(Документ.ЗаказПокупателя.ПустаяСсылка)
И РасходнаяНакладнаяЗапасы.Ссылка.Проведен
И РасходнаяНакладнаяЗапасы.Ссылка.ПометкаУдаления = ЛОЖЬ
Показать
Связь сделана по полю ЗаказПокупателя.
В поле Количество нужно выводить значение, в зависимости от документа (напротив Документ.СборкаЗапасов - Количество из ТЧ этого документа, напротив Документ.РасходнаяНакладная - Количество из ТЧ этого документа).
Сделал на СКД вычисляемое поле Количество, в "Выражение" добавил:
ВЫБОР
КОГДА ТИПЗНАЧЕНИЯ(СсылкаОтгрузка) = ТИП("Документ.РасходнаяНакладная")
ТОГДА КоличествоОтгрузка КОГДА ТИПЗНАЧЕНИЯ(СсылкаПроизводство) = ТИП("Документ.СборкаЗапасов")
ТОГДА КоличествоПроизводство
КОНЕЦ
Еще проверял через условие:
ВЫБОР
КОГДА НЕ ВЫРАЗИТЬ(СсылкаПроизводство,"Документ.СборкаЗапасов") ЕСТЬ NULL ТОГДА КоличествоПроизводство КОГДА НЕ ВЫРАЗИТЬ(СсылкаОтгрузка,"Документ.РасходнаяНакладная") ЕСТЬ NULL ТОГДА КоличествоОтгрузка
КОНЕЦ
По итогу выводится только первое значение из условия во все строки. Пробовал делать поле Количество через Вычисляемое поле - тоже самое. Также, убирал группировки - результат тот же.
2) Как выводить документы и их количество по методу ФИФО?
К примеру, в документе Производство №1 количество 5000, в Производство №2 6000.
В документе Расходная накладная №1 количество 3000, Расходная накладная №2 8000
Производство №1 5000
-----Расходная накладная №1 3000
-----Расходная накладная №2 2000
Производство №2 6000
-----Расходная накладная №2 6000
1) В общем случае, таблицы я предпочитаю в запросе соединять, т.к. правила игры более понятны. Связи разных источников стоит использовать, если понимаешь, что это именно тот случай.
2) ФИФО в запросе крайне сложно организовать. Хотя, кажется, были где-то статьи. Если нужно СКД, то можно данные заранее получить поместить в таблицу, и из нее выводить данные.
2) ФИФО в запросе крайне сложно организовать. Хотя, кажется, были где-то статьи. Если нужно СКД, то можно данные заранее получить поместить в таблицу, и из нее выводить данные.
1) Переделал на 1 набор данных:
ВЫБРАТЬ
ОтчетОПереработкеПродукция.Ссылка КАК СсылкаОтгрузка,
ОтчетОПереработкеПродукция.Номенклатура КАК Номенклатура,
ОтчетОПереработкеПродукция.Количество КАК КоличествоОтгрузка,
ОтчетОПереработкеПродукция.Ссылка.ЗаказПокупателя КАК ЗаказПокупателя
ПОМЕСТИТЬ ВТ_Отгрузка
ИЗ
Документ.ОтчетОПереработке.Продукция КАК ОтчетОПереработкеПродукция
ГДЕ
ОтчетОПереработкеПродукция.Ссылка.ЗаказПокупателя.Проведен
И ОтчетОПереработкеПродукция.Ссылка.ЗаказПокупателя.ПометкаУдаления = ЛОЖЬ
И ОтчетОПереработкеПродукция.Ссылка.ЗаказПокупателя <> ЗНАЧЕНИЕ(Документ.ЗаказПокупателя.ПустаяСсылка)
И ОтчетОПереработкеПродукция.Ссылка.Проведен
И ОтчетОПереработкеПродукция.Ссылка.ПометкаУдаления = ЛОЖЬ
ОБЪЕДИНИТЬ
ВЫБРАТЬ
РасходнаяНакладнаяЗапасы.Ссылка,
РасходнаяНакладнаяЗапасы.Номенклатура,
РасходнаяНакладнаяЗапасы.Количество,
РасходнаяНакладнаяЗапасы.Заказ
ИЗ
Документ.РасходнаяНакладная.Запасы КАК РасходнаяНакладнаяЗапасы
ГДЕ
РасходнаяНакладнаяЗапасы.Заказ.Проведен
И РасходнаяНакладнаяЗапасы.Заказ.ПометкаУдаления = ЛОЖЬ
И РасходнаяНакладнаяЗапасы.Заказ <> ЗНАЧЕНИЕ(Документ.ЗаказПокупателя.ПустаяСсылка)
И РасходнаяНакладнаяЗапасы.Ссылка.Проведен
И РасходнаяНакладнаяЗапасы.Ссылка.ПометкаУдаления = ЛОЖЬ
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТ_Отгрузка.СсылкаОтгрузка КАК СсылкаОтгрузка,
ВТ_Отгрузка.Номенклатура КАК Номенклатура,
ВТ_Отгрузка.КоличествоОтгрузка КАК КоличествоОтгрузка,
ВТ_Отгрузка.ЗаказПокупателя КАК ЗаказПокупателя,
СборкаЗапасовПродукция.Ссылка КАК СсылкаПроизводство,
СборкаЗапасовПродукция.Номенклатура КАК Номенклатура1,
СборкаЗапасовПродукция.Количество КАК КоличествоПроизводство,
СборкаЗапасовПродукция.ЗаказПокупателя КАК ЗаказПокупателя1
ИЗ
Документ.СборкаЗапасов.Продукция КАК СборкаЗапасовПродукция
ПОЛНОЕ СОЕДИНЕНИЕ ВТ_Отгрузка КАК ВТ_Отгрузка
ПО СборкаЗапасовПродукция.ЗаказПокупателя = ВТ_Отгрузка.ЗаказПокупателя
ГДЕ
СборкаЗапасовПродукция.ЗаказПокупателя.Проведен
И СборкаЗапасовПродукция.ЗаказПокупателя.ПометкаУдаления = ЛОЖЬ
И СборкаЗапасовПродукция.ЗаказПокупателя <> ЗНАЧЕНИЕ(Документ.ЗаказПокупателя.ПустаяСсылка)
И СборкаЗапасовПродукция.Ссылка.Проведен
И СборкаЗапасовПродукция.Ссылка.ПометкаУдаления = ЛОЖЬ
Показать
В поле количество для всеъ строк, все равно попадает только значение из условия, которое стоит первым. Поле Количество добавлено в ресурсы.
Добавил для вывода поля КоличествоОтгрузка и КоличествоПроизводство, чтобы было видно, что данные для заполнения в этих полях есть
(3) Запрос, как минимум, неправильный, т.к. если соединение полное, то условие наложенное только на одну сторону даст только записи, где есть записи именно этой таблицы. Либо ЕСТЬNull надо использовать. А может и вообще вам ПОЛНОЕ и не нужно...
ГДЕ
СборкаЗапасовПродукция.ЗаказПокупателя.Проведен
И СборкаЗапасовПродукция.ЗаказПокупателя.ПометкаУдаления = ЛОЖЬ
И СборкаЗапасовПродукция.ЗаказПокупателя <> ЗНАЧЕНИЕ(Документ.ЗаказПокупателя.ПустаяСсылка)
И СборкаЗапасовПродукция.Ссылка.Проведен
И СборкаЗапасовПродукция.Ссылка.ПометкаУдаления = ЛОЖЬ
Собственно, это все не очень грамотно. Условия явно избыточны, как минимум. Начиная с того, что проведенный документ в норме не может быть помечен на удаление.
(4) Вы правы, в условиях пометку удаления убрал, соединение сделал ЛЕВОЕ. Для первых указазал группировку
ВЫБРАТЬ
ОтчетОПереработкеПродукция.Ссылка КАК СсылкаОтгрузка,
ОтчетОПереработкеПродукция.Номенклатура КАК Номенклатура,
ОтчетОПереработкеПродукция.Количество КАК КоличествоОтгрузка,
ОтчетОПереработкеПродукция.Ссылка.ЗаказПокупателя КАК ЗаказПокупателя
ПОМЕСТИТЬ ВТ_Отгрузка
ИЗ
Документ.ОтчетОПереработке.Продукция КАК ОтчетОПереработкеПродукция
ГДЕ
ОтчетОПереработкеПродукция.Ссылка.ЗаказПокупателя.Проведен
И ОтчетОПереработкеПродукция.Ссылка.ЗаказПокупателя <> ЗНАЧЕНИЕ(Документ.ЗаказПокупателя.ПустаяСсылка)
И ОтчетОПереработкеПродукция.Ссылка.Проведен
СГРУППИРОВАТЬ ПО
ОтчетОПереработкеПродукция.Номенклатура,
ОтчетОПереработкеПродукция.Ссылка,
ОтчетОПереработкеПродукция.Количество,
ОтчетОПереработкеПродукция.Ссылка.ЗаказПокупателя
ОБЪЕДИНИТЬ
ВЫБРАТЬ
РасходнаяНакладнаяЗапасы.Ссылка,
РасходнаяНакладнаяЗапасы.Номенклатура,
РасходнаяНакладнаяЗапасы.Количество,
РасходнаяНакладнаяЗапасы.Заказ
ИЗ
Документ.РасходнаяНакладная.Запасы КАК РасходнаяНакладнаяЗапасы
ГДЕ
РасходнаяНакладнаяЗапасы.Заказ.Проведен
И РасходнаяНакладнаяЗапасы.Заказ <> ЗНАЧЕНИЕ(Документ.ЗаказПокупателя.ПустаяСсылка)
И РасходнаяНакладнаяЗапасы.Ссылка.Проведен
СГРУППИРОВАТЬ ПО
РасходнаяНакладнаяЗапасы.Номенклатура,
РасходнаяНакладнаяЗапасы.Ссылка,
РасходнаяНакладнаяЗапасы.Количество,
РасходнаяНакладнаяЗапасы.Заказ
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТ_Отгрузка.СсылкаОтгрузка КАК СсылкаОтгрузка,
ВТ_Отгрузка.Номенклатура КАК Номенклатура,
ВТ_Отгрузка.КоличествоОтгрузка КАК КоличествоОтгрузка,
ВТ_Отгрузка.ЗаказПокупателя КАК ЗаказПокупателя,
СборкаЗапасовПродукция.Ссылка КАК СсылкаПроизводство,
СборкаЗапасовПродукция.Номенклатура КАК Номенклатура1,
СборкаЗапасовПродукция.Количество КАК КоличествоПроизводство,
СборкаЗапасовПродукция.ЗаказПокупателя КАК ЗаказПокупателя1
ИЗ
Документ.СборкаЗапасов.Продукция КАК СборкаЗапасовПродукция
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Отгрузка КАК ВТ_Отгрузка
ПО СборкаЗапасовПродукция.ЗаказПокупателя = ВТ_Отгрузка.ЗаказПокупателя
ГДЕ
СборкаЗапасовПродукция.ЗаказПокупателя.Проведен
И СборкаЗапасовПродукция.ЗаказПокупателя <> ЗНАЧЕНИЕ(Документ.ЗаказПокупателя.ПустаяСсылка)
И СборкаЗапасовПродукция.Ссылка.Проведен
Показать
В поле количество все равно выводится значение, которое указано в первой конструкции КОГДА .... ТОГДА
Условие задачи: вывести количество (в один столбец, в зависимости от типа документа в строке) и посчитать Остаток произведенной продукции по методу ФИФО из ТЧ документов СборкаЗапасов (документ производства) и РасходнаяНакладная+ОтчетОПереработке (документ отгрузки).
Вид отчет должен принимать:
Документ.ЗаказПокупателя Колтчество (шт) Остаток (шт)
---Номенклатура
-------Документ.Производства
-------------Документ.Отгрузки
(7) Насколько понял Ваш вопрос, если в документе отгрузки (РасходнаяНакладная или ОтчетОПереработке) нет позиции номенклатуры с заполненным количеством, то в поле Количество должно быть пустое значение - согласен, в запрос нужно добавить проверку на Null.
На примере, котором я проверяю количество заполнено в ТЧ документов, но значение в это поле попадает то, которое указано в первом КОГДА ... ТОГДА, т.е. к примеру:
ВЫБОР
КОГДА ТИПЗНАЧЕНИЯ(СсылкаОтгрузка) = ТИП("Документ.РасходнаяНакладная")
ТОГДА КоличествоОтгрузка КОГДА ТИПЗНАЧЕНИЯ(СсылкаПроизводство) = ТИП("Документ.СборкаЗапасов")
ТОГДА КоличествоПроизводство
КОНЕЦ
ВЫБОР
КОГДА ТИПЗНАЧЕНИЯ(СсылкаПроизводство) = ТИП("Документ.СборкаЗапасов")
ТОГДА КоличествоПроизводство КОГДА ТИПЗНАЧЕНИЯ(СсылкаОтгрузка) = ТИП("Документ.РасходнаяНакладная")
ТОГДА КоличествоОтгрузка
КОНЕЦ
(8) ну через тип не особо корректно это проверять. В общем, вы не до конца понимаете, как это должно у вас работать.
Подумайте, откуда Null берется, и что происходит, если в отгрузке нету соответствующей записи.
И вычисляйте это поле в запросе. Незачем наружу выносить - хз, что там с ним происходит.
На данном конкретном примере Null не откуда не берется. То, что нужна провера - это понятно. Проблема в самом условии для поля Количество, оба условия верны. Вопрос как реализовать вывод количества из ТЧ того документа, который выводится в строке (через вычисляемые поля).
(10) Вычислил поле Количество по тому же условию в запросе - результат не изменился. Неправильно составлено условие (оба условия верны, выводится значение которое указано первым в условии)
(10)
(11) Скажу прямее, если при соединении "Справа" нету соответствующей записи (т.е. нету отгрузки), то в поле КоличествоОтгрузка будет Null - вот на него и проверяйте.
(11) если выводит то, которое первое, значит у вас оба сравнения возвращают Истина. А почему бы и нет? Если отгрузка есть, то так и должно быть.
Ваше условие вообще лишено смысла - документ отгрузки всегда имеет тип РасходнаяНакладная, а производство - тип "СборкаЗапасов"
Ваше условие вообще лишено смысла - документ отгрузки всегда имеет тип РасходнаяНакладная, а производство - тип "СборкаЗапасов"
Я это понимаю и в этом и затык (пункт 1 этой темы поэтому и создал). Как сделать корректное условие, чтобы в поле Количество выводилось количество из ТЧ документа, который в строке.
ВЫБОР
КОГДА ЗначениеЗаполнено(КоличествоОтгрузка) ТОГДА КоличествоОтгрузка
КОГДА ЗначениеЗаполнено(КоличествоПроизводство) ТОГДА КоличествоПроизводство
КОНЕЦ
Выполняются оба условия - выводится значение из первого условия.
При условии для поля Количество:
ВЫБОР
КОГДА КоличествоОтгрузка = NULL ТОГДА КоличествоПроизводство
КОГДА КоличествоПроизводство = NULL ТОГДА КоличествоОтгрузка
КОНЕЦ
Поле Количество пустое (не выполняется ни одно из условий)
(17) да вроде русским языком пишу, таблицы к примеру прикладывал, текстовое описание задачи предоставил множество раз....
Совсем простыми словами:
Документ А его количество Б
Документ С его количество Д
Нужно получить:
Документ----------Количество
А ----------------------------Б
С----------------------------Д
По условиям, которые множество раз приводил выше и которые неправильные получается таблица:
Либо:
Документ----------Количество
А ----------------------------Б
С----------------------------Б
Либо:
Документ----------Количество
А ----------------------------Д
С----------------------------Д
(18) В вашем запросе документы трех типов. От того, не понятно, что вы называете A, а что C. Пример без типизации очень сложно привязать к вашему коду. Лучше в том виде, в каком запрос, и чтобы было понятно, что какому псевдониму соответствует.
(19) Документ Производство его количество 8684
Документ РасходнаяНакладная его количество 19008
Нужно получить:
Документ-------------------------------------Количество
Производство --------------------------------------8684
РасходнаяНакладная----------------------------19008
При условии ниже - поле количество пустое
ВЫБОР
КОГДА КоличествоОтгрузка = NULL ТОГДА КоличествоПроизводство
КОГДА КоличествоПроизводство = NULL ТОГДА КоличествоОтгрузка
КОНЕЦ
При условии ниже - в поле количество выводится то значение, которое указано в 1м условии (оба условия верны).
CODE]ВЫБОР
КОГДА ЗначениеЗаполнено(КоличествоОтгрузка) ТОГДА КоличествоОтгрузка
КОГДА ЗначениеЗаполнено(КоличествоПроизводство) ТОГДА КоличествоПроизводство
КОНЕЦ[/1C-CODE]
Либо:
Документ-------------------------------------------Количество
Производство --------------------------------------19008
РасходнаяНакладная----------------------------19008
Либо:
Документ-----------------------------------------Количество
Производство --------------------------------------8684
РасходнаяНакладная----------------------------8684
- это вы что имеете в виду? Называйте вещи своими именами - либо как правильное имя типа документа, либо синоним поля в запросе. Также, я ваши примеры не понимаю - это у вас в одной вообще строке, или в разных.
Забудьте вы про условия свои, они не имеют отношения к формулировании задачи.
Понял.
Вам нужно, чтобы СКД выводило в разных группировках данные из разных полей запроса.
Я бы не стал такое делать вообще, а просто выводил их в разных колонках, и итоги бы, заодно еще можно бы было сделать.
Теоретически что-то такое возможно https://blagin.ru/1s-skd-summirovanie-znachenij-na-razlichnyx-urovnyax-gruppirovok/ Еще есть вариант - не использовать СКД. Т.к. СКД в данном случае вряд ли будет использоваться для вариантивности, быстрее отчет с макетом нарисовать. Это если действительно очень надо это все в одной колонке.
(25) Задача решилась гораздо проще. Расчет поля Количество убрал из запроса, добавил его в вычисляемые поля с пустым значением. В ресурсах его добавил дважды с расчетом по соответствующим полям. Значения выводит верные.
Спасибо за участие в моем вопросе!
(18)ТИПЗНАЧЕНИЯ(СсылкаПроизводство) = ТИП("Документ.СборкаЗапасов") - это берется из таблицы документа сборка, там не может быть другого значения.
А вот ссылка отгрузка у вас действительно может быть либо реализацией либо ОтчетОПереработке
Как бы то ни было, вы просто не понимаете, что делаете. Рекомендую поверить моему опыту, и разобраться.
Распишите себе в экселе примеры, что получает первый запрос (во временную таблицу), что результирующий, и все станет понятно.
5.
unknown181538
15828.02.24 15:37 Сейчас в теме+0.25 $m
(3) я не до конца понимаю вашу задачу, но скорее всего, стоит СГРУППИРОВАТЬ данные в первых запросах. Т.к. бывают ситуации, когда одна номенклатура в заказе внесена двумя строками - в этом случае получите некорректные данные без группировки.