![]() |
![]() |
![]() |
|
Поиск товаров из Тч в списке значений | ☑ | ||
---|---|---|---|---|
0
NIGHTHUNTER
27.07.21
✎
08:16
|
Здравствуйте. Пытаюсь правильно разобрать решение.
На входе, есть список значений, полученный из хранилища. завихренным способом. Для проверки, ввел в этот список 2 группы и один элемент. Сейчас при записи документа, нужно проверить, относятся ли товары в его табличной части к тому что есть в этом списке. И так же у другого документа. который связан с этим по реквизиту. То есть я просто получаю табличную часть, одного документа, перебираю ее и проверяю принадлежит ли текущая номенклатура группам в списке. или не введена ли она туда элементом? Решил вот прояснить ситуацию. |
|||
1
Ненавижу 1С
гуру
27.07.21
✎
08:19
|
>> завихренным способом
вы корректно задачу поставьте в каком случае тест должен давать истину, в каком ложь |
|||
2
ДенисЧ
27.07.21
✎
08:20
|
Пихнуть тч в запрос, список параметром туда же и наложить условие В ИЕРАРХИИ()
|
|||
3
NIGHTHUNTER
27.07.21
✎
08:26
|
(1) Конкретно, -
Есть список значений, он уже получен. При записи документа. В одном реквизите другой документ выбран. Нужно при записи проверить, что в табличных частых документов. Того что записывается и того что выбран в его реквизите, номенклатура, только из групп добавленных в этом списке. Или добавлена в этот список как элемент. А если в табличных частях документов. есть номенклатура не принадлежащая тому что введено в этот список, ни относится ни к группам введенным в этот список, и не введена в этот список как элемент. Не давать записывать документ. Пытаюсь понять как это лучше сделать. В список для проверки, ввел 2 группы и один элемент. то есть если в тч документов, элементы, принадлежат этим группам. или они тот что введен как элемент, то документ можно записывать. |
|||
4
NIGHTHUNTER
27.07.21
✎
08:36
|
Есть список значений ТоварыНаКомиссии.
В нем есть 2 группы справочника номенклатура и элемент справочника номенклатура. Перебираю табличную часть документа. Получаю первый элемент справочника номенклатура. Как проверить, относится ли он к группам введенным в список значений? Или не является ли элементом, введенным в этот список значений 7 |
|||
5
ДенисЧ
27.07.21
✎
08:39
|
(4) Читай внематочно (2) и нииимозги
|
|||
6
lodger
27.07.21
✎
08:44
|
(4) начни с того, какие данные у тебя есть в руках.
есть 1) документ объект со всей начинкой 2) тч со строками, где ссылки лежат, на справочник номенклатуры. 3) список значений со ссылками на справочник номенклатуры. (группа или элемент не важно) 4) ссылка на второй документ. при попытке что-либо сделать с п.2-4 ты будешь тормошить базу (а верни мне родителя того справочника, а принеси мне ТЧ документа). за одну проверку будет от десятка до тысяч единичных чтений базы. так писать нельзя. делай запрос. |
|||
7
lodger
27.07.21
✎
08:46
|
переверни вопрос из (0).
тебе найдо найти в 2х ТЧ отсылки к списку начений. |
|||
8
NIGHTHUNTER
27.07.21
✎
08:47
|
(6) делать нужно как пишут в (2) ?
|
|||
9
lodger
27.07.21
✎
08:49
|
делать это оптимально в процедуре ПередЗаписью. если что-то нашел, пишешь Отказ=Истина.
искать запросом. структура запроса: // выбрать ТЧ документа1 из текущего объекта, поместить в ВТ1 // выбрать всё из ВТ1, поместить в ВТ2 объединить все выбрать ТЧ документа2 по ссылке из БД // выбрать из ВТ2 где Номенклатура В ИЕРАРХИИ (&ТоварыНаКомиссии) |
|||
10
NIGHTHUNTER
27.07.21
✎
09:06
|
(9) такое начало?
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ | ПеремещениеТоваровТовары.Номенклатура КАК Номенклатура |ПОМЕСТИТЬ ВТ_ПеремещениеТоваров |ИЗ | &ТЧПеремещения КАК ПеремещениеТоваровТовары |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВнутреннийЗаказТовары.Номенклатура |ИЗ | &ТЧВнутреннийЗаказ КАК ВнутреннийЗаказТовары | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ | ВТ_ПеремещениеТоваров.Номенклатура |ИЗ | ВТ_ПеремещениеТоваров КАК ВТ_ПеремещениеТоваров"; |
|||
11
NIGHTHUNTER
27.07.21
✎
09:10
|
(10) Как сюда передать имеющийся список значений с проверкой в ИЕРАРХИИ() ?
|
|||
12
NIGHTHUNTER
27.07.21
✎
09:11
|
Так ли?
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ | ПеремещениеТоваровТовары.Номенклатура КАК Номенклатура |ПОМЕСТИТЬ ВТ_ПеремещениеТоваров |ИЗ | &ТЧПеремещения КАК ПеремещениеТоваровТовары |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВнутреннийЗаказТовары.Номенклатура |ИЗ | &ТЧВнутреннийЗаказ КАК ВнутреннийЗаказТовары |ГДЕ | ВнутреннийЗаказТовары.Номенклатура В ИЕРАРХИИ(&СпТоварыНаКомиссии) | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ | ВТ_ПеремещениеТоваров.Номенклатура |ИЗ | ВТ_ПеремещениеТоваров КАК ВТ_ПеремещениеТоваров"; Запрос.УстановитьПараметр("ТЧПеремещения", Товары); Запрос.УстановитьПараметр("ТЧВнутреннийЗаказ", ВнутреннийЗаказ.Товары); Запрос.УстановитьПараметр("СпТоварыНаКомиссии", ТоварыНаКомиссии); |
|||
13
NIGHTHUNTER
27.07.21
✎
09:16
|
Чего то не хватает в (12) ?
|
|||
14
NIGHTHUNTER
27.07.21
✎
09:17
|
(9) вот это не понятно
... выбрать всё из ВТ1, поместить в ВТ2 ... |
|||
15
NIGHTHUNTER
27.07.21
✎
09:22
|
(9) если что-то нашел, пишешь Отказ=Истина.
Так мне наоборот нужно сделать, что если есть позиции номенклатуре, которые не относятся к списку. тогда отказ истина ? |
|||
16
NIGHTHUNTER
27.07.21
✎
09:28
|
(12) Подскажите пожалуйста. Тут выборка из двух документов.
В итоговом запросе накладывается условие на второй документ. Но выборка из первого получается без условия? как будет правильно? Что бы отбор по обеим табличным частям шел с отбором по списку значений в иерархии ? |
|||
17
NIGHTHUNTER
27.07.21
✎
09:35
|
Видимо правильно будет так, в соответствии что написано в (9)
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ | ПеремещениеТоваровТовары.Номенклатура КАК Номенклатура |ПОМЕСТИТЬ ВТ_ПеремещениеТоваров |ИЗ | &ТЧПеремещения КАК ПеремещениеТоваровТовары |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВнутреннийЗаказТовары.Номенклатура |ПОМЕСТИТЬ ВТ_ПеремещениеВнутреннийЗаказ |ИЗ | &ТЧВнутреннийЗаказ КАК ВнутреннийЗаказТовары | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ | ВТ_ПеремещениеТоваров.Номенклатура |ИЗ | ВТ_ПеремещениеТоваров КАК ВТ_ПеремещениеТоваров |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВТ_ПеремещениеВнутреннийЗаказ.Номенклатура |ИЗ | ВТ_ПеремещениеВнутреннийЗаказ КАК ВТ_ПеремещениеВнутреннийЗаказ |ГДЕ | НЕ ВТ_ПеремещениеВнутреннийЗаказ.Номенклатура В ИЕРАРХИИ (&СпТоварыНаКомиссии)"; Запрос.УстановитьПараметр("ТЧПеремещения", Товары); Запрос.УстановитьПараметр("ТЧВнутреннийЗаказ", ВнутреннийЗаказ.Товары); Запрос.УстановитьПараметр("СпТоварыНаКомиссии", ТоварыНаКомиссии); Рез = Запрос.Выполнить(); Если Не Рез.Пустой() Тогда КонецЕсли; Но а если нет ссылки на документ Внутренний заказ в Перемещении? Тогда в зависимости от этого нужно 2 запроса делать? Проверять либо табличную часть из первого документа Перемещения, или из второго если она там заполненна и вообще есть на него ссылка. А так по логике верный запрос? Смысл в этой инструкции |ГДЕ | НЕ ВТ_ПеремещениеВнутреннийЗаказ.Номенклатура В ИЕРАРХИИ (&СпТоварыНаКомиссии)"; Что выбираются позиции которые не принадлежат этому списку? |
|||
18
Kassern
27.07.21
✎
09:36
|
(16) берешь 2 твои ТЧ выгружаешь в ТЗ данные ТЗ передаешь параметров в запрос в виде временной таблицы. Далее эти 2 временные таблицы объединяешь вместе. В итоге у тебя получается одна общая таблица товаров из 2х документов. Далее в эту таблицу добавляешь отбор, где Номенклатура в Иерархии ТвоегоСписка Или Номенклатура в ТвоемСписке (раз у тебя условие и на иерархию и на точное совпадение). Вот и все
|
|||
19
NIGHTHUNTER
27.07.21
✎
09:40
|
(18) Ну я так и сделал в (17)
верно ли? Теперь остается обработать моменты, 1. когда в перемещении , основном документе нет записей в Тч 2. когда не выбран документ внутренний заказ 3. когда в выбранном документе внутренний заказ не заполненна табличная часть товары верно же? |
|||
20
Kassern
27.07.21
✎
09:41
|
(19) у тебя "Товары" это ТЗ или ТЧ в параметрах запроса?
|
|||
21
NIGHTHUNTER
27.07.21
✎
09:46
|
(20) Тч, видимо, я не перегружал в Тз. Нужно перегрузить? Пока собираюсь с мыслями.
|
|||
22
NIGHTHUNTER
27.07.21
✎
09:48
|
(20) Тч
|
|||
23
Kassern
27.07.21
✎
09:48
|
(19) можешь не в условии отработать а доп поле создать типа:
Выбор когда ВТ_ПеремещениеВнутреннийЗаказ.Номенклатура В ИЕРАРХИИ (&СпТоварыНаКомиссии) тогда Истина Иначе Ложь КОнец Как ТоварВСписке А далее уже по этому полю сделать поиск, если ТЗ.Количество()>0 И ТЗ.Найти(Ложь,"ТоварВСписке")=неопределено тогда Записать Либо можешь можешь без НЕ сделать условие и в конце сверить количество строк в ТЧ и в результирующей ТЗ. |
|||
24
mikecool
27.07.21
✎
09:49
|
(21) ты уже давно собираешься, все не соберешься...
|
|||
25
Kassern
27.07.21
✎
09:50
|
(24) хотя бы пытается, вот уже временные таблицы в оборот пошли и объединения запросов, гляди через пару лет сможет половине форума фору дать)
|
|||
26
NIGHTHUNTER
27.07.21
✎
09:51
|
(23) Понятно. Пока делаю вот как в (17)но идет ошибка
{Документ.ПеремещениеТоваров.Форма.ФормаДокумента.Форма(2132)}: Ошибка при вызове метода контекста (Выполнить) Рез = Запрос.Выполнить(); по причине: При выборе данных из объекта в запросе не могут присутствовать соединения и объединения такой код Запрос = Новый Запрос; Запрос.Текст = " |ВЫБРАТЬ РАЗЛИЧНЫЕ | ПеремещениеТоваровТовары.Номенклатура КАК Номенклатура |ПОМЕСТИТЬ ВТ_ПеремещениеТоваров |ИЗ | &ТЧПеремещения КАК ПеремещениеТоваровТовары |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВнутреннийЗаказТовары.Номенклатура |ПОМЕСТИТЬ ВТ_ПеремещениеВнутреннийЗаказ |ИЗ | &ТЧВнутреннийЗаказ КАК ВнутреннийЗаказТовары | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ | ВТ_ПеремещениеТоваров.Номенклатура |ИЗ | ВТ_ПеремещениеТоваров КАК ВТ_ПеремещениеТоваров |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВТ_ПеремещениеВнутреннийЗаказ.Номенклатура |ИЗ | ВТ_ПеремещениеВнутреннийЗаказ КАК ВТ_ПеремещениеВнутреннийЗаказ |ГДЕ | НЕ ВТ_ПеремещениеВнутреннийЗаказ.Номенклатура В ИЕРАРХИИ (&СпТоварыНаКомиссии)"; Запрос.УстановитьПараметр("ТЧПеремещения", Товары.Выгрузить()); Запрос.УстановитьПараметр("ТЧВнутреннийЗаказ", ВнутреннийЗаказ.Товары.Выгрузить()); Запрос.УстановитьПараметр("СпТоварыНаКомиссии", ТоварыНаКомиссии); Рез = Запрос.Выполнить(); Если Не Рез.Пустой() Тогда КонецЕсли; |
|||
27
NIGHTHUNTER
27.07.21
✎
09:53
|
(26+) почему такая ошибка ?
{Документ.ПеремещениеТоваров.Форма.ФормаДокумента.Форма(2132)}: Ошибка при вызове метода контекста (Выполнить) Рез = Запрос.Выполнить(); по причине: При выборе данных из объекта в запросе не могут присутствовать соединения и объединения |
|||
28
Ненавижу 1С
гуру
27.07.21
✎
09:56
|
(27) потому что если загружаете таблицу как параметр, то не можете в том запросе использовать объединения и/или соединения
вот так нельзя: |ИЗ | &ТЧВнутреннийЗаказ КАК ВнутреннийЗаказТовары | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ |
|||
29
Kassern
27.07.21
✎
10:03
|
(27) сохрани временные таблицы в отдельных пакетах запросов, а потом уже сохраненные таблицы объединяй.
|
|||
30
NIGHTHUNTER
27.07.21
✎
10:05
|
(28) Большое спасибо! Поправил вот так, ошибка ушла.
(29) Ок! // Запрос = Новый Запрос; Запрос.Текст = " |ВЫБРАТЬ РАЗЛИЧНЫЕ | ПеремещениеТоваровТовары.Номенклатура КАК Номенклатура |ПОМЕСТИТЬ ВТ_ПеремещениеТоваров |ИЗ | &ТЧПеремещения КАК ПеремещениеТоваровТовары |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ РАЗЛИЧНЫЕ | ВнутреннийЗаказТовары.Номенклатура КАК Номенклатура |ПОМЕСТИТЬ ВТ_ВнутреннийЗаказ |ИЗ | &ТЧВнутреннийЗаказ КАК ВнутреннийЗаказТовары |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВТ_ВнутреннийЗаказ.Номенклатура |ПОМЕСТИТЬ ВТ_ПеремещениеВнутреннийЗаказ |ИЗ | ВТ_ВнутреннийЗаказ КАК ВТ_ВнутреннийЗаказ | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ | ВТ_ПеремещениеТоваров.Номенклатура |ИЗ | ВТ_ПеремещениеТоваров КАК ВТ_ПеремещениеТоваров |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВТ_ПеремещениеВнутреннийЗаказ.Номенклатура |ИЗ | ВТ_ПеремещениеВнутреннийЗаказ КАК ВТ_ПеремещениеВнутреннийЗаказ |ГДЕ | НЕ ВТ_ПеремещениеВнутреннийЗаказ.Номенклатура В ИЕРАРХИИ (&СпТоварыНаКомиссии)"; Запрос.УстановитьПараметр("ТЧПеремещения", Товары.Выгрузить()); Запрос.УстановитьПараметр("ТЧВнутреннийЗаказ", ВнутреннийЗаказ.Товары.Выгрузить()); Запрос.УстановитьПараметр("СпТоварыНаКомиссии", ТоварыНаКомиссии); Рез = Запрос.Выполнить(); Если Не Рез.Пустой() Тогда КонецЕсли; // <- |
|||
31
NIGHTHUNTER
27.07.21
✎
10:06
|
(30) Выберет ли запрос (30) записи, если в Тч документов Перемещение товаров и Внутренний заказ
будет номенклатура, которая не значится в списке значений товары на комиссии ? |
|||
32
NIGHTHUNTER
27.07.21
✎
10:07
|
(31+) И не выберет ли если там будет только номенклатура которая значится в списке значений ТоварыНаКомисси ?
|
|||
33
Kassern
27.07.21
✎
10:23
|
все в ваших руках, тестируйте, проверяйте. При условии "НЕ ВТ_ПеремещениеВнутреннийЗаказ.Номенклатура В ИЕРАРХИИ (&СпТоварыНаКомиссии)";" у вас отберутся все строки, в которых номенклатура не в иерархии вашего списка.
|
|||
34
NIGHTHUNTER
27.07.21
✎
10:27
|
(33) Ок, буду тестовый набор данных готовить, для тестирования.
Пока добавил такое вот условие, - Запрос = Новый Запрос; Если Товары.Количество() > 0 и ЗначениеЗаполненно(ВнутреннийЗаказ) и ВнутреннийЗаказ.Товары.Количество() > 0 Тогда Запрос.Текст = " |
|||
35
Kassern
27.07.21
✎
10:36
|
(34) а если нет внутреннего заказа то все, документ не запишется, или это обязательный реквизит?
|
|||
36
NIGHTHUNTER
27.07.21
✎
10:55
|
(35) Записывается.
Я все нюансы пока не знаю. Но много не типового, если не все. Сейчас проверял запись на документе. у которого нет внутреннего заказа. |
|||
37
NIGHTHUNTER
27.07.21
✎
11:10
|
(35) Сказали нужно делать проверку для каждого документа по отдельности.
Получается я немного лишнего сделал. но разобрался как нужно. Сейчас разнесу проверки по документам. |
|||
38
NIGHTHUNTER
27.07.21
✎
11:19
|
(9) Делать это оптимально в процедуре ПередЗаписью()
В процедуре ПриЗаписи() не подойдет ? |
|||
39
NIGHTHUNTER
27.07.21
✎
11:22
|
Делаю в процедуре ПередЗаписью, как сказали в (9)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |