Имя: Пароль:
1C
1C 7.7
v7: Вопрос по Таблице значений
,
0 Verdi
 
02.03.13
15:45
Добрый день!

Подскажите как выполнить отбор в общей ТЗ по условиям:
А - количество дней 30
Б - количество дней 60
В - количество дней 90

В ТЗ отбираются остатки товаров, имеющиеся на складе и расчитывается сколько дней прошло от момента прихода.
Нужно в таблицу вывести по условию только тот товар, который от конечно
1 Verdi
 
02.03.13
15:46
(0) й даты равен или меньше условия.

Сама ТЗ:
КатегорияA = 30;
   КатегорияB = 60;
   КатегорияC = 90;
   
   ТЗ.ВыбратьСтроки();
     ТЗ.НоваяКолонка("Прод","Число");
   ТЗ.НоваяКолонка("ЗЦена","Число");
   ТЗ.Новаяколонка("Прих", "Число");
   ТЗ.НоваяКолонка("ВсегоДней");
   ТЗ.НоваяКолонка("Сумма","Число");
   ТЗ.НоваяКолонка("РЦена","Число");
   ТЗ.НоваяКолонка("РСумма","Число");
     ЦенаП = СоздатьОбъект("Справочник.Цены");
   Пока ТЗ.ПолучитьСтроку()=1 Цикл
           ТЗ.ЗЦена = ТЗ.ЗакЦена*100/120;
             ТЗ.Прод = ТЗ.Продали + ТЗ.Списали;
           Если ОпрСпис = 1 Тогда
               ТЗ.Прих = ТЗ.КолПрих + ТЗ.КолОприх;
           Иначе
               ТЗ.Прих = ТЗ.КолПрих;
           КонецЕсли;
             
               ТЗ.Сумма = ТЗ.ЗЦена * ТЗ.НаСкладе;
             Если ТЗ.НаСкладе = 0  Тогда
                 ТЗ.ВсегоДней = 0;
             Иначе
               
                 ТЗ.ВсегоДней = (ТЗ.ДатаП - КонДата)*(-1);
             КонецЕсли;
             ЦенаП.ИспользоватьВладельца(ТЗ.Номенклатура);
           Если ЦенаП.НайтиПоРеквизиту("ТипЦен",ЦенаПрод,0) = 1 Тогда
               ТЗ.РЦена = ЦенаП.Цена.Получить(КонДата);
           Иначе
               ТЗ.РЦена = 1;
           КонецЕсли;
           ТЗ.РСумма = ТЗ.РЦена * ТЗ.Прод;

     КонецЦикла;
2 K-5
 
02.03.13
15:48
(1) а запросом можно?
3 Mikeware
 
02.03.13
15:54
отбора в ТЗ нет. Ищи перебором.
Ну, или готовь данные заранее (на этапе получения).
или используй ИндексированнуюТаблицу
или прямой запрос.
4 Verdi
 
02.03.13
20:13
Запрос делает отбор в ТЗ, но вот отредактировать его не удаётся. В 8 как то проще.

Вот текст запроса. Как можно в запрос добавить список переменных отбора? Переменные - это Категория А В С....

   Запрос = СоздатьОбъект("Запрос");
   ВалютаОтчета = глДоллары;

   ТекстЗапроса =
   "//{{ЗАПРОС(Сформировать)
   |Период с НачДата по КонДата;
   |Номенклатура = Регистр.ПартииНаличие.Номенклатура;
   |Статус = Регистр.ПартииНаличие.КодОперации;
   |ДатаП = Регистр.ПартииНаличие.ДатаПартии;
   |Кол = Регистр.ПартииНаличие.Количество;
   |Докум = Регистр.ПартииНаличие.Партия.ПриходныйДокумент;
   |Функция КолПрих = Приход(Кол) когда (Статус = Перечисление.КодыОпераций.Закупка);
   |Функция КолОприх = Приход(Кол) когда (Статус = Перечисление.КодыОпераций.Оприходование);
   |Функция КолВоз = Приход(Кол) когда (Статус = Перечисление.КодыОпераций.ВозвратОтПокупателя);
   |Функция НаСкладе = КонОст(Кол);
   |Функция Продали   = Расход(Кол) когда (Статус = Перечисление.КодыОпераций.Продажа);
   |Функция Списали   = Расход(Кол) когда (Статус = Перечисление.КодыОпераций.Списание);
   |Группировка Номенклатура;
   |Группировка Докум;";
   
   Если ПустоеЗначение(Ном) = 0 Тогда
       ТекстЗапроса = ТекстЗапроса + РазделительСтрок + "Условие (Номенклатура в Ном);";  
   КонецЕсли;        
   ТекстЗапроса = ТекстЗапроса + РазделительСтрок +
   "ЗакЦена = Регистр.ПартииНаличие.Партия.ЗакупочнаяЦена;";  
   
   Запрос.Выполнить(ТекстЗапроса);
   Запрос.Выгрузить(ТЗ,1,0);
5 Тьма
 
02.03.13
20:17
ДатаА=КонДата-30;
............
|ДокумДатаДок = Регистр.ПартииНаличие.Партия.ПриходныйДокумент.ДатаДок;
..............
|Функция НаСкладеА = КонОст(Кол) когда (ДатаДок<ДатаА)
/////////////////
как-то так
6 Chai Nic
 
02.03.13
20:42
Однако, СоздатьОбъект("Запрос")...

БРОСЬ БЯКУ!
7 Эльниньо
 
02.03.13
21:21
(5) Из ТЗ по условию вытянуть. В ТЗ должно быть всё.

(4) Я правильно понял?
8 VladZ
 
02.03.13
21:50
В запросе можно свою функцию использовать... Попробуй туда копнуть.
9 VladZ
 
02.03.13
21:54
10 Verdi
 
02.03.13
21:54
(8) Сейчас правлю запрос. в (5) не получилось
11 КонецЦикла
 
02.03.13
22:11
Скорее всего лучше вывести ту дату в ТЗ, а потом сделать сортировку ТЗ и отсечь блоком ненужное
Внешние функции - жесть по скорости
12 Verdi
 
02.03.13
22:26
(11) а пример текста можешь привести?
13 КонецЦикла
 
02.03.13
22:32
Ровно 30, 60 и 90 дней?
Нужно получить в ТЗ колонку с этим значением из запроса (или с каким-то другим, но чтобы не лазить далеко)

Потом сделать ТЗ.Сортировать("КолвоДней");
Потом (например нужно 60 дней)
Стр = 0;
ТЗ.НайтиЗначение(60, Стр, "КолвоДней");
Если Стр = 0 Тогда
//ничего не делаем
Иначе
ТЗ.Выгрузить(ВремТЗ, Стр, ТЗ.КоличествоСтрок());
КонецЕсли;

Во ВремТЗ имеем 60 дней
Осталось найти 90 дней и откусить

Что-то типа такого
14 КонецЦикла
 
02.03.13
22:37
***

Если Стр = 0 Тогда
//данных для вывода в отчет нет, так и сообщаем
Иначе
15 Verdi
 
02.03.13
22:52
(14) Я вставил реквизит на форму: Категория.
Теперь нужно в модуле прописать список значений (как не знаю): КатегорияА, КатегорияБ, КатегорияС.
Затем я делаю расчет: ДатаА = ДатаКон-90, ДатаБ = ДатаКон - 180, ДатаС = ДатаКон - 360.
Можно расчёт сразу привязать к списку реквизитов?
16 Verdi
 
02.03.13
22:54
(13) В колонку КолвоДней попадает много цифр, но нужно отобрать именно те, которые удовлетворяют условиям ДатаА, ДатаБ....
17 КонецЦикла
 
02.03.13
23:00
(15) Переменную заведи, которая будет смотреть текущее значение категории
(16) Если значения разные и не хочешь заморачиваться с внешними компонентами - перебери ТЗ да и все (можно ставить пометку удаления в служебную колонку, потом блоком удалить)
18 КонецЦикла
 
02.03.13
23:01
Попробуй внешнюю функцию, может будет приемлемо :)
А то как-то не очень получается
19 Verdi
 
02.03.13
23:22
(18) В принципе всё получилось. Но только возврат не хочет записываться в приход, хотя движения на склад делает. Может КодОперации не тот?


   ТекстЗапроса =
   "//{{ЗАПРОС(Сформировать)
   |Период с НачДата по КонДата;
   |Номенклатура = Регистр.ПартииНаличие.Номенклатура;
   |Статус = Регистр.ПартииНаличие.КодОперации;
   |ДатаП = Регистр.ПартииНаличие.ДатаПартии;
   |Кол = Регистр.ПартииНаличие.Количество;
   |Докум = Регистр.ПартииНаличие.Партия.ПриходныйДокумент;
   |Склад = Регистр.ПартииНаличие.МОЛ;
   |Функция КолПрих = Приход(Кол) когда (Статус = Перечисление.КодыОпераций.Закупка);
   |Функция КолОприх = Приход(Кол) когда (Статус = Перечисление.КодыОпераций.Оприходование);
   |Функция КолВоз = Приход(Кол) когда (Статус = Перечисление.КодыОпераций.ВозвратОтПокупателя);
   |Функция НаСкладе = КонОст(Кол) когда (ДатаП>=ДатаА);
   //|Функция Продали   = Расход(Кол) когда (Статус = Перечисление.КодыОпераций.Продажа);
   //|Функция Списали   = Расход(Кол) когда (Статус = Перечисление.КодыОпераций.Списание);
   |Группировка Номенклатура Без Групп;";
20 Тьма
 
03.03.13
00:13
(19)Может возврат проходит по расходу красным?
21 КонецЦикла
 
03.03.13
02:10
(19) Ну так нормально
Раньше запрос не смотрел, не нужны тут функции
Возврат в ТиС проходит как приход, но код операции же другой, посмотри
Можно писать Когда (Статус в СписокКодов)
22 КонецЦикла
 
03.03.13
02:11
СписокКодов - список значений заранее заполненный нужными кодами операций