Как сделать запрос совпадения из таблицы в выбранной накладной (ОФ)

1. ShuSU 63 02.05.19 10:16 Сейчас в теме
помогите сделать запрос совпадения. То есть нужна из таблицы строка.номенклатура сопоставить с имением такой же номенклатуры в выбранной приходной накладной.

не могу правильно поставить запрос. Гугл не помог ((.
Накладная поле выбора типа ДокументСсылка.ПриходнаяНакладная


док=Накладная.ПолучитьОбъект();
	для Каждого Строка из Товары Цикл
		Если ЗначениеЗаполнено(Строка.Номенклатура) Тогда
			ЗапросПоНак = Новый Запрос;
			ЗапросПоНак.УстановитьПараметр("ВыбТовара", Строка.Номенклатура);
			ЗапросПоНак.Текст=  "ВЫБРАТЬ
            |	док.Ссылка КАК Ссылка
            |ИЗ
            |	Документ.док.Номенклатура КАК ПриходнаяНакладная
			|ГДЕ
            |	ПриходнаяНакладная.Номенклатура = &ВыбТовара";
			Выборка = ЗапросПоНак.Выполнить().Выбрать();
			Если Выборка.Следующий() Тогда
				Строка.Номенклатура=Выборка.Номенклатура;
				СообщениеОбработки =СообщениеОбработки + Символы.ПС +Строка("Пропущена: "+Выборка.Номенклатура);
			иначе
Показать
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
17. catena 110 03.05.19 06:08 Сейчас в теме +0.1 $m
(16)Стройте запросы конструктором запросов, как минимум он не даст обратиться к несуществующим таблицам. Отлаживать запросы лучше в какой-нибудь консоли. И лучше на тесте.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. alex-l19041 8 02.05.19 10:28 Сейчас в теме
(1) сделайте запрос по таблице приходной накладной ДО цикла
5. ShuSU 63 02.05.19 10:34 Сейчас в теме
(2)как? я в прицепах запроса запутался. выбрал накладную и задача добавить товар недостающий из имеющийся таблицы. если есть то пропустить если нету то добавить.
как и на какой объект сослаться и как заставить обходить нужное значение.
мне пример поможет.
6. alex-l19041 8 02.05.19 10:38 Сейчас в теме
(5)
как?
- с помощью конструктора запросов...
3. alex-l19041 8 02.05.19 10:29 Сейчас в теме
(1)
док=Накладная.ПолучитьОбъект();
- для какой цели ?
9. tusv 212 02.05.19 11:08 Сейчас в теме +0.02 $m
(1) Вариант 1
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
|	НакладнаяТовары.Номенклатура КАК Номенклатура,
|	НакладнаяТовары.Количество КАК Количество,
|	НакладнаяТовары.Цена КАК Цена,
|	НакладнаяТовары.Сумма КАК Сумма
|ИЗ
|	Документ.ПриходнаяНакладная.Товары КАК НакладнаяТовары
|ГДЕ
|	НакладнаяТовары.Ссылка = &Ссылка
|	И НЕ НакладнаяТовары.Номенклатура В (&Товары)";
Запрос.УстановитьПараметр("Ссылка", Накладная);
Запрос.УстановитьПараметр("Товары",Ссылка.Товары.ВыгрузитьКолонку("Номенклатура"));
ВыборкаДобавить = Запрос.Выполнить().Выбрать();
Показать

Вариант 2
Запрос.Текст = "ВЫБРАТЬ
	|	ПриходнаяНакладнаяТовары.Номенклатура КАК Номенклатура,
	|	ПриходнаяНакладнаяТовары.Количество КАК Количество,
	|	ПриходнаяНакладнаяТовары.Цена КАК Цена,
	|	ПриходнаяНакладнаяТовары.Сумма КАК Сумма
	|ИЗ
	|	Документ.ПриходнаяНакладная.Товары КАК ПриходнаяНакладнаяТовары
	|		ЛЕВОЕ СОЕДИНЕНИЕ Документ.РасходнаяНакладная.Товары КАК РасходнаяНакладнаяТовары
	|		ПО ПриходнаяНакладнаяТовары.Номенклатура = РасходнаяНакладнаяТовары.Номенклатура
	|			И (РасходнаяНакладнаяТовары.Ссылка = &Расходгая)
	|ГДЕ
	|	ПриходнаяНакладнаяТовары.Ссылка = &Приходная
	|	И РасходнаяНакладнаяТовары.Ссылка ЕСТЬ NULL"
	Запрос.УстановитьПараметр("Приходная", Накладная);
	Запрос.УстановитьПараметр("Расходная",Ссылка);
	ВыборкаДобавить = Запрос.Выполнить().Выбрать();
Показать
4. alex-l19041 8 02.05.19 10:30 Сейчас в теме
затем в цикле сравнивайте содержимое таблиц
7. 17808849 61 02.05.19 10:44 Сейчас в теме +0.02 $m
ВЫБРАТЬ
	ВложенныйЗапрос.Номенклатура,
	СУММА(ВложенныйЗапрос.Количество) КАК Количество
ИЗ
	(ВЫБРАТЬ
		ПоступлениеТоваровТовары.Номенклатура КАК Номенклатура,
		1 КАК Количество
	ИЗ
		Документ.ПоступлениеТоваров.Товары КАК ПоступлениеТоваровТовары
	
	ОБЪЕДИНИТЬ ВСЕ
	
	ВЫБРАТЬ
		РеализацияТоваровТовары.Номенклатура,
		2
	ИЗ
		Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары) КАК ВложенныйЗапрос

СГРУППИРОВАТЬ ПО
	ВложенныйЗапрос.Номенклатура

ИМЕЮЩИЕ
	СУММА(ВложенныйЗапрос.Количество) = 2
Показать


СУММА(ВложенныйЗапрос.Количество) = 1 Только поступление
СУММА(ВложенныйЗапрос.Количество) = 2 Только реализация
СУММА(ВложенныйЗапрос.Количество) = 3 Оба документа
8. Agrhh 02.05.19 11:07 Сейчас в теме +0.02 $m
ВЫБРАТЬ РАЗЛИЧНЫЕ
	Накладная.Ссылка,
	Накладная.Номенклатура
ПОМЕСТИТЬ ВТ_Накладная
ИЗ
	Документ.Накладная.Товары КАК Накладная
ГДЕ
	Накладная.Ссылка = &Ссылка
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
	Приходная.Ссылка,
	Приходная.Номенклатура
ПОМЕСТИТЬ ВТ_Приходная
ИЗ
	Документ.Приходная.Товары КАК Приходная
ГДЕ
	Приходная.Номенклатура В
			(ВЫБРАТЬ
				ВТ_Накладная.Номенклатура
			ИЗ
				ВТ_Накладная КАК ВТ_Накладная)
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТ_Накладная.Номенклатура,
	ВТ_Приходная.Ссылка
ИЗ
	ВТ_Накладная КАК ВТ_Накладная
		ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Приходная КАК ВТ_Приходная
		ПО ВТ_Накладная.Номенклатура = ВТ_Приходная.Номенклатура
Показать
10. AnryMc 849 02.05.19 14:01 Сейчас в теме +0.02 $m
ВЫБРАТЬ
      ТаблицаНоменклатуры.Номенклатура.Ссылка КАК НоменклатураДубли
ИЗ
      ТребуемыйДокумент.ТаблицаНоменклатуры КАК ТаблицаНоменклатуры
ГДЕ
     ТаблицаНоменклатуры.Ссілка = &МойДокумент
СГРУППИРОВАТЬ ПО
       ТаблицаНоменклатуры.Номенклатура.Ссылка
ИМЕЮЩИЕ
        КОЛИЧЕСТВО(ТаблицаНоменклатуры.Ссылка) > 1
Показать
11. ShuSU 63 02.05.19 16:41 Сейчас в теме
Спасибо друзья за отклик, но все не то.
все намного проще.
задача заполнить недостающие позиции в накладной.
То есть таблица Товары во внешней обработки получена из чтения Искель накладной.
в ней проводится сопоставление с нашими карточками товара. если накладная большая то времени уходит очень много, плюс если ШК новые и нет в накладной от поставщика, то времени уходит на сбор еще больше. А простой товара на складе, это потеря потенциальной прибыли. Вот и встала ЗАДАЧА пускать в оборот накладные не до конца обработаны. плодить куски накладных тоже не вариант. Плюнуть и создать дубли если есть тоже не вариант.
Вот и надо всего лишь добавить в накладную уже сопоставленую позицию и пропустить уже имеющуюся.

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


Мне надо именно правильно сформулировать текст запроса
12. tusv 212 02.05.19 18:16 Сейчас в теме +0.02 $m
(11)Судя по тексту Вы выбираете из всех Приходных накладных, так и должно? или все таки очепятка?
И все же к каждой строке делать запрос. Это не комильфо. Правильней загнать таблицу из Ёкселя в ВТ и выбрать в запросе
Я через менеджер ВТ
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Товары",Товары); 
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.Текст = "ВЫБРАТЬ
   |	Товары.Номенклатура КАК Номенклатура,
   |	Товары.Сумма КАК Сумма,
   |	Товары.Количество КАК Количество,
   |	Товары.Цена КАК Цена
   |ПОМЕСТИТЬ ВТ_Товары
   |ИЗ
   |	&Товары КАК Товары";
Запрос.Выполнить();
Показать

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

И если хочется выполняем запрос для сообщения
СообщениеОбработки = "";
Запрос.Текст = "ВЫБРАТЬ Товары.Номенклатура
|ИЗ ВТ_Товары как Товары
|ГДЕ Товары.Номенклатура в (&СписокТоваров)";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
	 СообщениеОбработки = СообщениеОбработки + Символы.ПС +Строка("Пропущена: "+Выборка.Номенклатура);	
КонецЦикла;	
13. tusv 212 02.05.19 18:30 Сейчас в теме +0.02 $m
И это. Наверное можно без предварительной записи. Вдруг результат не понравится
Давно с обычным приложением не работал, но вроде можно.
Форма = Накладная.ПолучитьФорму("ФормаДокумента");
Пока Выборка.Следующий() Цикл
     Нов = Форма.ЭлементыФормы.Товары.Добавить();
    ЗаполнитьЗначенияСвойств(нов, Выборка);
КонецЦикла;
Форма.Открыть();
14. ShuSU 63 03.05.19 01:43 Сейчас в теме +0.18 $m
Временная Таблица хороша для работы на одном компьютере, но увы не в моем случае.
Я только начинаю изучать язык. И пока дошёл только до решения делать запрос по строкам. Да посадка по производительности., да и пусть. главное что бы работало. уже когда скил прокачаю, буду переделывать все все равно. Сейчас главное что бы работало. Почему обычная форма, потому - что ДАЛИОН, чтоб его налево.
Судя по тексту Вы выбираете из всех Приходных накладных, так и должно?
нет. есть поле выбора: Накладная, с типом: ДокументСсылка.ПриходнаяНакладная
код и ссылается на выбранный объект: Док=Накладная.ПолучитьОбъект();
Если запускать процедуру без запроса:
Процедура ДобавитьВНакладную(Элемент)
    Если не ЗначениеЗаполнено(Накладная) тогда
        Предупреждение("Не выбран документ для загрузки");
        Возврат
    КонецЕсли;
    Док=Накладная.ПолучитьОбъект();
    для Каждого Строка из Товары Цикл
        Если ЗначениеЗаполнено(Строка.Номенклатура) Тогда
                нов=Док.Товары.Добавить();
                нов.Номенклатура=Строка.Номенклатура;
                нов.ЕдиницаИзмерения=нов.Номенклатура.БазоваяЕдиницаИзмерения;
                нов.Количество=Строка.Количество;
                нов.Коэффициент=нов.ЕдиницаИзмерения.Коэффициент;
                нов.СтавкаНДС=нов.Номенклатура.СтавкаНДС;
                нов.Сумма=Строка.Сумма;
                нов.Цена=Строка.Цена;
        КонецЕсли;
    КонецЦикла;
док.Записать(РежимЗаписиДокумента.Запись);
форма=док.ПолучитьФорму("ФормаДокумента");
форма.Открыть();
    
КонецПроцедуры
Показать

В итоге все работает, но добавляет все строки в выбраню Накладную. и получается что в Икселе 100 позиций а в ПНакоадной уже есть 30 позицией, то получаем 130 позиций. Где 30 позиций продублированы.
Если не получится я уже наверное сделаю что перед добавлением просто стирать все позиции в ПНакладной. Итог получится тот же.
Меня именно интересует как пройтись запросом на совпадение по Номенклатуры.
15. catena 110 03.05.19 05:56 Сейчас в теме +0.1 $m
(14)В текущем алгоритме с вашими скилами быстрее обойтись без запроса.

для Каждого Строка из Товары Цикл
Если ЗначениеЗаполнено(Строка.Номенклатура) Тогда
Если док.Товары.Найти(Строка.Номенклатура,"Номенклатура")=Неопределено Тогда
нов=Док.Товары.Добавить();
..................................
16. ShuSU 63 03.05.19 06:06 Сейчас в теме
(15)как вариант, точно.
просто зациклился на запросах потому, что не могу понять их правильную формулировку, и отладчик их не проверяет, и приходиться тыкаться постоянно.
17. catena 110 03.05.19 06:08 Сейчас в теме +0.1 $m
(16)Стройте запросы конструктором запросов, как минимум он не даст обратиться к несуществующим таблицам. Отлаживать запросы лучше в какой-нибудь консоли. И лучше на тесте.
18. ShuSU 63 03.05.19 06:13 Сейчас в теме
(17) блин блински я его и не замечал, что он есть, респект!!!
19. tusv 212 03.05.19 11:14 Сейчас в теме
(16)Как вариант Ищите строки Типа НайтиСтроки(Новый Структура(Новый Соответсвие"Вам столько вариантов дали","АВы честно плюшки выдали))
Ну не знаю, что Вам надо. Меня б уволили нахрен с такими запросами. Такое очучение, что специально дурака включили
20. ShuSU 63 03.05.19 17:52 Сейчас в теме
(19)Увы сам себя уволить я не смогу. А саму себе и сотрудникам жизнь упростить,даже если не правильными методами разве плохо.
а то что подсказывали, всем огромное спасибо.
21. acanta 03.05.19 18:54 Сейчас в теме
Пациент будет жить? - А смысл? (С)из газетки с анекдотами
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот