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

Класс для выполнения запросов к базе данных 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 не будет опубликован. Обязательные поля помечены *