Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Очень популярная тема (более 25 ответов) аналог слова "Все" или "Вошедшие в запрос" (число прочтений - 24165 )
valeriy99
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 6
Местоположение: Киев
Зарегистрирован: 03. Марта 2012
Пол: Мужской
аналог слова "Все" или "Вошедшие в запрос"
28. Сентября 2012 :: 10:09
Печать  
Подскажите если знаете. Как в прямом запросе указать выводить все значения параметра (аналогия запроса 1С "Все" или "Вошедшие в запрос")? Круглые глаза

     ТекстЗапроса = "
     |SELECT
     |      $спрТТ.КодТТ as КодТТ,
     |      РегОборот.ТорговаяТочка as [ТТ $Справочник.ТТ],
     |      "+?(ПоТМЦ=0,"","спрТМЦ.Code as КодТМЦ, РегОборот.ТМЦ as [ТМЦ $Справочник.ТМЦ],")+"
     |      РегОборот.Период as "+Период+",
     |      $спрТМЦ.ЕдиницаПоУмолчанию as [Ед $Справочник.Единицы],
     |      SUM(РегОборот.РасходКвоОборот) as РасхКвоЕд,
     //|      SUM($спрЕД.Вес) as ВЕС,
     |      SUM(CAST(РегОборот.РасходКвоОборот AS NUMERIC(15)) * CAST($спрЕД.Вес AS NUMERIC(14,3))) as РасхКвоКГ
     |FROM
     |      $РегистрОбороты.Обороты(:ДатаН,:ДатаК~,"+Период+",,ТМЦ IN (SELECT Val FROM #Группа) AND ТорговаяТочка = :прТТ,(ТМЦ,ТорговаяТочка),(РасходКво)) as РегОборот
     |INNER JOIN
     |      $Справочник.ТМЦ as спрТМЦ ON спрТМЦ.ID = РегОборот.ТМЦ
     |INNER JOIN
     |      $Справочник.Единицы as спрЕД ON спрЕД.ParentExt = РегОборот.ТМЦ AND спрЕД.ID = $спрТМЦ.ЕдиницаПоУмолчанию
     |INNER JOIN
     |      $Справочник.ТТ as спрТТ ON спрТТ.ID = РегОборот.ТорговаяТочка
     |GROUP BY $спрТТ.КодТТ, РегОборот.ТорговаяТочка, "+?(ПоТМЦ=0,"","спрТМЦ.Code, РегОборот.ТМЦ, ")+"РегОборот.Период, $спрТМЦ.ЕдиницаПоУмолчанию
     |ORDER BY РегОборот.Период, РегОборот.ТорговаяТочка"+?(ПоТМЦ=0,"",", РегОборот.ТМЦ")+"
     |";

Данный запрос выводит продажи по периодам по Торговой точке, например, по неделям. Но если в какие-то недели продажи отсутствовали, то их нет и в результатах, а они нужны с нулевыми значениями.
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #1 - 28. Сентября 2012 :: 10:39
Печать  
Аналог слова "Все" - это фулл джойн на справочник.
Если я правильно помню, что делает ключ "Все" в черных запросах.
Для недель: подготовь временную таблицу со значениями недель и сделай фуллджойн на нее.

"Все вошедшие в запрос" (если я, опять же, правильно помню как оно работает) имеет смысл только при кросс-таблице.
При работе с классом ИтогиПоГруппировкам, например, выгружается нужная колонка и сворачивается - полученный набор ключей используется для построение кросс-таблицы.
  
Наверх
 
IP записан
 
valeriy99
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 6
Местоположение: Киев
Зарегистрирован: 03. Марта 2012
Пол: Мужской
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #2 - 28. Сентября 2012 :: 15:04
Печать  
Нашел: существует параметр дополнение ("ДОПОЛНЕНИЕ") к Периодичности, т.е., например, "Месяц ДОПОЛНЕНИЕ" или "Неделя ДОПОЛНЕНИЕ". Но, этот метод применяется только к регистру остатков через $РегистрОстаткиОбороты. Где бы найти тоже но к регистру оборотов. Смущённый
  
Наверх
 
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #3 - 29. Сентября 2012 :: 18:52
Печать  
Используй класс ПрямойЗапрос - в нем есть такой параметр и он действует и на регистр Обороты в отдельности для произвольной периодичности
  
Наверх
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #4 - 17. Октября 2012 :: 10:24
Печать  
Помогите, кто знает, как в прямом запросе реализовать "ВСЕ Вошедшие в запрос".

     ТекстЗапроса="
     |      SELECT  
     |            СпрНоменклатура.ID as      [СпрНом $Справочник.Номенклатура],
     |        РегОстатки.Товар as      [Тов $Справочник.Номенклатура],
     |            РегОстатки.Склад as [Скл $Справочник.МестаХранения],
     |            РегОстатки.ОстатокТовараОстаток
         |      FROM
     |            $РегистрОстатки.ОстаткиТоваров(:ДатаКон~,
     |            inner join $Справочник.Номенклатура as СпрНоменклатура (nolock) on СпрНоменклатура.id = Товар
     |            inner join $Справочник.МестаХранения as СпрСклады (nolock) on СпрСклады.id = Склад,
     |                               (Фирма='"+МД.ЗначениеВСтрокуБД(ПустаяФирма)+"') AND (СпрНоменклатура.IsFolder=2)"    
     +filter_vl("СпрНоменклатура",ВыбТовары)
     +filter_vl("СпрСклады",ВыбСклад)+" ,(Фирма, Товар, Склад), (ОстатокТовара)) as РегОстатки
         |   left join $Справочник.Номенклатура as СпрНоменклатура (nolock) on СпрНоменклатура.id = РегОстатки.Товар

     Данный запрос выводит остатки товаров на складах.
     В конкретном случае выходят остатки по двум товарам, первый товар есть на двух складах, а другой на трех.
     (Всего в таблицу попадает 5 строк)
     Нужно чтобы первый товар был показан с нулевым остатком и на третьем складе, т.е. как при "ВСЕ Вошедшие в запрос".
     (В таблице тогда будет 6 строк, 3 строки по каждому товару)
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #5 - 18. Октября 2012 :: 02:37
Печать  
Могу только предложить выгрузить данные во временную ТЗ,
а потом поджойнить ее на себя же (точнее, на сгруппированную выборку из ВТ).

примерно так:

Код
Выбрать все
Select
    склад,
    номенклатура,
    бла-бла-бла
Into ВТ
From
    бла-бла-бла

select
    бла-бла-бла
from
    (select distinct Номенклатура from ВТ) Все
    left Join ВТ on ВТ.Номенклатура = Все.Номенклатура 



не исключено, что в финальной выборке вместо Лефт джойна правильнее использовать Фулл джойн (на таком примере - не показательно, но вот если полей группировки будет 3, и по двум из них захочется "все вошедшие в запрос"...)
  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #6 - 18. Октября 2012 :: 09:53
Печать  
Спасибо за участие.
Попробовал сделать так:
     ТекстЗапроса="
     |      SELECT  
     |            СпрНоменклатура.ID as      [СпрНом $Справочник.Номенклатура],
     |        РегОстатки.Товар as      [Тов $Справочник.Номенклатура],
     |            РегОстатки.Склад as [Скл $Справочник.МестаХранения],
     |            РегОстатки.ОстатокТовараОстаток
     |      into ВремТ
   |      FROM
     |            $РегистрОстатки.ОстаткиТоваров(:ДатаКон~,
     |            inner join $Справочник.Номенклатура as СпрНоменклатура (nolock) on СпрНоменклатура.id = Товар
     |            inner join $Справочник.МестаХранения as СпрСклады (nolock) on СпрСклады.id = Склад,
     |                               (Фирма='"+МД.ЗначениеВСтрокуБД(ПустаяФирма)+"') AND (СпрНоменклатура.IsFolder=2)"    
     +filter_vl("СпрНоменклатура",ВыбТовары)
     +filter_vl("СпрСклады",ВыбСклад)+"
   |,
     |                               (Фирма, Товар, Склад), (ОстатокТовара)) as РегОстатки
   |   left join $Справочник.Номенклатура as СпрНоменклатура (nolock) on СпрНоменклатура.id = РегОстатки.Товар
     |";
       Запрос.УстановитьТекстовыйПараметр("ДатаКон", ДатаКон);
     ПромТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);  
     
     ТекстЗапроса="
     |      SELECT *
     |      FROM
     |  (select distinct СпрНом from ВТ) Все
   |      left Join ВТ on ВТ.СпрНом = Все.СпрНом";
   ПромТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);

После одного запуска ругается что в базе уже есть объект ВТ,
эта таблица сама не удаляется что ли? И сам смысл такого объединения непонятен, объясни пож-ста, что должно получиться во временной таблице и откуда должны взяться строки с недостающими складами у товара после join?
  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #7 - 18. Октября 2012 :: 10:07
Печать  
Зашел в "Management Studio", таблица ВТ действительно никуда не пропадает, после отработки отчета, ну да ничего, грохнуть ее  в студио не проблема. В 1С++ есть метод ИТ.ПолноеСоединение(стрКолонкиЛевойИТ, ПраваяИТ, ИндексПравойИТ, стрКолонкиПравойИТ) Это аналог full join. Есть аналоги всех типов join-ов.
Вот только бы знать что с чем соединять.
  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #8 - 18. Октября 2012 :: 10:16
Печать  
В первой таблице имеем примерно так:
  Мороженое Склад1   5шт
  Мороженое Склад2   7шт.
  Мороженое Склад3   2шт.
  Яблоки Склад1   8шт.
  Яблоки Склад3   1шт.

А вот строки "Яблоки Склад2   0шт." нет. (Т.к. 0 -вые остатки регистр 1С не хранит)
Как в SQL с помощью каких временных таблиц и join-ов сделать так, чтобы добавилась такая строка?
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #9 - 19. Октября 2012 :: 04:17
Печать  
[quote author=Vlad7131 link=1348826949/0#6 date=1350553985]После одного запуска ругается что в базе уже есть объект ВТ,
эта таблица сама не удаляется что ли? [/quote]

0) ВТ в моем псевдокоде - просто обозначение временной таблицы.
1) То, как написано у тебя - ВТ это полноценная таблица (которая, кстати, еще и создается непосредственно в рабочей БД)
2) Чтоб запрос при повторном выполнении не ругался на существование такой таблицы - кошерно использовать, скажем GUID в качестве имени таблицы. Кстати, посколько таблица у тебя полноценная - то выполнив один раз запрос ты будешь получать ошибку даже из другого сеанса 1С.
3) Чтоб не засирать базу временными таблицами - необходимо после выполнения запроса выполнить "drop table ВТ"

но есть небольшой хинт
4) Если имя таблицы начинается с "#" - скуль будет создавать ее в tempdb, более того - эта таблица будет доступна только из текущего соединения (читай - из текущего сеанса 1С).
4а) Эта таблица будет автоматически удалена при закрытии текущего соединения.
4б) чтоб скуль не ругался на имя таблицы, начинающееся с #, необходимо заключить его в квадратные скобки: "[#ВТ]"
4в) если имя таблицы начинается с ## - то скуль ее создаст в tempdb, но доступна она будет для всех. Будет ли она удалена автоматически - сходу не скажу. Да и к делу это не относится.


[quote]И сам смысл такого объединения непонятен, объясни пож-ста, что должно получиться во временной таблице и откуда должны взяться строки с недостающими складами у товара после join?[/quote]
[s]Чтобы понять рекурсию нужно понять рекурсию[/s]
Чтоб понять смысл такого объединения - нужно понять как работает скулевый Джойн (да и не скулевый тоже).
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #10 - 19. Октября 2012 :: 04:33
Печать  
Мороженое Склад1   5шт
Мороженое Склад2   7шт.
Мороженое Склад3   2шт.
Яблоки Склад1   8шт.
Яблоки Склад3   1шт.
Слива Склад2   10шт.


Пусть это содержимое твоей ВТ.
Теперь ты хочешь сделать выборку "Номенклатура Все ВошедшиеВЗапрос, Склад Все ВошедшиеВЗапрос" (к сожалению, я уже в подробностях не помню, как себя ведет Все ВошедшиеВЗапрос, но общий смысл представляю).

пишем так
[code]Select
   ВсеТовары.Товар,
   ВсеСклады.Склад,
   IsNull(ВТ.Колво, 0) Колво
From
   (select distinct Товар from ВТ) ВсеТовары,
   (select distinct Склад from ВТ) ВсеСклады   -- тут мы получим декартово произведение товаров и складов
   Full Join ВТ on ВТ.Товар = ВсеТовары.Товар And ВТ.Склад = ВсеСклады.Склад[/code]

на выходе должно получится:
Мороженое Склад1   5шт
Мороженое Склад2   7шт.
Мороженое Склад3   2шт.
Яблоки Склад1   8шт.
Яблоки Склад2   0шт.
Яблоки Склад3   1шт.
Слива Склад1   0шт.
Слива Склад2   10шт.
Слива Склад3   0шт.


Вроде так все.
  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #11 - 19. Октября 2012 :: 05:05
Печать  
Привет! Спасибо за дельные советы по SQL. Что в SELECT
можно использовать into я и не знал, сейчас нашел в книге Фленова into, но в операторе  
"INSERT INTO Имя Таблицы", это то же самое, просто insert опущено, или нет?
Где взять GUID для использования в качестве имени таблицы?

В этой конструкции, где две таблицы через запятую:
Select* From
  (select distinct Товар from ВТ) ВсеТовары,
  (select distinct Склад from ВТ) ВсеСклады
это и есть декартово произведение, cross join писать не надо?
  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #12 - 19. Октября 2012 :: 06:03
Печать  
Написал в запросе:      
     |      SELECT  
     |        РегОстатки.Товар as [Тов $Справочник.Номенклатура],
     |      РегОстатки.Склад as [Скл $Справочник.МестаХранения],
     ..........................
     |      into [#ВТ]
Сессию не закрывал, просто в отчете еще раз нажал кнопку "сформировать", SQL
ругнулся "There is already an object named '#ВТ' in the database."
Юзеры всяко будут так делать, поэтому в начале отчета надо удалять ВТ.

А как к этой ВТ потом обращаться, тоже с # и в скобках ?
     |      SELECT
     |        ВсеТовары.Товар,
     |              ВсеСклады.Склад,
     |              IsNull([#ВТ].Колво, 0) Колво
     |      FROM
     |              (select distinct Тов from [#ВТ]) ВсеТовары,
         |              (select distinct Скл from [#ВТ]) ВсеСклады
         |            Full Join [#ВТ] on [#ВТ].Тов = ВсеТовары.Товар And [#ВТ].Скл = ВсеСклады.Склад
  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #13 - 19. Октября 2012 :: 07:14
Печать  
Ну допиши в начале (только обязательно Выполнить, а не ВыполнитьСкалярный):
РС.Выполнить("DROP TABLE #ВТ");
РС - это ODBCRecordSet
  
Наверх
ICQ  
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #14 - 19. Октября 2012 :: 07:18
Печать  
# - обязательна, квадратные скобки - не очень
  
Наверх
ICQ  
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #15 - 19. Октября 2012 :: 07:47
Печать  
Vlad7131 писал(а) 19. Октября 2012 :: 05:05:
Привет! Спасибо за дельные советы по SQL. Что в SELECT
можно использовать into я и не знал, сейчас нашел в книге Фленова into, но в операторе  
"INSERT INTO Имя Таблицы", это то же самое, просто insert опущено, или нет?

"INSERT INTO Имя Таблицы" - это добавление строк в УЖЕ СУЩЕСТВУЮЩУЮ таблицу
SELECT INTO - это СОЗДАНИЕ таблицы и добавление строк в нее.



Цитата:
Где взять GUID для использования в качестве имени таблицы?


Код
Выбрать все
Функция GUID() Экспорт
	GUID = СоздатьОбъект("Guid");
	GUID.Новый();

	Возврат GUID.ВСтроку();
КонецФункции	// GUID
 



Соответственно, текст запроса выглядит как
стрИмяВТ = "[#" + GUID() + "]";
ТекстЗапроса = "бла-бла-бла FROM " + стрИмяВТ + " бла-бла-бла";


Цитата:
В этой конструкции, где две таблицы через запятую:
Select* From
  (select distinct Товар from ВТ) ВсеТовары,
  (select distinct Склад from ВТ) ВсеСклады
это и есть декартово произведение, cross join писать не надо?

Точный синтаксис уже не помню, может это Оракловская запись кросс-джойна.
А по сути, да - кросс-джойн == декартово произведение.
А не помню, ибо кросс-джойны - зло.
  
Наверх
 
IP записан
 
novichek
Экс-Участник


Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #16 - 20. Октября 2012 :: 04:27
Печать  
Satans Claws писал(а) 19. Октября 2012 :: 07:47:
...
А не помню, ибо кросс-джойны - зло.

Обоснуй Улыбка
  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #17 - 20. Октября 2012 :: 07:02
Печать  
Добрый день!
Сформировал временную таблицу
SELECT .... INTO [#ВТ]
Сделал запрос:
     "SELECT * FROM #ВТ";
Вывел запрос в ТЗ на форму.
Выдает таблицу с четырьмя колонками: СпрНом, Тов, Скл, ОстатокТовара, строки со значениями тоже есть.

А запрос: "SELECT Тов FROM #ВТ";
равно как и запрос: "SELECT Таб1.Тов FROM #ВТ Таб1";
выдает ошибку: [SQL Server]Invalid column name 'Тов'.

Подскажите в чем дело, как же обратиться к конкретной колонке?
  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #18 - 20. Октября 2012 :: 09:57
Печать  
Обращаться также, как и создал. Код создания тут: SELECT .... INTO [#ВТ], нам того, что у тебя за точками скрыто, отсюда не видать
  
Наверх
ICQ  
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #19 - 20. Октября 2012 :: 11:26
Печать  
Привет! Спасибо за поддержку.
Очень долго не мог понять, методом "тыка" дошел, что
вот так  "SELECT  РегОстатки.Товар as Тов into #BT" можно потом обратиться к полю Тов, а вот так уже нельзя:
"SELECT РегОстатки.Товар as [Тов $Справочник.Номенклатура] into #BT," Как обратиться к полю во втором случае - не знаю, подскажите, если как то можно. Вобщем результат получил, правда с помощью трех запросов и двух ВТ.
Вот такой запрос не проканал:
     |      SELECT
     |      ВсеТовары.TOV as Товар,
     |      ВсеСклады.SKL as Склад
     //|      into [#ВТ2]
     |      IsNull(#ВТ.OST, 0) Остаток
     |      FROM
     |      (SELECT DISTINCT TOV FROM #ВТ) ВсеТовары,  
     |      (SELECT DISTINCT SKL FROM #ВТ) ВсеСклады
     |      LEFT JOIN #ВТ on #ВТ.TOV=ВсеТовары.TOV and #ВТ.SKL=ВсеСклады.SKL", не прошло обращение к #BT.OST
хотя псевдоним остатка  в первой ВТ был в селекте такой:
|            РегОстатки.ОстатокТовараОстаток as OST
Тоже загадка, пришлось это все в ВТ2 и уж потом еще 1 запрос.
Может поменять обращение к #BT на обращение через псевдоним, добавить (SELECT * FROM #BT) Остатки, и тогда  переписать IS NULL(Остатки.OST, 0) Остаток ?
  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #20 - 21. Октября 2012 :: 14:40
Печать  
1. Во втором случае можно обратиться к полю так:
SELECT [Тов $Справочник.Номенклатура] FROM #BT
2. Смысла в записи в квадратные скобки и типизации полей при укладывании во временную таблицу или при организации вложенной выборки - нет. Типизация нужна только при формировании окончательной выборки, которая будет непосредственно выгружена в 1С.
  
Наверх
ICQ  
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #21 - 22. Октября 2012 :: 03:19
Печать  
Цитата:
Satans Claws писал(а) 19. Октября 2012 :: 07:47:
...
А не помню, ибо кросс-джойны - зло.

Обоснуй Улыбка


Ибо бедумное декартово произведение создает выборки охрененных размеров. Особенно, если декартятся не 2, а 3 и более источника.
Использовать же кросс-джойны в качестве неявных лефт/райт/иннер-джойнов - просто моветон.

А реальных задач, когда действительно требуется кросс-джойн - исчезающе мало.
Даже в текущей задаче - нефиг делать это на скуле. Кросс-таблицу надо реализовывать на клиенте.
  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #22 - 22. Октября 2012 :: 05:50
Печать  
Добый день.
Помогите разобраться с запросом:      
     ТекстЗапроса="
     |      SELECT  
     |        РегОстатки.Товар as      TOV,
     |            РегОстатки.Склад as SKL,
     |            РегОстатки.ОстатокТовараОстаток as OST
     |      into [#ВТ]
         |      FROM
     |            $РегистрОстатки.ОстаткиТоваров(:ДатаКон~,
     |            inner join $Справочник.Номенклатура as СпрНоменклатура (nolock) on СпрНоменклатура.id = Товар
     |            inner join $Справочник.МестаХранения as СпрСклады (nolock) on СпрСклады.id = Склад,
     |                               (Фирма='"+МД.ЗначениеВСтрокуБД(ПустаяФирма)+"') AND (СпрНоменклатура.IsFolder=2)"    
     +filter_vl("СпрНоменклатура",ВыбТовары)
     +filter_vl("СпрСклады",ВыбСклад)+"
         |, (Фирма, Товар, Склад), (ОстатокТовара)) as РегОстатки";

       Запрос.УстановитьТекстовыйПараметр("ДатаКон", ДатаКон);
     ПромТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);  
         
     ТекстЗапроса="
     |      SELECT
     |      ВсеТовары.TOV as Товар,
     |      ВсеСклады.SKL as Склад,
     |      IsNull(Все.OST, 0) Остаток
     |      FROM
     |      (SELECT DISTINCT TOV FROM #ВТ) ВсеТовары,  
     |      (SELECT DISTINCT SKL FROM #ВТ) ВсеСклады
//      |      (SELECT * FROM #ВТ) Все
     |      Full Join #ВТ on #ВТ.TOV=ВсеТовары.TOV AND #ВТ.SKL=ВсеСклады.SKL";

     Выдает ошибку: The multi-part identifier "#ВТ.TOV" could not be bound.
Псевдоним в строке "(SELECT * FROM #ВТ) Все", если убрать комментарий и закомментировать последнюю строку, спасает и
запрос работает, но результат то другой. А сделать псевдоним в Join-е "Full Join #ВТ as Все on Все.TOV=ВсеТовары.TOV AND Все.SKL=ВсеСклады.SKL"
не получается, выдает ошибку: The multi-part identifier "ВсеТовары.TOV" could not be bound. Т.е. даже внутренние select-ы не отработали.
Пока удалось сделать желаемую выборку с помощью 3 запросов и двух временных таблиц. Наверно это не очень оптимально.

  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #23 - 22. Октября 2012 :: 07:54
Печать  
(Vlad7131) Если делать без аналога все вошедшие то какой предполагаемое число строк ???

PS Т.е. Если скажем выводишь в виде
таблицы строки товары , столбцы склады и без групп  то может уже
и ничего и не надо делать.
  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #24 - 22. Октября 2012 :: 08:08
Печать  
Это смотря что будет в ВыбТовар и ВыбСклад, можно в отчете указать 1 товар, а можно группу или даже несколько групп.
"Все вошедшие" увеличивает выборку, включая товары с нулевыми остатками. Тренируюсь на примере из 2 товаров на 3 складах.
Без "Все вошедшие" 5 строк: 1 товар есть на всех 3 складах, а один на двух. Со "Всеми вошедшими" строк будет 6, по 3 строки для каждого товара для каждого из 3 складов вошедших в запрос для первого товара. Вообще в базе складов около 25.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #25 - 22. Октября 2012 :: 08:13
Печать  
Да не тренировочная это задача.

Если объем выходных строк без все вошедшие
до 10 000 строк то пиши все на клиенте ( в самой 1с)
через ТЗ или ИТЗ.
  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #26 - 22. Октября 2012 :: 08:15
Печать  
Так и задумано: Вывести строку с товаром, а потом присоединять секции со складами справа. Вот только если в первой строке будет к примеру 3 склада (остатки есть на трех складах), а во второй строке 2 склада и другие, не те что в первой строке, хреново будет такую таблицу выводить(не говорю что невозможно). Все склады присоединять тоже не камильфо.  А вот если бы остатки были для всех складов, "вошедших в запрос", для какого товара нет - там 0, вот это был бы гуд.
  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #27 - 22. Октября 2012 :: 08:22
Печать  
Через ТЗ: я не знаю как добавить недостающие строки по складам с 0, с использованием ИТ - может что и получится, хотя вряд ли будет лучше, чем с 2 временными таблицами.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #28 - 22. Октября 2012 :: 08:27
Печать  
Vlad7131 писал(а) 22. Октября 2012 :: 08:15:
Так и задумано: Вывести строку с товаром, а потом присоединять секции со складами справа. Вот только если в первой строке будет к примеру 3 склада (остатки есть на трех складах), а во второй строке 2 склада и другие, не те что в первой строке, хреново будет такую таблицу выводить(не говорю что невозможно). Все склады присоединять тоже не камильфо.  А вот если бы остатки были для всех складов, "вошедших в запрос", для какого товара нет - там 0, вот это был бы гуд.


Если делать без всяких вошедшие
у Вас в 1с есть уже таблица ТЗ с остатками по товарам и складам.
Отсортируйте ее по Товар, Склад.

Далее для нового товара выводите
колонку товар и все колонки складов с пустым колвом.
далее для каждого склада выведите
в  нужную колонку остаток этого склада.
Все. ( только не знаю насколько понятен мой ответ )


  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #29 - 22. Октября 2012 :: 08:52
Печать  
Дело в том, что ТЗ имеет 3 колонки: товар, склад и остаток.
И для каждого товара - разное количество и состав складов.
Поэтому при выводе "всех" складов для каждого товара получится чехарда. Например : товар1, склад3, склад6, а под этой строкой: Товар2, склад1, склад4, склад8. И т.д. С помощью ТЗ у меня очтет давно написан и работает, но получилось не совсем просто, мягко говоря. А цель работы - скорость.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #30 - 22. Октября 2012 :: 08:52
Печать  
т.е для примера из поста 5
имеем
товар колонка 1
склад1 колонка 2
склад2 колонка 3
склад3 колонка 4

Выводим шапку таблицы
колонки
1 товар
колонка 2 склад1
колонка 3 склад2
колонка 4 склад3

Цикл по строкам
Мороженное это новый товар
выводим строку в таблицу
где заполнена колонка 1 - мороженное
колонки с 2 по 4 колво пробел
Видим склад 1 выводим 5 шт в колонку 2

строка 2
Видим склад 2 выводим 7 шт в колонку 3

строка 3
Видим склад 3 выводим 3 шт в колонку 4

строка 4
яблоки это новый товар
выводим строку  в таблицу
где заполнена колонка 1 - яблоки
колонки с 2 по 4 колво пробел
Видим склад 1 выводим 8 шт в колонку 2

строка 5
Видим склад 3 выводим 1 шт в колонку 4
  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #31 - 22. Октября 2012 :: 09:16
Печать  
Vlad7131 писал(а) 22. Октября 2012 :: 08:52:
Дело в том, что ТЗ имеет 3 колонки: товар, склад и остаток.
И для каждого товара - разное количество и состав складов.
Поэтому при выводе "всех" складов для каждого товара получится чехарда. Например : товар1, склад3, склад6, а под этой строкой: Товар2, склад1, склад4, склад8. И т.д. С помощью ТЗ у меня очтет давно написан и работает, но получилось не совсем просто, мягко говоря. А цель работы - скорость.

А в чем проблема то?
Код
Выбрать все
//ТЗ - ИндексированнаяТаблица с колонками "Товар, Склад, Остаток"
ТЗ.ДобавитьИндекс("_инд","*Товар, *Склад");
вТЗ = СоздатьОбъект("ТаблицаЗначений");
ТЗ.Выгрузить(вТЗ);
вТЗ.Свернуть("Склад","");
вТЗ.Сортировать("Склад");
тТЗ = СоздатьОбъект("ТаблицаЗначений");
ТЗ.Выгрузить(тТЗ);
тТЗ.Свернуть("Товар","");
тТЗ.Сортировать("Товар");
Таб.ВывестиСекцию("Шапка|Товар");
Для Сч=1 по вТЗ.КоличествоСтрок() Цикл
     //Выводим шапку складов
     Таб.ВывестиСекцию("Шапка|Склад");
КонецЦикла
_сз=СоздатьОбъект("СписокЗначений");
тТЗ.ВыбратьСтроки();
Пока тТЗ.ПолучитьСтроку()=1 Цикл
     Таб.ВывестиСекцию("Строка|Товар");
     Для Сч=1 по вТЗ.КоличествоСтрок() Цикл
	    //Выводим строчку складов
	    _сз.УдалитьВсе();
	    _сз.ДобавитьЗначение(тТЗ.Товар);
	    _сз.ДобавитьЗначение(вТЗ.ПолучитьЗначение(Сч,"Склад"));
	    НайденнаяСтрока=ТЗ.НайтиСтроку("_инд",_сз);
	    Если НайденнаяСтрока=0 Тогда
		   выхОстаток=0;
	    Иначе
		   выхОстаток=ТЗ.ПолучитьЗначение(НайденнаяСтрока,"Остаток");
	    КонецЕсли
	    Таб.ВывестиСекцию("Строка|Склад");
     КонецЦикла
КонецЦикла 

  
Наверх
ICQ  
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #32 - 22. Октября 2012 :: 10:03
Печать  
Спасибо!
Еще не понял до конца, как , но уже проверил, работает!!!
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #33 - 22. Октября 2012 :: 10:05
Печать  
Vlad7131 писал(а) 17. Октября 2012 :: 10:24:
     В конкретном случае выходят остатки по двум товарам, первый товар есть на двух складах, а другой на трех.
     (Всего в таблицу попадает 5 строк)
     Нужно чтобы первый товар был показан с нулевым остатком и на третьем складе, т.е. как при "ВСЕ Вошедшие в запрос".
     (В таблице тогда будет 6 строк, 3 строки по каждому товару)


Вот такой код:
Код
Выбрать все
ТекстЗапроса = "
	|SELECT ОстаткиТоваровОстатки.Товар [Товар $Справочник.Номенклатура]
	|	, ОстаткиТоваровОстатки.Склад [Склад $Справочник.МестаХранения]
	|	, ОстаткиТоваровОстатки.ОстатокТовараОстаток
	|FROM $РегистрОстатки.ОстаткиТоваров(,,
	|		(Фирма = :ВыбФирма),
	|		(Товар, Склад),) AS ОстаткиТоваровОстатки
	|TOTALS Sum(ОстатокТовараОстаток)
	|BY ALL
	|	, [Товар $Справочник.Номенклатура]
	|	, [Склад $Справочник.МестаХранения]
	|";
ПостроительЗапроса = СоздатьОбъект("ПостроительЗапроса");
ПостроительЗапроса.Текст = ТекстЗапроса;
ПостроительЗапроса.Параметры.Установить("ВыбФирма", ВыбФирма);
ПостроительЗапроса.Группировки.Добавить("[Товар]");
ПостроительЗапроса.Группировки.Добавить("[Склад]");
ПостроительЗапроса.Выполнить();
Выборка = ПостроительЗапроса.Результат();
Пока Выборка.Группировка("Товар") = 1 Цикл
	Пока Выборка.Группировка("Склад") = 1 Цикл
		Сообщить("Товар: " + Выборка.Товар + ", склад: " + Выборка.Склад + ", остаток: " + Выборка.СуммаОстатокТовараОстаток);
	КонецЦикла;
КонецЦикла;
 



выводит в окне сообщений Цитата:
Товар: товар 1, склад: Склад 1, остаток: 10
Товар: товар 1, склад: Склад 2, остаток: 10
Товар: товар 2, склад: Склад 1, остаток: 10
Товар: товар 2, склад: Склад 2, остаток: 10
Товар: товар 3, склад: Склад 1, остаток: 10
Товар: товар 3, склад: Склад 2, остаток:


Класс

Если чё, используются разработки 1 и 2.



Или вот так, если нужна таблица значений:
Код
Выбрать все
	ТекстЗапроса = "
		|SELECT ОстаткиТоваровОстатки.Товар [Товар $Справочник.Номенклатура]
		|	, ОстаткиТоваровОстатки.Склад [Склад $Справочник.МестаХранения]
		|	, ОстаткиТоваровОстатки.ОстатокТовараОстаток
		|FROM $РегистрОстатки.ОстаткиТоваров(,,
		|		(Фирма = :ВыбФирма),
		|		(Товар, Склад),) AS ОстаткиТоваровОстатки
		|TOTALS Sum(ОстатокТовараОстаток)
		|BY [Товар $Справочник.Номенклатура]
		|	, [Склад $Справочник.МестаХранения]
		|";
	Консоль = СоздатьОбъект("AddIn.qryConsole");
	Консоль.УстановитьТекстовыйПараметр("ВыбФирма", ВыбФирма);
	ФайлКуба = Консоль.СоздатьКуб(ТекстЗапроса);
	СводныйЗапрос = СоздатьОбъект("СводныйЗапрос");
	СводныйЗапрос.Открыть(ФайлКуба);
	тз = СводныйЗапрос.Выгрузить(, "[Товар], [Склад]");
 

  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #34 - 22. Октября 2012 :: 10:22
Печать  
ПостроительЗапроса это не в 1с++, отдельная компонента?
Что есть разработки 1 и 2 ?
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #35 - 22. Октября 2012 :: 10:28
Печать  
Vlad7131 писал(а) 22. Октября 2012 :: 08:15:
Так и задумано: Вывести строку с товаром, а потом присоединять секции со складами справа. Вот только если в первой строке будет к примеру 3 склада (остатки есть на трех складах), а во второй строке 2 склада и другие, не те что в первой строке, хреново будет такую таблицу выводить(не говорю что невозможно). Все склады присоединять тоже не камильфо.  А вот если бы остатки были для всех складов, "вошедших в запрос", для какого товара нет - там 0, вот это был бы гуд.



Курить в сторону класса ИтогиПоГруппировкам.
Там есть метода разворота по горизонтали - там это все реализовано.

Если в примитиве на пальцах, то делается очень просто: из выборки выгружается колонка с нужными данными и сворачивается.
Этот Свернутый список показателей - и есть "все вошедшие в запрос".
Если отсортируешь этот список + правильно отсортируешь таблицу данных - то легко сможешь шагая по данным определять, сколько пустых ячеек тебе нужно вывести до следующего значащего значения (или действовать даже более правильно - ячейки выводить всегда пустыми, а значения уже писать вычисляя адрес нужной ячейки).


не помню, есть ли он здесь в репозитории (скорее всего есть в сводной конфе с классами)
Потому линк на "создателя" - http://rikcenter.ru/download/RiK_Sums.rar
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #36 - 22. Октября 2012 :: 10:31
Печать  
Vlad7131 писал(а) 22. Октября 2012 :: 10:22:
Что есть разработки 1 и 2 ?

Это ссылки. http://www.1cpp.ru/forum/YaBB.pl?num=1193394153 и http://www.1cpp.ru/forum/YaBB.pl?num=1268237529



А если добавить к этому Yoksel, можно написать
Код
Выбрать все
	ТекстЗапроса = "
		|SELECT ОстаткиТоваровОстатки.Товар [Товар $Справочник.Номенклатура]
		|	, ОстаткиТоваровОстатки.Склад [Склад $Справочник.МестаХранения]
		|	, ОстаткиТоваровОстатки.ОстатокТовараОстаток
		|FROM $РегистрОстатки.ОстаткиТоваров(,,
		|		(Фирма = :ВыбФирма),
		|		(Товар, Склад),) AS ОстаткиТоваровОстатки
		|TOTALS Sum(ОстатокТовараОстаток)
		|BY ALL
		|	, [Товар $Справочник.Номенклатура]
		|	, [Склад $Справочник.МестаХранения]
		|";
	Консоль = СоздатьОбъект("AddIn.qryConsole");
	Консоль.УстановитьТекстовыйПараметр("ВыбФирма", ВыбФирма);
	ФайлКуба = Консоль.СоздатьКуб(ТекстЗапроса);
	СводныйЗапрос = СоздатьОбъект("СводныйЗапрос");
	СводныйЗапрос.Открыть(ФайлКуба);
	ПостроительОтчета = СоздатьОбъект("ПостроительОтчета");
	ПостроительОтчета.ИсточникДанных = СводныйЗапрос;
	ПостроительОтчета.ГруппировкиСтрок.ДобавитьЗначение("[Товар]");
	ПостроительОтчета.ГруппировкиКолонок.ДобавитьЗначение("[Склад]");
	ПостроительОтчета.Поля.ДобавитьЗначение("Сумма ОстатокТовараОстаток");
	Документ = ПостроительОтчета.Показать().ПолучитьЭлементУправления(1).Документ;
	Документ.ПоказатьУровеньГруппировокСтрок(2);
	Документ.ПоказатьУровеньГруппировокКолонок(2); 


Улыбка
  

_______002.PNG ( 4 KB | Загрузки )
_______002.PNG

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #37 - 23. Октября 2012 :: 12:02
Печать  
Всем привет!
Решил пойти по пути подсказанном Salimbek-ом и Satans Claws:

Отчет работает, решил усложнить, дабавить разворот по группам справочника Номенклатура.
Для этого вместо таблицы значений с товаром (у него тТЗ) использовал индексированную таблицу, сгруппировав ее:
ИТ.Группировать("Товар:&Тов", "Остаток",0);                        //????
а эта строка была выше, до группировать:
ИТ.ДобавитьИндекс("_инд","*Тов, *Склад");                        //????

и выводя в рекурсивной процедуре:

Процедура ВывестиГруппировку(ИТ,Таб)
     ...................................
     ИТ.ВыбратьСтроки();
     Пока ИТ.ПолучитьСтроку()=1 цикл  
           Таб.ВывестиСекцию("Строка|Товар");
           Для Сч=1 по СклТЗ.КоличествоСтрок() Цикл
                   //Выводим строчку складов
                     _сз.УдалитьВсе();
                     _сз.ДобавитьЗначение(ТовТЗ.Тов);
                     _сз.ДобавитьЗначение(СклТЗ.ПолучитьЗначение(Сч,"Склад"));
                 НайденнаяСтрока=ИТ.НайтиСтроку("_инд",_сз);            //????
                     Если НайденнаяСтрока=0 Тогда
                         выхОстаток=0;
                     Иначе
                         выхОстаток=ИТ.ПолучитьЗначение(НайденнаяСтрока,"Остаток");
                     КонецЕсли;
                 Таб.ПрисоединитьСекцию("Строка|Склад");
     ...................................
Ошибка:      Индекс с именем _инд не найден ! Что не так? Куда делся индекс.
Может надо было как то по другому группировать?
  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #38 - 23. Октября 2012 :: 12:22
Печать  
Другими словами:
Можно ли группировать ИТ по одному индексу (с одной колонкой &товар), а потом искать в этой же таблице но по другому индексу
(с двумя колонками: товар, склад)???
  
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #39 - 24. Октября 2012 :: 03:59
Печать  
ИТ.НайтиСтроку(_сз, "_инд");
  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #40 - 24. Октября 2012 :: 05:03
Печать  
Теперь другая ошибка,
НайденнаяСтрока=ИТ.НайтиСтроку(_сз,"_инд");
{C:\DB.ADM\PV\ОСТАТКИТОВАРОВ6.ERT(103)}: Номер индекса может быть либо числом либо строкой!  (100)
В учебнике стоит сначала индекс, потом ключ - список значений.
  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #41 - 24. Октября 2012 :: 05:12
Печать  
Синтаксис: НайтиСтроку(Индекс, Ключ, [чНайтиПоследнюю = 0], [чСпозиционироваться = 0])
Параметры:
Индекс - тип: Строка, Число. Идентификатор или номер индекса.

Хорошо, не ищет по этому индексу:
ИТ.ДобавитьИндекс("_инд","*Тов, *Склад");
А какой идентификатор или номер индекса здесь:
ИТ.Группировать("Товар:&Тов;Склад:Склад", "Остаток",0);
В списке значений _сз товар и склад.
Что подставить в ИТ.НайтиСтроку("_инд",_сз) вместо "_инд"?
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #42 - 24. Октября 2012 :: 05:25
Печать  
Товар и Склад вестимо, 2 индекса в сгруппированной ИТЗ
  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #43 - 24. Октября 2012 :: 05:30
Печать  
Каким образом?
НайденнаяСтрока=ИТ.НайтиСтроку("Товар,Склад",_сз);
{C:\DB.ADM\PV\ОСТАТКИТОВАРОВ6.ERT(103)}: Индекс с именем Товар,Склад не найден !
  
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #44 - 24. Октября 2012 :: 05:35
Печать  
[quote author=Vlad7131 link=1348826949/30#40 date=1351055029]Теперь другая ошибка,
НайденнаяСтрока=ИТ.НайтиСтроку(_сз,"_инд");
{C:\DB.ADM\PV\ОСТАТКИТОВАРОВ6.ERT(103)}: Номер индекса может быть либо числом либо строкой!  (100)
В учебнике стоит сначала индекс, потом ключ - список значений.[/quote]

Сплю с утра :)
Переставь ИТ.ДобавитьИндекс("_инд","*Тов, *Склад");  после ИТ.Группировать();  Видимо все ненужные индексы прибиваются при группировке. Честно говоря, не помню уже чё там как.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #45 - 24. Октября 2012 :: 06:16
Печать  
Vlad7131 писал(а) 24. Октября 2012 :: 05:30:
Каким образом?
НайденнаяСтрока=ИТ.НайтиСтроку("Товар,Склад",_сз);
{C:\DB.ADM\PV\ОСТАТКИТОВАРОВ6.ERT(103)}: Индекс с именем Товар,Склад не найден !


После сгруппировать, у тебя 2 индекса в табличке - Товар и Склад.

Соответственно, добавь еще составной индекс и ищи там что хочешь
по двум значениям в этом составном индексе.
  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #46 - 24. Октября 2012 :: 08:27
Печать  
А код можешь написать, как добавить составной индекс?

ИТ.ДобавитьИндекс("_инд","*Тов, *Склад"); Это не то ?
Я эту строку и после группировать ставил, все равно не ищет.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #47 - 24. Октября 2012 :: 08:58
Печать  
Код
Выбрать все
ИТ.Группировать("Товар:&Тов;Склад:Склад", "Остаток",0);
ИТ.ДобавитьИндекс("Вася","*Тов, *Склад");
сз = СоздатьОбъект("СписокЗначений");
сз.Установить("Товар",ТвойТовар);
сз.Установить("Склад",ТвойСклад);

Если ИТ.НайтиСтроку("Вася",сз) >0 Тогда
   ... 

  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #48 - 25. Октября 2012 :: 07:15
Печать  
Подскажите, как соединить две ИТ.
Изначально была ИТ:      
                 Товар      Склад Остаток
                 ====================
                 Краб      Брак      4
                 Овощ      Сроки      5      
                 Краб      Сроки      4
                 Овощ      Терминал 2
                 Краб      Терминал 3
Выгрузил эту ИТ в еще 2 ИТ и свернул:
                                                Краб      Брак      4
     ИТ.Выгрузить(ИТСкл);            Овощ      Сроки      5
     ИТСкл.Свернуть("Склад","")      Овощ      Терминал 2
     --------------------------------------------------
     ИТ.Выгрузить(ИТТов);            Краб      Брак      4
     ИТТов.Свернуть("Тов","");      Овощ      Сроки      5

Нужно эти таблицы ИТСкл и ИТТов объединить между собой, чтобы получилось 6 строк,
добавилась строка с товаром Овощ на складе Брак.
Затем то, что получилось сделать левое соединение с первой ИТ, чтобы в итоге было 6 строк:
по 3 склада на каждый товар, остаток товара Овощ на складе Брак будет 0.

Код соединения выдает ошибку:
ИТСкл.ДобавитьИндекс("Инд_Тов","*Тов");
ИТТов.ПолноеСоединение("Тов", ИТСкл, Инд_Тов, "Склад:Склад");
     Ошибка: Количество колонок соединения в левой и правой таблицах не совпадают!
Подскажите, плз, в чем ошибка, и где можно найти примеры использования соединений.
     
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #49 - 25. Октября 2012 :: 07:19
Печать  
Это .. цель не ясна, а так, смотри в сторону метода Группировать, мот того, и сворачивать тебе ничего не надо.. и левоесоединение не нужно вовсе.
http://www.1cpp.ru/docum/icpp/html/IndexedTable.html#group
  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #50 - 25. Октября 2012 :: 08:43
Печать  
В чем все же ошибка, как работать с соединением?
В индексе правой таблицы 2 колонки Тов и Скл
и колонок левой ИТ для поиска тоже две и те же самые.

ИТ.ДобавитьИндекс("ИндексПравойИТ","Тов,Склад");
ИТТов.ЛевоеСоединение("Тов,Склад", ИТ, ИндексПравойИТ, "Остаток");

Выд.ошибка: Количество колонок соединения в левой и правой таблицах не совпадают!
Этод метод вообще как то работает? Можно где то пример посмоьреть с кодом, учебник уже на 40 раз прочитал.
  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #51 - 25. Октября 2012 :: 08:52
Печать  
ИТ с колонками Товар, Товар_Родитель, Склад сформировал, там все товары на всех складах, нет только остатка.
А в другой таблице есть остатки но строк Товар, Склад с нулевыми остатками нет.
Вот и надо бы мне левое соединение первой ИТ со второй.
А уж потом сгруппировать с &, да и вывести с раскладкой по группам справочника Номенклатура.
Вобщем осталось только понять как работает это левое соединение, получается учебника не хватает для этого.
Кто работал, посмотрите, я выше код написал, может я что не так понял из учебника.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #52 - 25. Октября 2012 :: 08:57
Печать  
ИТТов.ЛевоеСоединение("Тов,Склад", ИТ, ИндексПравойИТ, "Тов,Склад");
  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #53 - 25. Октября 2012 :: 09:10
Печать  
Все равно не проходит.

ИТ.ДобавитьИндекс("ИндексПравойИТ","Тов,Склад");
ИТТов.ЛевоеСоединение("Тов,Склад", ИТ, ИндексПравойИТ, "Тов,Склад");
{C:\DB.ADM\PV\ОСТАТКИТОВАРОВ7.ERT(278)}: Количество колонок соединения в левой и правой таблицах не совпадают!
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #54 - 25. Октября 2012 :: 09:19
Печать  
Мот того, отказатся от левого соединения..
Проще уж в класс.ИтогиПоГруппировкам загнать свою плоскую ТЗ..
Или уж с Группировать играться
  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #55 - 25. Октября 2012 :: 09:45
Печать  
Спасибо са помощь, обязательно попробую с ИтогамиПоГруппировкам,
примеры бы еще были, простецкие с кодами, а то в учебнике много не нароешь.

Проблему решил как всегда случайно, помучившись.
Вот так не работало, индекс не создавался:
НомерИнд=ИТ.ДобавитьИндекс("_инд","Тов, Склад");
А вот так сработало:
НомерИнд=ИТ.ДобавитьИндекс("_инд","*Тов, *Склад");
Это может потому, что у меня в таблице поля были типизированные
[Тов $Справочник.Номенклатура]. Хотя точно не знаю надо проверять.
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #56 - 26. Октября 2012 :: 03:40
Печать  
Код
Выбрать все
Процедура Печать()
...
	оИтогиПоГруппировкам = СоздатьОбъект("Отчет.ИтогиПоГруппировкам");
	оИтогиПоГруппировкам.Инит(Контекст, тзГрп, 1);
	оИтогиПоГруппировкам.ДобавитьКолонкуСуммы("Сумма", 2, оОтчет.стрФорматСуммы());

	ТЗ.ВыбратьСтроки();
	Пока ТЗ.ПолучитьСтроку() = 1 Цикл
		оИтогиПоГруппировкам.ПередПечатьюСтроки(Таб, ТЗ);
		оИтогиПоГруппировкам.ПослеПечатиСтроки(Таб, ТЗ);
	КонецЦикла;
	оИтогиПоГруппировкам.ПослеПечатиТаблицы(Таб, ТЗ);
...
КонецПроцедуры 




Толи ПередПечатьюСтроки толи ПослеПечатиСтроки вызывает коллбэк ВывестиСекцию:

Код
Выбрать все
Процедура ВывестиСекцию(Т, ТЗ, стрПрефикс, ИмяПоказателя)
	Значение = ТЗ.ПолучитьЗначение(ТЗ.НомерСтроки, ИмяПоказателя);
	Если ИмяПоказателя = "Документ" Тогда
		ДатаВыплаты	= ТЗ.Документ.ДатаДок;
		Выплачено	= "";
		Основание	= "";
		Если ТЗ.Документ.Вид() = "РасходныйОрдер" Тогда
			Выплачено = СокрЛП(ТЗ.Документ.Выдать);
			Основание = СокрЛП(ТЗ.Документ.Основание);
		КонецЕсли;
		Т.ВывестиСекцию("Документ" + стрДобавкаСекции);
	Иначе
		Т.ВывестиСекцию("Строка" + стрДобавкаСекции);
	КонецЕсли;
КонецПроцедуры 

  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #57 - 26. Октября 2012 :: 06:12
Печать  
А где взять описание этого объекта?
В справке 1С++ в " Дополнительные классы и ЭУ" его нет.
Это уже не 1С++?
Если 1С++ это в какой то степени законченный продукт, есть описание, как с ним работать, то это что за библиотека?
  
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #58 - 26. Октября 2012 :: 07:43
Печать  
  
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #59 - 26. Октября 2012 :: 07:48
Печать  
  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #60 - 26. Октября 2012 :: 12:44
Печать  
Скачал "RiK_Sums", распаковал, зашел в конфигурацию.
Описалова то никакого нет, типа какие есть объекты, свойства и методы? Как в 1С++. Нашел только текст лицензии.
Разбираться в коде конфигурации ?
Больше точно ничего нет?
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #61 - 26. Октября 2012 :: 12:50
Печать  
Улыбка

Слепить кросс-таблицу можно и в обычной ТЗ.
Вопрос в скорости и в универсальности только.
А можно и тупо при выводе в отчет.

На счет класса - там есть пример, и и описалово самого класса - там вроде как и так понятно, что передавать и как это сделано.
  
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #62 - 26. Октября 2012 :: 15:02
Печать  
там есть файл 1CPP_Classes.als - положи его в 1cv7\bin или в каталог базы, и будет описание в 1с-ном синтакспомошнике (раздел Классы)
  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #63 - 27. Октября 2012 :: 07:11
Печать  
Спасибо! Увидел, буду разбараться.
  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #64 - 27. Октября 2012 :: 09:26
Печать  
Satans Claws? а что это за третий параметр в строке
оИтогиПоГруппировкам.Инит(Контекст, тзГрп, 1);
В описании метода Инит(Конт, Группмровки) их только два ?
Параметр недокументированный, он есть? Каково его назначение?
  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #65 - 27. Октября 2012 :: 09:56
Печать  
Сделал: ЗагрузитьВнешнююКомпоненту(КаталогИБ()+ "\RiK_SQL.dll")
Получил:
Компонента 1C++ инициализирована!
Компонента RiK_SQL.dll инициализирована!
Компонента FormEx инициализирована!
Компонента Моксель инициализирована!

Во внешнем отчете:
оИтогиПоГруппировкам = СоздатьОбъект("Отчет.ИтогиПоГруппировкам");
: Неудачная попытка создания объекта (Отчет.ИтогиПоГруппировкам)

Не пойму, что еще надо сделать, подскажите, плз.
  
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #66 - 28. Октября 2012 :: 07:12
Печать  
В демке загляни в раздел Обработки. Там находятся определения и реализации классов.
Самый главный хедер - DefCls. При загрузке 1С++ анализирует именно его, и загружает всё что там описано. Этот хедер также может быть внешним файлом с имененм DefCls.prm.

В простейшем варианте просто перетащи все обработки из демки в свою конфу. Но желательно всё-же понимать, что делаешь.
  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #67 - 28. Октября 2012 :: 09:46
Печать  
Да, увидел, есть 5 обработок.
Для чего это - я так думаю, что кроме экспортных переменных, функций и процедур, 1С-ка ничего не увидит. Как еще могут использоваться эти обработки, явно ведь они не вызываются?

Вопрос: а как 1СРР работает без обработок, там ведь тоже есть классы?
  
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #68 - 29. Октября 2012 :: 02:54
Печать  
Есть такая методология: Объектно Ориентированное Программирование.
Главное назначение 1С++ - это как раз реализация ООП в 1С. Всё остальное - бесплатное приложение.

Цитата:
... кроме экспортных переменных, функций и процедур, 1С-ка ничего не увидит
Это как раз есть часть концепции ООП. Называется "инкапсуляция".
Обработки h_ИтогиПоГруппировкам и классОтчет_ИтогиПоГруппировкам являются описанием нового типа Отчет.ИтогиПоГруппировкам.  И таких пользовательских типов в любой действующей системе дофига и больше.
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #69 - 29. Октября 2012 :: 04:01
Печать  
Vlad7131 писал(а) 27. Октября 2012 :: 09:26:
Satans Claws? а что это за третий параметр в строке
оИтогиПоГруппировкам.Инит(Контекст, тзГрп, 1);
В описании метода Инит(Конт, Группмровки) их только два ?
Параметр недокументированный, он есть? Каково его назначение?



Потому что в моей базе этот класс достаточно серьезно допилен Улыбка
(на предмет дриллдауна, упрощения всяких однотипных действий и, наверное, много чего еще)
  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #70 - 29. Октября 2012 :: 09:30
Печать  
Скопировал все обработки, почти все из глобальника, кроме загрузки компоненты. Строка СоздатьОбъект("Отчет.ИтогиПоГруппировкам") сработала. Но опять затык:
Отчет.ИтогиПоГруппировкам::ВывестиСтрокиГруппировок(Таблица Т=, ТаблицаЗначений ТЗ=, Число Уровень=1) : Поле агрегатного объекта не обнаружено
КонтекстФормы.ВывестиСекцию(Т, ТЗ, стрПрефикс, ИмяПоказателя);
{классОтчет_ИтогиПоГруппировкам@MD(342) }

Вообще пишу типовой отчет "остатки товаров на складах" для типовой Торговли и склада. Редакции 8.
Может есть у кого готовый, можно вместе с конфой, любого релиза,
если с конфигурацией, то легче разбираться.
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #71 - 29. Октября 2012 :: 10:10
Печать  
[quote author=Vlad7131 link=1348826949/60#70 date=1351503021]
Отчет.ИтогиПоГруппировкам::ВывестиСтрокиГруппировок(Таблица Т=, ТаблицаЗначений ТЗ=, Число Уровень=1) : Поле агрегатного объекта не обнаружено
КонтекстФормы.ВывестиСекцию(Т, ТЗ, стрПрефикс, ИмяПоказателя);
[/quote]


Пишет же - в контексте формы отчета нет коллбэк-метода ВывестиСекцию().
Короче, в самом отчете должна быть процедура ВывестиСекцию() с 4 параметрами. Чуть раньше в кусках кода я даже приводил ее пример.
  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #72 - 29. Октября 2012 :: 10:50
Печать  
Да в том то и дело, что она есть:
//*******************************************************
Процедура ВывестиСекцию(Т, ТЗ, стрПрефикс, ИмяПоказателя)
     Значение = ТЗ.ПолучитьЗначение(ТЗ.НомерСтроки, ИмяПоказателя);
     Если ИмяПоказателя = "Товар" Тогда
           Т.ВывестиСекцию("Строка");
     Иначе
           Т.ВывестиСекцию("Строка");
     КонецЕсли;
КонецПроцедуры
//*******************************************      
Процедура Печать()
     Т = СоздатьОбъект("Таблица");
     Т.ИсходнаяТаблица("ОстаткиЕд");
     оИтогиПоГруппировкам = СоздатьОбъект("Отчет.ИтогиПоГруппировкам");
     оИтогиПоГруппировкам.Инит(Контекст, "Товар,Склад");//, 1);
     оИтогиПоГруппировкам.ДобавитьКолонкуСуммы("Остаток", 2, "Ч015.2-");

     ТЗ.ВыбратьСтроки();
     Пока ТЗ.ПолучитьСтроку() = 1 Цикл  
           Beep();
           оИтогиПоГруппировкам.ПередПечатьюСтроки(Т, ТЗ);
           оИтогиПоГруппировкам.ПослеПечатиСтроки(Т, ТЗ);
     КонецЦикла;
     оИтогиПоГруппировкам.ПослеПечатиТаблицы(Т, ТЗ);
КонецПроцедуры
//*******************************************  
Процедура ОстаткиТоваров()
     Перем _инд;
     ТЗ = СоздатьОбъект("ТаблицаЗначений");
     Запрос = СоздатьОбъект("ODBCRecordset");
   Запрос.Отладка(Отладка);
     filter_cache_for_clients=0;      filter_cache_for_products_gr = 0;      filter_cache_for_products_el = 0;

     ТекстЗапроса="
     |      SELECT  
     |            СпрНоменклатура.ID as      [Товар $Справочник.Номенклатура],
     |        РегОстатки.Товар as      идТовар,
     |            РегОстатки.Склад as [Склад $Справочник.МестаХранения],
     |            РегОстатки.Склад as идСклад,
     |            РегОстатки.ОстатокТовараОстаток as Остаток
   |      FROM
     |            $РегистрОстатки.ОстаткиТоваров(:ДатаКон~,
     |            inner join $Справочник.Номенклатура as СпрНоменклатура (nolock) on СпрНоменклатура.id = Товар
     |            inner join $Справочник.МестаХранения as СпрСклады (nolock) on СпрСклады.id = Склад,
     |                               (Фирма='"+МД.ЗначениеВСтрокуБД(ПустаяФирма)+"') AND (СпрНоменклатура.IsFolder=2)"    
     +filter_vl("СпрНоменклатура",ВыбТовары)
     +filter_vl("СпрСклады",ВыбСклад)+"
   |,
     |                               (Фирма, Товар, Склад), (ОстатокТовара)) as РегОстатки  
     |   inner join $Справочник.Номенклатура as СпрНоменклатура (nolock) on СпрНоменклатура.id = РегОстатки.Товар
     |";
       Запрос.УстановитьТекстовыйПараметр("ДатаКон", ДатаКон);
     ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
     ТЗ.Сортировать("Товар,идТовар,Склад,идСклад");  
  Печать();
КонецПроцедуры
//========================================      
  
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #73 - 29. Октября 2012 :: 15:58
Печать  
в ГМ, после загрузки 1cpp добавь

     оНастройки = СоздатьОбъект("УправлениеНастройками");
     оНастройки.Включить("TurboBL");

Это включает возможность вазова процедур любого контекста.
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #74 - 30. Октября 2012 :: 04:34
Печать  
Да, похоже, что ТурбоБЛ на включился - бывает такое.

ЗЫ

Код
Выбрать все
Процедура ВывестиСекцию(Т, ТЗ, стрПрефикс, ИмяПоказателя)
     Значение = ТЗ.ПолучитьЗначение(ТЗ.НомерСтроки, ИмяПоказателя);
     Если ИмяПоказателя = "Товар" Тогда
	     Т.ВывестиСекцию("Строка");
     Иначе
	     Т.ВывестиСекцию("Строка");
     КонецЕсли;
КонецПроцедуры 



Гениальный код...
  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #75 - 30. Октября 2012 :: 04:55
Печать  
Получилось, встал в отладчике на первую строку"ВывестиСекцию":
Процедура ВывестиСекцию(Т, ТЗ, стрПрефикс, ИмяПоказателя)
     Значение = ТЗ.ПолучитьЗначение(ТЗ.НомерСтроки, ИмяПоказателя);
     Если ИмяПоказателя = "Товар" Тогда
           Т.ВывестиСекцию("Строка|Товар");
     Иначе
           Т.ПрисоединитьСекцию("Строка|Склад");
     КонецЕсли;
КонецПроцедуры
У меня плоская таблица с колонками: Товар, Склад,Остаток.
Тлько для каждого товара - разное количество строк со складами.
С помощью этого класса товар - по вертикали, а склады по горизонтали не вывести? Или надо сначала добиться чтобы для каждого товара были все возможные склады, где то с 0 остатком?
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #76 - 30. Октября 2012 :: 05:05
Печать  
кури в сторону метода класса
УстановитьПараметрыРазворотаПоГоризонтали(ИмяПоказателя, сзЗначения, НачКолонка)

сзЗначения - это список со всеми значениями показателя, разворачиваемого по горизонтали.
Обычный способ получения оного такой:

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



  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #77 - 30. Октября 2012 :: 05:06
Печать  
Вывести. Класс умеет выводить простыню по горизонтали.
  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #78 - 30. Октября 2012 :: 06:07
Печать  
Это я сделал:
Процедура Печать()
     Т = СоздатьОбъект("Таблица");
     Т.ИсходнаяТаблица("ОстаткиЕд");
     оИтогиПоГруппировкам = СоздатьОбъект("Отчет.ИтогиПоГруппировкам");
     оИтогиПоГруппировкам.Инит(Контекст, "Товар,Склад");//, 1);
     оИтогиПоГруппировкам.ДобавитьКолонкуСуммы("Остаток", 2, "Ч015.2-");  
сзСклады = СоздатьОбъект("СписокЗначений");
ТЗ_Копия = СоздатьОбъект("ТаблицаЗначений");
ТЗ.Выгрузить(ТЗ_Копия,,, "Склад");
ТЗ_Копия.Свернуть("Склад", "");
ТЗ_Копия.Сортировать("Склад", 1);
ТЗ_Копия.Выгрузить(сзСклады,,, "Склад");
  3);
     
     ТЗ.ВыбратьСтроки();
     Пока ТЗ.ПолучитьСтроку() = 1 Цикл  
           Beep();
           оИтогиПоГруппировкам.ПередПечатьюСтроки(Т, ТЗ);
           оИтогиПоГруппировкам.ПослеПечатиСтроки(Т, ТЗ);
     КонецЦикла;
     оИтогиПоГруппировкам.ПослеПечатиТаблицы(Т, ТЗ);
КонецПроцедуры
А каков порядок вывода в таблицу?
//*******************************************      
Процедура ВывестиСекцию(Т, ТЗ, стрПрефикс, ИмяПоказателя)
     Значение = ТЗ.ПолучитьЗначение(ТЗ.НомерСтроки, ИмяПоказателя);
     Если ИмяПоказателя = "Товар" Тогда
           Т.ВывестиСекцию("Строка|Товар");
     Иначе
           Т.ПрисоединитьСекцию("Строка|Склад");
     КонецЕсли;
КонецПроцедуры
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #79 - 30. Октября 2012 :: 07:36
Печать  
[quote author=Vlad7131 link=1348826949/75#78 date=1351577221]
//*******************************************      
Процедура ВывестиСекцию(Т, ТЗ, стрПрефикс, ИмяПоказателя)
     Значение = ТЗ.ПолучитьЗначение(ТЗ.НомерСтроки, ИмяПоказателя);
     Если ИмяПоказателя = "Товар" Тогда
           Т.ВывестиСекцию("Строка|Товар");
     Иначе
           Т.ПрисоединитьСекцию("Строка|Склад");
     КонецЕсли;
КонецПроцедуры [/quote]




[code]Процедура ВывестиСекцию(Т, ТЗ, стрПрефикс, ИмяПоказателя)
     Значение = ТЗ.ПолучитьЗначение(ТЗ.НомерСтроки, ИмяПоказателя);
     Т.ВывестиСекцию("Строка|Товар");
     Для й 1 = по КоличествоЗначенийПоГоризонтали Цикл
           Т.ПрисоединитьСекцию("Строка|Склад");
     КонецЦикла;
КонецПроцедуры[/code]
  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #80 - 30. Октября 2012 :: 11:42
Печать  
Для й=1 по КоличествоЗначенийПоГоризонтали Цикл

А где определяется это КоличествоЗначенийПоГоризонтали ?
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #81 - 30. Октября 2012 :: 11:55
Печать  
Дык к классу есть наглядный пример, давно бы уже скормил свою ТЗ, подправил макет и наслаждался
  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #82 - 30. Октября 2012 :: 11:58
Печать  
Какой пример, это отчет из конфигурации RIK?
  
Наверх
 
IP записан
 
Vlad7131
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 74
Зарегистрирован: 06. Октября 2012
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #83 - 30. Октября 2012 :: 12:05
Печать  
3);
КоличествоЗначенийПоГоризонтали=сзСклады.РазмерСписка();

А здесь где брать товар,склад:
Процедура ВывестиСекцию(Т, ТЗ, стрПрефикс, ИмяПоказателя)
     Значение = ТЗ.ПолучитьЗначение(ТЗ.НомерСтроки, ИмяПоказателя);
     Товар=???
     Т.ВывестиСекцию("Строка|Товар");
     Для й = 1 по КоличествоЗначенийПоГоризонтали Цикл
           Склад=???
           Остаток=???
           Т.ПрисоединитьСекцию("Строка|Склад");
     КонецЦикла;
КонецПроцедуры
Переменная "й" где нибудь используется?
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: аналог слова "Все" или "Вошедшие в запрос"
Ответ #84 - 30. Октября 2012 :: 12:28
Печать  
Vlad7131 писал(а) 30. Октября 2012 :: 11:58:
Какой пример, это отчет из конфигурации RIK?


ну да.

ЗЫ: и что самое главное, в хейдере класса в комментах перечислены все методы класса и зачем они нужны.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать