Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
28 окт 2021, 13:16

Отбор в табличной части документа

Автор mishganze, 03 авг 2021, 14:13

0 Пользователей и 1 гость просматривают эту тему.

mishganze

Хочу в своей Рознице 2.2.10.19 в документе ПересчетТоваров сделать отбор строк номенклатуры ибо штатный мне не очень нравится. Пробую так

&НаСервере
Процедура НайтиПоНаименованиюНаСервере()

ЭлементыФормы.Товары.ОтборСтрок.Номенклатура.Значение.Добавить(Справочники.Номенклатура.НайтиПоНаименованию("Стул"));

КонецПроцедуры

&НаКлиенте
Процедура НайтиПоНаименованию(Элемент)

НайтиПоНаименованиюНаСервере();

КонецПроцедуры
И тут 1с начинает ругаться на "Переменная не определена (ЭлементыФормы)"

Что я не так делаю?

antoneus

Раз я вижу директивы компиляции - это управляемые формы? Тогда не ЭлементыФормы, а Элементы. И сомневаюсь я, что остальной код тоже будет работать.

mishganze

Да управляемые.... Пробовал я и Элементы. Не помогло.
Подскажите как правильно сделать....

antoneus

&НаСервере
Процедура НайтиПоНаименованиюНаСервере()
   
    Элементы.Товары.ОтборСтрок = Новый ФиксированнаяСтруктура("Номенклатура", Справочники.Номенклатура.НайтиПоНаименованию("Стул"));
   
КонецПроцедуры

mishganze

Путем долгих мучений и благодаря вашему коду родил следующее
&НаКлиенте
Процедура НайтиПоНаименованию(Элемент)
    Если СтрДлина(НаименованиеНоменклатуры)<1 Тогда
        Элементы.Товары.ОтборСтрок = Неопределено;
    Иначе
        Элементы.Товары.ОтборСтрок = Новый ФиксированнаяСтруктура(МассивНоменклатуры(НаименованиеНоменклатуры)) ;
    КонецЕсли;   
КонецПроцедуры

&НаСервере
Функция МассивНоменклатуры(Номенклатура)
НайденныеНоменклатуры = Новый Структура;
     Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Номенклатура.Наименование КАК Наименование
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Наименование ПОДОБНО &ИскНом";

Запрос.УстановитьПараметр("ИскНом","%"+Номенклатура+"%");
Результат = Запрос.Выполнить();
    Выборка=Результат.Выбрать();
Пока Выборка.Следующий() Цикл
НайденныеНоменклатуры.Вставить("Номенклатура",Выборка.Наименование);
КонецЦикла;

Возврат НайденныеНоменклатуры ;
КонецФункции
Если задать конкретную позицию и в результате запроса она будет одна то отбор сработает. Но если будет несколько позиций то в табличной части будет пусто

mishganze


antoneus

Ну, добавлять реквизит в тч документа для отбора (и хранить этот мусор в базе) - такое себе решение. Правильнее добавлять реквизит в табличную часть реквизита формы и отбирать по нему.

mishganze

@antoneus, Я так и сделал... Тоже это показалось не целесообразным. В этом решении перебор и поиск в элементах таблицы происходит на сервере... И  когда позиций в таблице много то поиск идет с тормозами.

antoneus

Можно и не бегать на сервер.

Теги:

Похожие темы (5)

Рейтинг@Mail.ru Rambler's Top100

Поиск