Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Отбор строк ТЗ по значению не являющемуся колонкой ТЗ
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.2 > Программирование управляемых форм 1С 8.2
logist
Есть ТЗ с некими колонками, одна из них Номенклатура (в справочнике номенклатуры есть поле СтавкаНДС), так вот как методом ТЗ.НайтиСтроки выбрать строки с нужной мне ставкой НДС?
Vofka
Именно этим методом никак.

Цитата
НайтиСтроки (FindRows)
Синтаксис:

НайтиСтроки(<ПараметрыОтбора>)
Параметры:

<ПараметрыОтбора> (обязательный)

Тип: Структура.
Задает условия поиска: ключ структуры определяет имя колонки, по которой будет осуществляться поиск, а значение структуры - искомое значение.
logist
Цитата(Vofka @ 22.05.12, 11:33) необходимо зарегистрироваться для просмотра ссылки
Именно этим методом никак.

Это понятно. Ну а что делать-то? )))
Vofka
Вариантов "что делать" может быть несколько:
1) Я не в курсе откуда берутся данные в ТЗ. Так вот можно сделать, чтобы туда они попадали уже с определенной ставкой НДС;
2) Перебором строк смотреть на ставку НДС и если подходит - выносим эти строки куда надо и дальше с ними делаем что надо;
3) Добавить в таблицу колонку СтавкаНДС. А если сильно мозолит глаз - то просто на форме её скрыть.
logist
Цитата(Vofka @ 22.05.12, 11:42) необходимо зарегистрироваться для просмотра ссылки
Я не в курсе откуда берутся данные в ТЗ. Так вот можно сделать, чтобы туда они попадали уже с определенной ставкой НДС;

Тз это ТЧ документа которая обрабатывается на сервере перед записью в форме

Цитата(Vofka @ 22.05.12, 11:42) необходимо зарегистрироваться для просмотра ссылки
Перебором строк смотреть на ставку НДС и если подходит - выносим эти строки куда надо и дальше с ними делаем что надо;

Перебором строк не подходит, потому что идет перебор СтавокНДС и по ним отбор строк для формирования из них документов, ну и перебирать придется несколько раз что не вариант.

Цитата(Vofka @ 22.05.12, 11:42) необходимо зарегистрироваться для просмотра ссылки
Добавить в таблицу колонку СтавкаНДС. А если сильно мозолит глаз - то просто на форме её скрыть.

Думал над этим вопросом, но считаю не лучшим решением, должны же быть какие-то другие, более гуманные варианты.
Vofka
Цитата(logist @ 22.05.12, 12:05) необходимо зарегистрироваться для просмотра ссылки
Перебором строк не подходит, потому что идет перебор СтавокНДС и по ним отбор строк для формирования из них документов, ну и перебирать придется несколько раз что не вариант.

Во-первых с таким подходом вам и искать строки надо было бы несколько раз. Во-вторых, что мешает при обходе строки по разным ставкам НДС складывать отдельно и потом отдельно их обработать?

Цитата(logist @ 22.05.12, 12:05) необходимо зарегистрироваться для просмотра ссылки
Думал над этим вопросом, но считаю не лучшим решением, должны же быть какие-то другие, более гуманные варианты.

Собственно, если действие происходит на сервере и эта ТЗ пользователю даже не показывается - то я вообще не вижу никаких проблем с добавлением новой колонки.

Ну и что самое интересное: задачу вы озвучили только что (в посте выше), а решение предложили в первом посте с вопросом почему оно не работает. При этом если б задачу озвучили сразу, то я бы предложил такой вариант: запрос с итогами по ставкам НДС.
logist
Цитата(Vofka @ 22.05.12, 12:29) необходимо зарегистрироваться для просмотра ссылки
что мешает при обходе строки по разным ставкам НДС складывать отдельно и потом отдельно их обработать?

Видимо так и поступлю.

Цитата(Vofka @ 22.05.12, 12:29) необходимо зарегистрироваться для просмотра ссылки
такой вариант: запрос

А что запрашивать-то, это ТЧ перед записью. Если б можно было запросом то и проблем бы не было.
Vofka
Цитата(logist @ 22.05.12, 12:35) необходимо зарегистрироваться для просмотра ссылки
А что запрашивать-то, это ТЧ перед записью. Если б можно было запросом то и проблем бы не было.

Выгружаем данные ТЧ в ТЗ и делаем запрос по ТЗ.
logist
Цитата(Vofka @ 22.05.12, 13:49) необходимо зарегистрироваться для просмотра ссылки
и делаем запрос по ТЗ.

С этого места можно подробней (с примерами желательно)? smile.gif
Vofka
Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ
|   *
|ИЗ
|   &ТЗ КАК ТЗ
|";
Запрос.УстановитьПараметр("ТЗ", ТЗ); // переменная ТЗ - это какая-то подготовленная таблица значений
Результат = Запрос.Выполнить().Выгрузить();
Сообщить("Профит!", СтатусСообщения.Внимание);
logist
ЗапросТЗ.Текст = "ВЫБРАТЬ * ИЗ &ТЗ КАК ТЗ ГДЕ ТЗ.Номенклатура.СтавкаНДС = &СтавкаНДС";

На выходе таблица только с одной колонкой "СтавкаНДС", где остальное?))
sava1
Сначала надо добавить таблицу.
См. Менеджер временных таблиц
Vofka
Цитата(sava1 @ 22.05.12, 16:28) необходимо зарегистрироваться для просмотра ссылки
Сначала надо добавить таблицу.
См. Менеджер временных таблиц

Я буквально вчера без менеджера временных таблиц делал. Когда-то да, действительно без него не давало, а сейчас и без него позволяет.
logist
С запросом разобрался, мой косяк, но теперь при выгрузке результата запроса ошибка:
Цитата
Ошибка при вызове метода контекста (Выполнить)
ТаблицаДляВыделения = ЗапросТЗ.Выполнить().Выгрузить();
по причине:
Содержимое объекта данных может быть выбрано только во временную таблицу
sava1
типо так
    Запрос =Новый Запрос();
    МВТ = Новый МенеджерВременныхТаблиц;
    Запрос.МенеджерВременныхТаблиц = МВТ;
    Запрос.Текст = "
    |Выбрать рр.ТМЦ,рр.Заказ Поместить тзв
    |ИЗ &тз как рр ГДЕ рр.ТМЦ = &ТМЦ";
    Запрос.УстановитьПараметр("ТЗ",тчФил);
    Запрос.УстановитьПараметр("ТМЦ",тд.ТМЦ);
    Запрос.Выполнить();
    //
    Запрос.Текст = "ВЫБРАТЬ ТМЦ,Сумма(Заказ) как Сумм ИЗ тзв Сгруппировать по ТМЦ";
    тх = Запрос.Выполнить().Выгрузить();
    СуммаОтбора = тх.Итог("Сумм");



 i 

Выделяйте код.
 


Первый запрос укладывает ТЗ в БД (причем можно сразу с отбором) - ключевое слово ПОМЕСТИТЬ
Второй - выбираем то, что нужно из созданной таблицы.
logist
        МВТ = Новый МенеджерВременныхТаблиц;
        ЗапросТЗ.МенеджерВременныхТаблиц = МВТ;
        ЗапросТЗ.Текст = "ВЫБРАТЬ * ПОМЕСТИТЬ ВТ ИЗ &ТЗ КАК ТЗ ГДЕ ТЗ.Номенклатура.СтавкаНДС = &СтавкаНДС";
        ЗапросТЗ.УстановитьПараметр("ТЗ", ТаблицаТовары);
        ЗапросТЗ.УстановитьПараметр("СтавкаНДС", Выборка.СтавкаНДС);
        ЗапросТЗ.Выполнить();
        
        ЗапросТЗ.Текст = "ВЫБРАТЬ * ИЗ ВТ";
        ТаблицаДляВыделения = ЗапросТЗ.Выполнить().Выгрузить();


Цитата
Ошибка при вызове метода контекста (Выполнить)
ЗапросТЗ.Выполнить();
по причине:
{(1, 42)}: Поле не найдено "ТЗ.Номенклатура.СтавкаНДС"
ВЫБРАТЬ * ПОМЕСТИТЬ ВТ ИЗ &ТЗ КАК ТЗ ГДЕ <<?>>ТЗ.Номенклатура.СтавкаНДС = &СтавкаНДС
sava1
тз откуда получена? Поля тз должны быть типизированы .
logist
Цитата(sava1 @ 22.05.12, 16:47) необходимо зарегистрироваться для просмотра ссылки
тз откуда получена? Поля тз должны быть типизированы .

ТЗ получена из ТЧ Объекта формы (ДанныеФормыКоллекция). Поля типизированы, отладчик показывает ТипЗначения колонки как ОписаниеТипов
sava1
Два варианта;
1) указать колонку в выборке явно , а не *
2) приджойнить к номенклатуре справочник, а фильтр накладывать при выборке из временной таблицы
logist
Цитата(sava1 @ 22.05.12, 17:00) необходимо зарегистрироваться для просмотра ссылки
1) указать колонку в выборке явно , а не *

Указывал - результат тот же.

Цитата(sava1 @ 22.05.12, 17:00) необходимо зарегистрироваться для просмотра ссылки
2) приджойнить к номенклатуре справочник, а фильтр накладывать при выборке из временной таблицы

Попробую smile.gif
logist
Стою я на месте с этим вопросом. В ТЗ колонки оказались не совсем типизированными, т.е. номенклатура это не СправочникСсылка sad.gif(
Vofka
На каком именно месте стоянка? smile.gif Что сделали, что именно не получается?
logist
Извиняюсь, тупанул, пятница)) Колонка номенклатура таки имеет типа СправочникСсылка.

Собственно вот:
<...>
    ТаблицаТовары = Документ.Товары.Выгрузить();
    
    МассивНоменклатуры = ТаблицаТовары.ВыгрузитьКолонку("Номенклатура");
    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("Ссылка", МассивНоменклатуры);
    Запрос.Текст = "ВЫБРАТЬ
                   |    СтавкиНДС.Ссылка КАК СтавкаНДС
                   |ИЗ
                   |    Справочник.СтавкиНДС КАК СтавкиНДС
                   |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура
                   |        ПО Номенклатура.СтавкаНДС = СтавкиНДС.Ссылка
                   |ГДЕ
                   |    Номенклатура.Ссылка В(&Ссылка)
                   |
                   |СГРУППИРОВАТЬ ПО
                   |    СтавкиНДС.Ссылка";
    Выборка = Запрос.Выполнить().Выбрать();
    
    Выборка.Следующий();            
    ПерваяСтавка = Выборка.СтавкаНДС;    
    
    ЗапросТЗ = Новый Запрос;
    МВТ = Новый МенеджерВременныхТаблиц;
    ЗапросТЗ.МенеджерВременныхТаблиц = МВТ;
    ТекстЗапросаТЗ = "ВЫБРАТЬ";
    Для Каждого Реквизит Из Документ.Ссылка.Метаданные().ТабличныеЧасти.Товары.Реквизиты Цикл
        ТекстЗапросаТЗ = ТекстЗапросаТЗ + "
                    |    ТЗ."+СтрЗаменить(Реквизит," ","")+",";
    КонецЦикла;                
        ТекстЗапросаТЗ = Лев(ТекстЗапросаТЗ,СтрДлина(ТекстЗапросаТЗ)-1);
        ТекстЗапросаТЗ = ТекстЗапросаТЗ + "
                    |ПОМЕСТИТЬ ВТ
                    |ИЗ
                    |    &ТаблицаТовары КАК ТЗ
                    |ГДЕ
                    |    ТЗ.Номенклатура.СтавкаНДС = &СтавкаНДС";
    
    Пока Выборка.Следующий() Цикл
        
        ЗапросТЗ.Текст = ТекстЗапросаТЗ;
        ЗапросТЗ.УстановитьПараметр("ТаблицаТовары", ТаблицаТовары);
        ЗапросТЗ.УстановитьПараметр("СтавкаНДС", Выборка.СтавкаНДС);
        ЗапросТЗ.Выполнить();    // ЗДЕСЬ ОСТАНАВЛИВАЕТСЯ С ОШИБКОЙ (текст ошибки ниже)
        
        ЗапросТЗ.Текст = "ВЫБРАТЬ * ИЗ ВТ";
        ТаблицаДляВыделения = ЗапросТЗ.Выполнить().Выгрузить();
<...>


Ошибка:
Цитата
Ошибка при вызове метода контекста (Выполнить)
ЗапросТЗ.Выполнить();
по причине:
{(29, 2)}: Поле не найдено "ТЗ.Номенклатура.СтавкаНДС"
<<?>>ТЗ.Номенклатура.СтавкаНДС = &СтавкаНДС


Если убрать "ГДЕ" то отрабатывает правильно. Названия реквизитов проверил.
Ardi
Цитата(logist @ 25.05.12, 14:31) необходимо зарегистрироваться для просмотра ссылки
Если убрать "ГДЕ" то отрабатывает правильно. Названия реквизитов проверил.

Убрать где.
Тоесть запрос выполняем только один раз-дополняя ТЗ новой колонкой.
А потом уже работаем с этой новой тз.
logist
Вообщем вот что, убрал ГДЕ из первого запроса, и вставил во второй, т.е.
        ЗапросТЗ.Текст = "ВЫБРАТЬ * ИЗ ВТ";

заменил на
        ЗапросТЗ.Текст = "ВЫБРАТЬ * ИЗ ВТ ГДЕ ВТ.Номенклатура.СтавкаНДС = &СтавкаНДС";



Всё отлично! Всем спасибо за помощь!
Margo2013
Всем привет!

У меня восьмерка 8.1 опыт не очень, но стараюсь. Делала фирме один отчетик, там надо запросом выбрать много данных, поместить в табл значений и в ней в некоторых строках посчитать четрые колонки.

строки я искала по текстовой колонке ТЗ.Найти (тек_имя_фирмы, "КороткоеНаименование") и потом расчитваю.

строк 80 тыщ, жутко долго ищет. чем можно заменить или ускорить?
Ardi
Margo2013
80 тыщ. раз в цикле вызывается "Найти"?
Я правильно понял?
Vofka
Margo2013, какого лешего в этой теме пишем, совсем уже?! Лишаетесь прав писать сообщения на сутки! Тема закрыта.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.