Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
12 дек 2024, 16:37

Возможно ли это реализовать запросом?

Автор lakykherson, 29 янв 2023, 08:24

0 Пользователей и 1 гость просматривают эту тему.

lakykherson

Есть документ реализация товаров и услуг. Он содержит две таблицы товары и серийные номера.

как мне вывести список всех товаров с серийными номерами и без них учитывая их количество в таблице товаров.

К примеру есть документ содержащий 4 строки с товарами,

1 Клавиатура 2шт.
2 Мышки 3шт.
3 Коврики 2шт.
4 флешки 3шт.

таблица серийных номеров содержит
клавиатуры 2 серийных номера SN111 и sn222
Мышки 3 серийных номера SG111 и sG222 И sG222
Коврики вообще не имеют серийных номеров
Флешки имеют всего один серийный номер FL111


Результатом запроса должн быть таким:
1 Клавиатура SN111
2 Клавиатура SN222
3 Мышка SG111
4 Мышка SG222
5 Мышка SG333
6 Коврик нет
7 Коврик нет
8 Фоешка FL111
9 Фоешка нет
10 Фоешка нет

Возможно такое сделать с помощью запроса? есть общий ключь в таблицах

я сделал так но не получается

ВЫБРАТЬ
| РеализацияТоваровУслугТовары.Номенклатура,
| РеализацияТоваровУслугСерийныеНомера.СерийныйНомер
|ИЗ
| Документ.РеализацияТоваровУслуг.СерийныеНомера КАК РеализацияТоваровУслугСерийныеНомера
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
| ПО РеализацияТоваровУслугТовары.КлючСвязи = РеализацияТоваровУслугСерийныеНомера.КлючСвязи
|ГДЕ
| РеализацияТоваровУслугТовары.Ссылка = &Ссылка
| И РеализацияТоваровУслугСерийныеНомера.Ссылка = &Ссылка

Максим75

lakykherson, в соединении еще связь по ссылке надо добавить.
и можно одно тогда условие оставить на ссылку

Максим75

а точно результат именно в таком виде нужен? имеется ввиду вот это:

6 Коврик нет
7 Коврик нет
8 Фоешка FL111
9 Фоешка нет
10 Фоешка нет

если да, то так просто не получится.

Максим75

lakykherson, не претендую на оригинальность, но делал бы простым отчетом (не на СКД)

создал бы пакетный запрос. в первом пакете выбор из таблицы Товары Товар, КлючСвзяи, кол-во товара, итоги по товару.
во втором пакете из таблицы СерийныеНомера выбрал бы КлючСвязи и Серийный номер.

Результат второго пакета кинул бы в Таблицу значений.
Делал бы отход первого запроса по товару. Там бы получал Товар, КючСвязи и количество.
Внутри первого цикла делал бы второй цикл по количеству (от 1 до Кол-во из запроса). Т.е. у одного товар может быть несколько записей, а ключ связи одинаковый.
Внутри второго цикла отбирал бы из таблицы значений (со второго пакета) по Товару и КлючуСвязи.
В таблице значений можно найти строки, передав некую структура для отбора, в данном случае структура будет содержать Товар, КлючСвязи.
Ну и дальше бы еще цикл по отбору из таблицы значений, там бы брал Серийные номера.

Короче говоря как то так.

lakykherson

а  как обработать этот запрос что бы результат был так что количество строк с одинаковым товаром был равным столбику количество?

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

Максим75

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

        КонецЦикла;
    КонецЦикла;

поясню: есть линейная структура
Товар   КлючСявзи  Кол-во
Мышка    2          4
Монитор  3          3

Необходимо получить таблицу значений такого вида
Товар   КлючСвязи  ИД
Мышка    2         2_1
Мышка    2         2_2
Мышка    2         2_3
Мышка    2         2_4
Монитор  3         3_1
Монитор  3         3_2

Потом так же сделать и со второй таблицей Серийных номеров
А уже потом можно их связывать между собой.
Я бы через запрос потом замутил, но не знаю, умеете ли Вы запихивать в запрос таблицы значений в виде параметров.

Afinogen

lakykherson,
во -первых  у вас неправильно левое соединение задано

вам если нужно для товаров найти все серийники то  у вас должно быть так
|    ВЫБРАТЬ
|    Товары.Номенклатура,
|    ЕСТЬNULL(СерийныеНомера.СерийныйНомер,""нет"") КАК СерийныйНомер
|ИЗ
|    Документ.РеализацияТоваров.Товары КАК Товары
|ЛЕВОЕ СОЕДИНЕНИЕ
|   Документ.РеализацияТоваров.СерийныеНомера КАК СерийныеНомера
|ПО
|Товары.КлючСвязи = СерийныеНомера.КлючСвязи И Товары.Ссылка = Серийныеномера.Ссылка
вот весь ваш запрос

Максим75

Afinogen, да там еще до соединения далеко. ясно, что ведущая должна быть таблица Товаров, а ведомая Серийных номеров. Вопрос не так тривиален, чтобы вот так в лоб решить одним запросом. Надо смотреть сколько единиц товара выписано и на сколько единиц есть серийные номера.

Afinogen

 B) там ситуация такая же как я сейчас у себя делал на проекте
насколько я понимаю  есть 1 документ - Реализация,
в нем 2 таб части: товары и серийные номера
и фишка в том что  в таб части "Товары" может быть например товар А и кол-во 2 штуки, а в таб части "серийные номера" ему будут соответствовать несколько строк
Но варианта чтобы в строке серийный номер таб.части"серийные номера" для 1 серийника было указано 2 штуки изначально быть не может,  серийник всегда уникален

Afinogen

фактически мы будем иметь что то типа

Товары
Товар А кол-во 2 штуки код строки "Код1"

значит в табличной части "серийные номера" должны бить записи
Товар А серийный номер 1 код1
Товар А серийный номер 2 код1
и т.д.

Тогда я не вижу проблем

я так понима что основная проблема именно в уникальности кода строки что ли? я у себя делал код  с типом Уникальный идентификатор, тогда все споконойвытаскивается)

Теги: запросы 

Похожие темы (5)

Рейтинг@Mail.ru

Поиск