Имя: Пароль:
1C
1С v8
Отбор номенклатуры по единицам измерения
0 Михаил22
 
18.07.19
11:18
Здравствуйте!
Не могу разобраться как в УТ отобрать номенклатуру по нужной Базовой Единице Измерения.
Выборка ругается на 3 параметр, т.е. отбор. Нужно именно через объекты 1С, не через запрос.
Подскажите что не так:

Отбор = Новый Структура("БазоваяЕдиницаИзмерения",Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("уп"));
Выборка = Справочники.Номенклатура.Выбрать(,,Отбор,);
1 lubitelxml
 
18.07.19
11:21
Выборка = Справочники.Номенклатура.Выбрать(Отбор); - вроде так всегда делал...
2 lubitelxml
 
18.07.19
11:21
но лучше запрос написать
3 Михаил22
 
18.07.19
11:24
(1) Так тож ругается

И так ругается.

Отбор = Новый Структура("БазоваяЕдиницаИзмерения","уп");

Всю голову сломал! Полдня убил еже.
4 lubitelxml
 
18.07.19
11:28
Запрос.УстановитьПараметр("ВыбБазоваяЕдиницаИзмерения",Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("уп"));
Запрос.Текст =
"ВЫБРАТЬ
| спр.Ссылка
|ИЗ
| Справочник.Номенклатура
|ГДЕ
| Спр.БазоваяЕдиницаИзмерения = &ВыбБазоваяЕдиницаИзмерения
|";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
//тут действия с элементами справочника
КонецЦикла
5 Галахад
 
гуру
18.07.19
11:28
(0) Индексирование по полю стоит?
6 Михаил22
 
18.07.19
11:29
(4) Спасибо. С запросом нет проблем, но надо с объектами 1с.
7 Михаил22
 
18.07.19
11:30
(5) Точно, не стоит. Вот я тормоз. Спасибо!!!
8 Михаил22
 
18.07.19
18:10
Нет, что-то не могу совладать и с выборкой по единицам измерения

Что не так с запросом? На выходе ноль элементов, хотя их там много.

ВЫБРАТЬ
Номенклатура.Ссылка
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
  Номенклатура.БазоваяЕдиницаИзмерения = "уп"

Работает только при таком виде:

ВЫБРАТЬ
  Номенклатура.Ссылка
ИЗ
  Справочник.Номенклатура КАК Номенклатура
ГДЕ
  Номенклатура.БазоваяЕдиницаИзмерения.Наименование = "уп"

Но так мне не подходит.

Задача такая.
  Внешняя обработка в которой стандартными элементами формы выводим и фильтруем номенклатуру, а потом по этой выборке надо пробежаться и сделать кое-какие монипуляции.

Стандартные элементы после отбора возвращают СправочникСписок.Номенклатура. Через эту штуку к выбранным элементам Номенклатуры не достучаться. Можно только получить правила отбора.
И вот если в отборе участвует БазоваяЕдиницаИзмерения, то сделать запрос или выборку не получается. Выборка дает ошибку, а запрос пустоту.
9 shuhard
 
18.07.19
18:15
(8)[Номенклатура.БазоваяЕдиницаИзмерения = "уп"]
не может работать и не будет
"уп" не является ссылкой
10 shuhard
 
18.07.19
18:16
ВЫБРАТЬ
Номенклатура.Ссылка
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
  Номенклатура.БазоваяЕдиницаИзмерения = &уп

Запрос.УстановитьПараметры("уп", ТМЦ.ЕдиницаХраненияОстатков);
11 Михаил22
 
18.07.19
18:22
(10) А без параметров как прописать сразу в текст запроса ссылку?
12 shuhard
 
18.07.19
18:23
(11) ВЫБРАТЬ
Номенклатура.Ссылка
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
  Номенклатура.БазоваяЕдиницаИзмерения = некийзапрос.ТМЦ.ЕдиницаХраненияОстатков
13 Михаил22
 
18.07.19
18:33
(10) Спасибо. Разобрался. Но возникла другая проблема.
При фильтрации стандартными элементами форму есть условие "Содержит", а как его интерпретировать в Запросе?
14 shuhard
 
18.07.19
18:34
(13) подобно, он же Like
15 Михаил22
 
18.07.19
18:41
(14) Ё. Прейдется условия из Отбора в СправочникСписок.Номенклатура разбирать и менять на ключевые слова запроса.

Может есть какая-то возможность добраться к выбранным элементам справочника из СправочникСписок, используя объекты 1С?
16 shuhard
 
18.07.19
18:45
(15) какая-то есть
но правильно либо запросы, либо СКД
17 Михаил22
 
18.07.19
18:50
(16) СКД тож потребует интерпретации условий. Все получается не элегантно.

Извиняюсь, но чем больше работаю с 1С, тем больше понимаю, что ее создатели были не в своем уме. :)
18 catena
 
19.07.19
06:09
(15)А список ваш на какой форме лежит?
19 Михаил22
 
19.07.19
09:04
(18) На главной форме внешней обработки. Не модальная.
20 catena
 
19.07.19
10:02
(19)Смешно))) ОФ или УФ?
21 Михаил22
 
19.07.19
10:27
ОФ. Не серверная база.
22 catena
 
19.07.19
10:32
(21)Тогда можно скопировать отбор в построитель

    ТекОтбор = ЭлементыФормы.СписокИзКоторогоБерем.ОтборСтрок;
    Построитель = Новый ПостроительОтчета;
    Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(СписокИзКоторогоБерем);
    Для каждого ЭлементОтбора Из ТекОтбор Цикл
    
        Если ЭлементОтбора.Использование Тогда
            НовыйЭлемент = Построитель.Отбор.Добавить(ЭлементОтбора.ПутьКДанным, ЭлементОтбора.Имя, ЭлементОтбора.Представление);
            НовыйЭлемент.ВидСравнения = ЭлементОтбора.ВидСравнения;
            НовыйЭлемент.Значение = ЭлементОтбора.Значение;
            НовыйЭлемент.ЗначениеС = ЭлементОтбора.ЗначениеС;
            НовыйЭлемент.ЗначениеПо = ЭлементОтбора.ЗначениеПо;
            НовыйЭлемент.Использование = Истина;
        КонецЕсли;
    
    КонецЦикла;
    РезультатЗапроса = Построитель.Результат;
        
    Возврат РезультатЗапроса.Выгрузить();
23 Михаил22
 
19.07.19
10:43
С построителем не работал.
Так понимаю ВидСравнения в построителе совпадает со объектом СправочникСписок.
Оба объекты 1С.
24 catena
 
19.07.19
10:52
(23)м, что? Я вопроса не поняла. ВидСравнения - это вообще говоря системное перечисление, но в данном случае это не важно, т.к. тут просто копируются все элементы и значения из одного отбора в другой. Все, что вам нужно, это поставить таблицу выборки вместо СписокИзКоторогоБерем и элемент формы, на котором отбор вместо ЭлементыФормы.СписокИзКоторогоБерем.ОтборСтрок
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.