Имя: Пароль:
1C
1С v8
ОтобратьСтрокиПоКритериям
,
0 Adgjj
 
12.07.12
14:51
Мне на днях здесь подсказали функцию ОтобратьСтрокиПоКритериям.
Применяла ее так - работало:
Список = Новый СписокЗначений;    
           Список.Добавить("X");
           Список.Добавить("Y");
           ТЗ_ОднаФото = ОтобратьСтрокиПоКритериям(ТЗ, Новый Структура("СменаXY", Список), Новый Структура("СменаXY", ВидСравнения.ВСписке)).Выгрузить();


Почему не работает так:
Список = Новый СписокЗначений;  
Список.Добавить(СтрокаТЗ.Организация.Наименование);
Список.Добавить(СтрокаТЗ.ДатаВыписки);
           Список.Добавить(СтрокаТЗ.ЕО);
           Список.Добавить(СтрокаТЗ.СменаXY);
           ТЗ_ОднаФото = ОтобратьСтрокиПоКритериям(ТЗ, Новый Структура("Название", Список), Новый Структура("Название", ВидСравнения.ВСписке)).Выгрузить();
Ошибка: http://s54.radikal.ru/i145/1207/01/6bc2feeeec3e.jpg
ошибка на строку функции НовыйОтбор = ПостроительЗапроса.Отбор.Добавить(Критерий.Ключ);
Функцию приведу в след. посте
1 Adgjj
 
12.07.12
14:51
Функция ОтобратьСтрокиПоКритериям(Источник, СтруктураКритериев, СтруктураСложныхКритериев = Неопределено) Экспорт
   
   Перем ВидСравненияСложный;
   
   Если СтруктураСложныхКритериев = Неопределено Тогда
       СтруктураСложныхКритериев = Новый Структура;
   КонецЕсли;
   
   ПостроительЗапроса = Новый ПостроительЗапроса;
   ПостроительЗапроса.ИсточникДанных = Новый ОписаниеИсточникаДанных(Источник);
   
   Для Каждого Критерий Из СтруктураКритериев Цикл
       НовыйОтбор = ПостроительЗапроса.Отбор.Добавить(Критерий.Ключ);
       
       СтруктураСложныхКритериев.Свойство(Критерий.Ключ, ВидСравненияСложный);
       
       Если ВидСравненияСложный = Неопределено Тогда
           НовыйОтбор.Установить(Критерий.Значение);
       Иначе
           НовыйОтбор.Использование = Истина;
           НовыйОтбор.ВидСравнения = ВидСравненияСложный;
           НовыйОтбор.Значение = Критерий.Значение;
       КонецЕсли;
   КонецЦикла;
   
   Возврат ПостроительЗапроса.Результат;
   
КонецФункции // ОтобратьСтрокиПоКритериям()
2 Adgjj
 
12.07.12
14:58
т.е этой функцией можно выбирать только значения из 1 поля?
3 hhhh
 
12.07.12
14:58
видимо СтрокаТЗ.ДатаВыписки у вас не типа строка. Какой-то другой тип пролез.
4 Adgjj
 
12.07.12
15:16
ДатаВыписки = Строка(СтрокаТЗ.ДатаВыписки);
           Список.Добавить(ДатаВыписки);
           ТЗ_ОднаФото = ОтобратьСтрокиПоКритериям(ТЗ_ОднаФото, Новый Структура("ДатаВыписки", Список), Новый Структура("ДатаВыписки", ВидСравнения.ВСписке)).Выгрузить();
           
так не помогает, ведь в ТЗ дата: дату по строке не отбирает. как быть?
5 Adgjj
 
12.07.12
15:19
(3) спасибо без даты работает
Организация = СтрокаТЗ.Организация;
           Список.Добавить(Организация);

           ЕО = СтрокаТЗ.ЕО;
           Список.Добавить(ЕО);
           ТЗ_ОднаФото = ОтобратьСтрокиПоКритериям(ТЗ, Новый Структура("Организация,ЕО", Список), Новый Структура("Организация,ЕО", ВидСравнения.ВСписке)).Выгрузить();

А как же с датой?
6 Adgjj
 
12.07.12
15:34
|    ВЫРАЗИТЬ(ВыработкаТС_Лес.ПутЛист.ДатаВыписки КАК СТРОКА(25)) КАК ДатаВыписки, так в запросе не катит
7 Adgjj
 
12.07.12
16:06
дату сделала строкой (проверила это в отладчике - строка):
ТЗ.Колонки.Добавить("ДатаВыпискиСтрока",ОбщегоНазначения.ПолучитьОписаниеТиповстроки(30)); //для ОтобратьСтрокиПоКритериям
   Для каждого СтрокаТЗ Из ТЗ Цикл
       СтрокаТЗ.ДатаВыпискиСтрока = Строка(СтрокаТЗ.ДатаВыписки);  //или ЗагрузитьКолонку(,);  посмотреть
   конеццикла;


Но:
Организация = СтрокаТЗ.Организация;
           Список.Добавить(Организация); //Список.Добавить(СтрокаТЗ.Организация);
           ДатаВыпискиСтрока = СтрокаТЗ.ДатаВыпискиСтрока;
           Список.Добавить(ДатаВыпискиСтрока); //Список.Добавить(СтрокаТЗ.ДатаВыписки);
           ЕО = СтрокаТЗ.ЕО;
           Список.Добавить(ЕО);
           СменаXY = СтрокаТЗ.СменаXY;
           Список.Добавить(СменаXY);    //Список.Добавить(СтрокаТЗ.СменаXY);
           ТЗ_ОднаФото = ОтобратьСтрокиПоКритериям(ТЗ, Новый Структура("Организация,ЕО,СменаXY,ДатаВыпискиСтрока", Список), Новый Структура("Организация,ЕО,СменаXY,ДатаВыпискиСтрока", ВидСравнения.ВСписке)).Выгрузить();

ТЗ_ОднаФото почему-то пустая((
8 Adgjj
 
12.07.12
16:07
9 Adgjj
 
12.07.12
16:20
http://s019.radikal.ru/i632/1207/a9/a4353e25ea97.jpg

похоже все ушли на фронт
10 ptiz
 
12.07.12
17:00
Объясни, что нужно получить простыми словами, по каким колонкам отбор?
11 Adgjj
 
18.07.12
13:24
Список = Новый СписокЗначений;  
           Список.Добавить(СтрокаТЗ.Организация); //В СПИСОК ПОЧЕМУ-ТО ПОПАДАЕТ ТОЛЬКО ОРГАНИЗАЦИЯ ?
           Список.Добавить(СтрокаТЗ.ЕО);
           Список.Добавить(СтрокаТЗ.СменаXY);
           Список.Добавить(СтрокаТЗ.ДатаВыпискиСтрока);
           ТЗ_ОднаФото = ОтобратьСтрокиПоКритериям(ТЗ, Новый Структура("Организация,ЕО,СменаXY,ДатаВыпискиСтрока", Список), Новый Структура("Организация,ЕО,СменаXY,ДатаВыпискиСтрока", ВидСравнения.ВСписке)).Выгрузить();

Нужно из ТЗ отобрать строки с указанными в списке значениями колонок Организация,ЕО,СменаXY,ДатаВыпискиСтрока.
Проблема в том, что В СПИСОК ПОЧЕМУ-ТО ПОПАДАЕТ ТОЛЬКО ОРГАНИЗАЦИЯ.
12 Adgjj
 
18.07.12
13:28
13 Adgjj
 
18.07.12
13:29
видимо проблема в том что орг-ция не типа строка
14 Adgjj
 
18.07.12
13:34
не помогло
15 Adgjj
 
18.07.12
13:40
неужели так много народа не умеет работать со списками((
16 Adgjj
 
18.07.12
14:33
Список = Новый СписокЗначений;    
           Список.Добавить(СтрокаТЗ.ОрганизацияСтрока);  
           Список.Добавить(СтрокаТЗ.ЕО);
           Список.Добавить(СтрокаТЗ.СменаXY);
           Список.Добавить(СтрокаТЗ.ДатаВыпискиСтрока);
           ТЗ_ОднаФото = ОтобратьСтрокиПоКритериям(ТЗ, Новый Структура("ОрганизацияСтрока,ЕО,СменаXY,ДатаВыпискиСтрока", Список), Новый Структура("ОрганизацияСтрока,ЕО,СменаXY,ДатаВыпискиСтрока", ВидСравнения.ВСписке)).Выгрузить();
           //ТЗ_ОднаФото = ОтобратьСтрокиПоКритериям(ТЗ, Новый Структура("ЕО,СменаXY,ДатаВыпискиСтрока", СтрокаТЗ.ЕО,СтрокаТЗ.СменаXY,СтрокаТЗ.ДатаВыпискиСтрока), Новый Структура("ОрганизацияСтрока,ЕО,СменаXY,ДатаВыпискиСтрока", ВидСравнения.ВСписке)).Выгрузить();

Уже вместо орг-ции ее код строкой пишу, все равно не помогает. Сначала думала из-за кавычек внутри организации - не помогло. ОтобратьСтрокиПоКритериям работает по чему угодно только не по организации.
17 Adgjj
 
18.07.12
14:52
Список = Новый СписокЗначений; //с учетом, что строки упорядочены выше  
           Список.Добавить(СтрокаТЗ.ОрганизацияСтрока); //В СПИСОК ПОЧЕМУ-ТО ПОПАДАЕТ ТОЛЬКО ОРГАНИЗАЦИЯ ?
           Список.Добавить(СтрокаТЗ.ЕО);
           Список.Добавить(СтрокаТЗ.СменаXY);
           Список.Добавить(СтрокаТЗ.ДатаВыпискиСтрока);
           ТЗ_ОднаФото = ОтобратьСтрокиПоКритериям(ТЗ, Новый Структура("ОрганизацияСтрока,ЕО,СменаXY,ДатаВыпискиСтрока", Список), Новый Структура("ОрганизацияСтрока,ЕО,СменаXY,ДатаВыпискиСтрока", ВидСравнения.ВСписке)).Выгрузить();
           //ТЗ_ОднаФото = ОтобратьСтрокиПоКритериям(ТЗ, Новый Структура("ЕО,СменаXY,ДатаВыпискиСтрока", СтрокаТЗ.ЕО,СтрокаТЗ.СменаXY,СтрокаТЗ.ДатаВыпискиСтрока), Новый Структура("ОрганизацияСтрока,ЕО,СменаXY,ДатаВыпискиСтрока", ВидСравнения.ВСписке)).Выгрузить();
           
           Список2 = Новый СписокЗначений;    
           Список2.Добавить("X");
           Список2.Добавить("Y");
           ТЗпроверка2 = ОтобратьСтрокиПоКритериям(ТЗ, Новый Структура("СменаXY", Список2), Новый Структура("СменаXY", ВидСравнения.ВСписке)).Выгрузить();

Список НЕ работает, Список2 работает.
http://i020.radikal.ru/1207/39/e925f38f752f.jpg
http://s002.radikal.ru/i198/1207/28/5fb85571e5c7.jpg
http://s55.radikal.ru/i149/1207/49/90f61d73a346.jpg
18 ptiz
 
18.07.12
17:33
(17) Ты видимо, не до конца понимаешь, как работает отбор в построителе.
Когда пишешь вызов функции:
ОтобратьСтрокиПоКритериям(ТЗ,
Новый Структура("ОрганизацияСтрока,ЕО,СменаXY,ДатаВыпискиСтрока", Список),
Новый Структура("ОрганизацияСтрока,ЕО,СменаXY,ДатаВыпискиСтрока", ВидСравнения.ВСписке)).Выгрузить();

параметр
Новый Структура("ОрганизацияСтрока,ЕО,СменаXY,ДатаВыпискиСтрока", Список),
означает, что надо сделать 4 отбора (они работают по принципу "И"), причем значения ты указываешь почему-то только для первого отбора!

надо указывать:
Новый Структура("ОрганизацияСтрока,ЕО,СменаXY,ДатаВыпискиСтрока", СписокДляОтбораОрганизацияСтрока, СписокДляОтбораЕО, СписокДляОтбораСменаXY, СписокДляОтбораДатаВыпискиСтрока),

ну и в следующем параметре:
Новый Структура("ОрганизацияСтрока,ЕО,СменаXY,ДатаВыпискиСтрока", ВидСравнения.ВСписке, ВидСравнения.ВСписке, ВидСравнения.ВСписке, ВидСравнения.ВСписке)

Тогда получишь результат: строки, в которых значения колонок ОрганизацияСтрока,ЕО,СменаXY,ДатаВыпискиСтрока есть в соответствуюещм списке.

Может, при таком сложном условии проще на запрос к ТЗ перейти.
"ВЫБРАТЬ *
ПОМЕСТИТЬ ТЗ
ИЗ &ТЗ КАК ТЗ;
ВЫБРАТЬ ОрганизацияСтрока,ЕО,СменаXY,ДатаВыпискиСтрока
ИЗ ТЗ
ГДЕ ОрганизацияСтрока В (&Список) ...."
19 Adgjj
 
19.07.12
10:27
(18) спасибо Вам большое
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший