Имя: Пароль:
1C
1С v8
Ввод Расходной на основании Заказа
0 nazareth
 
17.10.13
13:52
Добрый день. Недавно начал изучать 1С. Столкнулся со следующей задачей: имеются документы ЗаказПокупателя и Расходная. В документе ЗаказПокупателя имеется табличная часть куда мы вводим товары из справочника Номенклатура (товары не повторяются). Документ Расходная создается лишь на основании документа ЗаказПокупателя. Нужно реализовать одним запросом, чтобы при вводе на основании новый документ Расходная заполнялся автоматически списком товаров из ЗаказаПокупателя, но не всем, а тем, который еще не был отгружен. То есть, если мы уже на основании данного ЗаказаПокупателя ранее создавали Расходную и записывали туда часть товаров из ЗаказаПокупателя, то при следующем вводе на основании этого же заказа она уже не попадала в новый документ Расходная. Для связи документов в Расходной имеется реквизит ОснованиеЗаказ (ссылка на документ ЗаказПокупателя), который при новом вводе на основании сразу заполняется (перед запросом). Регистры не использовать, только запросом по документам.
Я написал два запроса:

Первый - соединяем две таблицы и отбираем неотгруженные товары:

        |ВЫБРАТЬ

        |    Заказ.НомерСтроки КАК НомерСтроки,
        |    Заказ.Номенклатура КАК Номенклатура,
        |    Заказ.Количество КАК Количество,
        |    Заказ.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
        |    Заказ.Цена КАК Цена,
        |    Заказ.Сумма КАК Сумма
        |ИЗ
        |    Документ.ЗаказПокупателя.Товары КАК Заказ
        |    ПОЛНОЕ СОЕДИНЕНИЕ  Документ.РасходнаяНакладная.Товары КАК Расходная
        |    ПО Расходная.Ссылка.ОснованиеЗаказ = Заказ.Ссылка
        |ГДЕ
        |    Заказ.Номенклатура<>Расходная.Номенклатура";

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

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

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

Оба запроса проходят без ошибок, но ничего не выдают. Пустая таблица. В чем косяк?
1 hhhh
 
17.10.13
14:03
(0) значит Номенклатура совпадает. Это же элементарно, ВАтсон.
2 hhhh
 
17.10.13
14:06
(2) а если так?

|ГДЕ
        |    ЕСТЬNULL(Заказ.Номенклатура, НЕОПРЕДЕЛЕНО)<> ЕСТЬNULL(Расходная.Номенклатура, НЕОПРЕДЕЛЕНО)
3 nazareth
 
17.10.13
14:07
(1) я пробую на примере нового заказа, для которого нет расходных, то есть товары никак не могут быть отгружены. то есть они должны все попадать, но выборка запроса пуста. не знаю в чем проблема((
4 nazareth
 
17.10.13
14:12
(2) ну так уже выборка непуста, но она записывает абсолютно все товары из всех расходных, даже пустые строки). а как это работает?
5 1dvd
 
17.10.13
14:12
УТ?

Форму формирования Реализаций в ЗаказеПокупателя смотрел?
6 nazareth
 
17.10.13
14:13
(2) точнее записывает все товары из всех заказов
7 Михаил Козлов
 
17.10.13
14:14
(0) Обычно изспользются остатки из РН "Заказы покупателей": заказ пишет приход, расходная - расход. Посмотрите в типовых; для обучения будет невредно.
8 nazareth
 
17.10.13
14:15
(5) ой, не знаю что это такое. я конфигурацию "с нуля" пишу. выполняю разные задачки)
9 nazareth
 
17.10.13
14:16
(7) я ж говорю, мне без использования регистров)
10 nazareth
 
17.10.13
14:32
(2) вот это вроде близкий к нужному совет. если поставить там равенство, то он записывает не все, а только отгруженные товары. а надо наоборот неотгруженные)))
11 Михаил Козлов
 
17.10.13
14:46
(9) Мне кажется, сначала полезнее усвоить типовые решения.
Что касается текста запроса, я бы сгруппировал по номенклатуре из заказа и из отгруженных реализаций и посмотрел бы разницу.
12 alexiv79
 
17.10.13
14:46
(0) без использования регистров реализация задачи будет через ж..пу - долго считаться, да и вообще низя так, по-моему, делать
13 hhhh
 
17.10.13
15:40
(10) надо вам ЛЕВОЕ СОЕДИНЕНИЕ, а не ПОЛНОЕ
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший