Как сделать запрос совпадения из таблицы в выбранной накладной (ОФ)
помогите сделать запрос совпадения. То есть нужна из таблицы строка.номенклатура сопоставить с имением такой же номенклатуры в выбранной приходной накладной.
не могу правильно поставить запрос. Гугл не помог ((.
Накладная поле выбора типа ДокументСсылка.ПриходнаяНакладная
не могу правильно поставить запрос. Гугл не помог ((.
Накладная поле выбора типа ДокументСсылка.ПриходнаяНакладная
док=Накладная.ПолучитьОбъект();
для Каждого Строка из Товары Цикл
Если ЗначениеЗаполнено(Строка.Номенклатура) Тогда
ЗапросПоНак = Новый Запрос;
ЗапросПоНак.УстановитьПараметр("ВыбТовара", Строка.Номенклатура);
ЗапросПоНак.Текст= "ВЫБРАТЬ
| док.Ссылка КАК Ссылка
|ИЗ
| Документ.док.Номенклатура КАК ПриходнаяНакладная
|ГДЕ
| ПриходнаяНакладная.Номенклатура = &ВыбТовара";
Выборка = ЗапросПоНак.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Строка.Номенклатура=Выборка.Номенклатура;
СообщениеОбработки =СообщениеОбработки + Символы.ПС +Строка("Пропущена: "+Выборка.Номенклатура);
иначе
ПоказатьПо теме из базы знаний
Найденные решения
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) Вариант 1
Вариант 2
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| НакладнаяТовары.Номенклатура КАК Номенклатура,
| НакладнаяТовары.Количество КАК Количество,
| НакладнаяТовары.Цена КАК Цена,
| НакладнаяТовары.Сумма КАК Сумма
|ИЗ
| Документ.ПриходнаяНакладная.Товары КАК НакладнаяТовары
|ГДЕ
| НакладнаяТовары.Ссылка = &Ссылка
| И НЕ НакладнаяТовары.Номенклатура В (&Товары)";
Запрос.УстановитьПараметр("Ссылка", Накладная);
Запрос.УстановитьПараметр("Товары",Ссылка.Товары.ВыгрузитьКолонку("Номенклатура"));
ВыборкаДобавить = Запрос.Выполнить().Выбрать();
ПоказатьВариант 2
Запрос.Текст = "ВЫБРАТЬ
| ПриходнаяНакладнаяТовары.Номенклатура КАК Номенклатура,
| ПриходнаяНакладнаяТовары.Количество КАК Количество,
| ПриходнаяНакладнаяТовары.Цена КАК Цена,
| ПриходнаяНакладнаяТовары.Сумма КАК Сумма
|ИЗ
| Документ.ПриходнаяНакладная.Товары КАК ПриходнаяНакладнаяТовары
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.РасходнаяНакладная.Товары КАК РасходнаяНакладнаяТовары
| ПО ПриходнаяНакладнаяТовары.Номенклатура = РасходнаяНакладнаяТовары.Номенклатура
| И (РасходнаяНакладнаяТовары.Ссылка = &Расходгая)
|ГДЕ
| ПриходнаяНакладнаяТовары.Ссылка = &Приходная
| И РасходнаяНакладнаяТовары.Ссылка ЕСТЬ NULL"
Запрос.УстановитьПараметр("Приходная", Накладная);
Запрос.УстановитьПараметр("Расходная",Ссылка);
ВыборкаДобавить = Запрос.Выполнить().Выбрать();
ПоказатьВЫБРАТЬ
ВложенныйЗапрос.Номенклатура,
СУММА(ВложенныйЗапрос.Количество) КАК Количество
ИЗ
(ВЫБРАТЬ
ПоступлениеТоваровТовары.Номенклатура КАК Номенклатура,
1 КАК Количество
ИЗ
Документ.ПоступлениеТоваров.Товары КАК ПоступлениеТоваровТовары
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
РеализацияТоваровТовары.Номенклатура,
2
ИЗ
Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары) КАК ВложенныйЗапрос
СГРУППИРОВАТЬ ПО
ВложенныйЗапрос.Номенклатура
ИМЕЮЩИЕ
СУММА(ВложенныйЗапрос.Количество) = 2
ПоказатьСУММА(ВложенныйЗапрос.Количество) = 1 Только поступление
СУММА(ВложенныйЗапрос.Количество) = 2 Только реализация
СУММА(ВложенныйЗапрос.Количество) = 3 Оба документа
ВЫБРАТЬ РАЗЛИЧНЫЕ
Накладная.Ссылка,
Накладная.Номенклатура
ПОМЕСТИТЬ ВТ_Накладная
ИЗ
Документ.Накладная.Товары КАК Накладная
ГДЕ
Накладная.Ссылка = &Ссылка
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
Приходная.Ссылка,
Приходная.Номенклатура
ПОМЕСТИТЬ ВТ_Приходная
ИЗ
Документ.Приходная.Товары КАК Приходная
ГДЕ
Приходная.Номенклатура В
(ВЫБРАТЬ
ВТ_Накладная.Номенклатура
ИЗ
ВТ_Накладная КАК ВТ_Накладная)
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ВТ_Накладная.Номенклатура,
ВТ_Приходная.Ссылка
ИЗ
ВТ_Накладная КАК ВТ_Накладная
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Приходная КАК ВТ_Приходная
ПО ВТ_Накладная.Номенклатура = ВТ_Приходная.Номенклатура
Показать
ВЫБРАТЬ
ТаблицаНоменклатуры.Номенклатура.Ссылка КАК НоменклатураДубли
ИЗ
ТребуемыйДокумент.ТаблицаНоменклатуры КАК ТаблицаНоменклатуры
ГДЕ
ТаблицаНоменклатуры.Ссілка = &МойДокумент
СГРУППИРОВАТЬ ПО
ТаблицаНоменклатуры.Номенклатура.Ссылка
ИМЕЮЩИЕ
КОЛИЧЕСТВО(ТаблицаНоменклатуры.Ссылка) > 1
Показать
Спасибо друзья за отклик, но все не то.
все намного проще.
задача заполнить недостающие позиции в накладной.
То есть таблица Товары во внешней обработки получена из чтения Искель накладной.
в ней проводится сопоставление с нашими карточками товара. если накладная большая то времени уходит очень много, плюс если ШК новые и нет в накладной от поставщика, то времени уходит на сбор еще больше. А простой товара на складе, это потеря потенциальной прибыли. Вот и встала ЗАДАЧА пускать в оборот накладные не до конца обработаны. плодить куски накладных тоже не вариант. Плюнуть и создать дубли если есть тоже не вариант.
Вот и надо всего лишь добавить в накладную уже сопоставленую позицию и пропустить уже имеющуюся.
Код все процедуры:
Мне надо именно правильно сформулировать текст запроса
все намного проще.
задача заполнить недостающие позиции в накладной.
То есть таблица Товары во внешней обработки получена из чтения Искель накладной.
в ней проводится сопоставление с нашими карточками товара. если накладная большая то времени уходит очень много, плюс если ШК новые и нет в накладной от поставщика, то времени уходит на сбор еще больше. А простой товара на складе, это потеря потенциальной прибыли. Вот и встала ЗАДАЧА пускать в оборот накладные не до конца обработаны. плодить куски накладных тоже не вариант. Плюнуть и создать дубли если есть тоже не вариант.
Вот и надо всего лишь добавить в накладную уже сопоставленую позицию и пропустить уже имеющуюся.
Код все процедуры:
Процедура ДобавитьВНакладную(Элемент)
Если не ЗначениеЗаполнено(Накладная) тогда
Предупреждение("Не выбран документ для загрузки");
Возврат
КонецЕсли;
Док=Накладная.ПолучитьОбъект();
для Каждого Строка из Товары Цикл
Если ЗначениеЗаполнено(Строка.Номенклатура) Тогда
ЗапросПоНак = Новый Запрос;
ЗапросПоНак.УстановитьПараметр("ВыбТовара", Строка.Номенклатура);
ЗапросПоНак.Текст= "ВЫБРАТЬ
| ПриходнаяНакладнаяТовары.Номенклатура КАК Номенклатура
|ИЗ
| Документ.ПриходнаяНакладная.Товары КАК ПриходнаяНакладнаяТовары
|ГДЕ
| ПриходнаяНакладнаяТовары.Номенклатура = &ВыбТовара";
Выборка = ЗапросПоНак.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
СообщениеОбработки =СообщениеОбработки + Символы.ПС +Строка("Пропущена: "+Выборка.Номенклатура);
иначе
нов=Док.Товары.Добавить();
нов.Номенклатура=Строка.Номенклатура;
нов.ЕдиницаИзмерения=нов.Номенклатура.БазоваяЕдиницаИзмерения;
нов.Количество=Строка.Количество;
нов.Коэффициент=нов.ЕдиницаИзмерения.Коэффициент;
нов.СтавкаНДС=нов.Номенклатура.СтавкаНДС;
нов.Сумма=Строка.Сумма;
нов.Цена=Строка.Цена;
КонецЕсли;
КонецЕсли;
КонецЦикла;
док.Записать(РежимЗаписиДокумента.Запись);
форма=док.ПолучитьФорму("ФормаДокумента");
форма.Открыть();
КонецПроцедуры
ПоказатьМне надо именно правильно сформулировать текст запроса
(11)Судя по тексту Вы выбираете из всех Приходных накладных, так и должно? или все таки очепятка?
И все же к каждой строке делать запрос. Это не комильфо. Правильней загнать таблицу из Ёкселя в ВТ и выбрать в запросе
Я через менеджер ВТ
Загнали Товары из Ёкселя во временную таблицу
Теперь выполняем запрос добавляемых товаров
И если хочется выполняем запрос для сообщения
И все же к каждой строке делать запрос. Это не комильфо. Правильней загнать таблицу из Ёкселя в ВТ и выбрать в запросе
Я через менеджер ВТ
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Товары",Товары);
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.Текст = "ВЫБРАТЬ
| Товары.Номенклатура КАК Номенклатура,
| Товары.Сумма КАК Сумма,
| Товары.Количество КАК Количество,
| Товары.Цена КАК Цена
|ПОМЕСТИТЬ ВТ_Товары
|ИЗ
| &Товары КАК Товары";
Запрос.Выполнить();
ПоказатьЗагнали Товары из Ёкселя во временную таблицу
Теперь выполняем запрос добавляемых товаров
Запрос.УстановитьПараметр("СписокТоваров", Накладная.Товары.ВыгрузитьКолонку("Номенклатура"));
Запрос.Текст = "ВЫБРАТЬ Товары.Номенклатура
| Товары.Номенклатура.БазоваяЕдиницаИзмерения КАК ЕдиницаИзмерения,
| Товары.Номенклатура.БазоваяЕдиницаИзмерения.Коэффициент как Коэффициент,
| Товары.Количество,
| Товары.Цена,
| Товары.Номенклатура.СтавкаНДС
|ИЗ ВТ_Товары КАК Товары
|ГДЕ
| Не Товары.Номенклатура в (&СписокТоваров)";
//ИЛИ Не Товары.Номенклатура в (ВЫбРАТЬ Номенклатура ИЗ Документ.ПриходнаяНакладная.Товары) если не очепятка
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
нов=Док.Товары.Добавить();
ЗаполнитьЗначенияСвойств(нов, Выборка);
КонецЦикла;
ПоказатьИ если хочется выполняем запрос для сообщения
СообщениеОбработки = "";
Запрос.Текст = "ВЫБРАТЬ Товары.Номенклатура
|ИЗ ВТ_Товары как Товары
|ГДЕ Товары.Номенклатура в (&СписокТоваров)";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
СообщениеОбработки = СообщениеОбработки + Символы.ПС +Строка("Пропущена: "+Выборка.Номенклатура);
КонецЦикла;
И это. Наверное можно без предварительной записи. Вдруг результат не понравится
Давно с обычным приложением не работал, но вроде можно.
Давно с обычным приложением не работал, но вроде можно.
Форма = Накладная.ПолучитьФорму("ФормаДокумента");
Пока Выборка.Следующий() Цикл
Нов = Форма.ЭлементыФормы.Товары.Добавить();
ЗаполнитьЗначенияСвойств(нов, Выборка);
КонецЦикла;
Форма.Открыть();
Временная Таблица хороша для работы на одном компьютере, но увы не в моем случае.
Я только начинаю изучать язык. И пока дошёл только до решения делать запрос по строкам. Да посадка по производительности., да и пусть. главное что бы работало. уже когда скил прокачаю, буду переделывать все все равно. Сейчас главное что бы работало. Почему обычная форма, потому - что ДАЛИОН, чтоб его налево.
Судя по тексту Вы выбираете из всех Приходных накладных, так и должно?
нет. есть поле выбора: Накладная, с типом: ДокументСсылка.ПриходнаяНакладная
код и ссылается на выбранный объект: Док=Накладная.ПолучитьОбъект();
Если запускать процедуру без запроса:
В итоге все работает, но добавляет все строки в выбраню Накладную. и получается что в Икселе 100 позиций а в ПНакоадной уже есть 30 позицией, то получаем 130 позиций. Где 30 позиций продублированы.
Если не получится я уже наверное сделаю что перед добавлением просто стирать все позиции в ПНакладной. Итог получится тот же.
Меня именно интересует как пройтись запросом на совпадение по Номенклатуры.
Я только начинаю изучать язык. И пока дошёл только до решения делать запрос по строкам. Да посадка по производительности., да и пусть. главное что бы работало. уже когда скил прокачаю, буду переделывать все все равно. Сейчас главное что бы работало. Почему обычная форма, потому - что ДАЛИОН, чтоб его налево.
Судя по тексту Вы выбираете из всех Приходных накладных, так и должно?
нет. есть поле выбора: Накладная, с типом: ДокументСсылка.ПриходнаяНакладная
код и ссылается на выбранный объект: Док=Накладная.ПолучитьОбъект();
Если запускать процедуру без запроса:
Процедура ДобавитьВНакладную(Элемент)
Если не ЗначениеЗаполнено(Накладная) тогда
Предупреждение("Не выбран документ для загрузки");
Возврат
КонецЕсли;
Док=Накладная.ПолучитьОбъект();
для Каждого Строка из Товары Цикл
Если ЗначениеЗаполнено(Строка.Номенклатура) Тогда
нов=Док.Товары.Добавить();
нов.Номенклатура=Строка.Номенклатура;
нов.ЕдиницаИзмерения=нов.Номенклатура.БазоваяЕдиницаИзмерения;
нов.Количество=Строка.Количество;
нов.Коэффициент=нов.ЕдиницаИзмерения.Коэффициент;
нов.СтавкаНДС=нов.Номенклатура.СтавкаНДС;
нов.Сумма=Строка.Сумма;
нов.Цена=Строка.Цена;
КонецЕсли;
КонецЦикла;
док.Записать(РежимЗаписиДокумента.Запись);
форма=док.ПолучитьФорму("ФормаДокумента");
форма.Открыть();
КонецПроцедуры
ПоказатьВ итоге все работает, но добавляет все строки в выбраню Накладную. и получается что в Икселе 100 позиций а в ПНакоадной уже есть 30 позицией, то получаем 130 позиций. Где 30 позиций продублированы.
Если не получится я уже наверное сделаю что перед добавлением просто стирать все позиции в ПНакладной. Итог получится тот же.
Меня именно интересует как пройтись запросом на совпадение по Номенклатуры.
(14)В текущем алгоритме с вашими скилами быстрее обойтись без запроса.
для Каждого Строка из Товары Цикл
Если ЗначениеЗаполнено(Строка.Номенклатура) Тогда
Если док.Товары.Найти(Строка.Номенклатура,"Номенклатура")=Неопределено Тогда
нов=Док.Товары.Добавить();
..................................
для Каждого Строка из Товары Цикл
Если ЗначениеЗаполнено(Строка.Номенклатура) Тогда
Если док.Товары.Найти(Строка.Номенклатура,"Номенклатура")=Неопределено Тогда
нов=Док.Товары.Добавить();
..................................
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот