Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Как в запросе по регистру получить реквизиты через точку? (число прочтений - 3172 )
Scorp_nsk
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 4
Зарегистрирован: 03. Сентября 2010
Как в запросе по регистру получить реквизиты через точку?
03. Сентября 2010 :: 04:57
Печать  
Здравствуйте!
Задача для знающих людей простая, но пока мне не поддается к сожалению.
Необходимо выбрать движения регистра ПартииНаличие за период. В выбранных движениях получить документы, которые будут разного вида (Поступление, Реализация и т.д.). И из этих документов получить реквизит Контрагент. В дальнейшем уже из этого реквизита через точку нужно будет получить Код и Наименование контрагента.
База - ДБФ. Конфигурация - Комплексная.
Вот мой текст запроса:
[code]
     База = СоздатьОбъект("OLEDBData");
     Соединение = "Provider=VFPOLEDB.1;Deleted=Yes;Data Source=" + КаталогИБ()+ ";Mode=ReadWrite;Extended Properties="";User ID="";Password="";Mask Password=False;Collating Sequence=RUSSIAN;Exclusive=No;DSN=""";
     Рез = База.Соединение(Соединение);
     Запрос = База.СоздатьКоманду();
     
     ТекстЗапроса = "
     |SELECT
     |  Рег.IDDoc as [ТекДок $Документ],
     |  Жур.IDDocDef as ТекДок_вид,
     |  $Рег.Фирма as [Фирма $Справочник.Фирмы],
     |  СпрФ.Descr as ФирмаПредставление,
     |  $СпрФ.УпрАналитика as [УпрАналитика $Справочник.УпрАналитика],
     |  СпрУпр.Code as УпрАналитикаКод,
     |  СпрУпр.Descr as УпрАналитикаПредставление,
     |  $Рег.СубФирма as [СубФирма $Справочник.Фирмы],
     |  СпрСубФ.Descr as СубФирмаПредставление,
     |  $ВрДок.Контрагент as Контрагент
     |FROM
     |  $Регистр.ПартииНаличие as Рег
     |INNER JOIN
     |  1Sjourn as Жур ON Жур.IDDoc = Рег.IDDoc
     |INNER JOIN
     |  $Справочник.Фирмы as СпрФ ON СпрФ.ID = $Рег.Фирма
     |INNER JOIN
     |  $Справочник.УпрАналитика as СпрУпр ON СпрУпр.ID = $СпрФ.УпрАналитика
     |INNER JOIN
     |  $Справочник.Фирмы as СпрСубФ ON СпрСубФ.ID = $Рег.СубФирма
     |INNER JOIN $Документ.ВозвратОтПокупателя as ВрДок ON ВрДок.IDDoc = Рег.IDDoc
     |INNER JOIN $Документ.Реализация as ВрДок ON ВрДок.IDDoc = Рег.IDDoc
     |WHERE
     |  Жур.Date BETWEEN :ДатаНачала~~ AND :ДатаКонца~~
     |";
       
      Запрос.УстановитьТекстовыйПараметр("ДатаНачала",ДатаНачала);
     Запрос.УстановитьТекстовыйПараметр("ДатаКонца",ДатаКонца);
     Запрос.Отладка(1);      
     ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
     ТЗ.ВыбратьСтроку();
[/code]
Понятное дело, что в таком виде парсер будет ругаться на дубликат таблицы.
Я не прошу написать для меня запрос. Буду признателен, если подскажете в каком направлении дальше грызть. Как в одном поле собрать контрагентов из разных документов?
Заранее спасибо.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Как в запросе по регистру получить реквизиты через точку?
Ответ #1 - 03. Сентября 2010 :: 05:03
Печать  
А зачем из Партий пытаться вытащить клиентоса ?
Не проще ли взять продажный регистр Продажи ?
ЗЫ: а так, у тебя ошибка в том, что ты везде используешь INNER..
Тебе нужно инер табличка журнала и 2 лефта с табличками документов + условие на вид документа, coalesce в селект для клиентоса, разные алиясы на все таблички и всё.
Только вот , баловство это всё.
  
Наверх
 
IP записан
 
Scorp_nsk
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 4
Зарегистрирован: 03. Сентября 2010
Re: Как в запросе по регистру получить реквизиты через точку?
Ответ #2 - 03. Сентября 2010 :: 05:13
Печать  
Eprst писал(а) 03. Сентября 2010 :: 05:03:
А зачем из Партий пытаться вытащить клиентоса ?
Не проще ли взять продажный регистр Продажи ?


Регистр Партий нужен однозначно, т.к. минимальная детализация как раз по партии. Плюс в дальнейшем фильтрация и группировки будут идти по ним.

По поводу второго замечания. Ведь это не решит моего вопроса. Или я ошибаюсь?

UPD: Прочел Ваш расширенный ответ. Задумался. Спасибо.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Как в запросе по регистру получить реквизиты через точку?
Ответ #3 - 03. Сентября 2010 :: 05:15
Печать  
1.Еще раз, какое отношение Покупатель имеет к Партиям товаров ?
Ему фиолетово, откуда они пришли и по какой цене.. Поэтому и в регистре нет измерения Покупатель - он там не нужен вообще.
2. Это решит твою неправильную проблему.

  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Как в запросе по регистру получить реквизиты через точку?
Ответ #4 - 03. Сентября 2010 :: 05:15
Печать  
Eprst писал(а) 03. Сентября 2010 :: 05:03:
А зачем из Партий пытаться вытащить клиентоса ?
Не проще ли взять продажный регистр Продажи ?

видимо потому, что
Цитата:
(Поступление, Реализация и т.д.).
  

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



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Как в запросе по регистру получить реквизиты через точку?
Ответ #5 - 03. Сентября 2010 :: 05:17
Печать  
trad писал(а) 03. Сентября 2010 :: 05:15:
Eprst писал(а) 03. Сентября 2010 :: 05:03:
А зачем из Партий пытаться вытащить клиентоса ?
Не проще ли взять продажный регистр Продажи ?

видимо потому, что
Цитата:
(Поступление, Реализация и т.д.).

Ну в запросе у автора Реализация/Возврат от Покупателя,
да и в Приходе - это ужо Поставщик, который в Партиях ужо и так есть в самой "Партии".

  
Наверх
 
IP записан
 
Scorp_nsk
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 4
Зарегистрирован: 03. Сентября 2010
Re: Как в запросе по регистру получить реквизиты через точку?
Ответ #6 - 03. Сентября 2010 :: 05:26
Печать  
Прошу прощения что не полностью описал задачу.
Дело в том, что конечный результат - это отчет, который показывает движении партии по цепочке (поступление товара в головную фирму - продажа партии в филиал - продажа в филиале из оптовой фирмы в розничную) Это самая длинная цепочка. Возможны варианты в этой цепочке. Например партия приходит не от головной фирмы, а напрямую. Кроме того партия обрастает различными затратами (транспортные, разгрузка, различные проценты). И вся эта информация выводится в одну строку. В итоге - прозрачное движение партии от поставщика до покупателя.
Ну а конкретно контрагенты нужны для фильтрации и группировки менеджеров продажи. Через контрагентов на них и выходим.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Как в запросе по регистру получить реквизиты через точку?
Ответ #7 - 03. Сентября 2010 :: 05:39
Печать  
А зачем/кому нужно знать, какая Партия ушла какому клиентосу ?
Вот не пофик ли ?
+ С чего уверенность, что именно ЭТА партия (та что в регистре) ушла именно ЭТОМУ клиентосу ?
Вы чего, не автоподбор партий ведёте, а руками их в табличной части документа выбираете ?
Какой смысл ЭТО знать ? Что Васе ушла партия от поставщика Феди и Вени ?
Вот не пофик ли ?
Когда важнее знать, что Васе продали Вотку и Конфетки по такой то сумме, профит составил столько то..
Не понимаю.
ЗЫ: если вы только не лекарствами какими-нить торгуете, или "партионным - серийным-штучным" товаром, где важно знать, что именно этот товар ушел клиентосу.
  
Наверх
 
IP записан
 
Scorp_nsk
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 4
Зарегистрирован: 03. Сентября 2010
Re: Как в запросе по регистру получить реквизиты через точку?
Ответ #8 - 03. Сентября 2010 :: 05:55
Печать  
Eprst писал(а) 03. Сентября 2010 :: 05:39:
А зачем/кому нужно знать, какая Партия ушла какому клиентосу ?
Вот не пофик ли ?
....


Мы сейчас с Вами ушли в сторону от основного вопроса. Но все же отвечу.
Нет не все равно. Маржинальный отчет показывает маржу по каждой партии исходя из прихода от стороннего поставщика и продажей конечному покупателю с учетом всех затрат.
Партии конечные пользователи не выбирают вручную. Автоподбор существует и действует. Но при поступлении товара из одной собственной фирмы в другую определенная информация автоматически передается от партии к новой партии. В итоге в конечной партии есть информация о приходе от стороннего поставщика и затратах.

Отчет достаточно сложный. Собирается долго. Поэтому я и решил использовать прямые запросы.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Как в запросе по регистру получить реквизиты через точку?
Ответ #9 - 03. Сентября 2010 :: 06:18
Печать  
Ладно , у каждого свои тараканы, но то что вы делаете - один хрен бред, ибо покупатель-партия товара никому не нужен, имхо.
А ответ был еще в #1
  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Как в запросе по регистру получить реквизиты через точку?
Ответ #10 - 03. Сентября 2010 :: 11:25
Печать  
Ну если тебе очень надо, то хотя бы не делай сразу все за 1С-ку... конечно можно и супер запрос написать, только писаться будет долго, а можно и просто:
1. Запросом вытащить движения и документы в ТЗ (что уже будет оптимальнее по скорости)
2. Создать новую колонку в ТЗ (например "контрагент") и заполнить ее, перебрав все строки
---
Для дальнейшего ускорения можно
3. Заранее запросом загрузить нужные поля из справочника "Контрагенты" в ИТЗ (Индексированную таблицу) с созданием соответствующих индексов
4. п.2 реализовать через поиск уже в этой подготовленной ИТЗ
---
Если скорости не хватает, то смотришь следующий тормозной участок, желательно через отладчик, и оптимизируешь его (например можно ускорить вывод в печатную форму, используя вместо Таб.ВывестиСекцию(); просто Таб.Область().Текст=печТекст; )
З.Ы. Подумай, что ты поставишь в своем отчете для контрагента, если партия была списана, например, по Инвентаризации.
В общем, чем больше ты будешь заниматься, тем лучше поймешь - что же именно тебе надо. И с обретением знания тебе уже будет намного проще составить оптимальный запрос. Удачи!
  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать