даже если в массиве элемент один, то находит все в справочнике, делаю несколько запросов, дабы из результатов вытянуть те изделия, в которых есть ВСЕ комплектующие из массива. как мне это сделать или хотя бы чтобы запрос по параметру искал?
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
Если ТабличныйПоиск.Количество()>0 Тогда
КомпоновщикНастроек.Настройки.Структура.Очистить();
//СхемаКомпоновкиДанных.НаборыДанных.Очистить();
СтрПар=Новый Массив;
Сч=0;
ВнешНаб=Новый Структура;
Для каждого Пункт Из ТабличныйПоиск Цикл
СтрПар.Добавить(Пункт);
КонецЦикла;
СКД=Новый СхемаКомпоновкиДанных;
ИД = СКД.ИсточникиДанных.Добавить();
ИД.Имя = "СхемаСКД";
ИД.ТипИсточникаДанных = "Local";
НД=СКД.НаборыДанных.Добавить(Тип("НаборДанныхОбъектСхемыКомпоновкиДанных"));
НД.Имя="НД"+Сч;
НД.ИмяОбъекта="НД"+Сч;
НД.ИсточникДанных="СхемаСКД";
ПНД = НД.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
ПНД.Поле = "Наименование";
ПНД.ПутьКДанным = "Наименование";
ПНД.Заголовок = "Наименование";
ПНД2 = НД.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
ПНД2.Поле = "Комплектующие";
ПНД2.ПутьКДанным = "Комплектующие";
ПНД2.Заголовок = "Комплектующие";
НК=КомпоновщикНастроек.Настройки;
Если НК.Структура.Количество()=0 Тогда
Таб=НК.Структура.Добавить(Тип("ТаблицаКомпоновкиДанных"));
ГКД1 = Таб.Строки.Добавить();
ГКД1.Использование = Истина;
ПГКД1 = ГКД1.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
ПГКД1.Использование = Истина;
ПГКД1.Поле = Новый ПолеКомпоновкиДанных("Наименование");
ВП1=ГКД1.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
ВП1.Использование=Истина;
ГКД2 = ГКД1.Структура.Добавить();
ГКД2.Использование = Истина;
ПГКД2 = ГКД2.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
ПГКД2.Использование = Истина;
ПГКД2.Поле = Новый ПолеКомпоновкиДанных("Комплектующие");
ВП2=ГКД2.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
ВП2.Использование=Истина;
КонецЕсли;
Пока Сч<СтрПар.Количество() Цикл
Запр=Новый Запрос;
Запр.Текст="ВЫБРАТЬ РАЗЛИЧНЫЕ
| ИзделиеСостав.Ссылка КАК Ссылка
|ПОМЕСТИТЬ ВТ_Изделия
|ИЗ
| Справочник.Изделие.Состав КАК ИзделиеСостав
|ГДЕ
| ИзделиеСостав.Комплектующие = &Комплектующие;
|
|ВЫБРАТЬ
| ВТ_Изделия.Ссылка.Наименование КАК Наименование,
| ИзделиеСостав.Комплектующие КАК Комплектующие
|ИЗ
| ВТ_Изделия КАК ВТ_Изделия
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Изделие.Состав КАК ИзделиеСостав
| ПО ВТ_Изделия.Ссылка = ИзделиеСостав.Ссылка";
Запр.УстановитьПараметр("Комплектующие",Справочники.Комплектующее.НайтиПоНаименованию(Строка(СтрПар[Сч])));
РезЗап=Запр.Выполнить().Выгрузить();
ВнешНаб.Вставить("НД"+Сч,РезЗап);
Сч=Сч+1
КонецЦикла;
КМ=Новый КомпоновщикМакетаКомпоновкиДанных;
МКМ=КМ.Выполнить(СКД,НК);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МКМ,ВнешНаб);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
КонецЕсли;
КонецПроцедуры
(2) даже если в массиве один элемент для параметра одного запроса соответственно, находит все элементы справочника, даже те, которые к параметру по данным не относятся. Как мне это исправить? А лучше чтобы находил те изделия, в которых есть ВСЕ элементы из массива. Как это организовать? Так лучше?
(3)
Нужен запрос который находит из Справочника.Изделие - только те элементы, у которых табличная часть Состав полностью соответствует заданному массиву Комплектующих?
//1. выбрать все комплектующие из Подбора (ТабличныйПоиск) и поместить в втКомплект
//2. Отбираем все изделия где хоть что-то совпало по комплектующим
//3. Отбираем Те изделия у которых есть лишние(втКомплект.Ссылка is null) или недостающие комплектующие (ИзделиеСостав.Комплектующие is null)
//4. Из тех у которых хоть что-то совпало убираем те у которых не комплект(ЛишниеИзделия.Ссылка is null).
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Комплект", МассивКомплектующих);
Запрос.Текст =
"ВЫБРАТЬ
| Комплектующее.Ссылка КАК Ссылка
|ПОМЕСТИТЬ втКомплект
|ИЗ
| Справочник.Комплектующее КАК Комплектующее
|ГДЕ
| Комплектующее.Ссылка В (&Комплект)
|;
|/////////////////////////
|ВЫБРАТЬ различные
| ИзделиеСостав.Ссылка КАК Ссылка
| ПОМЕСТИТЬ втИзделияСовпадающиеПоОднойСоставлящией
|ИЗ
| Справочник.Изделие.Состав КАК ИзделиеСостав
|ГДЕ
| ИзделиеСостав.Комплектующие В (&Комплектующие)
|;
|
|/////////////////////////
|
|ВЫБРАТЬ различные
| втИзделия.Ссылка КАК Ссылка
| ПОМЕСТИТЬ втИзделияСНедостающимЛибоЛишнимиКомплектующими
|ИЗ
| втИзделияСовпадающиеПоОднойСоставлящией как втИзделия
| Соединение Справочник.Изделие.Состав КАК ИзделиеСостав
| Полное Соединение втКомплект как втКомплект
| По ИзделиеСостав.Комплектующие = втКомплект.Ссылка
| По ИзделиеСостав.Ссылка = втИзделия.Ссылка
|ГДЕ
| ИзделиеСостав.Комплектующие is null
| Или втКомплект.Ссылка is null
|;
|/////////////////////////
|ВЫБРАТЬ
| ВсеИзделия.Ссылка КАК Ссылка
|
|ИЗ
| втИзделияСовпадающиеПоОднойСоставлящией Как ВсеИзделия
| Левое Соединение втИзделияСНедостающимЛибоЛишнимиКомплектующими Как ЛишниеИзделия
| По ВсеИзделия.Ссылка = ЛишниеИзделия.Ссылка
|ГДЕ
| ЛишниеИзделия.Ссылка is null
|";
МассивИзделийСоответствующийКомплекту = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");
(10) Теперь это выдает"Ошибка компоновки данных
по причине:
Ошибка инициализации
по причине:
Ошибка создания набора данных "НД1"
по причине:
Не найден внешний набор данных "НД1"
" может чего по дороге поломал?
причем восстанавливаю к прежней версии- все равно выдает.
(13) Мозги нам не трахай! То что ты не умеешь использовать запрос в СКД - это не означает, что запрос не рабочий!
Не в курсе, что запрос вообще является самостоятельным объектом, и к СКД никакого отношения не имеет?
(14) я разве говорил, что запрос не рабочий? просто данная проблема тупо препятствует выполнению запроса, поскольку программа не находит набор данных с тем же именем, с которым прога и ищет.
(15) Слушай, ты пришел и спросил - как правильно почистить картошку. Тебе помогли.
Теперь ты говоришь - я не могу этим воспользоваться, поскольку я не умею варить борщ и поэтому не могу оценить правильно ли почищена картошка.
(10) теперь такую ошибку:"Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'v':
форма: Элемент
имя: {http://v8.1c.ru/8.2/uobjects}v
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'settings':
форма: Элемент
имя: {http://v8.1c.ru/8.1/data-composition-system/settings}settings
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'item':
форма: Элемент
имя: {http://v8.1c.ru/8.1/data-composition-system/core}item
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'value':
форма: Элемент
имя: {http://v8.1c.ru/8.1/data-composition-system/core}value
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'Value':
форма: Элемент
имя: {http://v8.1c.ru/8.1/data/core}Value
по причине:
Ошибка отображения типов:
Отсутствует отображение для типа 'ОтчетТабличнаяЧастьСтрока.ИзделияСКомплектующими.ТабличныйПоиск'
"
значение недопустимого типа...
низя ТаблицуЗначений передавать на клиент.
массив можно. поищи обходные пути передачи нужных тебе данных с клиента на сервер и обратно.