8.х запрос из 8.1 в 7.7

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем Amber, 18 фев 2009.

  1. TopicStarter Overlay
    Amber
    Offline

    Amber Опытный в 1С

    Регистрация:
    16 ноя 2007
    Сообщения:
    98
    Симпатии:
    0
    Баллы:
    26
    Требуется сделать запрос через оле из 8.1 в 7.7. Запрос выбирает документы "Заказ" по определенному контрагенту("Клиент"). Делаю так:
    Код:
    Запрос77=V7.CreateObject("Запрос");
    Запрос77.Текст="
    //{{ЗАПРОС(тест)
    |Период с ВыбНачПериода по ВыбКонПериода;
    |Без итогов;
    |ИтоговаяСумма = Документ.Заказ.ИтоговаяСумма;
    |Условие(Клиент);
    |"//}}ЗАПРОС
    
    
    Теперь вопросы
    1) Как работать с Параметром?Как я понимаю параметру "Клиент" должно присваеваться згначиние того же типа что и в документе. А так как запрос идет из 8-ки, то заместо клиента должно быть такое выродение - "Если Справочник77.НаитиПоНаименованию(Контрагент)=1...."?
    2)Как работать с выборкой.? Какой в данном случае аналог "Пока Выборка.Следующий()"?
    3) такой способ подрузамевает запрос в цикле...Имеет ли смысл выбирать все документы, кидать из в ТЗ и уже ее обрабатывать?База находится в удаленном оффисе, канал связи до 10Мб/с.Какой способ более предпочтителен с точки зрения быстродействия и нагрузки на сервера?
    Заранее спасибо!
  2. tunec
    Offline

    tunec Опытный в 1С

    Регистрация:
    2 июн 2008
    Сообщения:
    469
    Симпатии:
    0
    Баллы:
    26
    обращение к свойствам и методам объектов 7.7 пишутся с исп. языка 7.7, а все сервисные функции и процедуры на 8ке...
  3. TopicStarter Overlay
    Amber
    Offline

    Amber Опытный в 1С

    Регистрация:
    16 ноя 2007
    Сообщения:
    98
    Симпатии:
    0
    Баллы:
    26
    Это мне понятно, а касательно 3х вопросов что скажите?
  4. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    1. Да
    2. Точно также - это будет COM-объект со всеми методами.
    3. Запрос в цикле - это всегда пипец...
  5. TopicStarter Overlay
    Amber
    Offline

    Amber Опытный в 1С

    Регистрация:
    16 ноя 2007
    Сообщения:
    98
    Симпатии:
    0
    Баллы:
    26
    Можно пример относительно второго пункта.
    По поводу 3-его согласен..Просто выборка нужна по максимум(в перспективе) 3000 контрагентов...а в 7.7 их к этому моменту может быть уже за 10000, а еще есть заказы вообще без контрагента..итого если не делать выбурку с циклом по контрагенту ТЗ получается огромная. С учем того что запрос идет в удаленную базу(не sql) и канал там всего 10МБ/с вот и встал вопрос о том что более правильно.
  6. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    А какой пример вы хотите получить? Если вы получили ВЫБОРКУ, то она и будет работать, как выборка в 77...
  7. TopicStarter Overlay
    Amber
    Offline

    Amber Опытный в 1С

    Регистрация:
    16 ноя 2007
    Сообщения:
    98
    Симпатии:
    0
    Баллы:
    26
    С выборкой разберусь..а касаемо производительности в данном случае ваше мнение не изменилось?
  8. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Нет, не изменилось. Ибо выполнение запроса в цикле ВСЕГДА медленнее.
    Проще скинуть таблицу, тогда уж, на винт и прочитать ее, если там боитесь за передачу данных.
    К тому же выборка не грузит все в память, это выгрузка делает.
  9. TopicStarter Overlay
    Amber
    Offline

    Amber Опытный в 1С

    Регистрация:
    16 ноя 2007
    Сообщения:
    98
    Симпатии:
    0
    Баллы:
    26
    Нашел более простой(для меня) способ
    Код:
    Док77Заказ.ВыбратьПоЗначению(Дата(01.01.2009),,"Клиент",Клиент);
    
    
    Теперь отпал вопрос о размерах выборки и запросе в цикле.
  10. TopicStarter Overlay
    Amber
    Offline

    Amber Опытный в 1С

    Регистрация:
    16 ноя 2007
    Сообщения:
    98
    Симпатии:
    0
    Баллы:
    26
    чтобы не открывать новую тему задам вопросы в этой.
    И так я по Оле выбираю данные из 77. Требуется выбрать все документы Заказ где Клиент= Контранент. Контрагентов много(вперспективе около 1000), заказов очень много, поэтому выбирать все заказы нерационально.Есть два(как мимимум) способа решения задачи-через запрос и методом ВыбратьПоЗначению(). Запросы писать в 77 я не умею, тем более вложенные. Запрос который я составил приведен выше. Но как в запрос передать весь список контрагентов, илиже делать цикл и запрос по каждому(что тоже нерационально).
    Второй вопрос.
    если я пользуюсь методом ВыбратьПоЗначению
    Код:
    Док77=V7.CreateObject("Документ");
    Если Спр77Клиенты.НайтиПоКоду("180")=1
    тогда Клиент=Спр77Клиенты.ТекущийЭлемент();
    КонецЕсли;
    Пока Док77.ВыбратьПоЗначению(,,"Клиент",Клиент)=1 цикл
    НоваяСтрока=Тз.Добавить();
    НоваяСтрока.Сумма=Запрос.ИтоговаяСума;
    НоваяСтрока.Контрагент=Запрос.Клиент;
    КонецЦикла;
    
    
    Вылетает ошибка
    Клиент в 77 точно находится(проверяю каждый раз через отладку)..Подскажит в чем проблема и как решить?
    Заранее спасибо!
  11. x_under
    Offline

    x_under Модераторы Команда форума Модератор

    Регистрация:
    25 апр 2007
    Сообщения:
    2.576
    Симпатии:
    13
    Баллы:
    29
    просто в 8-ке когда опускаешь даты система туда запихивает какой-то параметр, который не удовлетворяет 7-ку (Какой точно я не знаю. Пустая строка или неопределено). Попробуй указывать даты или пустую дату.
  12. TopicStarter Overlay
    Amber
    Offline

    Amber Опытный в 1С

    Регистрация:
    16 ноя 2007
    Сообщения:
    98
    Симпатии:
    0
    Баллы:
    26
    Помогло. Ошибка исчезла. Но выборка пустая...Искомый реквезит есть в Графах Отбора, искомый элемент справочнике 1с77 находится. Подскажите что не так?
  13. x_under
    Offline

    x_under Модераторы Команда форума Модератор

    Регистрация:
    25 апр 2007
    Сообщения:
    2.576
    Симпатии:
    13
    Баллы:
    29
    А еще непонятно вот это
    Код:
    Док77=V7.CreateObject("Документ"); // Почему не указано какой документ 
    
  14. TopicStarter Overlay
    Amber
    Offline

    Amber Опытный в 1С

    Регистрация:
    16 ноя 2007
    Сообщения:
    98
    Симпатии:
    0
    Баллы:
    26
    Метод ВыбратьПоЗначению() работает только с документами неопределенного типа, поэтому и работает именно так как написано выше.
    Вопрос пока остается открытым. Почему выборка пустая так и не разобрался :unsure:
  15. x_under
    Offline

    x_under Модераторы Команда форума Модератор

    Регистрация:
    25 апр 2007
    Сообщения:
    2.576
    Симпатии:
    13
    Баллы:
    29
    А, вот где мы с тобой затупили
    Ты пытаешься в цикл засунуть определение выборки. Надо так
    Код:
    Док77.ВыбратьПоЗначению(,,"Клиент",Клиент);   // это выборка
    Пока Док77.ПолучитьДокумент() = 1 Цикл
    // работаешь с документами
    КонецЦикла;
    
    Там обработка для 7-ки (OLE было лень писать).

    Вложения:

    • 1.ert
      Размер файла:
      28 КБ
      Просмотров:
      26
  16. TopicStarter Overlay
    Amber
    Offline

    Amber Опытный в 1С

    Регистрация:
    16 ноя 2007
    Сообщения:
    98
    Симпатии:
    0
    Баллы:
    26
    x_under Спасибо большое, но до этогоя уже сам дошел.
    Сейчас код обработки выглядит так
    Код:
    Спр77Клиенты=V7.CreateObject("Справочник.Клиенты");
    Док=V7.CreateObject("Документ");
    Если Спр77Клиенты.НайтиПоКоду("180")=1
    тогда
    Клиент=Спр77Клиенты.ТекущийЭлемент();
    КонецЕсли;
    Док.ВыбратьПоЗначению("01.01.08","01.02.09","КлиентАбонемент", Клиент);
    Пока Док.ПолучитьДокумент()=1 Цикл
    Если Док.ПометкаУдаления()=1 Тогда
    Продолжить;
    КонецЕсли;
    Если Док.Вид()="Заказ" Тогда
    Сообщить("***");	
    КонецЕсли;
    КонецЦикла;
    
    
    Данный код ошибок не выдает..Проблема заключается в том, что не выполняется условие "Док.ПолучитьДокумент()=1", а следовательно выборка пуста. По коду клиент в Оле базе находится, Документы по этом уклиенту за период есть(именно документы вида Заказ). Така я вот проблема.
  17. x_under
    Offline

    x_under Модераторы Команда форума Модератор

    Регистрация:
    25 апр 2007
    Сообщения:
    2.576
    Симпатии:
    13
    Баллы:
    29
    Попробуй параметры все же передавать как дату. Может строка не устраивает процедуру. Я точно не помню как в 7-ке ее определить
    Код:
    Док.ВыбратьПоЗначению('01.01.08','01.02.09',"КлиентАбонемент", Клиент);
    // или так
    Док.ВыбратьПоЗначению(V7.Eval(Дата(2008,01,01)),V7.Eval(Дата(2009,02,01)),"КлиентАбонемент", Клиент);
    
  18. TopicStarter Overlay
    Amber
    Offline

    Amber Опытный в 1С

    Регистрация:
    16 ноя 2007
    Сообщения:
    98
    Симпатии:
    0
    Баллы:
    26
    Да нет тут похоже дело не в датах..А в "Клиенте". Как это обойти(или хотябы проверить какие значения куда попадают) ума не приложу :unsure:
  19. unknown181538
    Offline

    unknown181538

    Регистрация:
    24 фев 2008
    Сообщения:
    38
    Симпатии:
    0
    Баллы:
    1
    "<ИмяОтбора> - строка с названием Общего реквизита документов либо названием Графы отбора журналов;"
    а у вас есть такая графа отбора?...сорри .. вижу...
    Однако же вы видимо хотите сделать в цикле выборку. Не уверен в рациональности этого. М.б. даже лучше было бы сделать запрос по всем документам, а затем в цикле пропускать ненужные.
  20. vitaly_mnpz
    Offline

    vitaly_mnpz Опытный в 1С

    Регистрация:
    15 фев 2009
    Сообщения:
    267
    Симпатии:
    0
    Баллы:
    26
    А не проще ли создать в семерке глобальную функцию типа

    Код:
    Функция ВыполнитьЗапрос(НачДата,КонДата,ТексЗапроса,КодКонтрагента) Экспорт
    
    КонтрагентМенеджер = СоздатьОбъект("Справочник.Контрагенты");
    Если КонтрагентМенеджер.НайтиПоКоду(КодКонтрагента) = 1 Тогда
    КонтрагентСсылка = КонтрагентМенеджер.ТекущийЭлемент();
    КонецЕсли;
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса =   // что-то вроде
    "Период с НачДата по КонДата;
    |Заказ= Документ.Заказ.ТекущийДокумент;
    |Контрагент = Документ.Заказ.Контрагент;
    |СуммаДокумента = Документ.Заказ.СуммаДокумента;
    |Группировка Заказ;
    |Условие(Контрагент = КонтрагентСсылка);
    |";
    
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
    Возврат 0;
    Иначе
    Возврат Запрос;
    КонецЕсли;
    
    КонецФункции
    
    Вместо одиночного кода контрагента можно передавать список кодов с разделителями.
    После удачного выполнения в контексте восьмерки будет Com-объект - Запрос. Там его уже обходить...

Поделиться этой страницей