Класс "ПрямойЗапрос"

Класс для выполнения запросов к базе данных 1Сv7 (DBF, SQL) с синтаксисом максимально приближенным к синтаксису 1Сv8.

В общем хочу отдать на суд вольным зрителям набор КОП «ПрямойЗапрос» с документацией к нему.
Что он может:
— выполнение запроса на языке подобном 1Cv8
— выполнение запроса на любом формате БД (DBF — SQLite, SQL — ODBCRecordset)
— наличие виртуальных таблиц
— выполнение параметризированных запросов

Что он не умеет:
— не отличает возможные реквизиты объектов метаданных совпадающих с предопределенными реквизитами этих объектов (например: Код, Наименование в справочнике и т.п.)

К классу приложена подробная документация.

Выражаю свою благодарность товарищам:

тов. berezdetsky за класс AccountsRecordset
тов. Steban шаблон параметра — это круто
тов. JohnyDeath за пример ВТ ПодчиненныеДокументы и прочее
тов. Orefkov за 1sqlite
тов. Dmitro за практические советы
всем разработчикам 1С++ за 1С++
ну и всем остальным кто словом и делом помогал
.

Пример использования:

ТекстЗапроса = «ВЫБРАТЬ
|    Рег.ТекущийДокумент КАК [Документ $Документ]
|    ,Рег.ВидДокумента КАК [Документ_вид $ВидДокумента]
|    ,Рег.Склад КАК [Склад $Справочник.Склады]
|    ,Рег.Номенклатура КАК [Номенклатура $Справочник.Номенклатура]
|    ,Рег.КоличествоНачальныйОстаток КАК ОстатокНач
|    ,Рег.КоличествоОборот КАК Оборот
|    ,Рег.КоличествоПриход КАК Приход
|    ,Рег.КоличествоРасход КАК Расход
|    ,Рег.КоличествоКонечныйОстаток КАК ОстатокКон

|ИЗ $РегистрОстаткиОбороты.ОстаткиТМЦ(:НачПериода
|        ,:КонПериода
|        ,Документ
|        ,ДвиженияИГраницыПериода
|        ,

|        ,(Склад,Номенклатура)
|        ,(Количество)) КАК Рег
«;

Запрос = СоздатьОбъект(«ПрямойЗапрос»);
Запрос.Текст = ТекстЗапроса;
Запрос.УстановитьТекстовыйПараметр(«
НачПериода«,НачГода(РабочаяДата()));
Запрос.УстановитьТекстовыйПараметр(«КонПериода«,РабочаяДата());
Запрос.РежимОтладки = 1;

ИТЗРезультат = Запрос.Выполнить();
ИТЗ.ВыбратьСтроку();

Официальная версия: 1.8.3 от 30.12.11 г.

Более полная информация на форуме 1С++.

P.S. данная разработка распространяется бесплатно как для частного, так и для коммерческого использования. Поддержка осуществляется при наличии свободного времени. Возможно сотрудничество на предмет внедрения данной разработки в конкретные конфигурации.

99 Comments

  1. JohnyDeath

    Одна документация чего стоит!

    Завидую таким людям!

    Reply
  2. Ёпрст

    Офигеть!, на такое описалово, у меня бы месяц, не меньше ушло бы… а тут еще и работать надо..

    🙂

    Reply
  3. CheBurator

    Да, дока приличная… но использовать это все я бы побоялся, автор и сам пишет — «возможны ошибки»… работа, видимо, проделана большая — но в чем смысл тогда при потенциальном наличии ошибок?

    Reply
  4. Ёпрст

    (3) Ошибки со временем исправятся, а вот полученный при работе с данным классом опыт — это бесценно..!

    Reply
  5. vandalsvq

    (3) На счет ошибок могу сказать следующее. Это на самом деле вторая версия. Первая была полностью переписана и в виду этого я и пишу «возможны ошибки». Хотя, на текущий момент из того что я использовал ошибок не было обнаружено.

    Reply
  6. Ish_2

    От Випа недавно первый раз услышал про проект 1с++.

    Теперь первый раз увидел пример создания класса в 1с++.

    Конечно, здорово !

    Reply
  7. vandalsvq

    Добавлена новая версия КОП и обновленная документация.

    Готов озвучить часть плана по развитию класса, правда без сроков:

    — доработка документации по индексам реализованным в таблицах 1С

    — доработка документации по инструкциям языка запросов

    — доработка ВТ по бухгалтерским таблицам

    — реализация ВТ по регистрам

    — реализация ВТ СрезПервых

    — реализация различных функций и инструкций

    По пути посмотрим что еще будет.

    Reply
  8. acsent

    В чем отличие от обычного запроса через 1С++?

    Reply
  9. vandalsvq

    Отличий много и не очень одновременно 🙂

    1. Источники данных связанные с таблицами 1С указываются без символа $. Например: Справочник.Контрагенты, Документ.Выписка, ДокументСтроки.ПоступлениеМатериалов

    2. Возможность поименования таблиц не имеющих метаимен. Например: в тексте запроса можно писать «ЖурналДокументов» вместо _1sjourn, или «Проводки» вместо _1sentry.

    3. Можно не использовать конструкцию $ОбщийРеквизит. А вместо $ФлагРегистра необходимо писать Регистр<ИдентификаторРегистра>. Например: $Жур.Комментарий вместо Жур.$ОбщийРеквизит.Комментарий.

    4. Внутренние идентификаторы подставляются самостоятельно классом. Более того их необходимо объявлять не через «$», а через «:». Так же для DBF формата БД всегда подставляется 36-тиричное представление, а для SQL (как правило) 10-чное, + если указать модификатор после идентификатора то 36-тиричное. Т.е. конструкции вроде ВидСправочника36 нет, вместо нее :ВидСправочника.ОсновныеСредства~.

    5. Наличие ВТ $ПодчиненныеДокументы, $СрезПоследних

    6. Урезанные параметры у вирт. значения $ПоследнееЗначение

    7. $ПоследнееЗначение как и $Константа возвращают подготовленные значенияю. Т.е. для числа это Numeric(n,m), для даты это DateTime или формат ГГГГММДД, для прочих — CHAR(n) длинной в зависимости от реквизита. (может 1С++ также делает я не помню)

    8. Модификаторы текстовых параметров пользователя слегка отличаются от 1С++

    Ну кажется все что вспомнил.

    Reply
  10. JohnyDeath

    +(9) ты главное забыл сказать. Теперь можно не думать о формате БД, в которой работаешь 😉

    Reply
  11. vip

    (6) Если vip’a поменьше банить будете, много чего еще услышишь (увидишь).

    Reply
  12. Ish_2

    (11) Если VIP -жизненный статус , то бан даже полезен.

    Подталкивает к размышлениям.

    Reply
  13. vip

    (12) Подталкивает справедливый.

    Последний подтолкнул к совсем другим размышлениям.

    Reply
  14. Ish_2

    (13) Подталкивает любой.

    Совсем другие размышления и имелись ввиду.

    Reply
  15. vandalsvq

    (10) ну да… спасибо что напомнил 🙂

    Кстати по просьбе Donat-а ВТ по регистрам будет аккурат после документации по индексам и инструкциям языка (те которые не описаны до конца).

    Reply
  16. Ёпрст

    (15)

    Интересно, сколько времени уходит на документацию ?…Так, для справки.

    Reply
  17. vandalsvq

    По разному. Но в среднем на документирование уходит около 20-30% времени от времени разработки. Т.е. если я пишу КОП месяц то документирую обычно около недели. Например у меня есть разработка на которую документация составлена на 30%, а уже 108 страниц текста. Думаю что на данный КОП будет в районе 100 страниц в итоге.

    Reply
  18. Ёпрст

    (17) Круто… мне каменты то вломы в модуле постить… а об достойном описаове… эх, не дано 🙁

    Reply
  19. JohnyDeath

    (18) такая же беда. Вот сижу и молча завидую.

    У меня на доку уходит больше времени чем на разработку и реализацию. Может потому что это слишком муторно и нудно?

    Reply
  20. vandalsvq

    Вышло обновление 1.01.003.

    Доработана документация и исправлены ошибки выявленные мною.

    Особенно прошу обратить внимание на советы программистам написанные в документации. Надеюсь они помогут избежать ошибок и вопросов.

    Reply
  21. vandalsvq

    Небольшие новости с фронта. Закончена разработка ВТ РегистрОстатки, РегистрОбороты, РегистрОстаткиОбороты. Осталось доработать документацию и дотестировать. Сегодня вечером будет выложено обновление.

    Тестеры добровольцы приветствуются.

    Reply
  22. vandalsvq

    Ну собственно вот и обновление. Сообщаю на период с 15 по 19 меня не будет в сети, поэтому если не буду отвечать не обессудьте. Но в пн как выйду разберусь

    Reply
  23. tok

    Молодец, что еще можно сказать. Вот это дело! Чисто и красиво.

    Когда-то хотел нечто подобное попытаться сделать. Очень рад за Ваши труды!

    обожаю все, что связанное с 1c++. Обязательно посмотрю.

    Reply
  24. vandalsvq

    Вернулся чуть раньше…. ни уж то все всё проверили? 🙂 Комментариев то только один добавился и тот положительный 🙂

    Reply
  25. rasswet

    Запрос = СоздатьОбъект(«ПрямойЗапрос»);

    {F:TESTПРЯМОЙ_ЗАПРОС.ERT(11)}: Неудачная попытка создания объекта (ПрямойЗапрос)

    подскажите необходимые условия для запуска. Пытаюсь демо-пример реализовать.

    Компоненту загружаю. а дальше? или ссылочку на обработку с примером. я копировал из Вашей шапки код.

    2.0.3.4 1cp++ и пробовал 3.01.22

    Хочется с этим всем разобраться..

    Reply
  26. vandalsvq

    Значит ВК 1С++ ты загрузил?

    Тогда необходимо подключить классы, для этого почитай тут

    http://www.1cpp.ru/docum/icpp/html/classes.html

    После подключения КОП можно создавать объект прямой запрос и пробовать писать 😉

    Reply
  27. vandalsvq

    Выложил релиз 1.02.002 от 22.07.09 г. Прошу любить и жаловать. 😉

    Reply
  28. vandalsvq

    Вышла новая версия. Исправлена критическая ошибка при формировании данных по регистрам с использованием документов как границ расчетов.

    Добавлена возможность подключения внешних баз данных.

    Reply
  29. artbear

    По собственному опыту разработки различных классов на разных языках/средах знаю, что проще всего писать документацию совместно с тестами для полной гарантии соответствия доки и класса 🙂

    Reply
  30. vandalsvq

    Ищутся реальные пользователи данного класса.

    Интересует где, как, для чего применяете и ваше мнение.

    Reply
  31. vandalsvq

    ИСПРАВИЛ КРИТИЧЕСКУЮ ОШИБКУ

    Ошибка происходила при формировании ВТ РегистрОбороты (и как следствие ВТ РегистрОстаткиОбороты) если регистр имеет тип Остатки и БыстраяОбработкаДвижений = 0.

    Версию не менял.

    Reply
  32. vandalsvq

    Вышла новая версия. Описание читать в документации или в топике. Брать наверху.

    Reply
  33. vandalsvq

    Исправлена критичная ошибка при формировании ВТ по регистрам. Всем качать обязательно. Описание в документации. Файл в топике.

    Reply
  34. vet7777

    примеры типовые добавь в конце описания, например, получение остатка по счету на определенную дату и по определенному субконту.

    практикум так сказать, чтобы народ быстрее освоил.

    Reply
  35. vandalsvq

    (34) для получения остатки по счетам надо чтобы ВТ БИОстатки появилась.

    А вот по регистрам вполне возможно и покажу что нибудь. Может через недельку напишу какой нить простенький отчет, или конфу тестовую выложу когда причешу ее нормально.

    Reply
  36. vandalsvq

    Выложил версию 1.03.001 (beta).

    Почему бета…

    1. Проведены работы по оптимизации времени подготовки запроса. В связи с чем необходимо более тщательное тестирование

    2. Вирт. таблица БИОстатки для SQL написана «на коленке» по аналогии с DBF. При этом DBF оттестирована и проведены работы по оптимизации времени выполнения запроса, для SQL подобных работ еще не было (планируется исследовать на неделе).

    Собственно вот

    Reply
  37. vandalsvq

    Обновил файл релиза 1.03.001 (бета). Теперь уже почти не бета версия, а похожа на стабильный релиз.

    Отладил и поработал над оптимизацией выполнения запроса в SQL формате БД (спасибо тов. berezdetsky за его КОП AccountRecordset, без него было бы гораздно сложнее).

    Reply
  38. vandalsvq

    Обновил планируемый релиз 1.03.001 (beta). Проведены некоторые работы по оптимизации времени подготовки запроса. Файл брать в топике.

    Reply
  39. vandalsvq

    Выложена версия 1.03.002 от 17.08.09 г.

    Добавлена бета-версия ВТ БИОборотыДтКт. Незначительные изменения по оптимизации подготовки запроса.

    Хочу сказать для всех кто сомневается: версия 1.03.002 имеет статус «бета» исключительно из-за добавления в подготовку запроса виртуальных таблиц для работы с бухгалтерской подсистемой. В остальном же версия 1.03.ххх имеет ряд существенных улучшений по сравнению с версией 1.02.ххх и рекомендуется к использованию.

    Reply
  40. vandalsvq

    Выложена версия 1.03.003 от 18.08.09 г.

    Добавлены новые функции языка запроса: Лево(), Право(), СокрЛ(), СокрП(). Некоторые приватные методы реализованы как публичные с целью возможности разбора виртуальных таблиц вне класса.

    Пы.сы. Если на форуме 1С++ активность в теме про класс хоть какая-то. То здесь я не вижу не активности, ни заинтересованности. Что не так? Или разработка показалось «не особо нужной»…. странной даже.

    Reply
  41. vandalsvq

    Выложил обновление. Исправлена ошибка связанная с подготовкой запроса для dbf формата базы данных если в запросе участвовали объекты с наличием символа «_» в виде объекта (справочник, документа, регистр).

    Reply
  42. vandalsvq

    Новая версия: 1.03.004. Смотреть в документацию и продолжать пробовать. Если смельчаки конечно же имеются 😉

    Reply
  43. vandalsvq

    Вышла новая версия. 1.03.005.

    Добавлена ВТ БИОбороты, существенно проработаны БИОстатки и БИОборотыДтКт.

    Исправлены другие мелкие недочеты и недоделки.

    Reply
  44. vandalsvq

    Класс заменен без изменения версии. Небольшой багофикс некоторых косячков.

    Reply
  45. vandalsvq

    Вышла новая версия. Множество изменений. В том числе пара достаточно нужных и «полезных».

    Кстати очень интересным получилась возможность использования данного класса в совокупности с решением «ПоставщикДанных».

    Информацию о данной «разработке» можно «подсмотреть» на 1С++.

    http://www.1cpp.ru/forum/YaBB.pl?num=1248941896

    Reply
  46. CheBurator

    Очень приветствуется наличие в составе «инсталлятора» примеров каких-нибудь типовых отчетов (ну, например, для Типовой ТиС) — остатки ТМЦ, ведомость по остаткам ТМЦ и т.д. — переделанных с учетом исапользования данного класса — будет все нагляднее…

    Reply
  47. CheBurator

    ух, чувствую надо плотно садится на прямые запросы и поставщика данных… а «табличное поле» — это что?

    Reply
  48. CheBurator

    просто вдогонку: очень хочется чтобы работа, которую проделывает автор была «завершена», т.е. сабж «зафксирован» (с описанием известных багов и фич), существовала содержательная документация и т.д. — то есть чтобы был ПРОДУКТ. Отрадно видеть, что автор — делает «правильно». От использования возможностей 1С++ лично меня удерживают тоько небрежности и глюки, встреченные в том, что пришлось использовать… Простба побоьше примеров (конфигурация?)

    Reply
  49. vandalsvq

    (46)

    Инсталлятор в данном случае получиться «неуниверсальным». Те кто пользуются классами уже имеют определенную иерархию, те кто не пользуется, велика вероятность что не будут. Я думаю достаточно «демо-конфигурации» и небольшого «фака» в документации как подключить, как использовать и т.д. Это я напишу. Спасибо за идею 😉

    (47)

    Табличное поле — это интерфейсный объект реализованный в 1С++ который позволяет на форме отображать табличное поле во многом идентичное 8-ке. Вообще примеры использования ТП я встречал и на данном ресурсе. Можно поискать. Если интересно то скорее надо уже на форум 1С++

    (48)

    Странно слышать про глюки. Насколько я использую 1С++ (а это практически все что в ней есть) большинство, если не почти все уже пофиксены.

    Что касается примеров. В ближайшее время для ТиС я наверное перепишу пару отчетов. К сожалению текущая загруженность не позволяет уделять большое внимание «непроизводственным» вопросам :). Время, время, время.

    Кстати что касается документации, то я думаю в данной разработке вопросов особых не должно быть, очень подробная дока получилась.

    Reply
  50. CheBurator

    (49) спсб за ответ.

    по (46) те кто уже пользуется — они не будут, а те кто заинтересован с нуля — будут. А то получается — 1.почему так мало откликов и 2.кто не использовал — тому и не надол, а кто использовал они и так все знают… 😉

    по (48) речь не про глюки 1С++, а про прикладные выкладываемые решения.

    Reply
  51. vandalsvq

    (50) реклама — двигатель торговли ;). А на мой взгляд хорошего фака+демо конфигурация будет достаточно. 😉

    Reply
  52. vandalsvq

    Выложена версия 1.05.001 от 02.12.09 г. Кому надо смотреть.

    Reply
  53. vandalsvq

    Выложена версия 1.05.002 от 07.12.09 г.

    Reply
  54. vandalsvq

    Выложена версия 1.06.005 от 11.05.10 г.

    Reply
  55. vandalsvq

    Выложена версия 1.06.006 от 11.05.10 г.

    Брать обязательно.

    Reply
  56. vandalsvq

    Давненько я здесь не появлялся. В общем очень много изменений произошло. Как всегда отражаю в топе только последние. А вообще с версии 1.06.006 вот полный список изменений:

    1.07.005 от 28.05.10 г.

    — Исправлена ошибка при расчете конечной даты ВТ РегистрОбороты (для регистра с типом Обороты) если дата совпадает с датой начала периода хранения оборотов.

    1.07.004 от 24.05.10 г.

    — Исправлена ошибка подстановки предопределенных текстовых параметров с количеством слов разделенными запятыми более 2-х.

    1.07.003 от 21.05.10 г.

    — Исправлена ошибка подстановки текстовых параметров с модификаторами.

    — Исправлена «плавающая» ошибка парсинга ВТ без указания параметров.

    1.07.002 от 18.05.10 г.

    — Исправлена ошибка при формировании ВТ РегистрОстатки (по регистру с типом «Остатки») если дата получения остатков очень близка к ТА.

    — Исправлена ошибка при формировании ВТ РегистрОбороты (по регистру с типом Обороты) если граница окончания получения оборотов близка к ТА. Оптимизирован расчет границ для сбора данных.

    — Добавлена возможность обратной совместимости с версией 1.06.ххх. Все параметры ВТ не являются обязательными. Подставляются значения по умолчанию.

    1.07.001 от 14.05.10 г. (beta)

    — Добавлен новый параметр «Соединения» виртуальной таблицы РегистрОстатки.

    — Добавлен новый параметр «Соединения» виртуальной таблицы РегистрОбороты.

    — Добавлен новый параметр «Соединения» виртуальной таблицы РегистрОстаткиОбороты.

    — Добавлен новый параметр «Соединения» виртуальной таблицы БИОстатки.

    — Добавлен новый параметр «Соединения» виртуальной таблицы БИОборотыДтКт.

    — Добавлен новый параметр «Соединения» виртуальной таблицы БИОбороты.

    — Добавлен новый параметр «Соединения» виртуальной таблицы БИОстаткиОбороты.

    — Возможна потеря обратной совместимости по всем измененным виртуальным таблицам с более ранними версиями.

    1.06.007 от 14.05.10 г.

    — Исправлена ошибка виртуальной таблицы РегистрОбороты при формировании по регистру с типом «Обороты» и периодичностью Декада.

    — Исправлена ошибки формирования виртуальных таблиц по бухгалтерской подсистеме при наличии более 1-го плана счетов.

    Reply
  57. vandalsvq

    Ну, начнем-с?

    Предлагаю задавать вопросы относительно использования класса здесь.

    Reply
  58. orefkov

    (57)

    Узок был их круг. Страшно далеки они были от народа (с)

    Reply
  59. vandalsvq

    (58) да уж… тут активность близка в нулю

    Reply
  60. cleaner_it

    Крутая вещь! Попробую применить в http://infostart.ru/public/72778, потом напишу что получилось:) 134 страницы документации за вечер не освоить:)

    Reply
  61. vandalsvq

    (60) если решишь пользоваться бери с форума 1С++ новую версию. А то тут давненько не обновлял. И потом расскажи об успехах :).

    Reply
  62. anton.fly7

    как сделать чтоб на DBF базе работала не через SQLite а через VFPOLEDB? такое вообще возможно?

    Reply
  63. anton.fly7

    (62) разобрался

    нашел 1sqlite.dll, вопрос снимается )

    Reply
  64. cleaner_it

    (61) На работе до сих пор пользуюсь версией 2.5, нареканий нет:) На сайте последняя 3.2.1.0, конечно ее получше использовать в новых наработках (ошибок много пофиксено). На работе боязно, работает — не трогай:) Только после многократного тестирования:)

    Reply
  65. vandalsvq

    (64) последняя счас не 3.2.1.0, а 3.2.1.17. Исправлений там на самом деле много. Переезд в принципе безболезнен, а вот возможности… особенно в части табличного поля.

    Reply
  66. cleaner_it

    (0) а автоматический подбор индексов — твоя работа или Orefkov?

    Выбран индекс ACDATETIM: DTOS(DATE)+TIME+IDDOC

    А вообще — уже очень-очень нравится, пользоваться классом удобно:)

    Reply
  67. cleaner_it

    (61) Результаты:

    VFPOLEDB

    — Для DBF делал развертку виртуальной таблицы остатков (итоги+движения). Потратил 2 дня на разбор полетов

    Класс ПрямойЗапрос

    — Для DBF написал запрос. Потратил 1 час, вместе с чтением документации на 1sqlite и класс ПрямойЗапрос. Скорость выполнения увеличилась даже визуально!

    Итог: класс использовать нужно! Рекомендую всем, кто не хочет мучений при написании прямых запросов к DBF

    На заметку: Конструктор qryConsole по умолчанию ставит между параметром и модификатором пробел «:ДатаПолученияОстатков ~», при использовании класса текст запроса необходимо править — убирать пробел: «:ДатаПолученияОстатков~»

    Reply
  68. cleaner_it

    Небольшой пример для тех, кто только начинает переходить на ПрямойЗапрос:

     ТекстЗапросаДвижений =
    «SELECT
    |   $Жур.ТекущийДокумент КАК [Документ $Документ]
    //|   Журнал.IDDOC as [Документ $Документ]
    | , $Жур.ВидДокумента КАК Документ_вид
    //| , Журнал.IDDOCDef as Документ_вид
    | , $Жур.ДатаДокумента КАК [ДатаДок $Дата]
    //| , «+?(БазаSQL = 0,»Журнал.DATE»,»$НачалоПериода.День(Журнал.DATE_TIME_IDDOC)»)+» as ДатаДок
    |
    | , $СпрДоговора.ТекущийЭлемент КАК [Договор $Справочник.Договоры]
    //| , СпрДоговора.ID КАК [Договор $Справочник.Договоры]
    | , $СпрКонтрагенты.ТекущийЭлемент КАК [Покупатель $Справочник.Контрагенты]
    //| , СпрКонтрагенты.ID КАК [Покупатель $Справочник.Контрагенты]
    |
    | , $НаименованиеРегистра.ВидДвижения КАК ПриходРасход
    //| , НаименованиеРегистра.DEBKRED КАК ПриходРасход
    |
    | , НаименованиеРегистра.Фирма КАК [Фирма $Справочник.Фирмы]
    | , НаименованиеРегистра.ВидДолга КАК [ВидДолга $Перечисление.ВидыДолга]
    | , НаименованиеРегистра.КредДокумент КАК [КредДокумент $Документ]
    | , НаименованиеРегистра.ДокументОплаты КАК [ДокументОплаты $Документ]
    | , НаименованиеРегистра.КодОперации КАК [КодОперации $Перечисление.КодыОпераций]
    |
    | , НаименованиеРегистра.СуммаРуб*(1 — $НаименованиеРегистра.ВидДвижения * 2) КАК СуммаВзаиморасчетовВВалютеБухУчета
    //| , $НаименованиеРегистра.СуммаРуб*(1 — НаименованиеРегистра.DEBKRED * 2) КАК СуммаВзаиморасчетовВВалютеБухУчета
    |
    | , Жур.$ОбщийРеквизит.Автор  КАК [Автор $Справочник.Пользователи]
    | , Жур.$ОбщийРеквизит.Проект КАК [Проект $Справочник.Проекты]
    | , Жур.$ОбщийРеквизит.ЮрЛицо КАК [ЮрЛицо $Справочник.СвоиЮрЛица]
    |
    |FROM Регистр.»+НаименованиеРегистра+» КАК НаименованиеРегистра
    //|FROM $Регистр.»+НаименованиеРегистра+» КАК НаименованиеРегистра
    | INNER JOIN ЖурналДокументов КАК Жур ON $НаименованиеРегистра.ТекущийДокумент = $Жур.ТекущийДокумент
    //| INNER JOIN «+?(БазаSQL = 0,»1SJOURN»,»_1SJOURN»)+» AS Журнал «+?(БазаSQL = 0,»»,»With (NOLOCK)»)+» ON НаименованиеРегистра.IDDOC = Журнал.IDDOC
    | LEFT JOIN Справочник.Договоры КАК СпрДоговора ON $СпрДоговора.ТекущийЭлемент = НаименованиеРегистра.Договор
    //| LEFT JOIN $Справочник.Договоры КАК СпрДоговора ON СпрДоговора.ID = $НаименованиеРегистра.Договор
    | LEFT JOIN Справочник.Контрагенты КАК СпрКонтрагенты ON $СпрКонтрагенты.ТекущийЭлемент = СпрДоговора.ParentExt
    //| LEFT JOIN $Справочник.Контрагенты КАК СпрКонтрагенты ON СпрКонтрагенты.ID = СпрДоговора.ParentExt
    |
    |WHERE $Жур.ДатаДокумента BETWEEN :ВыбНачПериода AND :ВыбКонПериода~
    //|WHERE («+?(БазаSQL = 0,»Журнал.DATE»,»Журнал.DATE_TIME_IDDOC»)+» BETWEEN :ВыбНачПериода»+?(БазаSQL = 0,»~~»,»»)+» AND :ВыбКонПериода»+?(БазаSQL = 0,»~~»,»~»)+»)
    |
    |»;

    Показать

    В примере показано, что меняется. Старый вариант запроса для DBF (VFPOLEDB ) и SQL закомментирован

    Reply
  69. vandalsvq

    (66) Подбор индексов — это работа 1sqlite, т.е. Саши Орефкова.

    (67) по поводу модификатора посмотрю чтобы пробелы не учитывались.

    (68) я на 1С++ писал что есть некоторые недоработки.

    Цитата: «В частности Жур.$ОбщийРеквизит.ИмяРеквизита можно писать как $Жур.ИмяРеквизита, а $nolock вообще отсутствует везде.

    Ну и сравнение «WHERE $Жур.ДатаДокумента»… тут такое дело что сравнивать left(date_time_iddoc,8) (для SQL будет так) не самое хорошее решение. Проще после кода поставить проверку, если это ПрямойЗапрос.ЭтоSQL = 1 то данную часть заменить на $Жур.ПозицияДокумента. Т.е. ПрямойЗапрос.Текст = СтрЗаменить(ПрямойЗапрос.Текст,»WHERE $Жур.ДатаДокумента»,»WHERE $Жур.ПозицияДокумента»);». 😎

    Reply
  70. cleaner_it
    ПрямойЗапрос.Текст = СтрЗаменить(ПрямойЗапрос.Текст,»WHERE $Жур.ДатаДокумента»,»WHERE $Жур.ПозицияДокумента»);»

    обязательно сделаю такую проверку

    А по поводу $nolock я прочитал в твоей документации, что происходит подстановка автоматическая для SQL, а для 1sqlite это и не нужно. Или я не так понял?

    Ну, раз уж на то пошло — можно вернуть знак $ перед регистрами движений? Не очень удобно править руками запрос qryConsole, первый раз я даже долго искал в своем запросе ошибку (спасибо Орефкову за консоль запросов 1sqlite, помогла разобраться)

    Reply
  71. cleaner_it

    (70) больше не буду дублировать:) дальнейшая переписка на http://www.1cpp.ru/forum/YaBB.pl?num=1246429625

    Reply
  72. BlueWind

    Поставлена задача оживить большую распределенную базу на бухгалтерской компоненте — центральная SQL и периферийные на DBF. С этой целью начал исследование возможностей 1с++ и класса ПрямойЗапрос… Начать было сложновато, но уже что-то получается, и результаты очаровывают настолько, что я для себя решил, что когда заброшу 1с и займусь скульптурой, первым делом наваяю памятник человеку, придумавшему колготки (это просто было уже решено раньше на основе весенних впечатлений), и сразу за ним — бюсты создателей 1с++ и этого класса! Ибо это — вещь!! Спасибо vandalsvq и за класс и за основательную документацию! Похоже, я буду активно его использовать..

    Использую КОП ПрямойЗапрос 1.7.21, 1с++ 3.2.3.1

    Вот такой запрос:

    ТекстЗапроса = »

    |ВЫБРАТЬ *

    |ИЗ

    |$БИОстатки.Основной(:КонДата~,, (Подразделения, Товары), (Количество, Сумма), ((Субконто1 = :ВыбПодразделение) И (Счет = :Счет411)),)

    |КАК Би

    |»;

    дает ошибку «В метод необходимо передавать непустые объекты типа метаданных». Если между идентификаторами видов субконто убрать пробел — все нормально. Если вместо (Подразделения, Товары) задать через пробел (Субконто1, Субконто2) — ошибки не возникает. В документации по $БИОстатки, впрочем, так и указано: «Т.е. например (Субконто1, Субконто3) или (Контрагенты,Договоры).», но при возможности влияние пробела хорошо было бы исключить..

    В документации по $БИОстатки, Параметр КонецПериода сказано: «Параметр со значением даты или документа, до которого необходимо рассчитать остатки (условие <, т.е. не входит в сумму остатков). » Здесь закрались сомнения, и экспериментально установлено, что «<» справедливо для документа (т.е. остатки на начало документа), а для даты верно «<=», т.е. на конец дня.

    Хотелось бы еще при выполнении запросов классом вместо «Выполняется обработка» в строке состояния наблюдать информацию именно о выполнении запроса с указанием даты — что-то вроде «Расчет итогов: 27.11.10» по аналогии с 1с..

    Reply
  73. BlueWind

    (72) По поводу параметра КонецПериода разобрался — если в запросе параметр КонецПериода типа Дата установлен с модификатором (:КонДата~) тогда остатки рассчитываются на конец дня, если без модификатора (:КонДата) — тогда на начало дня. В документации про влияние модификатора сказано, но хорошо бы уточнить — каким образом.

    И еще вопрос: als и ints файлы для КОП ПрямойЗапрос существуют?

    Reply
  74. mybracho

    Ребята, скиньте ссылку где взять построитель для прямого запроса

    Reply
  75. iksanova

    Документация достаточно большая.

    Пользоваться своим классом — это круто!

    Заинтересовалась!

    Reply
  76. nll.jojo

    заинтригованннн

    Reply
  77. andrey314

    Круто. Понимаю что наглею, но было бы еще круче если бы в составе документации были примеры для работы с БИ.

    Reply
  78. vandalsvq

    Данный вопрос лучше всего задать в теме на форуме 1С++ (см. тут — http://www.1cpp.ru/forum/YaBB.pl?num=1285352210). Я достаточно сильно от 7.7 отошел и очень много проектов которые сейчас веду, чтобы браться за помощь :).

    Reply
  79. sss999

    Круто конечно,но если бы мне сказали как,я бы весь синтаксис переделал под восьмерочный,ну не понятно нафига было делать какой то другой синтаксис,как будто людям делать нечего как сидеть и изучать новые языки.Документацию такую же делать нужно как и в 1с 8,при том вполне возможно даже выпустить небольшую книженцию страниц 50 и сделать небольшие денежки на этом проекте,опять же если синтаксис приведете к восьмерочному и уберете баги.Не нужен весь язык запросов,хотя бы основное для выборок.

    Reply
  80. sss999

    Там в запросе можно обойтись и без всяких там долларов,двоеточий и квадратных скобок,все это можно отследить,а так я смотрю и не понимаю что это за конструкция в скобках что за синоним такой с пробелом и долларом и еще и с точкой.И еще тут же написать минимальную инструкцию,или сделать два варианта расширенный синтаксис и краткое начало работы с краткой справкой.

    Reply
  81. vandalsvq

    (79) sss999, конкрентной цели монетизации проекта не было, я делал для своих нужд, а то что синтаксис такой, за основу был взять синтаксис 1C++. На тот момент достаточно распространенный среди знатоков прямых запросов. Синтаксис к 8-му приводить не вижу смысла, вот буквально пару дней назад пользовался разработкой для написания сложных сборов данных и знаешь, мне нравится результат который получился и процесс не вызвал больших проблем. Не хватает конструктора — вот что надо было бы точно.

    По документации: если посмотришь то увидишь что документация там точно за 50 страниц выпадает, не хватает конкретных примеров — это да, но описание я считаю минимально достаточным.

    И еще по поводу синтаксиса, я не вижу слишком больших отличий от 8-ки. Необходимость переименования и определения вида в запросе… ну что ж… А двоеточния или @ — очень сильно нужны. Например: в коде Т.ТекущийЭлемент = :Ссылка точно видно что «Ссылка» это именно текстовый параметр который надо подставить соответствующим образом. А в коде Т.ТекущийЭлемент = @Ссылка понятно что «Ссылка» это подставляемый параметр который необходимо задавать отличным от предыдущего примера видом, и при этом понятно что запрос параметризированный и выполнение его происходит отлично от обычного запроса.

    Reply
  82. sss999

    А подскажите как подключить ваш класс

    Reply
  83. sss999

    А на форуме 1cpp там помойка ,два дня нужно рыться что бы найти что то,больше половины старья которое уже не актуально ввиду выхода новых версий,а норм никто не может написать инструкции.

    Reply
  84. sss999

    не подскажешь что за ошибка?Я посмотрел выходит в момент создания объекта 0,что за объект такой?в этом тексте типобъекта =0,я посмотрел он передается через параметр,а там стоит и вправду 0.

    // определяем время подготовки запроса

    ВремяПодготовки = _GetPerformanceCounter();

    // создаем объект для получения результата запроса

    ПолучательЗапроса = СоздатьОбъект(ТипОбъекта);

    ПрямойЗапрос::Выполнить(Число ТипОбъекта=0, Строка ТекстВыполнения=, Число БезПодготовки=0) : Неудачная попытка создания объекта

    ПолучательЗапроса = СоздатьОбъект(ТипОбъекта);

    {C:Base77БазаПрямойЗапрос.ert(13386) }

    тЗапроса = Запрос.Выполнить(0);

    {F:SQLЗАПРОС2.ERT(183)}: ПрямойЗапрос::Выполнить(Число ТипОбъекта=0, Строка ТекстВыполнения=, Число БезПодготовки=0) : Неудачная попытка создания объекта

    ПолучательЗапроса = СоздатьОбъект(ТипОбъекта);

    {C:Base77БазаПрямойЗапрос.ert(13386) }

    Reply
  85. sss999

    ПрямойЗапрос::СоздатьОбъектыЗапроса(Строка ПутьКБазеSQL=:memory:) : Неудачная попытка создания объекта

    БазаSQLite = СоздатьОбъект(«SQLiteBase»);

    {C:Base77БазаПрямойЗапрос.ert(1057) }

    Запрос = СоздатьОбъект(«ПрямойЗапрос»);

    {F:SQLЗАПРОС2.ERT(146)}: ПрямойЗапрос::СоздатьОбъектыЗапроса(Строка ПутьКБазеSQL=:memory:) : Неудачная попытка создания объекта

    БазаSQLite = СоздатьОбъект(«SQLiteBase»);

    {C:Base77БазаПрямойЗапрос.ert(1057) }

    Хотя dll лежит sqllite

    Reply
  86. vandalsvq

    (85) sss999, посмотри, может в коде при выполнении запроса вызываешь Выполнить с неправильными параметрами. Потому что 0 может быть только если он извне пришел именно так. А вообще там должно быть ИндексированнаяТаблица или ТаблицаЗначений. В общем в документацию посмотри.

    Что же касается sqlite, может версия компоненты старая? Может не загрузилась ВК? Отдельно попробуй объект создать, проходит/нет.

    Reply
  87. sss999

    отредактировал,обработку твою,запрос отработал.Для дбф.

    Текст заменил так

    было:

    ИначеЕсли ЭтоSQL = 0 Тогда

    ЗапросSQLite.Отладка(РежимОтладкиЗапроса);

    ЗапросSQLite.ВыполнитьЗапрос(ТекстЗапроса,ПолучательЗапроса=);

    КонецЕсли;

    стало:

    ИначеЕсли ЭтоSQL = 0 Тогда

    ЗапросSQLite.Отладка(РежимОтладкиЗапроса);

    ПолучательЗапроса=ЗапросSQLite.ВыполнитьЗапрос(ТекстЗапроса);

    КонецЕсли;

    и перед этим поменял

    ПолучательЗапроса = СоздатьОбъект(ТипОбъекта);

    заменил на

    ПолучательЗапроса=0;

    Reply
  88. sss999

    а то что не создавался СоздатьОбъект(«SQLiteBase»); это видно проблема консоли,открыл другую обработку в которой объект создается и консоль заработала.

    Reply
  89. vandalsvq

    (87) sss999, в итоге у тебя всегда результат будет в ИТ. Смотри сам, но проблема была не в коде класса, а в твоем коде.

    Reply
  90. sss999

    (89) ну вот так консоль захотела только через такой код работать,а обработка работает через старый код,проблемы в консоли как я понял

    Reply
  91. sss999

    а зачем создается объект такой? ПолучательЗапроса = СоздатьОбъект(ТипОбъекта); у меня в типеобъекта стояло 0 и не отрабатывало через консоль

    Reply
  92. vandalsvq

    (91) sss999, я не совсем понимаю про какую консоль ты говоришь? А в «СоздатьОбъект(ТипОбъекта)» не совсем понятно почему ноль приходит, туда должна приходить строка, с указанием типа объекта для получения результата запроса. Вероятнее всего проблема в вызове «Выполнить», посмотри параметры согласно документации, сравни с параметрами которые передаются, там ошибка.

    Reply
  93. korpas

    При попытке выполнить запрос появляются сообщения:

    Процедура не обнаружена (вирт)

    Процедура не обнаружена (я)

    и

    Внимание! Инициализация класса: ПрямойЗапрос закончилась неудачно!

    В файле ПрямойЗапрос.ert не вижу, где объявляются процедуры вирт() и я()…

    P.S. Видимо надо обновить 1cpp до 3ей версии…

    Reply
  94. vandalsvq

    (93) korpas, советую за более актуальной версией, а также сборками с необходимыми dll и другими компонентами ходить на 1cpp.ru. В частности тут — http://www.1cpp.ru/forum/YaBB.pl?num=1273512019, выкладываются последние сборки. Правда давненько их не было и я не уверен что с моим авторством еще будут. Но кто знает. Сейчас функционал весьма стабилен и очень даже работоспособен.

    В общем, ищите инфу на 1С++, тут я редко пишу ответы.

    Reply
  95. succub1_5
    Reply
  96. ManyakRus

    маленький глюк:

    В $РегистрОстаткиОбороты.ОстаткиТМЦ() Условия приходится писать в одной строке, с новой строки выдаёт ошибки

    Meta name parser error: не указан параметр «:rg_405»

    Reply
  97. Mikeware

    Хочу совета!

    ВЫБРАТЬ
    Рег.ТекущийДокумент КАК [Документ $Документ]
    ,Рег.ВидДокумента КАК [Документ_вид $ВидДокумента]
    ,Рег.Фирма КАК [Фирма $Справочник.Фирмы]
    ,Рег.Договор КАК [Договор $Справочник.Договоры]
    ,Рег.СуммаРубНачальныйОстаток КАК ОстатокНач
    ,Рег.СуммаРубОборот КАК Оборот
    ,Рег.СуммаРубПриход КАК Приход
    ,Рег.СуммаРубРасход КАК Расход
    ,Рег.СуммаРубКонечныйОстаток КАК ОстатокКон
    ,СпрФирмы.ТекущийЭлемент КАК [ФирмаСпр ]
    ИЗ $РегистрОстаткиОбороты.Покупатели(:НачПериода
    ,:КонПериода
    ,Документ
    ,ДвиженияИГраницыПериода
    ,        ,(Фирма,Договор)
    ,(СуммаРуб)) КАК Рег
    
    ЛЕВОЕ СОЕДИНЕНИЕ $Справочник.Фирмы   Как Фирмы
    ПО   Рег.Фирма= Фирмы.id
    

    Показать

    дает ошибку

    near «AS»: syntax error

    Собственно, менял условия соединения и на ЛЕВОЕ СОЕДИНЕНИЕ $Справочник.Фирмы Как Фирмы

    ПО Рег.Фирма= $Фирмы.ТекущийЭлемент, и т.п. — та же ошибка.

    Классы обновил на версию от 22.05.13

    в режиме отладки выдает текст, который визуально ошибок не имеет

    без левого соединения (сама ВТ) работает….

    база- ДБФ.

    Reply
  98. vandalsvq

    (97) Mikeware, отправь на почту или в скайп текст отладочного режима, хочу посмотреть, поскольку так с ходу не видно в чем проблема может быть.

    Reply
  99. Mikeware

    (98) спасибо, я сам разобрался. накосячил с типизацией. она немного отличается от «классической», привычной в одбсшных…

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *