Имя: Пароль:
1C
 
Поиск товаров из Тч в списке значений
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)