IE 2016

1sqlite

Опубликовал orefkov в раздел Программирование - Внешние компоненты

Внешняя компонента для работы с базами данных SQLite, плюс прямые запросы в ДБФ-базах 1С.

Внешняя компонента, предназначенная для работы с базами данный SQLite.
Версия 1.0.2.3

Основана на проекте http://www.sqlite.org.

Основная страница проекта: http://snegopat.ru/1sqlite/

Кроме того, при работе в ДБФ-версии 1С, компонента позволяет посредством "движка" SQLite и встроенным в него механизмом "виртуальных таблиц" обращаться на чтение к таблицам базы данных 1С через "родные" методы самой 1С. Что позволяет выполнять запросы к базе 1С даже в монопольном режиме работы.

Основные фичи компоненты:

  • SQLite версии 3.6.11
  • Движок SQLite доработан в плане регистронезависимости русских символов, нормально работают lower, upper, like, названия таблиц, полей.
  • Добавлено collate _1С - сравнение строк без учета регистра и завершающих пробелов.
  • Отображение ДБФ-таблиц 1С в базу данных SQLite и возможность использовать их в запросах.
  • Работа с ДБФ-таблицами 1С в монопольном режиме.
  • Получение в прямых запросах "длинных" строк 1С-ДБФ.
  • Типизация результатов запроса типами данных 1С.
  • Работа с текстовыми и sql-параметрами в запросах.
  • Укладка в базу данных SQLite ТаблицЗначений.
  • Укладка в базу данных SQLite СписовЗначений с объектами 1С, с возможностью в ДБФ версии разворота групп справочников или счетов по иерархии.
  • Поставщик данных табличного поля 1С++


История версий:

1.0.1.1

  • Исправлен вылет при попытке подключить таблицу строк документа, у которого нет ТЧ.
  • Добавлены текстовые параметры: :ВидСубконто и :ПланСчетов

1.0.1.2

  • Исправлена работа с преобразованием значений типа Дата в формат БД.

1.0.1.3

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

1.0.1.4

  • Добавлено авто-подключение таблиц.

1.0.1.5

  • Исправлена ошибка подстановки текстового параметра ":ВидСправочника.ХХХ"
  • Добавлен модификатор 3 для подстановки значений типа Строка. Подставляет фрагмент текста без кавычек, для динамического формирования текста запроса.

1.0.1.6

  • Исправлена подстановка значения пустой даты.
  • Добавлена типизация :Субконто
  • Добавлена типизация :Время
  • Добавлена функция str2id
  • Добавлена функция id2str

1.0.1.7

  • Доработана работа 3го модификатора текстового параметра типа "Строка". Теперь подставляемый фрагмент текста также обрабатывается метапарсером.
  • Удалены типизация ":ВидДокумента" и ":ВидДокументаПредставление".
  • Добавлены типизации ":ИмяВида" и ":ПредставлениеВида".
  • Доработан метод SQLiteQuery::ВыполнитьЗапрос. Теперь можно получать результат выполнения запроса в таблицу значений, список значений, полем из скалярного запроса, а также в любой объект, реализующий интерфейс загрузки результата запроса (ISQLiteResultLoader).

1.0.1.8

  • Исправлена ошибка обработки NULL значений.
  • Исправлена ошибка преобразования из utf-8 нулевых строк
  • Устранена гигантская утечка памяти при некоторых случаях использования LIMIT
  • Рефакторинг классов базы данных и запросов, с целью облегчения использования их в других компонентах
  • Из соображений производительности восстановлены типизации :ВидДокумента и :ВидДокументаПредставление
  • Из соображений производительности добавлены типизации :ВидСубконто и :ВидСубконтоПредставление

1.0.1.9

  • - Сделано принудительное округление чисел при типизации :Число, тк получатели результата (кроме ТаблицыЗначений) сами этого не делают.
  • Исправлена работа типизации при обработке NULL значений, тк получатели результата (кроме ТаблицыЗначений) сами этого не делают.
  • Изменена логика работы с Begin/EndReadSequnce. В немонопольном режиме падение производительности, зато не падает.
  • Добавлен метод SQLiteQuery::ОбработатьТекстЗапроса
  • Добавлено свойство SQLiteQuery::ВыполнятьВТранзакции
  • Исправлена ошибка программы при подключении таблиц шапки документа, не имеющего реквизитов шапки.
  • Исправлена ошибка при выборке из таблиц 1С, иногда могущая привести к зависанию программы.
  • Добавлено подключение таблиц ЖурналовРасчетов ДБФ версии 1С.
  • Исправлена укладка списка объектов при наличии иерархии - неверно укладывались объекты, содержащие в идентификаторе русские буквы (распределенка с русским префиксом ИБ).
  • Добавлен объект SQLiteDataProvider - поставщик данных табличного поля 1С++ для таблиц sqlite и таблиц 1С DBF-версии.

1.0.2.0 bugfix 2

  • SQLite обновлен до релиза 3.6.11
  • Добавлена способность ПоставщикаДанных динамически менять текст запроса, если некоторые поля не нужны табличному полю для отображения
  • Добавлена возможность быстрого поиска для поставщика данных
  • Исправлена ошибка выборки данных при некоторых условиях (where date <= '09или19или29.месяц.год' order by date desc)
  • Убрана странная ошибка при попытке подготовить запросы с текстом запроса длиннее 972 символов.
  • Порядок сортировки в 'collate _1C' сделан точно соответствующим порядку сортировки в дбф-файлах 1С.
  • Изменены методы:
    • SQLiteDataProvider::УстановитьТекстЗапроса
    • SQLiteDataProvider::Отладка
  • Добавлены методы:
    • SQLiteDataProvider::НеУдалятьПоля
    • SQLiteDataProvider::ПоляБыстрогоПоиска
    • SQLiteDataProvider::ПолучитьТекстЗапроса

 1.0.2.2

  • SQLite обновлен до релиза 3.6.18

1.0.2.3

  • SQLite обновлен до релиза 3.6.22
  • Исправлена ошибка автоподключения таблиц 1С, названия которых начинаются с подчеркивания
  • Доработано автоподключение таблиц 1С, теперь можно просто указывать имя таблицы, заключенное в [].
  • Изменен алгоритм выгрузки результата запроса в СписокЗначений.   

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
1sqlite 1.0.2.3
.zip 408,69Kb
05.02.10
402
.zip 408,69Kb 402 Бесплатно
Пример использования (поиск клиентов/товаров в ДБФ базе 1С)
.1214222839 8,01Kb
25.09.09
275
.1214222839 8,01Kb 275 Бесплатно
Мини-консоль для запуска запроса.
.1214287828 7,33Kb
25.09.09
276
.1214287828 7,33Kb 276 Бесплатно
Пример использования. Универсальное дерево документов (для ДБФ)
.1214287870 7,44Kb
25.09.09
244
.1214287870 7,44Kb 244 Бесплатно
Документация к 1.0.2.3
.zip 62,42Kb
05.02.10
305
.zip 62,42Kb 305 Бесплатно
Пример использования. Отчет "Состояние заявки" для ТиС ДБФ. (работает только на дату ТА)
.1214393726 12,42Kb
30.05.15
231
.1214393726 12,42Kb 231 Бесплатно

См. также

Лучшие комментарии

174. Свой 31.07.2008 12:05
тестировал 1sqlite в условиях сетевой работы на машинах Win XP.
При обращении к таблицам с данными по сети судя по скорости компонента полностью перекачивает таблицу и скорость обработки запроса сравнима с прямым запросом через Microsoft Visual FoxPro Driver или Microsoft.Jet.OLEDB.4.0 (я не использовал 1С++ а только вышеуказанные драйвера-провайдеры)
при локальном запуске 1sqlite примерно на ПОРЯДОК быстрее прямых запросов также запущенных локально
В качестве практической пользы пока реализовал "клиент-сервер" когда обработка на клиенте (сетевое подключение) отправляет сеансу на машине(хранилищу базы) запрос 1sqlite и обратно ей передается ТЗ с данными, работает шустро
Ответили: (178) (175)
+ 2 [ JohnyDeath; hogik; ]
# Ответить
129. vip 05.07.2008 19:26
Ув. hogik!

Не хотел вмешиваться.

И я уже “ниччего не понимаю....”
Интуитивно понимая невероятную полезность Вашей разработки, я тщетно ищу жемчужное зерно.
Можно изложить то же самое, но избавившись от логореи?
Из результатов тестов я почерпнул пока только намеки на то, что в SQL первый запрос почти всегда выполняется дольше, чем последующие.
И?
Объясните наконец, в чем сермяжная правда вашего решения?
Понимая, что трогаю Вас за святое, спрошу - как случилось так, что разработки Александра используют многие тысячи людей? А Ваши?
Не обижайтесь, я себя дурачком не считаю и хочу четко и ясно увидеть изюминку.
Бесплатность, скорость, стабильность, отзывы пользователей.
В начале презентации проекта стороннюю заинтересованность видел. Сейчас нет.
???
Примером для разработчиков и пользователей считаю сайт 1С++.
Конструктивная, доброжелательная и очень эффективная по результатам атмосфера.

P.S. Еще раз прошу не обижаться.
Просто тону в потоке мутных сентенций.
Ответили: (131) (130) (279)
+ 2 [ slavapil; JohnyDeath; ]
# Ответить
153. hogik 14.07.2008 20:48
Возникает ошибка при работе в многопользовательском режиме.
В момент выполнения запроса блокируются, некоторые, таблицы БД. Если в другой сессии 1Са будет выполняться попытка обновления таблицы, участвующих в запросе, то эта сессия завершится аварийно с кодом ошибки “CodeBase –56” после ожидания, примерно, 60 секунд.
Ответили: (184) (171) (158) (157) (154)
+ 1 [ Свой; ]
# Ответить
213. JohnyDeath 23.11.2009 15:57
(212)
В запросе:
AND (ПолеСПеречислением =:Плюсик)

Далее:
Запрос.Подставлять("Плюсик", Перечисление.Булево.+);

П.С. У тебя прям в конфигураторе в ИД стоит "+"?
Ответили: (214)
+ 1 [ shtah; ]
# Ответить
3. O-Planet 24.06.2008 08:07
Вот это - однозначно зачет! Даж сама идея скрестить SQLLite и 1C уже на "+" тянет.
+ 1 [ janber; ]
# Ответить
20. orefkov 24.06.2008 15:03
(19)
2500 - для моряка это пыль :)
+ 1 [ German; ]
# Ответить
29. orefkov 25.06.2008 09:22
В дополнение к 28.
Вообще-то, приведенный тобой отчет делается вообще без перебора справочника товаров.
+ 1 [ JohnyDeath; ]
# Ответить
248. orefkov 15.02.2012 16:20
create unique index
+ 1 [ alyuev; ]
# Ответить
41. JohnyDeath 25.06.2008 13:47
(36,37) А что хитрого? Я ж тебе без иронии посоветовал. А по-другому никак: пока сам не сядишь, никакой чужой запрос тебе не поможет.
Ответили: (42)
+ 1 [ artbear; ]
# Ответить
68. ADirks 27.06.2008 08:26
2 hogik
Навигационный метод получения данных это конечно здорово и всё такое. Знать как это работает действительно необходимо, и без этого никогда не решишь задачу методами декларативными. Но вот вопрос: почему же тогда все стараются использовать декларативные методы вместо процедурных?
Мне в своё время пришлось много поработать с BTreeve, и восторга от этого я как-то не испытывал. На SQL я делаю то же самое, но быстрее, и с меньшими травмами мозга. Да, при этом я в любой момент могу досконально разобраться, во что раскрутится мой запрос, но в большинстве случаев это не требуется.

P.S. Это ни в коем случае не упрёк или наезд. Это просто реплика из зала. Личное мнение на основе личного опыта.
Ответили: (95) (71)
+ 1 [ orefkov; ]
# Ответить

Комментарии

1. German 23.06.2008 19:07
Не знал что Google Gears на нем основан ..
# Ответить
2. mdzen 23.06.2008 22:03
Поюзал. Прелестно! Если б с этой штукой консоль запросов (как в 8.0) замутить,то цены ей не будет.
Ответили: (189)
# Ответить
3. O-Planet 24.06.2008 08:07
Вот это - однозначно зачет! Даж сама идея скрестить SQLLite и 1C уже на "+" тянет.
+ 1 [ janber; ]
# Ответить
4. artbear 24.06.2008 08:08
Еще ветка для обсуждения на форуме прямых запросов для 1С -
http://www.1cpp.ru/forum/YaBB.pl?num=1214205575/0
Ответили: (137)
# Ответить
5. artbear 24.06.2008 08:21
Еще пример от Саши Орефкова
>>
В качестве примера - моя обработка - универсальное дерево подчиненности документов для ДБФ-версии.
>>1С++ не требуется, только 1sqlite.
http://www.1cpp.ru/forumfiles/Attachments/docgraph.zip
Ответили: (23)
# Ответить
6. JohnyDeath 24.06.2008 10:44
Круть! Просто круть!
# Ответить
7. Свой 24.06.2008 12:16
Народ, расскажите, что планируете сделать с помощью данной компоненты ?
# Ответить
8. JohnyDeath 24.06.2008 12:59
Учебник в зубы: http://www.1cpp.ru/forum/YaBB.pl?num=1148874473 , замер производительности и вперёд! ;)
# Ответить
9. Sbs 24.06.2008 13:00
Ну вот... И что теперь с 1с++ делать? Только начинаю въезжать и использовать прямые запросы...

Однозначно! +!

А можно ли этим чудом потянуть данные из постороннего дбф (не из базы)?
В обработке "поисктовара" не прошли попытки типа :
запрос.ВыполнитьЗапрос("create virtual table Товары1 using dbeng(Dt1628)") ;
текст="SELECT * FROM Товары1" ; //(c путями к файлу игрался)
Ответили: (10)
# Ответить
10. orefkov 24.06.2008 13:36
(9)
DBF-ки отображаются только из родной базы.
# Ответить
11. Сhe Burashka 24.06.2008 13:38
ой, чувствую супершедевр какой-то... только начинаю прямые запросы читать (скуль для чайников активно изучаю) - а тут еще... что делать-то? что юзать для DBF-ины? 1С++ или эту?
Ответили: (14) (13)
# Ответить
12. orefkov 24.06.2008 13:40
Завел проект на googlecode
http://code.google.com/p/sqlite1c/
Исходники качать любым svn-клиентом.
# Ответить
13. orefkov 24.06.2008 13:44
(11)
Ну, если нужно работать в дбф монопольно, то другого пути нет.
А изучать 1С++ - завсегда пригодится.
Ответили: (273)
# Ответить
14. orefkov 24.06.2008 13:46
(11)
Вообще-то, строго говоря - изучать надо структуру базы 1С и язык SQL.
А 1С++ и 1sqlite - просто инструменты для доступа к базе.
# Ответить
15. Сhe Burashka 24.06.2008 13:53
Уе! зашибись! красивое дерево документов....
а вот если бы в поиске клиентов работала фонетическая похожесть....???
Ответили: (18) (17)
# Ответить
16. Сhe Burashka 24.06.2008 14:03
1С++ для работы с данной DLL - не требуется?
Ответили: (17)
# Ответить
17. orefkov 24.06.2008 14:14
(15)
Напиши алгоритм для выяснения фонетической похожести. Движок SQLite позволяет и свои функции на С++ подключать.
Встроим ее в компоненту, будешь писать where ПохожеНа(descr, 'вася') > 1
(16)
1sqlite самодостаточная компонента, скрипач не нужен.
Ответили: (18)
# Ответить
18. Сhe Burashka 24.06.2008 14:19
(17) спсб за оперативные ответы!!!
по (15) я - не умею.. *-(
# Ответить
19. Сhe Burashka 24.06.2008 14:19
выборку справочника товаров на 2500 позиций делает мгновенно...
Ответили: (130) (27) (23) (20)
# Ответить
20. orefkov 24.06.2008 15:03
(19)
2500 - для моряка это пыль :)
+ 1 [ German; ]
# Ответить
21. torg1c 24.06.2008 16:29
Мини-консоль для запуска запроса. Можно примерчик для консоли?
Ответили: (122) (22)
# Ответить
22. orefkov 24.06.2008 16:49
(21)
Ну, нажимаешь "Подключаемые таблицы", ставишь галку на Справочник.Номенклатура, потом пишешь в окошке
select id [Товар :Справочник.Номенклатура]
from Справочник_Номенклатура
where descr between 'Б' and 'Г'

Жмешь F5.
Видишь все товары, чьи наименования начинаются на Б, В. Если есть товар с названием "Г", его тоже увидишь.
# Ответить
23. hogik 24.06.2008 17:10
(19)(Сhe Burashka)
“выборку справочника … делает мгновенно...”
Если в запросе не используется индекс – естественно. Это к вопросу (5) из http://infostart.ru/projects/2089. Выборка обычный циклом без индекса будет работать также быстро.
Ответили: (130) (27)
# Ответить
24. hogik 24.06.2008 19:15
Интересная разработка. В части подцепить внешнюю СУБД и дать удобный интерфейс к ней – отлично. А в части прямых запросов к DBFной базе данных 1Са, для данной СУБД – очередной самообман. Достаточно иметь средство отключения индекса при просмотре таблицы и скорость выборки, для некоторых задач, значительно повысится. При этом можно будет пользоваться стандартными языковыми средствами 1Са обработки данных. Конечно для полноценной (эффективной) обработки данных полезно иметь возможность искать и позиционироваться на запись по ключу (чего нет в стандартном языке 1Са), но это реализуется гораздо проще и в использовании проще, чем написание никчемных запросов.
Хотя это дело вкуса :-)
Ответили: (26) (25)
# Ответить
25. orefkov 24.06.2008 23:18
(24)
Буду очень благодарен, если ты покажешь мне, на каких типичных задачах в 1С помогла бы выборка в физическом порядке записей.
Тупая выборка из таблица без упорядочивания мало кому интересна.
А "никчемные" запросы рвут язык 1С как тузик грелку, хоть на родном движке dbeng32, хоть на прилепленном тобой движке.
Дико извиняюсь, но твою подмену движка 1С я рассматриваю как попытку поставить более мощный движок на машину с квадратными колесами (язык 1С).
Как не форсируй движок, только грохота от колес больше, а толку не много.
А эта разработка - попытка к боле-менее нормальному движку (dbeng32) приделать круглые колеса, на каких во всем мире принято ездить.
Ответили: (26)
# Ответить
26. hogik 25.06.2008 00:54
(25)
По пунктам:
1) “ты покажешь мне, на каких типичных задачах” – У меня в (24) написано “некоторых”. Например, отчет по остаткам для всех товаров с сортировкой по реквизиту, не имеющему индекса. Результат записывается в рабочий файл (массив) и потом сортируется по данному реквизиту. Но в 1С справочник всегда просматривается с учетом индекса, в данном случае, не имеющем никакого отношения к поставленной задаче. Другой пример, это когда надо выполнить задачу из Вашего примера “поисктовара.ert”. Ведь в Вашем примере результат поиска заносится в таблицу значений и перед её отображением можно выполнить сортировку по любому реквизиту. И т.д.
2) “Тупая выборка из таблица без упорядочивания мало кому интересна” – В любом отчёте, где не удаётся уменьшить количество релевантных записей путем применения индекса, требуется именно такая “Тупая выборка”.
3) “запросы рвут язык 1С как тузик грелку” – В случае клиент серверной технологии уменьшают нагрузку на сеть, используют кэширование на сервере, использую более производительную подсистему ввод/вывода сервера и т.д. А в Вашей разработке прямые запросы только расширяют возможности языка 1Са доступа к данным. Но расширить возможности языка в этой части можно и другим способом. Причем здесь (в этой Вашей фразе) запросы?
4) “хоть на родном движке dbeng32” – А Вашей разработке используется другой движок?
5) “хоть на прилепленном тобой движке” – Мой движок “прилеплен” с другой целью. И без изменения конфигурации обеспечивает производительность выше, чем в SQLной версии 1Са. При сопоставимой надежности. И гораздо меньшими затратами на железо, программное обеспечение, доработку системы и т.д. А в части повышения скорости работы 1Са с изменением конфигурации в моей разработке описаны средства расширения стандартного языка 1Са. Описание этих средств укладывается на одной странице формата А4. И по количеству строчек, добавляемых в конфигурацию меньше, чем аналогичное решение задачи с применением запросов SQL. При этом написать алгоритм выборки данных можно более эффективный с меньшими затратами мозгов.
6) “ Дико извиняюсь, но твою подмену движка 1С я рассматриваю…” – Оставлю без комментариев.
7) “только грохота от колес больше, а толку не много” – Работает с базой в 6 гигабайт (только DBFов), одновременно 50-75 человек. Круглосуточно, розница, 50000 наименований товаров, несколько сот тысяч видов работ в производстве. Днем, в часы пик, документы ложатся в базу каждые пять секунд. Стоимость сервера (компьютера) 1200 долларов (три года назад).
8) “А эта разработка - попытка к боле-менее нормальному движку (dbeng32) приделать круглые колеса” – Так мы говорим о движке или о приделках к нему “круглых колес”? Т.е. о форме или содержании? У меня сложилось впечатление, что Вы к плохому движку приделали бантики. И ожидаете, что в целом это будет работать лучше. Т.е. сделали косметический ремонт.
9) “на каких во всем мире принято ездить” – Если Вы имеете в виду язык SQL, то на нем “ездят” многие. Только “управляют” этой “машиной” люди с головой.
Ответили: (140) (44) (28) (27)
# Ответить
27. hogik 25.06.2008 01:54
(26)+
Да, совсем забыл сказать. В (19) Сергей (Сhe Burashka) отметил высокую скорость выборки в Вашей разработке. Думаю, он пробовал “поисктовара.ert”. Я в (23) написал “Если…”. Вношу исправления в своё сообщение. Никаких “если”. Именно так и есть. Таблица просматривается в физической последовательности. Это и есть основная причина быстрого выполнения выборки информации. И запрос (как инструмент) не имеет к повышению скорости никакого отношения.
Ответили: (130)
# Ответить
28. orefkov 25.06.2008 09:02
(26)
Вообще, ты приводишь много утверждений, мало относящихся к действительности.
Для начала - движок 1С не может просматривать таблицу в порядке индекса.
Делаем запрос - select rowid, descr from Справочник_Номенклатура
Видим - опана - результат выдается в порядке физических записей, безо всяких индексов, хотя я использую родные методы dbeng32.dll
Далее - ты говоришь, что выборка в порядке индекса чудовищно проигрывает выборке в порядке физических записей.
Проверяем: 1ый Запрос, выборка без индекса.
select rowid from Справочник_Номенклатура
Выполнено: строк 16961, время 37 мс.
2ой запрос, выборка по индексу IDD
select rowid from Справочник_Номенклатура order by id
Выполнено: строк 16961, время 38 мс.
3й запрос, выборка по индексу PDESCR
select rowid from Справочник_Номенклатура order by descr
Выполнено: строк 16961, время 58 мс.
Вывод - при выборке в порядке индкеса скорость уменьшается в зависимости от длины ключа.
При коротких ключах (ID - 9 символов, DESCR - 100 символов) скорость практически не изменяется.
Но даже и на длинном ключе индекса, чудовищных провалов нет.
Ну и наконец приведенный тобой пример задачи
"Например, отчет по остаткам для всех товаров с сортировкой по реквизиту, не имеющему индекса."
Осторожнее, не вводи в заблуждение неискушенных пользователей.
Основная нагрузка здесь - получение остатков по товару из регистра, при чем здесь перебор справочника в физическом порядке?
Попробуй сделать это, просматривая еще и файлы регистров в порядке физических записей.
То есть гипотетический расклад расхода времени примерно таков:
Перебор справочника товаров - 5%
Для каждого товара вычисление остатка - 80%
Сортировка результата: 15%
Пусть вместо перебора справочника по индексу используется перебор в порядке физических записей.
Какой выигрыш мы в итоге получим?
Зависит от того, по какому индексу ходит сама 1С.
Если по IDD, то как было показано выше - разницы практически нет.
Если по PDESCR, то да, выборка пройдет в 1.5 - 2 раза быстрее. Однако учитывая, что в общем времени рассчета отчета этот этап занимал 5%, то в целом ускорение отчета составит ничтожную величину.
Можешь написать, как бы делал такой отчет с помощью твоих расширений языка 1С?
Очень бы было интересно посмотреть.
# Ответить
29. orefkov 25.06.2008 09:22
В дополнение к 28.
Вообще-то, приведенный тобой отчет делается вообще без перебора справочника товаров.
+ 1 [ JohnyDeath; ]
# Ответить
30. orefkov 25.06.2008 10:17
Ну и еще в дополнение к 28.
Построение отчета для ТиС.
Получение остатка товаров на ТА с упорядочиванием по реквизиту ВидНоменклатуры:
Код
Процедура Сформировать()
   Попытка
      база = СоздатьОбъект("SQLiteBase");
   Исключение
      ЗагрузитьВнешнююКомпоненту("1sqlite.dll");
      база = СоздатьОбъект("SQLiteBase");
   КонецПопытки;
   база.Открыть(":memory:");
   запрос = база.НовыйЗапрос();
   запрос.ВыполнитьЗапрос("create virtual table ОстаткиТМЦ using dbeng(РегистрИтоги.ОстаткиТМЦ)");
   запрос.ВыполнитьЗапрос("create virtual table Номенклатура using dbeng(Справочник.Номенклатура)");
   
   запрос.Подставлять("ДатаТА", НачМесяца(ПолучитьДатуТА()));
   //запрос.Отладка();
   т1 = _GetPerformanceCounter();
   тз = запрос.ВыполнитьЗапрос("
   |select
   |   Номенклатура.ВидНоменклатуры [ВидНоменклатуры :Перечисление.ВидыНоменклатуры],
   |   Остатки.Номенклатура [Товар :Справочник.Номенклатура],
   |   Остатки.Остаток [Остаток :Число.15.5]
   |from
   |   (select
   |      Номенклатура,
   |      sum(Количество) Остаток
   |   from ОстаткиТМЦ
   |   where Period = :ДатаТА
   |   group by Номенклатура) Остатки
   |   left join Номенклатура on Остатки.Номенклатура = Номенклатура.id
   |order by Номенклатура.ВидНоменклатуры
   |");
   т2 = _GetPerformanceCounter();
   Сообщить("Время выполнения запроса: " + (т2 - т1) + " Строк получено: " + тз.КоличествоСтрок());
   
   тз.ВыбратьСтроку();
КонецПроцедуры
Показать полностью

Решения с помощью твоего расширения языка 1С пока не вижу.
Ответили: (121) (95) (82) (59) (46)
# Ответить
31. JohnyDeath 25.06.2008 10:39
ПолуОФФ: Саш, а может ты телепат докрутишь так, чтоб было удобно писАть запросы для 1sqlite?
# Ответить
32. orefkov 25.06.2008 10:40
В дополнение к 30.
Сравнил со штатным запросом 1С.
Код
Процедура Сформировать1С()
   Перем Запрос, ТекстЗапроса, Таб;
   //Создание объекта типа Запрос
   Запрос = СоздатьОбъект("Запрос");
   ТекстЗапроса = 
   "//{{ЗАПРОС(Сформировать1С)
   |Без итогов;
   |Товар = Регистр.ОстаткиТМЦ.Номенклатура;
   |Количество = Регистр.ОстаткиТМЦ.Количество;
   |Функция Остаток = КонОст(Количество);
   |Группировка Товар упорядочить по Товар.ВидНоменклатуры без групп;
   |"//}}ЗАПРОС
   ;
   
   т1 = _GetPerformanceCounter();
   Запрос.Выполнить(ТекстЗапроса);
   т2 = _GetPerformanceCounter();
   
   тз = СоздатьОбъект("ТаблицаЗначений");
   Запрос.Выгрузить(тз, 2, 0);
   Сообщить("Время 1С:" + (т2 - т1) + " Строк: " + тз.КоличествоСтрок());
   тз.ВыбратьСтроку();
КонецПроцедуры
Показать полностью

Даже на демке ТиСа, где остатки всего по 61 товару, получил при нескольких запусках:

Время 1С:269 Строк: 61
Время выполнения запроса: 2 Строк получено: 61
Время 1С:318 Строк: 61
Время выполнения запроса: 2 Строк получено: 61
Время 1С:425 Строк: 61
Время выполнения запроса: 2 Строк получено: 61
Время 1С:430 Строк: 61
Время выполнения запроса: 2 Строк получено: 61
Ответили: (59)
# Ответить
33. Сhe Burashka 25.06.2008 12:38
прям битва титанов, Орефкова и Ходжика ... ;-)
читать это все жутко интересно... Просьба к мэтрам, по возможности, конструктивно обсуждать, а то вы чего-то злобствовать начали...
По мну, например данная разработка видимо будет стартовой площадкой к освоению прямых запросов на 1С++ - потренируюсь пока на DBFe - как-то оно чуть более понятно...
.. в качестве варианта предлагаю запрограммить парочку тяжелых отчетов для типовой тис, например, отчет о состоянии заявки...
тьфу, как-то все сумбурно...
Ответили: (43) (35)
# Ответить
34. Свой 25.06.2008 12:49
восьмерка нервно курит в сторонке :)
# Ответить
35. JohnyDeath 25.06.2008 12:50
(33) .. в качестве варианта предлагаю запрограммить парочку тяжелых отчетов для типовой тис, например, отчет о состоянии заявки...
Кому предлагаешь? Если сам хочешь вкурить, то сам и пробуй написать. ;)
Ответили: (36)
# Ответить
36. Сhe Burashka 25.06.2008 12:56
(35) Хитрый, аднака! ;-)
# Ответить
38. Сhe Burashka 25.06.2008 12:58
Тут панимаешь монстры пиписьками меряются ;-) - куда уж мне ;-)
По хорошему, взять две типовые ТиСы, на одну сабж прикрутить, на вторую - движок Ходжика
и рассмотреть - +/-, удобства/неудобства и т.д. - весьма пользительный и интересный материал бы получился (имхо)
Ответили: (40)
# Ответить
39. Свой 25.06.2008 13:39
Бухитоги не видит компонента ?
Ответили: (48)
# Ответить
40. JohnyDeath 25.06.2008 13:46
(38) ну если ты возьмёшься переписать все трудные места на прямые запросы - флаг в руки. ИМХО, это очень кропотливая работа и никто просто так делать её не будет
# Ответить
41. JohnyDeath 25.06.2008 13:47
(36,37) А что хитрого? Я ж тебе без иронии посоветовал. А по-другому никак: пока сам не сядишь, никакой чужой запрос тебе не поможет.
Ответили: (42)
+ 1 [ artbear; ]
# Ответить
42. vip 25.06.2008 13:59
(41) Товарищ Че будет ждать подробной документации и всеобъемлющих примеров.
Хорошо еще, что не сказал, что стыдно выкладывать такую сырую поделку без должного документирования и что разработчики в очередной раз зажрались.
# Ответить
43. orefkov 25.06.2008 15:38
(33)
Ну, вот сляпал "Состояние заявки". Проверьте. Единственно, что период берется только от дкумента до ТА.
ВК для отчета нужно 1.0.1.4
# Ответить
44. hogik 25.06.2008 16:52
(28-30,32) (orefkov)
1) “много утверждений, мало относящихся к действительности” - Полностью с Вами согласен. Надеюсь, что дальнейшее наше обсуждение это прояснит. И мы начнем говорить об одной и той же “действительности”. Пока мы говорим о разных вещах. А если говорить о действительности, то было бы интересно узнать информацию аналогичную той, что я привел в пункте номер 7 сообщения (26) только с применением Вашей разработки.
2) “движок 1С не может просматривать таблицу в порядке индекса” – Возможно, Вы забыли поставить “не” перед “порядке индекса”. Я эту фразу буду обсуждать с учетом “не”. Я этого не говорил. Мало того, в своей разработке даю возможность просматривать таблицы в физической последовательности в рамках интерфейса движка. Но наличие этой возможности в движке и его интерфейсе не говорит о том, что в стандартном языке и алгоритмах 1Са это используется.
3) “ты говоришь, что выборка в порядке индекса чудовищно проигрывает выборке в порядке физических записей” – И этого я не говорил. Я говорил, что проигрывает. А чудовищно или не чудовищно зависит от масс других факторов. Я говорил, что, то ускорение, которое наблюдал Сергей, связано с просмотром таблицы в физической последовательности. Но не только от этого.
4) “при выборке в порядке индкеса скорость уменьшается в зависимости от длины ключа” – И от этого тоже.
5) “Ну и наконец приведенный тобой пример задачи… не вводи в заблуждение неискушенных пользователей” – Никакого ввода в заблуждение я не делаю. Я привожу пример просмотра всей таблицы и только. Второй, мой, пример на базе “поисктовара.ert” должен прояснить пользователю суть моего первого примера.
6) “Основная нагрузка здесь - получение остатков по товару из регистра, при чем здесь перебор справочника в физическом порядке?” – А причем здесь остатки.
7) “Попробуй сделать это, просматривая еще и файлы регистров в порядке физических записей” – У нас нет никаких регистров. Но суть фразы меня настораживает. Я ни в одном своём сообщении в этой теме не предлагал заменять просмотр по индексу на просмотр в физической последовательности.
8) “расклад расхода времени примерно таков” – Это у Вас такой расклад. У нас получение остатков делается одной командой найти по ключу. Но это совсем другая тема. Будет у Вас желание – обсудим. А по сути самих цифр Вашего примера смотрите ответ в пункте номер 5 данного сообщения.
9) “Можешь написать, как бы делал такой отчет с помощью твоих расширений языка 1С?” – Для сравнения скорости - точно такой отчет написать не могу. Т.к. в типовой ТиС у меня нет большой базы, а в нашей базе нет никаких регистров. И соответственно нет такого соотношения, приведенных, Вами цифр. При этом этот пример не имеет никакого отношения к теме нашего обсуждения. Мы обсуждаем - смотрите пункт номер 3 данного сообщения. И я утверждаю, что никакого отношения к этому факту запрос не имеет. Что касается примеров из моей разработки к обсуждаемой теме – они есть в подкаталоге EXT.
10) “приведенный тобой отчет делается вообще без перебора справочника товаров” – Я не приводил пример отчетов. Я приводил пример полного просмотра таблицы. Зачем, же так конкретно этот пример воспринимать?
11) “Построение отчета для ТиС … Решения с помощью твоего расширения языка 1С пока не вижу” – Попробую написать. Только не так быстро. Я с 2000 года не имею никакого отношения к таким понятиям как регистры, ТА и т.д. Забыл уже многое.
12) “Сравнил со штатным запросом 1С” – И не буду. Т.к. это совсем не в нашей теме. Сравнивать скорость выполнения штатных запросов имеет смысл в DBFной, SQLной версиях 1Са и в моей разработке. И желательно в реальных условиях – по сети.
Ответили: (46)
# Ответить
45. Сhe Burashka 25.06.2008 18:24
Спасибо всем откликнувшимся!!!!!!! особенно товарищу Орефкову, чья... ну эта... принадлежность оказалась самой длинной ;-)
Буду тестить и активно вкуривать...
ПОТОМУ ЧТО 8-КА МЕНЯ НЕ ПОРАДОВАЛА СВОИМ БЫСТРОДЕЙСТВИЕМ...
# Ответить
46. hogik 25.06.2008 20:17
+(44)
Написал аналог программы из (30) на средствах прямого доступа из своей разработки. Это не самый лаконичный и эффективный способ решения данной задачи. Её можно решать, например, построением постоянного индекса, установкой фильтров на стороне сервера и т.д. Т.е. я хотел представить самый очевидный способ решения задачи для начала конструктивного разговора на эту тему.
Код
Процедура Выполнить()
   Перем Тов,Рег,Инд,Зап,Таб,Дат,ИдТ,Поз,Пус;
   ЗагрузитьВнешнююКомпоненту("AddInExt.dll");
   Ext=СоздатьОбъект("AddIn.AddInExt");
   Тов=СоздатьОбъект("Справочник.Номенклатура");
   Пус=ЗначениеВСтрокуВнутр(ПолучитьПустоеЗначение("Справочник.Номенклатура"));
   Рег="РегистрОстаткиТМЦ";
   Инд="PROP";
   Дат=Формат(НачМесяца(ПолучитьДатуТА()),"ДГГГГММДД");
   Таб=СоздатьОбъект("ТаблицаЗначений");
   Таб.НоваяКолонка("ИдТов","Строка");
   Таб.НоваяКолонка("Код","Строка");
   Таб.НоваяКолонка("Наименование","Строка");
   Таб.НоваяКолонка("ВидТов","Строка");
   Таб.НоваяКолонка("Количество","Число");
   Зап=Ext._(41,Рег,Инд,Дат);
   Пока Число(Зап)>0 Цикл
      Если Ext._(43,Рег,"PERIOD")<>Дат Тогда Прервать; КонецЕсли;
      ИдТ=Ext._(43,Рег,"Номенклатура");
      Поз=0;      
      Если Таб.НайтиЗначение(ИдТ,Поз,"ИдТов")=0 Тогда
         Тов=ЗначениеИзСтрокиВнутр(Ext._(22,Ext._(43,Рег,"Номенклатура"),Пус));
         Таб.НоваяСтрока();
         Таб.ИдТов=ИдТ;
         Таб.Код=Тов.Код;
         Таб.Наименование=ВРег(СокрЛП(Тов.Наименование));
         Таб.ВидТов=Тов.ВидНоменклатуры;
         Таб.Количество=0;
      КонецЕсли;
      Таб.Количество=Таб.Количество+Число(Ext._(43,Рег,"Количество"));
      Зап=Ext._(42,Рег,Инд,Зап,1);   
   КонецЦикла;
    Таб.Сортировать("ВидТов");
   Таб.ВыбратьСтроку();
    Таб.Сортировать("Код");
   Таб.ВыбратьСтроку();
    Таб.Сортировать("Наименование");
   Таб.ВыбратьСтроку();
КонецПроцедуры
Показать полностью
Ответили: (130) (121) (106) (95) (59) (48)
# Ответить
47. Сhe Burashka 25.06.2008 22:28
..мдя... это надо осмыслить...
# Ответить
48. orefkov 25.06.2008 23:37
(39)
В компоненте есть доступ к системным таблицам 1Sxxxx.
Так что вполне можно обратится к бухитогам.
Только пока не сделана типизация :Субконто.
Но доделаю в ближайшее время.
(46)
О, вот пошел конструктивный разговор. Отлично. Таки вот рассказываю, как выполняются запросы в SQLite.
Текст запроса парсится движком SQLite, и для выполнения запроса создается "мини-программа", некий байт-код,
который затем исполняется виртуальной машиной SQLite (VDBE - virtual database engine - часть движка SQLite)
Эту программу можно просмотреть - достаточно перед текстом запроса добавить слово "explain", и вместо выполнения запроса будет возвращена программа его выполнения.
Это преамбула была. А теперь амбула.
Если посмотреть программу выполнения того запроса, то можно увидеть, что алгоритмически она практически эквивалентна приведенному тобой алгоритму.
Но. Выполнения этой программы делается не интерпретатором 1С, а интерпретатором SQLite, который гораздо шустрее.
Кроме того, заточен он именно на выполнение типичных операций с данными, например, вместо примитивного поиска/вставки в ТЗ используется поиск/вставка в индексированной временной таблице и тп.
Вот такие плюсы вырисовываются - вместо ручного написания алгоритма на 1С, с медленным выполнением его интерпретатором 1С, более короткий и лаконичный запрос, который преобразуется практически в такой же алгоритм, но еще и выполняемый гораздо быстрее и эффективнее.
Ответили: (123) (50)
# Ответить
49. orefkov 25.06.2008 23:40
Народ, кто-нить пробовал проверить выложенный отчет "Состояние заявки" ?
Интересны результаты на нормальных базах, а то я только на демке ТиСа проверял.
Да, там если фильтр по товару ставить, немного лишних данных может вылазить, не обращайте внимания, я попозже поправлю.
Ответили: (51)
# Ответить
50. hogik 26.06.2008 00:54
(48)
1) ” Таки вот рассказываю, как выполняются запросы в SQLite” – Уважаемый Александр. Пожалуйста, не отвлекайтесь на такие мелочи. Я в курсе того, как выполняется запрос в SQLite и как Вы “подцепились” к ней в своей разработке.
2) “Выполнения этой программы делается не интерпретатором 1С, а интерпретатором SQLite, который гораздо шустрее” – Давайте, откажемся от двойных стандартов. Вы очень конкретно привели мне цифры, по моему примеру “отчета” по остаткам – какую долю времени занимает просмотр таблицы в физической или по индексу последовательности по отношению к взятию остатков. Так сделаете это и в случае сравнения Вашей разработки с предложенным мной способом расширения штатного языка 1Са. И если Вы призываете к “конкретному разговору” то давайте конкретно – “цифры в студию”. А потом сопоставьте их со скорость работы самого движка – стандартного 1Совского и моего “прилепленного” движка. Далее вспомните о надежности клиент/серверного решения, о снятом ограничении на размер таблицы, об устранении клинчей и проблемы 100% занятости процессора, о возможности выполнения примитивных запросов и фильтров на стороне клиента, о возможности построения постоянного индекса и т.д.
3) “Кроме того, заточен он именно на выполнение типичных операций с данными” – С положительной стороной этого в Вашей разработке я согласен. Поэтому и поставил плюс в рейтинг. Однако конкретная заточка в моём решении прямого доступа к таблицам легко делается на уровне языковых средств 1Са и у меня в конфигурации она сделана.
4) “вместо ручного написания алгоритма на 1С” – Это классическое заблуждение о том, что можно писать эффективные информационные задачи на SQL без знания схемы базы данных, основ СУБД, особенностей работы движка и т.д.
5) “запрос, который преобразуется практически в такой же алгоритм” – Алгоритм запроса из наших примеров преобразуется не в меньшее количество операций ввода/вывода, чем у меня написано навигационным способом. Понимание и осознание пользователем того, как преобразуется алгоритм запроса, часто требует больше усилий, чем это требуется для написания задачи навигационным способом. Количество нажатых кнопок на клавиатуре не сильно отличается. Ну и самое главное. Навигационным способом доступа к данным можно написать любую задачу (в нашей специальности) с гарантированной самой высокой производительностью, на что способен движок. Иными словами. Если существует запрос, то всегда можно написать эту задачу навигационным способом и это будет работать также или быстрее. При этом затраты на написание алгоритма отличаются не значительно (см. наши примеры). Это особенно справедливо, если схема базы данных заточена под навигационные алгоритмы обработки данных, как это сделано в “1С 7.7”.
6) “но еще и выполняемый гораздо быстрее и эффективнее” – Это неправда. Запрос, в данном контексте, не при чем.
В заключение этого, моего сообщения, хочу повторить еще раз, что в части прямых запросов в Вашей разработке - это косметика для продукта, который надо либо выбросить, либо вносить существенный изменения. Либо продолжать считать 1С 7.7 игрушкой для использования, образно говоря, в монопольном режиме в качестве текстового редактора.
# Ответить
51. Sbs 26.06.2008 01:53
(49) посмотрел отчет о состоянии на живой базе. У нас в регистр.резервыТМЦ добавлено измерение "партии", поэтому в строках документа и движениях номенклатура может повторяться.
В этом случае получаем Резерв = Выписано * КоличествоСтрокСДаннойНоменклатурой. (В общем-то случай частный...).
По скорости со штатным запросом сравнивать смысла нет - отрабатывает мгновенно.
# Ответить
52. Сhe Burashka 26.06.2008 02:51
Поясните, плиз, что значит " навигационные алгоритмы", "навигационный способ"...?
я догадываюсь, но хочется определенности...
# Ответить
53. Сhe Burashka 26.06.2008 02:55
что-то я потерялся... обсуждение чего идет..? Ходжик говорит, что то, что сделал Орефков - это типа "костыль" для инвалида - ходить будет, и даже возможно бегать сможет, но в соревнованиях - не выиграет... и в соревнованиях имеет смысл допускать инвалидов, которым вместо костылей приживили фоигенные сервомотрочики вместо ног...? типа правильно я понял?
Ответили: (59)
# Ответить
54. Сhe Burashka 26.06.2008 03:13
бегло затестил обработку по отчету о состоянии заявки - переделал вывод в базовых единицах.. ну что сказать... штатная считала... эээээ... не хочится озвучивать... - взял заявку из ПРЕДЫДУЩЕГО МЕСЯЦА - считала штатная отчетина более полутора минут - мне ждать надоело - полез комменты читать - орефковская - отсчитала секунды за 3-4 (субъективно большую часть времени заняло обновление строки состояния)... В штатной все время занимает расчет остатков на дату заявки - идет долгая сборка данных...
Ответили: (58)
# Ответить
55. Сhe Burashka 26.06.2008 03:18
в проверяемой заявке - 400 строк...
# Ответить
56. hogik 26.06.2008 03:56
(52,53)(Сhe Burashka)
Навигационный способ, в части чтения:
1) Установить позицию на запись в таблице по ключу индекса или номеру записи.
2) Переместиться по таблице на N записей к началу или концу таблицы от текущей записи в порядке индекса или физическом порядке.
3) Установить позицию на начало или конец таблицы в порядке индекса или физическом порядке.
Моя основная мысль в данном осуждении, что утверждение Александра “запросы рвут язык 1С как тузик грелку” есть самообман. Я считаю, что в языке 1Са не хватает навигационных команд для написания полноценных и эффективных алгоритмов. И запрос к этому не имеет никакого отношения. Запрос в данной разработке лишь использует полный набор навигационных команд. Возможно не всегда оптимальным образом. Писать алгоритм в виде заброса или непосредственно навигационными командами – дело вкуса. Однако при написании алгоритма непосредственно навигационными командами можно всегда обеспечить максимальную эффективность.
Далее мы сползли на обсуждение моего “прилепленного” движка, т.к. в нем, кроме всего прочего, есть расширения стандартного языка 1Са в части прямого доступа к таблицам навигационными командами. Естественно, далее я стал говорить о “всем прочем” в моей разработке. И пытаюсь подвести собеседника к тому, что мной изготовленные “костыли” имеют большее значение, чем средства написания алгоритмов выборки. Т.е., что “содержание” важнее “формы”. Хотя и признаю, что “форма” в этой разработке сделана хорошо.
На вопрос “обсуждение чего идет..?” затрудняюсь ответить. Обмен текстами идет, но, по-моему, в разных темах. :-(((
Ответили: (57)
# Ответить
57. hogik 26.06.2008 04:23
+(56)(Сhe Burashka)
Кстати. Использование разработки 1SQLite не отменяет возможности использования моей разработки в части режима клиент/сервер. Единственно, что запросы будут выполняться на стороне клиента. Т.е. в чистом виде будут давать только удобство их написания, а не повышать эффективность системы в целом как это задумывалось для клиент/серверной технологии. При этом если, в моей разработке на CodeBase использовать не клиент/серверный режим (у меня это названо – ПДБД) в режиме терминал сервер, то все мои доработки остаются в силе в части:
1) Снятия ограничения на размер таблицы.
2) Устранения клинчей.
3) Разгрузка 100% занятости процессора.
4) Более высокая скорость работы движка.
5) Решение проблемы потери эффективности для больших таблиц.
6) Неограниченное количество пользователей (бесплатно).
7) И т.д.
Кроме этого можно использовать одновременно с 1SQLite и мои расширения штатного языка 1Са в части прямого доступа к таблицам.
Ответили: (58)
# Ответить
58. orefkov 26.06.2008 08:48
(54)
В типовой ТиС (по крайней мере в той версии, что у меня есть (9.2 7.70.947)) для этого отчета не совсем оптимален регистр Заявки и ЗаказыЗаявки.
Если в регистре Заявки у измерения ЗаявкаПокупателя включить "Отбор движений", в ЗаказыЗаявки у измерения ЗаявкаПокупателя поставить "Отбор итогов", и слегка переписать запрос, можно добится еще большей скорости выполнения отчета.
(57)
А вот это радует.
Если я правильно понял, можно использовать с 1С твой движок, и моя компонента все-равно будет работать?
Ответили: (61)
# Ответить
59. orefkov 26.06.2008 09:00
(53)
Не по словам суди, а по делам.
Ты ведь пример отчета запускал. Костыль это или сервомоторчик?
К тому же можно взять, и запустить код из (30), (32), (46), замерить время.

Больше кому-то что-то доказывать я не собираюсь.
Молча делаю свою работу.
Ответили: (60)
# Ответить
60. Ёпрст 26.06.2008 13:15
(59) Главное не останавливаться.
# Ответить
61. hogik 26.06.2008 15:10
(58)
“можно использовать с 1С твой движок, и моя компонента все-равно будет работать?”
Никаких противоречий для этого нет. Ошибки, конечно, могут выскочить. Но их проявление, думаю, будет очевидным сразу. И мы с Вами их быстро исправим, каждый со своей стороны.
“Больше кому-то что-то доказывать я не собираюсь”
Действительно, думаю, доказывать не надо. Но обсуждать “теорию”, а не только “практику” – имеет смысл.
“Молча делаю свою работу”
Уважаемый Александр. Это зря, в смысле “молча”. Думаю, Вашу разработку совершенно реально “подвинуть в направлении” клиент/серверной технологии “рвущей как тузик грелку” SQLную версию “1С 7.7”. И не только в части участков, которые можно написать на прямых запросах, но и в целом. Но это решать только Вам. Надумаете – пишите, звоните…
# Ответить
62. Сhe Burashka 26.06.2008 18:04
2 Ходжик: спсб за разъяснения,
если есть возможность: поясните ценность "навигационного подхода" и его пользу при работе по поиску и выборкам данных по сложным условиям... как-то я слабо себе представляю ценность перемещения "навигационным подходом" по базе данных за исключением прямых выборок доков/справочников... или я чего-то не понимаю...?
в свое время писал небольшую СУБД, где все работало безо всяких ключей/индексов - привязка шла исключительно по физическим номерам записей - все просто летало... но процедура реструктуризации базы жмакала долго...
Ответили: (63)
# Ответить
63. hogik 26.06.2008 20:01
(62)(Сhe Burashka)
Сергей, и Вам спасибо за проявляемый интерес к данной теме.

Этот, на первый взгляд, простой и короткий, вопрос имеет длинный ответ. Правда, ответ то же простой и от этого излагать его сложно. У меня был случай, когда я целый месяц по 14 часов в сутки рассказывал “ЭТО” высококлассному программисту применительно к АСУпным задачам в части “SQL или не SQL”. Начинать надо с самого начала.
Чем отличаются (в части обработки данных) задачи АСУп от ИПС.
В ИПС требуется искать (выбирать) “вдоль и поперек”. Единственно (упрощаю изложение!), что можно сделать для ускорения обработки это построить индексы с простым индексным выражением. Тем самым уменьшить количество просматриваемых записей – установить по одному реквизиту позицию по ключу и далее двигаться по таблице, выполняя “лобовое” сравнение остальных реквизитов самой записи. Если говорить о наших задачах, то отчеты это ИПС.
В АСУп очень много алгоритмов выполняющихся регулярно по жесткому алгоритму. И для уменьшения количества просматриваемых записей вполне реально построить постоянные индексы со сложным индексным выражением. Приведу пример индекса для получения должников, при условии, что итоги хранятся в самом справочнике клиентов:
IIF(Отгружено>Оплачено,”-“,IIF(Отгружено<Оплачено,”+”,” “))+STR(ABS(Отгружено-Оплачено),15,2)
Т.е. для просмотра списка должников достаточно выполнить позиционирование по “-” и перемещаться в любом (!) направлении без предварительной выборки в массив. При этом количество просматриваемых записей будет равно количеству должников. Если говорить о наших задачах, то использование таких “индексов” это все остальные задачи кроме отчетов. Но можно использовать такие индексы и в отчетах с фиксированным алгоритмом основных критериев отбора.
Т.е. суть разницы между ИПС и АСУпом в части обработки данных это - где лежит само условие выборки – в алгоритме (условие запроса) или в данных (индексное выражение). При проектировании схемы базы данных необходимо учитывать это. Для универсальных систем, таких как “1C:Предприятие” это не простая задача. А если ориентироваться на движок, который не позволяет строить сложных индексных выражений, часто и вообще не решаемая задача. Что мы и видим в SQLной версии 1Са.

Вот такое начало моего ответа на Ваш вопрос. Дальше продолжать?
Ответили: (71) (66)
# Ответить
64. Сhe Burashka 26.06.2008 21:51
Ясен пень продолжать, если не в лом! ;-)
интерес есть, потому как постоянно хочется "попрограммить" для души - но удается редко, потому как больше востребованы именно "1Сные" задачи (постанови и развития учета), более тонкие моменты (оптимизация, ускорение, увеличение эффективности) - это задачи не "первой необходимости", и, как правило , если такая задача у организации стоит - то, скорее всего, уже и есть решатель...
# Ответить
65. kitt 27.06.2008 05:35
я таки правильно понял, что разыменовывание полей запроса при выполнении не поддерживается?
То есть такой запрос

//**********************************
SELECT
Ост.Товар [Товар :Справочник.Товары],
Ост.Товар.Артикул
FROM
РегистрИтоги_ОстаткиТоваров as Ост
//**********************************

не выполняется, выдавая ошибку: no such column Ост.Товар.Артикул.
А то было бы круто.
Хотя и так, круче некуда.
Спасибо большое!! :D
Ответили: (67)
# Ответить
66. orefkov 27.06.2008 08:23
(63)
Универсальную систему (типа 1С) на таких индексных выражениях не сделать. Приведенный тобой пример очень упрощен.
Хотел бы я посмотреть, как построить индексное выражение для поиска должников, если у одного клиента 6 отгрузок с разными датами и разными сроками кредита, 8 оплат разнесенных по разным договорам, да еще и накопительные бонусы какие-нить.
Ответили: (71)
# Ответить
67. orefkov 27.06.2008 08:25
(65)
Нет, не делается. Это не восьмерка и не запросы семерки.
Код
SELECT
Ост.Товар [Товар :Справочник.Товары],
Т.Артикул
FROM
РегистрИтоги_ОстаткиТоваров as Ост left join Справочник_Товары Т on Ост.Товар = Т.id
Показать полностью
# Ответить
68. ADirks 27.06.2008 08:26
2 hogik
Навигационный метод получения данных это конечно здорово и всё такое. Знать как это работает действительно необходимо, и без этого никогда не решишь задачу методами декларативными. Но вот вопрос: почему же тогда все стараются использовать декларативные методы вместо процедурных?
Мне в своё время пришлось много поработать с BTreeve, и восторга от этого я как-то не испытывал. На SQL я делаю то же самое, но быстрее, и с меньшими травмами мозга. Да, при этом я в любой момент могу досконально разобраться, во что раскрутится мой запрос, но в большинстве случаев это не требуется.

P.S. Это ни в коем случае не упрёк или наезд. Это просто реплика из зала. Личное мнение на основе личного опыта.
Ответили: (95) (71)
+ 1 [ orefkov; ]
# Ответить
69. orefkov 27.06.2008 09:44
+68
Я бы уточнил - без этого никогда оптимальноне решишь задачу методами декларативными
# Ответить
70. ADirks 27.06.2008 10:37
эээ... да, слово пропустил :)
# Ответить
71. hogik 27.06.2008 18:25
(66)
“Приведенный тобой пример очень упрощен.”
ЭТО ПРИМЕР !!!!!!! ;-)))))))))))))))))))
“Универсальную систему (типа 1С) на таких индексных выражениях не сделать”
См. в (63) последний смысловой абзац, три последних предложения.

(68)
“почему же тогда все стараются использовать декларативные методы вместо процедурных?”
Ответ очевидный – это проще в написании на проблемном уровне.
“Мне в своё время пришлось много поработать с BTreeve, и восторга от этого я как-то не испытывал.”
Ну, наверно Вы решали проблемную задачу, а не писали движок к SQLному серверу.
“На SQL я делаю то же самое, но быстрее, и с меньшими травмами мозга.”
“Да, при этом я в любой момент могу досконально разобраться,”
Естественно. См. предыдущий абзац.

Я, в данной теме, “поднимаю” совершенно другой вопрос:
1) Есть универсальная система, заточенная на навигационные методы обработки информации (назовем это НМОИ).
2) Заточено под НМОИ и язык, и возможности строить и менять схему базы данных.
3) В скрытых от пользователя (это мы с Вами) элементах схемы базы данных и методах обработки тоже сделано под НМОИ. Но без “полного” использования его (метода) как в части схемы базы данных, так и в, предложенных пользователю, функциях обработки информации.
4) Было бы логично, продолжая основную концепцию данной универсальной системы, расширить язык 1Са в сторону “полного” НМОИ. А потом это “накрыть” удобным языковым интерфейсом. Да хоть и SQLем.
5) В результате пользователь получил бы, на мой взгляд, систему “два в одном”. И он выбирал бы, в каком случае, чего использовать. А случаев для использовании “полного” НМОИ в 1С достаточно. Например (первое и наглядное, что мне пришло в голову) - динамические фильтры на журналы и справочники.
Но по большому счету “в моей голове подняты” другие вопросы:
1) Написанный на SQL движке (!) для системы с идеологией НМОИ вариант 1C – “1С:Предприятие SQL”.
2) Трех уровневый монстр, в части СУБД, в лице 1С 8.х.
3) Отсутствие полноценной клиент/серверной СУБД с двумя методами доступа к данным – НМОИ и язык запросов.
4) Затратный способ (покупка железа, написание прямых запросов, обработок по свертки БД и т.д.) для приведения скорости (в широком смысле этого слова) работы 1С продуктов к декларированным задачам.
5) И т.д. в этом же направлении…

А что касается данной разработки – плюс в рейтинг я поставил. Несмотря на то, что вопрос расширения языка 1С в сторону НМОИ для повышения её производительности сделан, как минимум, в трёх разработка несколько лет назад. И что касается моих разработок, то мне бы хотелось с автором данной разработки расширить мои языковые средства в сторону SQLя. Тем более что я уже пытался сделать интерпретатор SQL запросов с применением SQLite для своих разработок. Но у меня получилось, так, что больших удобств пользователь не получал.
Ответили: (123) (95) (72)
# Ответить
72. hogik 28.06.2008 03:37
+(71)
Александр.
Возможно, то о чем я говорю проясниться, если Вы загляните в описание API для Advantage. И начнёте его смотреть вот с этого:

Skips the given number of records:
UNSIGNED32 AdsSkip (ADSHANDLE hObj, SIGNED32 lRecs);
hObj - Handle of table, cursor, or index order.
lRecs - Number of records to skip (can be negative).

Т.е. в интерфейсе этой СУБД совмещен навигационный и запросный способ обработки информации. Общие транзакции, блокировки, “логика” индексов и т.д. Похоже, что, пока это единственная СУБД с такими возможностями. И, на мой взгляд, это наиболее походящая СУБД для универсальных систем типа 1С 7.7, 8.х. Т.е. вполне реально штатный язык пользователя 1С отобразить на функции СУБД “более прямым способом”.
Ответили: (74)
# Ответить
73. Свой 28.06.2008 13:18
Ура ! Бухитоги сделаны !!!
# Ответить
74. Donat 28.06.2008 18:01
+(72)
В случае с Advantage стоит ещё вспомнить о её цене. :-(
Ответили: (75)
# Ответить
75. hogik 28.06.2008 18:13
+(74)
И сравнить ее с ценой MS SQL ;-)
# Ответить
76. kitt 28.06.2008 18:47
2orefkov, Саша, а есть ли в планах на будущее добавление возможности работы с произвольной базой 1с дбф, типа OLEDBdata.ПрисоединитьИБ() в 1срр?
Ответили: (77)
# Ответить
77. orefkov 28.06.2008 21:30
(76)
Не знаю. Я пока не смог подключить движок 1С к другой базе.
# Ответить
78. Свой 28.06.2008 22:34
натолкните на путь истинный, как добраться до бухитогов... собственной головой дошел только до того что нужно создать запрос "create virtual table Проводки using dbeng(_1С.ENTRY)" :(
можно примерчик, как хотябы осв по счету сделать (например остатки по складу)... или как сделать аналог СКД(Счет,ТипСуммы,Валюта,Субконто)
# Ответить
79. Свой 28.06.2008 23:32
вроде получается.... подключил в консоли таблицу Проводки, теперь работает запрос
select
Docid,
ktsc0,
accdtid
from Проводки
where DATE > 20080427 and DATE < 20080629 and accdtid = ' N'

где N - идентификатор счета10.1
я на правильном пути ?
# Ответить
80. Сhe Burashka 29.06.2008 00:51
Ну, просто все молодцы!
# Ответить
81. Сhe Burashka 29.06.2008 03:10
Только что родилось мега-предложение по функционалу.. и тут я задумался... - а неужели orefkov глупее меня...? ;-) смотрю - нет! есть! есть "Укладка в базу данных SQLite ТаблицЗначений".... оле-оле-оле-оле! теперь можно из файла загнать в ТЗ и применить сабж! (и так хитро с ленинским прищуром: а есть ли возможность загнать в базу данных SQLite текстовый файл с разделителями напрямую, без промежуточного чтения в ТЗ...?
Ответили: (88)
# Ответить
82. hogik 29.06.2008 03:14
Александр.
Я запустил пример из (30) со своей DBEng32 для Advantage.
Faulting application 1cv7.exe, version 7.70.0.25,
faulting module 1sqlite.dll, version 1.0.1.7,
fault address 0x0000225e.
Разбираться бум? Если – да. То как?
Ответили: (95) (87) (83)
# Ответить
83. hogik 29.06.2008 04:10
+(82)
Слетает сразу после первого вызова:
GetTable() для RG405
# Ответить
84. Свой 29.06.2008 16:56
никак не получается использовать типизацию Субконто :(
Ответили: (91)
# Ответить
85. angro 29.06.2008 21:48
"Факт подключения виртуальной таблицы фиксируется в базе SQLite. Поэтому повторное создание таблицы с таким же ЖелаемоеИмяТаблицы не получится. " - то есть если запустить 2-е копии 1с-ки, то работать не будет? или для каждой 1с-ки свой экземпляр базы будет?
Ответили: (87) (86)
# Ответить
86. JohnyDeath 29.06.2008 22:36
(85) В каждой сессии 1С ты создаёшь свой экземпляр класса "SQLiteBase", поэтому у всех базы SQLite "как бы" разные.
# Ответить
87. orefkov 30.06.2008 09:26
(85)
+ 86 - более того, факт подключения таблиц фиксируется отдельно для каждой открытой базы SQLite.
То есть даже если в одной сессии 1С открыть две разные базы SQLite, набор подключенных таблиц у каждой свой.
(82)
Ничего вроде не мешает скачать исходники, собрать отладочную версию и проверить.
Ответили: (90)
# Ответить
88. desty 30.06.2008 13:22
(81)
импорт файлов возможен с помощью консольной программы sqlite (http://www.sqlite.org/cvstrac/wiki?p=ImportingFiles)
но этот способ не очень красив так как для этого придется предварительно создать таблицу с нужной структурой

я могу предложить способ который использую я при работе с файлами типа csv

Код
_итз.ИзФайла(ИмяФайлаДанынх,4);
_итз.Выгрузить(тзДляУкладки);
Показать полностью


ИндексированнаяТаблица очень быстро работает на загрузку данных из csv
# Ответить
89. desty 30.06.2008 13:34
+88
скобка в ссылку закралась
http://www.sqlite.org/cvstrac/wiki?p=ImportingFiles
# Ответить
90. hogik 30.06.2008 15:17
(87)
“Ничего вроде не мешает скачать исходники, собрать отладочную версию и проверить”
Правильно ли я понял Ваш ответ, что Вас не интересует “продвижение” 1SQLite в направлении клиент/серверной технологии с использованием моей разработки?
Ответили: (92)
# Ответить
91. orefkov 30.06.2008 16:24
92. orefkov 30.06.2008 16:31
(90)
Дико извиняюсь. Пока на это нет времени.
По 1sqlite у меня есть планы по ближайшему развитию, возможно, после их реализации будет движение и в сторону твоей разработки.
Однако лицензия GPL, под которой выпущена 1sqlite ничуть не мешает начать делать эту работу тебе.
Если есть какие-то непонятные моменты в моем коде, я всегда готов помочь разобраться.
Ответили: (93)
+ 1 [ Abadonna; ]
# Ответить
93. hogik 30.06.2008 18:00
(92)
“Пока на это нет времени”
Наверно мне придется ждать.
Т.к. “лицензия GPL, …ничуть не мешает начать делать эту работу...”, но не очень то и помогает. Т.е., притом, что Вы планируете движение в сторону клиент/серверной технологии, заниматься мне самодельщиной, думаю, не стоит. А заняться ошибкой было бы вполне реально. Но…
fatal error RC1015: cannot open include file 'l.rus\afxres.rc'
Чего я делаю не так?
Ответили: (94)
# Ответить
94. hogik 30.06.2008 22:30
+(93)
Александр.
Мне удалось собрать отладочную версию. Ошибка найдена: recordBuffer().
При таком подходе к использованию интерфейса DBEng32 Ваша разработка не будет работать с моими разработками. Т.е. работать надо только через штатные методы и свойства этого интерфейса. Чего бум делать? Или не делать…
Ответили: (115) (112) (106)
# Ответить
95. hogik 01.07.2008 00:37
(68)(ADirks)
В дополнение к моему ответу в (71) для ADirks:
“…при этом я в любой момент могу досконально разобраться, во что раскрутится мой запрос…”
Занимаясь поиском ошибки из моего сообщения (82) я обнаружил, что количество операций чтений справочника “Номенклатура” в примерах (30) и (46) различается в два раза не в пользу запроса.
Ответили: (98)
# Ответить
96. Свой 01.07.2008 01:32
(91) весь лоб себе уже расшиб, не получается субконто, вот один из кодов запроса
select
SC0 [Мат_вид:Справочник.Материалы],
SC0 [мат:Субконто], obdt1,
SC1
from Остатки
where accid = ' N' and DATE = 20060101

как получить колонку с материалами ?
Ответили: (99) (97)
# Ответить
97. orefkov 01.07.2008 08:20
(96)
Для типизации Субконто в колонках запроса должно присутствовать поле ИмяПоляССубконто_вид, содержащее вид субконто. те
select
SC0 [мат:Субконто],
VSC0 [мат_вид]
obdt1,
SC1
from Остатки
where accid = ' N' and DATE = 20060101
Ответили: (100)
# Ответить
98. orefkov 01.07.2008 08:22
(95)
Можешь показать, как ты обнаружил разницу в количестве операций чтения справочника?
Ответили: (106)
# Ответить
99. orefkov 01.07.2008 08:27
(96)
Так же, если точно известно, что в полученной выборке будут только субконто одного вида (как в твоем примере), то можно написать и так:
select
substr(SC0, 1, 9) [Мат_вид:Справочник.Материалы],
obdt1,
SC1
from Остатки
where accid = ' N' and DATE = 20060101
В данном случае - под поле субконто 1С отводит строку 13 символов.
Но если тип значения субконто - справочник конкретного вида, она в эти 13 символов пишет внутренний идентификатор элемента без указания вида справочника, те использует только 9 символов.
Типизация :Справочник.Материалы ожидает именно строки длинной 9 символов, и если колонка 13 символов, не делает типизацию.
Ответили: (100)
# Ответить
100. Свой 01.07.2008 10:13
(97), (99) Спасибо большое, работают оба примера, причем
вариант (99) где substr(SC0, 1, 9) работает быстрее, судя по обращениям к винту в этом варианте запрос к меньшему количеству таблиц происходит
Ответили: (101)
# Ответить
101. orefkov 01.07.2008 10:30
(100)
Не, там типизация гораздо быстрее происходит.
Однако повторюсь, такую типизацию можно применять, только если
1. Вы точно уверены, что в SC0 будут всегда значения одного, нужного вам вида субконто. (например, у вас есть фильтр по конкретному счету)
2. Тип значения этого вида субконто - справочник, документ конкретного вида.
(Если тип значения этого вида субконто - просто справочник, документ (без указания вида), тогда можно использовать типизацию
SC0 [Субк1 :Справочник]
SC0 [Субк1 :Документ]
те поле не обрезать до 9 символов, типизировать тоже справочником, документом без указания вида)
# Ответить
102. Свой 01.07.2008 11:04
хотел фильтровать по счету - добавил в запрос подставлять запрос.Подставлять("accid", " N");
запрос выдает лишние счета - 01, налоговые счета, причем в некоторых строках со счетом "01"типизировался материал
аналогичные результаты при случае запрос.Подставлять("accid", СчетПоКоду(10.1,"Основной"));
Ответили: (105)
# Ответить
103. JohnyDeath 01.07.2008 11:15
Запрос покажи
# Ответить
104. JohnyDeath 01.07.2008 11:16
+ steban выложил класс "БухЗапрос" для 1sqlite http://www.1cpp.ru/forum/YaBB.pl?num=1214687800/0 , может что-нибудь подчерпнёшь для себя.
# Ответить
105. orefkov 01.07.2008 11:44
(102)
Так работает?
Код
ТекстЗапроса = "select 
|substr(SC0, 1, 9) [Мат_вид:Справочник.Материалы],
|obdt1,
|SC1
|from __1S_BKTTL Остатки
|where accid = :выбСчет and DATE = :выбДата";
запрос.Подставлять("выбСчет", СчетПоКоду("10.1", "Основной");
запрос.Подставлять("выбДата", '01.01.2006');
тз = запрос.ВыполнитьЗапрос(ТекстЗапроса);
Показать полностью
# Ответить
106. hogik 01.07.2008 13:58
(98)
“Можешь показать, как ты обнаружил разницу в количестве операций чтения справочника?”
Ссылка: http://infostart.ru/profile/2905/projects/1359/
Файл: DBEng32.doc.
Раздел: “Настройка”
Пункты про “Строка № 7” и “Строка № 8”.
Если нет времени заниматься установкой сервера БД (для сравнения) то можно:
1) Использовать версию для CodeBase 6.5 c режимом ПДБД.
2) Мне выслать Вам результат выполнения моего примера из (46).
Ну, а для не сравнения, а анализа установка сервера БД не требуется.

Но меня больше интересует Ваш ответ на (94). Не в смысле делать это сейчас, а в смысле обсудить. Возможно, и другие алгоритмы Вашей разработки упростятся. И это повлияют на написания того, что Вы делаете сейчас по основной теме разработки. Ну, а если не повлияет, то можно и отложить…
Ответили: (107)
# Ответить
107. orefkov 01.07.2008 15:21
(106)
Ну, я примерно понял в чем дело.
При соединении со справочником по id движок запросов вынужден считывать запись, следующую за найденной, потому что нигде не указано, что индекс по id уникальный, то есть нет гарантий, что в таблице нет повторяющихся id. Я не считаю это большой проблемой. По крайней мере, в гипотетической ситуации задвоения айдишника в справочнике, запрос отработает фактически верно, в соответствии с реальными данными. Хотя можно и доработать компоненту, условно считать индексы по id справочников, iddoc в журнале и шапках документов уникальными.
Ответили: (110) (108)
# Ответить
108. hogik 01.07.2008 15:40
(107)
“движок запросов вынужден считывать запись, следующую за найденной”
Ну, если еще и это делает, то в 4 раза больше чтений. Запустите трассировку. Там много еще другой полезной информации. Но ответ на вопрос из (106->94) хАчу...
Ответили: (109)
# Ответить
109. orefkov 01.07.2008 15:50
(108)
Таки я не понял, в два или в четыре?
Ты в первый раз трассировку плохо посмотрел?
Был бы очень благодарен, если бы ты кинул мне на orefkov gmail.com трассировки для запроса и для подсчета твоим способом.
И замеры времени выполнения обоих способов.
Дико извиняюсь, но тебе сделать это проще, чем мне.
Ответили: (110)
# Ответить
110. hogik 01.07.2008 16:10
(109)
“Таки я не понял, в два или в четыре?”
Если рассматривать то место, которое я смотрел, когда говорил в два раз – то в два раза.
А если учесть то, что написано Вами в (107), то еще в два раза. Т.е. в результате – в четыре раза.
“И замеры времени выполнения обоих способов.”
Это шутка? Я уже писал, что у меня нет большой базы в типовой ТиС. А на демо-версии у меня всё выполняется одинаково – около 0 секунд. И отличия на уровне ошибки измерения.
“если бы ты кинул мне”
Кину в течение ближайшего часа.
“Дико извиняюсь, но тебе сделать это проще, чем мне.”
Нам надо не извинятся, а переходить на более оперативные средства общения. Уж больно много времени уходить на написание буковок.
Ответили: (111)
# Ответить
111. orefkov 01.07.2008 16:20
(110)
Буду ждать.
А "отличия на уровне ошибки измерения" - ну так смотря чем и как мерять.
Если использовать _GetPerformanceCounter, который меряет с точностью до мсек, да прокрутить в цикле 10000 раз, то что-то все равно ведь выйдет?
Ответили: (113)
# Ответить
112. orefkov 01.07.2008 16:23
(94)
Ну, для начала надо иметь список методов, которые подменяет твоя разработка, то бишь какими именно штатными методами и свойствами dbeng32 можно оперировать.
Тогда будет возможна разработка универсальной 1sqlite.
Ответили: (115) (113)
# Ответить
113. hogik 01.07.2008 16:48
(111)
“ну так смотря чем и как мерять”
Вот именно “как”.
“Если использовать _GetPerformanceCounter,”
,а не чем!
“в цикле 10000 раз, то что-то все равно ведь выйдет?”
Нет.
(112)
“Ну, для начала надо иметь список методов, которые подменяет твоя разработка”
Все.
“то бишь какими именно штатными методами и свойствами dbeng32 можно оперировать.”
Любыми.

Но для начала надо брать описание схемы базы данных не из управляющих блоков CodeBase-а.
Я, в своей, разработке беру эту информацию из 1CV7.DD. Это то, что я увидел при беглом (!) просмотре исходных текстов 1SQLite.
Ответили: (115) (114)
# Ответить
114. orefkov 01.07.2008 17:16
(113)
"Но для начала надо брать описание схемы базы данных не из управляющих блоков CodeBase-а."
Можно объяснить подробнее, что имеется ввиду?
Из схемы базы данных я беру только состав полей и индексов для желаемой таблицы, черех объекты CTable, CIndex, CField.
Из наполнение будет отличаться при работе твоей версии dbeng32.dll ?
Ответили: (115)
# Ответить
115. hogik 01.07.2008 17:33
(114)
Александр.
Вы читали моё сообщение (94) по поводу ошибки в совместной работе наших разработок?
“Можно объяснить подробнее, что имеется ввиду?”
Вот это:
char* recordBuffer() const {return *(char**)((*(char**)((**(char***)(((char*)p_1C) + 0xC)) + 0x1C)) + 0x14) + 1;}
“…будет отличаться при работе твоей версии dbeng32.dll ?”
См. (113) ответ на (112). И если чего не заработает, то только из-за моей опечатки в программе. Но это быстро мной исправится.
Ответили: (117) (116)
# Ответить
116. orefkov 01.07.2008 17:52
(115)
Никак не вижу связи между "recordBuffer()" и 1CV7.DD.
Это просто получение адреса буфера, куда складываются данные записи после перемещения по таблице.
Если отказаться от этого, придется переписывать многое в части получения значений полей записи.
Либо как-то от твоего движка узнать адрес буфера с записью.
# Ответить
117. hogik 01.07.2008 18:36
(115)
“Никак не вижу связи между "recordBuffer()" и 1CV7.DD”
Я ранее написал “при беглом (!) просмотре исходных текстов 1SQLite”. И если не требуется никакой другой информации из управляющих блока кроме адреса буфера ввод/вывода CoseBase, то и не надо использовать 1CV7.DD. А получать это штатным способом (CTable, CIndex, CField).
“Либо как-то от твоего движка узнать адрес буфера с записью”
При использовании моей разработки не используется буфер ввод/вывода родного CodeBase. И для того, чтобы не связываться с ним, надо использовать методы FX_… из CstoreObj. В родной DBEng32 содержание буфера, в общем случае, не предсказуемо. Т.е. они выполняют ввод/вывод средствами CodeBase в буфер и ничего не знают о его местоположении в памяти и сразу выполняют пересылку нужных полей из буфера в переменные 1Са методами FX_… до выполнения следующей операции ввода/вывода для этой же таблицы. А в методах FX_… используются функции CodeBase получения значения поля по его имени.
# Ответить
118. Сhe Burashka 01.07.2008 20:28
ух.. просто праздник какой-то.. читаю прям как дюдюктив...
# Ответить
119. hogik 01.07.2008 20:34
118)
“читаю прям как дюдюктив”
Скоро, скоро всё станет понятно и не интересно. ;-)
# Ответить
120. orefkov 02.07.2008 18:26
Вышла 1.0.1.8

- Исправлена ошибка обработки NULL значений.
- Исправлена ошибка преобразования из utf-8 нулевых строк
- Устранена гигантская утечка памяти при некоторых случаях использования LIMIT
- Рефакторинг классов базы данных и запросов, с целью облегчения использования
их в других компонентах
- Из соображений производительности восстановлены типизации :ВидДокумента и
:ВидДокументаПредставление
- Из соображений производительности добавлены типизации :ВидСубконто и
:ВидСубконтоПредставление

Брать http://code.google.com/p/sqlite1c/downloads/list

Если используете подзапросы с limit, качать ОБЯЗАТЕЛЬНО!!!
# Ответить
121. orefkov 03.07.2008 13:51
Ну чтож, раз hogik говорил, что на его демке ТиСа выяснить разницу между (30) и (46) ему не удалось, пришлось сделать самому.
Итак.
1sqlite vs AddIn.AddInExt

Сравнивались времена получения сводного остатка на ТА ресурса Количество из регистра ОстаткиТМЦ демо-базы ТиСа, по измерению Номенклатура, без итогов и групп, упорядоченные по ВидНоменклатуры,Номенклатура четырмя способами:
1. Запросом 1С.
2. Выгрузкой итогов из регистра в ТЗ с последующим добавлением и заполнением колонки ВидНоменклатуры и сортировкой ТЗ по этой колонке.
3. Запросом 1sqlite
4. Навигационным способом из (46) с применением AddIn.AddInExt

Результатом выполнения каждого из способов являлась ТЗ, содержащая как минимум колонки
- Номенклатура (тип Справочник.Номенклатура)
- ВидНоменклатуры (тип Перечисление.ВидыНоменклатуры)
- Количество
упорядоченная по колонкам ВидНоменклатуры, Номенклатура.

Заставить заработать AddIn.AddInExt и 1sqlite в одной базе у меня не получилось - AddIn.AddInExt не работал в базе с "родным" dbeng32.dll, 1sqlite соответственно, не работал в базе данных на CodeBase'ом dbeng32.dll от hogik'а.
Поэтому были созданы две базы данных с одинаковыми данными, в каждой из которых были прогнаны по 3 способа:
В базе с родным dbeng32.dll - способы 1, 2, 3
В базе с движком hogik'а - способы 1, 2, 4
Время выполнения тестов 1 и 2 в каждой базе дадут основания косвенно сравнить меж собой и способы 3 и 4.

Каждый из способов прогонялся подряд 5 раз. После каждого теста в окно сообщений выводилось время выполнения в мсек и количество строк в полученной ТЗ.
Замеры времени выполнялись через _GetPerformanceCounter.

Результаты замеров

База с родным dbeng32.dll:
Время 1С запросом: 325 Строк: 61
Время 1С запросом: 385 Строк: 61
Время 1С запросом: 389 Строк: 61
Время 1С запросом: 403 Строк: 61
Время 1С запросом: 452 Строк: 61
Время 1С выгрузкой итогов: 8 Строк: 61
Время 1С выгрузкой итогов: 8 Строк: 61
Время 1С выгрузкой итогов: 8 Строк: 61
Время 1С выгрузкой итогов: 9 Строк: 61
Время 1С выгрузкой итогов: 9 Строк: 61
Время 1sqlite: 2 Строк: 61
Время 1sqlite: 2 Строк: 61
Время 1sqlite: 2 Строк: 61
Время 1sqlite: 2 Строк: 61
Время 1sqlite: 3 Строк: 61

База с движком от hogik:
Время 1С запросом: 367 Строк: 61
Время 1С запросом: 410 Строк: 61
Время 1С запросом: 411 Строк: 61
Время 1С запросом: 390 Строк: 61
Время 1С запросом: 380 Строк: 61
Время 1С выгрузкой итогов: 13 Строк: 61
Время 1С выгрузкой итогов: 13 Строк: 61
Время 1С выгрузкой итогов: 13 Строк: 61
Время 1С выгрузкой итогов: 13 Строк: 61
Время 1С выгрузкой итогов: 13 Строк: 61
Время hogik: 30 Строк: 61
Время hogik: 29 Строк: 61
Время hogik: 29 Строк: 61
Время hogik: 30 Строк: 61
Время hogik: 30 Строк: 61

Если кто желает воспроизвести тесты, могу выслать обработку для их проведения.
Ответили: (130) (123)
# Ответить
122. Abadonna 03.07.2008 14:00
(21)>Время 1С выгрузкой итогов: 8
Во! Чисто интуитивно я никогда не заморачивался никакими запросами, а всегда делал выгрузку итогов по регистру.
Конечно, 2 секунды куда как круче, но и 8 нормалёк :)))
(особенно по сравнению с 325 и 30)
# Ответить
123. hogik 03.07.2008 15:39
(121)
Александр.
Замечание по ходу обсуждения. Я не говорил “не удалось”. Моя мысль по это этому поводу была высказана примерно такая – “при сравнении в таких условиях, сравнивается не скорость работы движка, а скорость работы интерпретатора 1С”. Что полностью соответствует Вашим утверждениям в сообщении (48). И думаю, соответствует, одной из целей Вашей разработки. И если маленькие базы положить на RAM диск, то разница будет еще больше. Т.к. доля времени выполнения, той части, которую Вы оптимизируете - очень мала по сравнению со временем выполнения операций ввода/вывода.
Вы, с интервалом в два года, написали две фразы про грелку:
“запрос на 1С++ рвет дбф, как тузик грелку”
“запросы рвут язык 1С как тузик грелку”.
Я, как тогда, так и сейчас говорю, что слово “запрос” не имеет к этим утверждения никакого отношения. И слова “язык” и “dbf” тоже не имеют никакого отношения к “грелке”. Я попытался это изложить в (71) данной темы и пытался это сказать два года назад. Но, два года назад, я еще пытался ответить на вопрос “почему ж на самом деле тормозит 1С:Предприятие” при использовании в качестве написания движка для 1С языка запросов.
Что касается приведенного Вами сравнения, то наверно имеет смысл еще написать – при каких условиях проводилось данное сравнение. Т.е. по сети, в режиме клиент/сервер, какой использовался сервер БД и т.д. И не для меня, а для других людей, читающих комментарии к Вашей разработке. Лично мне эти результаты очевидны и без проведения тестирования.
Ну, а я подожду следующую Вашу фразу про грелку. Возможно, в ней появится истинный смысл того, кто кого и при каких условиях – “рвет как грелку”.
P.S. Жаль, что на разработку можно ставить только один плюс от одного плюсующего. Я б, от себя поставил гораздо больше.
Ответили: (130)
# Ответить
124. hogik 04.07.2008 01:36
Александр.
Привожу числа аналогичные Вашим замерам. И не с целю обсуждения “SQL или не SQL”. А как пример безграмотно выполненного тестирования. Обращаю ваше внимание на первые две строчки в каждой группе замеров. Если у Вас появится желание действительно сравнивать производительности наших решений, то давайте обсудим технические условия его проведения. Если Вас заинтересует пояснение данных чисел – задавайте мне вопросы.

1SQLite
Время выполнения запроса: 49 Строк получено: 53
Время выполнения запроса: 3 Строк получено: 53
Время выполнения запроса: 4 Строк получено: 53
Время выполнения запроса: 3 Строк получено: 53
Время выполнения запроса: 3 Строк получено: 53

Advantage 8.1
Время выполнения цикла: 93 Строк получено: 53
Время выполнения цикла: 31 Строк получено: 53
Время выполнения цикла: 31 Строк получено: 53
Время выполнения цикла: 31 Строк получено: 53
Время выполнения цикла: 31 Строк получено: 53

CodeBase 6.5
Время выполнения цикла: 28 Строк получено: 53
Время выполнения цикла: 25 Строк получено: 53
Время выполнения цикла: 25 Строк получено: 53
Время выполнения цикла: 26 Строк получено: 53
Время выполнения цикла: 26 Строк получено: 53
Ответили: (130) (125)
# Ответить
125. hogik 04.07.2008 14:56
+(124)
Александр.
А вот так выглядят замеры, если клиента запускать в виртуальной машине, а базу и сервер БД разместить на реальной машине. Но это тоже безграмотное выполнение теста.

1SQLite
Время выполнения запроса: 151 Строк получено: 53
Время выполнения запроса: 113 Строк получено: 53
Время выполнения запроса: 98 Строк получено: 53
Время выполнения запроса: 100 Строк получено: 53
Время выполнения запроса: 99 Строк получено: 53

Advantage 8.1
Время выполнения цикла: 114 Строк получено: 53
Время выполнения цикла: 67 Строк получено: 53
Время выполнения цикла: 70 Строк получено: 53
Время выполнения цикла: 73 Строк получено: 53
Время выполнения цикла: 67 Строк получено: 53
Ответили: (130)
# Ответить
126. Сhe Burashka 05.07.2008 14:11
ниччего не понимаю....
ии попутоно
> "“почему ж на самом деле тормозит 1С:Предприятие” при использовании в качестве написания движка для 1С языка запросов." - ???
Ответили: (128) (127)
# Ответить
127. Abadonna 05.07.2008 14:30
(126) мы, видать, дурачки с тобой ;) я вот тоже думаю при написании какого движка и каких запросов используется 1С?
# Ответить
128. hogik 05.07.2008 15:23
(126)(Сhe Burashka)
“ниччего не понимаю....”
И это радует, т.к. всё понимают только дураки ;-)
Краткое содержание данной темы: “Выяснено, что в Windows, таки, используется кэширование для операций ввода/вывода. И для локальных дисков эффективнее чем, при обращении к дискам через сеть”.
“почему ж на самом деле тормозит”
Одной фразой – реализуют навигационный способ обработки информации запросами.
В “1С:Предприятие 7.7” схема базы данных, алгоритмы обработки данных и язык разработки приложений ориентирован на навигационный способ обработки информации. Причины появления SQLной версии 1Са – клиент/сервер. А клиент/серверных СУБД с языком манипулирования данными отличным от SQL очень мало. Для того чтобы 1С 7.7 эффективно работала на движке с языком манипулирования данными подобным SQLю надо иметь другую схему базы данных, другие алгоритмы обработки данных и другой язык разработки приложений. Т.е. иметь другую 1С.
Вот пара ссылок, в которых есть немного общей информации по этому вопросу. Т.е. прошу не рассматривать эту информацию конкретно как “про Advantage и DBFы”. В контексте этого материала имеет смысл понимать под DBF сам метод доступа к данным – навигационный. Тем более что это уже и не DBFы.
http://www.hotsoft.ru/ADS/ads_faq.html
http://www.hotsoft.ru/ADS/index.htm
Ответили: (130)
# Ответить
129. vip 05.07.2008 19:26
Ув. hogik!

Не хотел вмешиваться.

И я уже “ниччего не понимаю....”
Интуитивно понимая невероятную полезность Вашей разработки, я тщетно ищу жемчужное зерно.
Можно изложить то же самое, но избавившись от логореи?
Из результатов тестов я почерпнул пока только намеки на то, что в SQL первый запрос почти всегда выполняется дольше, чем последующие.
И?
Объясните наконец, в чем сермяжная правда вашего решения?
Понимая, что трогаю Вас за святое, спрошу - как случилось так, что разработки Александра используют многие тысячи людей? А Ваши?
Не обижайтесь, я себя дурачком не считаю и хочу четко и ясно увидеть изюминку.
Бесплатность, скорость, стабильность, отзывы пользователей.
В начале презентации проекта стороннюю заинтересованность видел. Сейчас нет.
???
Примером для разработчиков и пользователей считаю сайт 1С++.
Конструктивная, доброжелательная и очень эффективная по результатам атмосфера.

P.S. Еще раз прошу не обижаться.
Просто тону в потоке мутных сентенций.
Ответили: (131) (130) (279)
+ 2 [ slavapil; JohnyDeath; ]
# Ответить
130. hogik 05.07.2008 21:58
(129)(vip)
“Интуитивно понимая невероятную полезность Вашей разработки, я тщетно ищу жемчужное зерно.”
Уточните, пожалуйста, что Вы в данной теме называете моей разработкой?
“Из результатов тестов я почерпнул пока только намеки на то, что в SQL первый запрос почти всегда выполняется дольше, чем последующие.”
Совершенно верно. И не только в SQL (понимая в разработке 1SQLite).
“И?”
Перечитайте в сообщение (123) первый абзац. Далее посмотрите на замеры в (121), при этом не важно в рамках какой разработки они проводились. А в (124) я пояснил своё высказывание из сообщения (123), проведя безграмотный тест. Далее я написал в (128) суть того, что мы наблюдаем. Т.е. причиной быстрого выполнения НЕ первого цикла любого тестирования по сравнению с первым является системный кэш операционной системы. Только в (121) этот первый цикл (наполнение кэша) произошло при выполнении “запроса” родными средствами 1Са. А в (124) заполнение кэша происходит при выполнении “запроса” сравниваемых способов выборки данных. Т.е. если переставить тесты местами и выполнить их после перезагрузки системы то соотношение 325:2 или 367:30 изменится. И не между сравниваемыми решениями, а в рамках замеров для каждого решения. Уменьшить влияние кэша на “точность” замеров можно запустив тесты в виртуальной сети. Что показано в (125) сообщении. Но все эти замеры в части сравнения разных решений безграмотны, что сказано в сообщении (121) начиная с текста “Заставить заработать AddIn.AddInExt и 1sqlite в одной базе…”. Добавлю только от себя к фразе от Александра “и на разных движках”.
“Объясните наконец, в чем сермяжная правда вашего решения?”
Повторю свой вопрос. Что Вы называете моим решением?
“Понимая, что трогаю Вас за святое…”
Если понимаете, то не трогайте. ;-)))
“…спрошу - как случилось так, что разработки Александра используют многие тысячи людей? А Ваши?”
Я не понимаю этот вопрос. Т.е. не в смысле того, что Вы написали. А в смысле того - почему Вы это написали. У Вас сложилось впечатление, что мы какие то разработки сравниваем? Или, что я критикую разработку Александра? На самом деле я высказал своё мнение в (23) по поводу сообщения (19) от Сергея. Т.к. несколькими днями раньше разговаривали на эту тему. Я даже ссылку поставил. Далее я запустил трассировку операций ввода/вывод средствами своей разработки и в (27) подтвердил свое предположение. Ну а далее по теме, Александр ставил мне задачки – я писал решения. Александр задавал мне вопросы, я отвечал.
“Не обижайтесь, я себя дурачком не считаю и хочу четко и ясно увидеть изюминку.”
”Бесплатность, скорость, стабильность, отзывы пользователей.”
”В начале презентации проекта стороннюю заинтересованность видел. Сейчас нет.”
Если Вы о навигационном способе доступа к данным. То все нарисовано в (46). Если о чем-то другом, то уточните, пожалуйста.
“Примером для разработчиков и пользователей считаю сайт 1С++.”
”Конструктивная, доброжелательная и очень эффективная по результатам атмосфера.”
Согласен. Хорошая атмосфера.
“Просто тону в потоке мутных сентенций.”
И я тону. И как это поправить?
# Ответить
131. Abadonna 06.07.2008 05:21
(129)>“Понимая, что трогаю Вас за святое…”
hogik, за святое только женщинам позволяй трогать! :)))
Ответили: (132)
# Ответить
132. hogik 06.07.2008 14:26
(131)(Abadonna)
“за святое только женщинам позволяй трогать”
С возрастом “святое” перемещается в другие части тела. ;-) А это место открыто для доступа всем желающим. :-(
Ответили: (133)
# Ответить
133. Abadonna 06.07.2008 15:48
(132) >С возрастом “святое” перемещается в другие части тела.
Чорт возьми! У меня в 50 так и не переместилось.
# Ответить
134. Сhe Burashka 07.07.2008 08:02
такс... надо перечитывать весь сабж...
Ответили: (135)
# Ответить
135. hogik 07.07.2008 14:39
(134)( Сhe Burashka)
“... надо перечитывать весь сабж...”
Сергей.
Попробую поберечь Ваше время.
1) Используется DBFная версия 1Са. Всех, всё это устраивает, кроме скорости работы. Тогда используйте 1SQLite.
2) Работа в DBFной версии не устраивает. Задумываетесь о переходе на SQLную версию. Тогда переходите на нее и пишите прямые запросы с помощью 1С++.
3) Работа в DBFной версии не устраивает. Задумываетесь о переходе на SQLную версию. Но писать прямые запросы не хотите. Тогда попробуйте связку “DBEng32+Advantage”.
4) Попробовали “DBEng32+Advantage” – устраивает. Но хотите писать прямые запросы. Тогда пишите прямые запросы на 1SQLite. Если будет обеспечена совместимость данных продуктов.
5) Если совместимость не будет обеспечена. А прямые запросы из 1SQLite Вы хотели писать для повышения производительности уже связки “DBEng32+Advantage” то используйте ДУС и РУС из моей разработки.
Ответили: (149) (139) (136)
+ 1 [ noprogrammer; ]
# Ответить
136. Abadonna 07.07.2008 14:56
(135) тогда переходите на нее и пишите прямые запросы с помощью 1С++.
Прямые запросы я запросто пишу и без всяких 1С++.
Например вот тут: http://infostart.ru/profile/1329/projects/746/
Ответили: (138) (137)
# Ответить
137. hogik 07.07.2008 15:03
(136)(Abadonna)
“пишу и без всяких 1С++.”
Да. Но см. сообщение (4) по данной ссылке. Хотя, это дело вкуса ;-))
# Ответить
138. JohnyDeath 07.07.2008 15:08
(136) Аркадий, ну сколько можно давить на 1с++, а?! ))
Вот напиши такой запрос (в терминах 1с++, но думаю, что всё понятно):

SELECT
$Сотрудники.ПолнНаименование
,$Сотрудники.Оклад
,$Сотрудники.id [Сотрудник $Справочник.Сотрудники]
FROM $Справочник.Сотрудники Сотрудники
WHERE Сотрудники.ДатаРождения BETWEEN :НачДата и :КонДата

потом сравни с этим. Что лучше читается? Думаю, что ответ очевиден.
А если ты со своим запросом пойдёшь на другую базу? Заново писАть?
Ответили: (142) (141)
+ 1 [ Бит; ]
# Ответить
139. vip 07.07.2008 18:12
(135) Ув. hogik!
Вот теперь полносью удовлетворен ответом. Достаточно коротко и ясно. Спасибо.
Жаль, но для меня работа с dbf не совсем актуальна, иначе постарался бы тему развить.
В сетях с количеством юзеров больше трех стараюсь склонить заказчика на sql. Оно того стоит.
Удачи!
Ответили: (140)
# Ответить
140. hogik 07.07.2008 18:41
(139)(vip)
“В сетях с количеством юзеров больше трех стараюсь склонить заказчика на sql.”
Загляните в пункт № 7 сообщения (26) данной темы. Т.е. про DBFы это не ко мне.
И Вам спасибо, и удачи.
# Ответить
141. Abadonna 07.07.2008 18:59
(138)>Аркадий, ну сколько можно давить на 1с++
Я разве давлю? Просто ненавижу "эклектику". Всегда бесило, например, Spr=CreateObject("Справочник.Сотрудники")
Поэтому не шибко нравится и FROM $Справочник.Сотрудники
Но это дело вкуса.
Потом я совершенно точно знаю, что делает прямой скуль, и не знаю как там разбирается с запросом 1С++...
Ответили: (143)
# Ответить
142. Abadonna 07.07.2008 19:03
(138)>А если ты со своим запросом пойдёшь на другую базу?
А если я зайду в базу, где нет 1CPP.DLL? И нет интернета, чтобы скачать?
А если владелец той, другой базы ваще принципиальный противник всяких там dll?
Ответили: (145) (144)
# Ответить
143. vip 07.07.2008 19:23
(141) 1C++ разбирается с запросом монопенисульно с чистым скулем. Тока удобней.
ххх (извините).
Ответили: (144)
# Ответить
144. Abadonna 07.07.2008 19:26
(143) А на (142) что ответишь?
# Ответить
145. vip 07.07.2008 19:29
(142) > А если я зайду в базу, где нет 1CPP.DLL? И нет интернета, чтобы скачать?
А ты там больше не ходи... Очаровашка...
# Ответить
146. vip 07.07.2008 19:31
ххх (извините).
# Ответить
147. Abadonna 07.07.2008 19:32
Между дрочим, еще до появления CPP я написал обработочку, которая ночью спокойненько парсила DDS, и создавала вьюхи на все справочники и документы (с учетом того, что за день могли поменяться метаданные)
Так что меня FROM $Справочник.Сотрудники не шибко удивишь ;)
# Ответить
148. hogik 07.07.2008 21:06
Всё! Я ухожу на пенсию. :-( Долго пытался вспомнить, что означает слово “монопенисульно ” применительно к СУБД. ;-)
Ответили: (151) (150)
# Ответить
149. Сhe Burashka 07.07.2008 22:35
150. vip 08.07.2008 08:29
151. Abadonna 08.07.2008 09:13
(148) >( Долго пытался вспомнить, что означает слово “монопенисульно ”
Оно как раз монопенисульно подходит практически ко всем понятиям, в т.ч. и к СУБД :)))))))))))))))))
# Ответить
152. hogik 10.07.2008 01:04
Провел еще один тест: http://infostart.ru/blogs/482/
# Ответить
153. hogik 14.07.2008 20:48
Возникает ошибка при работе в многопользовательском режиме.
В момент выполнения запроса блокируются, некоторые, таблицы БД. Если в другой сессии 1Са будет выполняться попытка обновления таблицы, участвующих в запросе, то эта сессия завершится аварийно с кодом ошибки “CodeBase –56” после ожидания, примерно, 60 секунд.
Ответили: (184) (171) (158) (157) (154)
+ 1 [ Свой; ]
# Ответить
154. Свой 14.07.2008 23:52
(153) т.е. ошибка в "родной" 1С другого сеанса будет если данная сессия "недождется" освобождения таблицы на запись в течение 60секунд ? эти 60 секунд как-то коррелируют с устанавливаемым параметром "время ожидания захвата таблиц" ?
Ответили: (155)
# Ответить
155. hogik 15.07.2008 00:09
(154)(Свой)
“т.е. ошибка в "родной" 1С другого сеанса будет если данная сессия "недождется" освобождения таблицы на запись в течение 60секунд ?”
Да.
“эти 60 секунд как-то коррелируют с устанавливаемым параметром "время ожидания захвата таблиц" ?”
Нет.
P.S. Причина известна. От неё можно избавиться. Слово за автором разработки.
# Ответить
156. orefkov 15.07.2008 08:48
Автор не может свое слово, так как в отпуске до 01.08
# Ответить
157. JohnyDeath 15.07.2008 09:17
(153) Чтоб не забылось, оформи, пожалуйста, здесь: http://code.google.com/p/sqlite1c/issues/list
# Ответить
158. hogik 15.07.2008 18:12
+(153)
При возникновении ошибки описанной в (153) сообщении, похоже, всё гораздо хуже, чем простое сваливание сессии 1С-а!
Примерно так:
При выдаче команд на обновление данных в CodeBase через DBEng32, 1С-ина не всегда проверяет код возврата. И сообщение об ожидании может не выдаваться. Просто часть команд по обновлению данных, молча, не выполняется. А когда доходит дело до выполнения команд, где 1С-ина проверяет код возврата – появится картина, описанная в (153) сообщении.
Ответили: (159)
# Ответить
159. hogik 15.07.2008 23:07
+(158)
Добавлю.
Т.е. база данных будет портиться, даже если не появится сообщение об аварийном завершении сессии.
# Ответить
160. Свой 16.07.2008 11:48
(160) жесть...выходить нельзя пользоваться sqlite1c в многопользовательке ? или может в момент запроса sqlite1c пробовать транзакцией блокировать необходимые таблицы ?
Ответили: (161) (160)
# Ответить
161. hogik 16.07.2008 14:23
(160)
“выходить нельзя пользоваться sqlite1c в многопользовательке ?”
В текущей версии – не рекомендую.
“или может в момент запроса sqlite1c пробовать транзакцией блокировать необходимые таблицы ?”
Т.е. не только проведение документов делать последовательно между пользователями, но и формирование отчетов. ;-))) Тем более, что это не поможет.
“жесть”
Думаю, в следующей версии Александр исправит эту проблему. Причина, то известна. И не требует больших переделок в разработке.
# Ответить
162. JohnyDeath 16.07.2008 15:39
hogik, а как по-простому повторить данное поведение?
1. В одной сессии выполняем запрос: "select * from Журнал"
2. В другой в это время выполняем код:
Код
 Док=СоздатьОбъект("Документ.Любой");
Док.Записать() 
Показать полностью

Готово. (главное, чтоб "Записать()" выполнялась в момент выполнения запроса)
Я правильно понял?
Ответили: (163)
# Ответить
163. hogik 16.07.2008 16:28
(162)
Более очевидный способ – делать это на справочниках. Т.е. я брал запрос из http://infostart.ru/blogs/482/. А в другой сессии выполнял чтение, обновление, добавление, удаление записей. Я написал причину в: http://code.google.com/p/sqlite1c/issues/list , ID=10, последний абзац. И этот сбой соответствует принципам технологических блокировок при работе с DBFами. До недавних пор, просто, не было полной уверенности в том, что 1C-ина делает в этих методах. Теперь уверенность есть :-(((
# Ответить
164. Сhe Burashka 17.07.2008 19:20
..блин.. прямо триллер с лихо закрученным сюжетом... а сыщик - в отпуске.. я только собрался поточить..опять придется отложить...
# Ответить
165. hogik 17.07.2008 21:05
Заблокировал использование методов, вызывающих ошибку в многопользовательском режиме.
Провел замеры скорости выполнения запросов в условиях, описанных в http://infostart.ru/blogs/482/.
Получил, время выполнения запроса 2500 секунд.
Это время мало отличается от времени выполнения данной задачи обычным циклом на штатном языке программирования. Т.е. основная причина быстрого выполнения запроса в 1SQLite, это использование методов движка не предназначенных для многопользовательской среды.
# Ответить
166. Chieftain 18.07.2008 10:46
Ну вот попробовал я получить ошибку. В разных сеансах был выполнен следующий код:
Процедура Сформировать()
Спр = СоздатьОбъект("Справочник.ТестВылетов");
Пока 1=1 Цикл
Спр.Новый();
Спр.УстановитьНовыйКод("фыв");
Спр.Наименование = Спр.Код;
Спр.Записать();
//Сообщить(Спр.Код);
КонецЦикла;
КонецПроцедуры
Процедура Сформировать()
База=СоздатьОбъект("SQLiteBase");
База.Открыть(":memory:");
Запрос = База.НовыйЗапрос();
Пока 1=1 Цикл
запрос.ВыполнитьЗапрос("SELECT * From Справочник_ТестВылетов",ТаблЗапроса);
//Сообщить(ТаблЗапроса.КоличествоСтрок());
КонецЦикла;
КонецПроцедуры

Что-то ошибок не выскакивает, база не рушится...
Навероное у меня руки не из того места растут
Ответили: (171) (167)
# Ответить
167. Chieftain 18.07.2008 10:57
+(166) Попробовал то же самое сделать немного иначе. В одной сессии идет запись, в нескольких других - выполняется запрос. Вылетов снова нет.
Научите меня валить 1С-ку, плиз
# Ответить
168. JohnyDeath 18.07.2008 11:20
Тоже проверил у себя по методике Chieftain'a, "усложнив" запрос:
Select sum(Количество) FROM Справочник_Новый1 Новый1 Where Новый1.Количество>=0
две сессии колбасились около 5 минут. Ниодного вылета! Что я делаю не так?
# Ответить
169. hogik 18.07.2008 13:43
(166-168)
Для того, что бы увидеть сбой надо проводить тестирования в сети.
Или хотя бы в “MS Virtual PC”.
Т.е. надо дать задачам выполняться параллельно. ;-))))))
# Ответить
170. hogik 18.07.2008 14:12
Для сомневающихся в наличии сбоя смотрите в конце статьи снимок экрана.
http://infostart.ru/blogs/482/
# Ответить
171. hogik 18.07.2008 15:47
(166)(Chieftain)
“Навероное у меня руки не из того места растут”
Думаю, не руки, а глаза.
В (153) написано “…после ожидания, примерно, 60 секунд”. Т.е. это означает, что запрос должен выполняться большее время. А еще можно посмотреть на замеры в http://infostart.ru/blogs/482/ для 1SQLite увидеть там время около 180 секунд. Имеет смысл посмотреть, там же, размеры файла DBF и количество записей. Не думаю, что Ваш запрос отбирает 510426 записей в таблицу значений. ;-)
# Ответить
172. hogik 30.07.2008 23:54
Похоже, что возникновение ошибки “CodeBase –56” удаётся устранить без потери в скорости выполнения запроса. Я это сделал в DBEng32 (для родных DBFов), но это легко можно перенести в 1SQLitte. Ждем Александра… :-)))
# Ответить
173. Сhe Burashka 31.07.2008 01:46
ага.. вот она типа истина...
# Ответить
174. Свой 31.07.2008 12:05
тестировал 1sqlite в условиях сетевой работы на машинах Win XP.
При обращении к таблицам с данными по сети судя по скорости компонента полностью перекачивает таблицу и скорость обработки запроса сравнима с прямым запросом через Microsoft Visual FoxPro Driver или Microsoft.Jet.OLEDB.4.0 (я не использовал 1С++ а только вышеуказанные драйвера-провайдеры)
при локальном запуске 1sqlite примерно на ПОРЯДОК быстрее прямых запросов также запущенных локально
В качестве практической пользы пока реализовал "клиент-сервер" когда обработка на клиенте (сетевое подключение) отправляет сеансу на машине(хранилищу базы) запрос 1sqlite и обратно ей передается ТЗ с данными, работает шустро
Ответили: (178) (175)
+ 2 [ JohnyDeath; hogik; ]
# Ответить
175. JohnyDeath 31.07.2008 12:11
(174) В качестве практической пользы пока реализовал "клиент-сервер" когда обработка на клиенте (сетевое подключение) отправляет сеансу на машине(хранилищу базы) запрос 1sqlite и обратно ей передается ТЗ с данными, работает шустро
А можешь поподробнее? В блоге расписать. Очень интересно что, как и почему.
Ответили: (176)
# Ответить
176. Свой 31.07.2008 12:18
(175) Спасибо, у меня нет опыта в написании в блогах, поэтому не могу обещать, но подумаю над статьей
Ответили: (177)
# Ответить
177. JohnyDeath 31.07.2008 12:28
(176) ты просто вкратце напиши как у тебя это всё работает, а кому будет интересно - спросят подробнее.
# Ответить
178. hogik 31.07.2008 15:08
(174)(Свой)
“…реализовал "клиент-сервер"…”
Ставлю плюс на само сообщение, даже если не появится статья в блоге.
# Ответить
179. JohnyDeath 31.07.2008 15:39
Тоже поставлю, но всё-таки очень хочется увидеть реализацию. ;)
# Ответить
180. hogik 01.08.2008 17:11
В http://infostart.ru/profile/2905/projects/2308/ добавлено описание причины возникновения ошибки “CodeBase –56” и некоторые пути решения данной проблемы.
# Ответить
181. hogik 21.08.2008 03:10
В http://infostart.ru/profile/2905/projects/2308/ положил на пробу новую версию с “гибким” управлением методами Begin/EndReadSequence(). Подробнее см. описание к версии 7.0.0.3.
Ответили: (190)
# Ответить
182. hogik 08.09.2008 17:07
Добавлены замеры для 1SQLite (1019) после исправления проблемы в многопользовательском режиме: http://infostart.ru/profile/2905/blogs/482/
# Ответить
183. hogik 11.09.2008 19:17
Добавлен замер времени выполнения цикла на штатном языке программирования с использованием транзакции: http://infostart.ru/profile/2905/blogs/482/
# Ответить
184. rovix 12.09.2008 18:53
долго курил данную тему.
очень расстроился после сообщения hogik`a об ошибке (153)
однако теплится надежда на то, что я не совсем верно понял ситуацию :)
Уважаемый hogik разъясните пожалуйста, базы портятся при совместном использовании codebase и запросов 1sqlite или при использовании 1sqlite со стандартным движком 1с?
Ответили: (185)
# Ответить
185. hogik 12.09.2008 19:17
(184)(rovix)
1) Стандартный движок 1С – CodeBase. Не путайте с разработкой “DBEng32 для CodeBase 6.5”.
2) База данных портится при использовании стандартного движка 1С.
3) В версии 1SQLite (1019) проблема решена – см. форум по 1С++.
4) В версии 1SQLite (1018) проблема решена – см. разработку http://infostart.ru/profile/2905/projects/2308/
# Ответить
186. rovix 15.09.2008 08:58
2 hogik
спасибо, теперь понял
# Ответить
187. rovix 15.09.2008 09:33
Меня и смутило совпадение названий и там codebase и там codebase.
Но насколько я понял из http://infostart.ru/profile/2905/projects/2308/ использовать на промсчете данную разработку пока рисковано? А с другой стороны начальство остерегается пересаживать базу на CodeBase/Advantage поскольку тоже в обсуждениях высказывалось что-то негативное (или даже в самом описании ) и за это платить еще деньги.
Вообще-то у нас dbf база эксплуатируется в терминальном режиме? Подскажите как все-таки безопаснее ускорить работу?
Пока применили Вашу hogik разработку http://infostart.ru/profile/2905/projects/1725/ (kernel33) для снятия ограничения 1ГБ - давняя головная боль :( спасибо
Ответили: (189)
# Ответить
188. orefkov 15.09.2008 12:39
Проблема с некорректной работой компоненты в многопользовательском режиме решена, скачать можно с http://www.1cpp.ru/forumfiles/Attachments/1sqlite_1019_fix.zip (Плюс еще несколько багов устранены)
Сюда пока не выкладываю, так как еще не все фишки доделал, какие хотел в включить в новый релиз.
Ответили: (191) (190)
# Ответить
189. hogik 15.09.2008 13:51
(187)(rovix)
1) “…использовать на промсчете данную разработку пока рисковано?” – Разработка “DBEng32 SEQ” не предназначена для “промсчета”.
2) “начальство остерегается пересаживать базу на CodeBase/Advantage” – И это естественно. У нас решение на “CodeBase 6.5” успешно работало ровно год. Сейчас, почти год, успешно работает решение на “Advantage 8.1”.
3) “тоже в обсуждениях высказывалось что-то негативное” – Что?
4) “Подскажите как все-таки безопаснее ускорить работу?” – Самое безопасное ускорение – DBFная версия 1Са в терминальном режиме. Это при малом количестве пользователей и не превышении 1(2) гигабайт на размер таблицы. Далее - SQLная версия 1Са с использованием прямых запросов и увеличением мощности сервера.
# Ответить
190. rovix 16.09.2008 14:51
DBFная версия 1Са в терминальном режиме;
Одновременно работает по 50-60 человек;
два четырехядерных процессора;
в пиковой нагрузке конечно же заметно притормаживание системы, а в остальное время, в принципе, приемлемо.
Хотелось бы снять нагрузку за счет, может быть, прямых запросов. Тем более, начальство вычитало статью в журнале "Системный администратор" №7 за 2008, там как раз за это было написано. В статье упоминаются 1sqlite, 1C++, SpellSQL, Rainbow, ToySQL.

2(orefkov)(188)
То есть, теперь можно использовать 1sqlite без использования (181)?
# Ответить
191. orefkov 16.09.2008 16:36
2 rovix
Да, можно.
Более подробно о том, что в (188):
Версия без ReadSequnce.
Добавлено:
- Объект SQLiteQuery. Метод ParseSqlText / ОбработатьТекстЗапроса("текст")
Возвращает переданный текст, обработанный метапарсером.
Установленые для запроса методом "Подставлять" текстовые параметры НЕ СБРАСЫВАЮТСЯ.

- Объект SQLiteQuery. Свойство NeedTransaction / ВыполнятьВТранзакции
Позволяет прочитать/установить свойство.
0 - не начинать транзакцию.
Не 0 - автоматически начать транзакцию при первом обращении к таблицам 1С при выполнении запроса, если она не начата.
В монопольном режиме независимо от значения свойства транзакция начинается ВСЕГДА.
В немонопольном режиме выполнение запроса в транзакции позволяет ускорить выполнение запроса, однако блокирует используемые таблицы для записи.

- Исправлен косяк при укладке объектов, содержащих в идшнике русские буквы.
- Убраны Begin/End ReadSequnce при чтении длинных строк и таблиц справочников при укладке объектов.
# Ответить
192. O-Planet 16.09.2008 17:07
Оч извиняюсь.. Но не утерпел. roVix - это тоже китайская подделка? :)
# Ответить
193. rovix 19.09.2008 09:32
а почему тоже? кто-то тоже китайская подделка или ты про себя имел ввиду?
# Ответить
194. rovix 19.09.2008 09:36
2 (orefkov)
а можно надеяться что Ваша разработка будет работать с журналами расчетов?
Ответили: (196)
# Ответить
195. O-Planet 19.09.2008 09:36
Просто еще есть romix... )
# Ответить
197. rovix 22.09.2008 11:54
2 orefkov
расписал структуру ЖР в http://code.google.com/p/sqlite1c/issues/detail?id=12
# Ответить
198. rovix 08.10.2008 10:19
так что, надеяться на реализацию работы с ЖР не стоит?
# Ответить
199. orefkov 19.11.2008 10:37
Выпущена версия 1.0.1.9

- Сделано принудительное округление чисел при типизации :Число, тк получатели
результата (кроме ТаблицыЗначений) сами этого не делают.
- Исправлена работа типизации при обработке NULL значений, тк получатели
результата (кроме ТаблицыЗначений) сами этого не делают.
- Изменена логика работы с Begin/EndReadSequnce. В немонопольном режиме падение
производительности, зато не падает.
- Добавлен метод SQLiteQuery::ОбработатьТекстЗапроса
- Добавлено свойство SQLiteQuery::ВыполнятьВТранзакции
- Исправлена ошибка программы при подключении таблиц шапки документа, не имеющего
реквизитов шапки.
- Исправлена ошибка при выборке из таблиц 1С, иногда могущая привести к зависанию
программы.
- Добавлено подключение таблиц ЖурналовРасчетов ДБФ версии 1С.
- Исправлена укладка списка объектов при наличии иерархии - неверно укладывались
объекты, содержащие в идентификаторе русские буквы (распределенка с русским
префиксом ИБ).
- Добавлен объект SQLiteDataProvider - поставщик данных табличного поля 1С++ для
таблиц sqlite и таблиц 1С DBF-версии.
# Ответить
200. Duke 17.12.2008 16:43
Подскажите плиз, как выбрать все документы определенного вида, например, РасходнаяНакладная, у которых Контрагент тому, который выбираем на форме отчета (ВыбКонтрагент) ? Пишу
select d.iddoc [Документ :Документ]
from Документ_РасходнаяНакладная as d
where d.Контрагент = :ВыбКонтрагент"

Запрос пустой :-(
# Ответить
201. Duke 17.12.2008 16:54
Уже сам разобрался. Недотипизировал объект....Нужно было
select d.iddoc [Документ :Документ.РасходнаяНакладная] писать
# Ответить
202. Duke 26.12.2008 12:07
Подскажите, как написать запрос по продажам в 1с 7.7 ТиС:
|Период С Дата1 По Дата2;
|Фирма=Регистр.ОстаткиТоваров.Фирма;
|Товар=Регистр.ОстаткиТоваров.Товар;
|Склад=Регистр.ОстаткиТоваров.Склад;
|ДокументДвижения=Регистр.ОстаткиТоваров.ТекущийДокумент;
|Кол=Регистр.ОстаткиТоваров.ОстатокТовара;
| РасхКол=Расход(Кол);
|Функция КонКол=КонОст(Кол);
|Группировка Товар без групп все;
Не понятно как вязать Регистр_ОстаткиТоваров и РегистрИтоги_ОстаткиТоваров... Или это нереальано с помощью Sqlite ?
Ответили: (203)
# Ответить
203. JohnyDeath 26.12.2008 14:38
(202) всё реально. Читай описание подсистем регистров.
Или возьми и покумекай класс: http://www.1cpp.ru/forum/YaBB.pl?num=1216729138/30#32
# Ответить
204. orefkov 07.04.2009 17:00
Новая версия 1.0.2.0


- SQLite обновлен до релиза 3.6.11
- Добавлена способность ПоставщикаДанных динамически менять текст запроса, если
некоторые поля не нужны табличному полю для отображения
- Добавлена возможность быстрого поиска для поставщика данных
- Исправлена ошибка выборки данных при некоторых условиях
(where date <= '09или19или29.месяц.год' order by date desc)
- Убрана странная ошибка при попытке подготовить запросы с текстом запроса длиннее 972 символов.
- Порядок сортировки в 'collate _1C' сделан точно соответствующим порядку сортировки в дбф-файлах 1С.
- Изменены методы:

- SQLiteDataProvider::УстановитьТекстЗапроса
- SQLiteDataProvider::Отладка

- Добавлены методы:

- SQLiteDataProvider::НеУдалятьПоля
- SQLiteDataProvider::ПоляБыстрогоПоиска
- SQLiteDataProvider::ПолучитьТекстЗапроса

Брать на http://code.google.com/p/sqlite1c/downloads/list
# Ответить
205. Свой 05.05.2009 19:44
спасибо
можно ли ожидать увеличения скорости компоненты всвязи с обновленным движком ?
# Ответить
206. badboychik 08.06.2009 23:50
А скажите как написать условие, аналогичное 1Сному
"Условие (Номенклатура.ПринадлежитГруппе(Молоко)=1)"
Причем группа Молоко многоуровневая
# Ответить
207. orefkov 09.06.2009 08:06
Сначала использовать УложитьОбъекты, потом сделать джойн с таблицой уложенных элементов.
# Ответить
208. MrDen 28.08.2009 15:22
текущая версия sqlite 3.6.17 бедт ли изменена ВК?
# Ответить
209. drumboss 13.10.2009 17:34
Из каких соображений нельзя уложить в Лайт ТЗ с количеством строк =0 ??
приходится писать что-то подобное...

Процедура УложитьТЗвЛайт(База,_ТЗ,ИмяТаблицы,Врем=0)
Если _ТЗ.КоличествоСтрок()=0 Тогда
_ТЗ.НоваяСтрока();
База.УложитьТЗ(_ТЗ,ИмяТаблицы,Врем);
Запрос=База.НовыйЗапрос();
Запрос.ВыполнитьЗапрос("delete from "+ИмяТаблицы);
Иначе
База.УложитьТЗ(_ТЗ,ИмяТаблицы,Врем);
КонецЕсли;
КонецПроцедуры

Может
SQLiteBase::putVT(CValueTable* pVT, const CString& strNameOfTable, BOOL bAsPersistent)
...
DWORD rows = pVT->GetRowCount();
if(!rows){tg.err = FALSE;return;}
# Ответить
210. CheBurator 17.11.2009 02:54
в примере с поиском по подстрокам
.
РазбиваемаяСтрока=СтрЗаменить(РазбиваемаяСтрока,"'","''");
РазбиваемаяСтрока=СтрЗаменить(СокрЛП(стрПоиска)," ",РазделительСтрок);
- вот тут вот как-то неаккуратненько???
# Ответить
211. shtah 20.11.2009 17:29
Здравствуйте! Подскажите пожалуйста, никак не могу собрать запрос, в котором в качестве условия фигурировало бы перечисление.

select ФИО, Рез from НужныйСправочник where Рез='+'

Рез - Перечисление "Булево", имеет значения "+" или "-"
# Ответить
212. shtah 23.11.2009 12:06
знаю, что дело в типизации..
Но вот так тоже не выходит:

SELECT
ФИО, ПолеСПеречислением [ПолеСПеречислением :Перечисление.Булево]
FROM НужныйСправочник
WHERE ismark <> '*'
AND (ФИО LIKE '%А%') AND (ПолеСПеречислением ='+')
Ответили: (213)
# Ответить
213. JohnyDeath 23.11.2009 15:57
(212)
В запросе:
AND (ПолеСПеречислением =:Плюсик)

Далее:
Запрос.Подставлять("Плюсик", Перечисление.Булево.+);

П.С. У тебя прям в конфигураторе в ИД стоит "+"?
Ответили: (214)
+ 1 [ shtah; ]
# Ответить
214. shtah 23.11.2009 17:24
(213)
у меня там словом, разобрался, спасибо!
# Ответить
215. MrDen 25.11.2009 17:04
На офсайте версия 1.0.2.0 bugfix 3
# Ответить
216. Alav 01.01.2010 21:35
Так что с обновлением?

Текущая версия 1.0.2.0 bugfix 3
* SQLite версии 3.6.11
(с) http://code.google.com/p/sqlite1c/

Current Status
* Version 3.6.21 of SQLite is recommended for all new development. Upgrading from version 3.6.12, 3.6.13, 3.6.14.2, or 3.6.16 through 3.6.20 is optional. Upgrading from all other SQLite versions is recommended. (с) http://www.sqlite.org/
# Ответить
217. Alav 02.01.2010 02:43
И второй вопрос, чем можно посмотреть файл с базой, созданной этой компонентой?
Ответили: (218)
# Ответить
218. JohnyDeath 03.01.2010 13:22
(217) если в базе присутствуют и виртуальные таблице, то посмотреть их можно только с использованием текущей компоненты. Иначе есть несколько хороших программ, например вот эта http://www.sqliteexpert.com/
# Ответить
219. Alav 10.01.2010 00:59
Хорошо попробую.

В принципе плагин к лисе тоже вроде бы нормально видит эти базы
http://code.google.com/p/sqlite-manager/
# Ответить
221. Anri 07.04.2010 11:23
Добрый день! Маленько не по теме, но всеже.
Пытаюсь создать Базу в консоли : на винде получается через три на четвертый(закономерности не заметил) на линухе с первого раза. Из 1С (7,7 ) база создается , но загрузить в нее данные не получается, в какую сторону копать?
Как загрузить данные из виртуальной таблицы в файл базыSQL?
И еще вопрос про относительные пути в 1С 7и 8 ? если обработка запуска лежит в каталоге, отличном от каталога базы , прогФайлов(допустим на флешке) как определить програмно путь до нее? (база естественно будет лежать неподалеку, да и DLL-ка тоже)
Ответили: (222)
# Ответить
222. Anri 12.04.2010 18:15
(221) Наверно вопрос глупый....
# Ответить
223. alest 18.03.2011 17:31
orefkov, можно ли с помощью вашей разработки записать файл в произвольную базу данных sqlite?
Если да, то подскажите, пожалуйста, каким объектом? Вот если бы из 1с++ binarydata туда ложить данные можно было...
# Ответить
224. cool.vlad4 18.03.2011 17:48
Ай, красава...только вот недавно пришла идея сделать хитрый обмен через инет с помощью мини баз на sqlite, а тут на ИС такую штуку проглядел...
# Ответить
225. МАлексей 08.11.2011 16:51
Замечательная штука. Совместно с прямыми запросами кратно увеличивала скорость работы сложных отчетов при работе по сети с dbf (в смысле позволяла не гонять данные по сети, а скопировать на комп и с ними работать).
# Ответить
226. KrakoZyabl 31.01.2012 14:18
Много сказано благодарных слов, остается только присоединиться к ним и выразить особую благодарность автору за его труд!!! Спасибо :)
# Ответить
227. orefkov 01.02.2012 10:33
Несколько новостей.
Проект переехал сюда.
Выпущена версия 1.0.2.5 - sqlite обновлен до 3.7.10
Документация по добавленным в 1.0.2.4 фичам - готовится.
# Ответить
228. nicxxx 02.02.2012 02:37
не открывается http://www.snegopat.ru/1sqlite/ :(
Ответили: (229)
# Ответить
229. orefkov 02.02.2012 08:21
(228)
Во-первых, адрес без www
Во-вторых, заработало :)
(У хостера что-то там было...)
# Ответить
230. orefkov 03.02.2012 08:32
Выпущена версия 1.0.2.6
Исправлена ошибка, приводящая к вылету при попытке работать с файловыми базами данных.
# Ответить
231. orefkov 03.02.2012 15:03
Вот наконец-то пытаюсь уйти от старой шестой студии 98 года, и пересобрать библиотеку современными средствами, в Visual Studio 2008. Размером получается чуть меньше, работает чуть пошустрее.
Кому охота, может затестить.
http://snegopat.ru/downloads/1sqlite/1sqlite_1026_2008.zip
# Ответить
232. alyuev 06.02.2012 19:21
Есть вопрос:

	База.УложитьТЗ(ТЗ,"ТЗ");
	запросSQLLite.ВыполнитьЗапрос("INSERT INTO base Select * From ТЗ");


Уложенная ТЗ - это виртуальная таблица в памяти, чтобы заполнить базу значениями из неё (запросом INSERT)? Т.е. она сама (ТЗ) не сохраняется в базе при укладке?
Ответили: (233)
# Ответить
233. orefkov 06.02.2012 21:13
(232)
Смотри внимательнее параметры метода УложитьТЗ, там есть "как постоянную"
т.е. по дефолту таблица под ТЗ создается компонентой как
Код
create temporary table
Показать полностью

и автоматом дропается при закрытии базы, а может создаваться как
Код
create table
Показать полностью
Ответили: (234)
# Ответить
234. alyuev 07.02.2012 13:29
(233) Спасибо! Понял. А онлайн-документация пока только здесь =>> Дока по 1SQLite?
Ответили: (236)
# Ответить
235. alyuev 07.02.2012 13:31
И ещё вопрос - есть ли возможность получать первые/последние N записей результата запроса?
Ответили: (236)
# Ответить
236. orefkov 07.02.2012 13:43
(234)
Лучше здесьсмотреть свежие версии, нужно только залогиниться как анонимус.
(235)
первые N:
Код
select .... limit N
Показать полностью

последние - отбирать как первые N с обратной сортировкой.
# Ответить
237. alyuev 07.02.2012 17:54
А как можно объединить 2 таблицы с одинаковой структурой? Есть база SQLite и есть ТЗ с аналогичной структурой. ТЗ укладываю. И дальше хотел бы объединить эту ТЗ с базой запросом типа MERGE. Чтобы потом сделать общий запрос.
# Ответить
238. alyuev 07.02.2012 18:32
Пытаюсь работать с INSERT OR REPLACE INTO - для слияния 2х таблиц (одна под другой)

		|INSERT OR REPLACE INTO 
		|	main (< ... тут перечень полей ...>)
		|SELECT * 
		|FROM ТЗ";
...Показать Скрыть

тестирую несколько раз - записи каждый раз добавляются. Т.е. как понимаю REPLACE не срабатывает. Что-то не так делаю?
Ответили: (240) (245)
# Ответить
239. orefkov 07.02.2012 18:34
Если влить данные из ТЗ в таблицу, то
Код
insert into basetable select ... from tzTable
Показать полностью

а если просто выбрать данные, то
Код
select .... from basetable
union all
select .... from tztable
Показать полностью

вот тут есть описание языка, правда по-аглицки.
Ответили: (241)
+ 1 [ alyuev; ]
# Ответить
240. orefkov 07.02.2012 18:37
(238)
replace срабатывает при вставке с уникальным полем.
Ответили: (241)
# Ответить
241. alyuev 08.02.2012 14:03
(239) За "UNION ALL" - большое спасибо - самое то!
(240) А как определить/назначить ключевое поле (PRIMARY KEY) для уложенной ТЗ? И в базе данных - создание индекса - не равносильно ли PRIMARY KEY? Я при создании базы не прописывал ключевое поле, но создал индекс.
Ответили: (242)
# Ответить
242. orefkov 08.02.2012 15:05
(241)
Ну да, достаточно создать индекс.
Ответили: (243) (247)
# Ответить
243. alyuev 09.02.2012 17:01
(242) А для уложенной ТЗ как задать ключ?
Ответили: (244)
# Ответить
244. orefkov 09.02.2012 17:07
(243)
Если ты применительно к задаче "insert or replace", то ключ надо задавать в таблице-приемнике, а не в источнике.
Либо сразу при создании таблицы указываешь, либо потом индекс по полю создаешь.
Ответили: (245)
# Ответить
245. alyuev 14.02.2012 17:38
(244) Не работает у меня "insert or replace". Это я делаю переброску МЛГ в SQLite. Создал базу с тремя индексами: Дата, Пользователь, ИД. Заполняю ТЗ (из МЛГ), укладываю её и делаю запрос как в (238). Сделал себе обработку с кнопкой. Так вот сколько раз нажму кнопку - столько раз и запишется в базу одна и та же инфа.
# Ответить
246. alyuev 15.02.2012 12:46
А есть где-то пример Журнала регистрации на SQLite?
# Ответить
247. alyuev 15.02.2012 15:34
(242) Что-то мне кажется, что Ключевое поле и Индекс - не равнозначны. Индекс, если я правильно понимаю, нужен для быстрой выборки, сортировки. Но в индексном поле могут быть одинаковые значения в разных строках. А для Ключевого поля такого не может быть по определению. Т.к. в ключевом поле (опять же, если я правильно понимаю) должны быть исключительно уникальные значения во всей таблице.
# Ответить
248. orefkov 15.02.2012 16:20
create unique index
+ 1 [ alyuev; ]
# Ответить
249. orefkov 15.02.2012 16:26
Проверял:
Код
create table a(a, b, c)
insert into a values(1, 2, 3)
create unique index a_a on a(a)
insert or replace into a values(1, 10, 4)
select * from a
Показать полностью

1 10 4
# Ответить
250. sss999 13.11.2013 11:08
Хотелось бы высказать некоторые хотелки,мне как человеку не писавшему прямые запросы ранее хотелось бы видеть удобо-читаемую инструкцию как это начать делать,мне нужно для базы dbf.А так в одном месте какая то инфа,в другом часть,что бы собрать все вместе нужно лазить пол дня,есть база дбф,я закинул в bin свеже скачанную dll 1cpp,скачал консоль с инфостарта одну,она не заработала,значит чего то не хватило,наткнулся на классы прямого запроса,там вразумительного ничего не сказано,здесь говорится про скл лайт как работа с этим объектом ,откуда он должен взяться,как он подключается в скачке одна dll только,это и есть этот объект и он формирует внутри виртуальные таблицы?(((
Ответили: (251)
# Ответить
251. orefkov 13.11.2013 11:22
(250)
1C++ и 1sqlite - это разные компоненты, работающие независимо друг от друга.
Просто с помощью 1C++ сделан класс, автоматически преобразующий текст запроса в версии для sql и dbf. К самой компоненте есть документация, описывающая, как выполнять запросы. Просто надо ещё знать структуру хранения данных в 1С. На форумах по 1С++ есть много информации на эти темы. Можно ещё и на мисте поспрашивать.
# Ответить
252. sss999 13.11.2013 11:37
Спасибо за ответ,но я немножко другое спросил,как начать работать с вашей dll,небольшой readme так сказать,что куда закинуть и что подключить,так как неявно предполагается наверняка наличие еще и других dll и чего то еще,чего только вы знаете,я зашел на форум а там тоже ссылки,а где гарантия что в той ссылке тоже не будет ссылки.Поэтому вот вы выложили а как все подключить,все требования по установленному п.о. не написали.
# Ответить
253. sss999 13.11.2013 11:57
Я скачал вашу консоль написал почти как у вас в примере,отметил там подключение таблицы галочкой по плану счетов и он мне выдал данные,причем dll liteSql я не прописывал и не закидывал.Если вы не можете внятно это объяснить,кто стоял у истоков, то я сомневаюсь что вообще кто-то может)
Ответили: (254)
# Ответить
254. Ёпрст 13.11.2013 13:29
(253) Ну а вопрос то у вас в чем хоть ?
Что не работает ?
# Ответить
255. sss999 13.11.2013 13:47
в общем закинул dll в бин и консоль вроде работает,но вот другая консоль у которой есть параметры не работает,хоть я и выбирал там все методы и прямой запрос и odbc и ole db,а автор тот вообще не отвечает,и инструкции тоже нет,пишет "Неудачная попытка создания объекта (ПрямойЗапрос)"..вопрос в том что нужно писать ридми что нужно для работы.Как то нужно свести инфу вместе,а то есть какие то классы ,то ли не есть,есть прямой запрос, есть кривой,неужели так трудно было к синтаксису восьмерки привести.все в разных местах,находится,и ниче не понятно.Мне вот нужно написать запрос подключаемый к разным базам,а здесь синтаксиса метода открыть объекта база нет.
Ответили: (257)
# Ответить
256. sss999 13.11.2013 14:08
куча старой инфы на этом форуме,нафига рыться в этой куче,если уже то не нужно то не нужно..жесть,удалить его вообще.
# Ответить
257. Ёпрст 13.11.2013 14:20
(255)
1. Всё писалось разными людьми, для разных целей и задач. Не для начинающих.
2. Есть целый форум, посвященный прямым запросам.
3. Классы, в том числе класс ПрямойЗапрос созданы как раз для облегчения написания чего-либо
4. 1sqlite не позволяет строить запросы к сторонней базе, только в родной.
5. Для написания запроса к сторонней базе, для дбф варианта, достаточно иметь компоненту 1cpp.dll, установленный vfpoledb провайдер.
Обо всём, более подробно можно прочитать тут
http://www.1cpp.ru/forum/YaBB.pl?board=query
welcome!
# Ответить
258. Ёпрст 13.11.2013 14:26
>>>неужели так трудно было к синтаксису восьмерки привести
Зачем это убожество ?
Гораздо проще писать на православном t-sql, и без всяких классов.
# Ответить
259. sss999 13.11.2013 14:31
Я уже придумал просто скинуть в текущую базу dbf из других баз,и обращаться к таблицам по названиям,возможно прийдется расширять md файл еще не знаю.Ну вот это все и не удобно,писали для себя если то и писали бы тогда а не выкладывали,если не могут объяснить нормально как с этим работать,уж как плох синтаксис 1с но их документация в сравнении с 1с это вообще нечто,примеры где.Вот и непонятно,мог бы кто то кто знает обобщить все эти множества сказать какая dll повторяет методы другой,как я понимаю в этой dll уже не нужен класс она и так работает без закорючек.Почему типизацию нельзя было сделать встроенную,и привести синтаксис к 1с 8,но это ладно понятно,наверно долго,или лень
Ответили: (261)
# Ответить
260. sss999 13.11.2013 14:34
в чем удобство на конкретном примере пож-та,или просто привычка,а я вот привык на 8 синтаксисе..
# Ответить
261. Ёпрст 13.11.2013 14:36
(259) Документации, примеров, обсуждений - вагон и маленькая тележка.
Вам просто лень ЭТО осилить.
Про убогий синтаксис языка запросов снеговика, лучше вообще не стоит упоминать.
А типизация там есть, более того, можно лепить запросы к нескольким базам одновременно.
# Ответить
262. sss999 13.11.2013 14:43
а зачем тратить два дня на всю эту инфу,если можно просто написать запрос в знакомом синтаксисе.
Ответили: (263)
# Ответить
263. Ёпрст 13.11.2013 14:44
(262) Когда это изначально писалось, снеговика еще в зародыше не было
# Ответить
264. Ёпрст 13.11.2013 14:49
Ну и то, что vandalsvq в своих классах реализовал парсер запросов "аля снеговик".. по большому счету, не нужно.
# Ответить
265. sss999 13.11.2013 14:50
а с какого года восьмерка по вашему?
Ответили: (267)
# Ответить
266. sss999 13.11.2013 15:00
у меня вопрос как обратиться к регистру по имени dbf файла,получается только через регистр.имя,что бы потом сделать union по всем файлам dbf
Ответили: (268)
# Ответить
267. Ёпрст 13.11.2013 15:16
(265) с 2003 года, если не изменяет память появился снеговик..
# Ответить
268. Ёпрст 13.11.2013 15:17
(266) задача то какая ?
если че

таблица движений регистра:
${Регистр|Register}.<Регистр> = raXXXX

таблица итогов (остатков/оборотов) регистра:
${РегистрИтоги|RegisterTotals}.<Регистр> = rgXXXX
# Ответить
269. sss999 13.11.2013 15:41
задача собрать дебиторку
# Ответить
270. sss999 13.11.2013 15:52
не понял команду синтаксис, название таблицы Rф2207,from $Rф2207,не работает,from $Регистр.Покупатели=$Rф2207,from ${Регистр}.Покупатели=$Ra2207, непонятно
# Ответить
271. sss999 13.11.2013 15:55
select *
from [Регистр.Покупатели] =:RA2207
# Ответить
272. Ёпрст 13.11.2013 16:01
Ё...
На вот, занимайся.
2 запроса, один на фоксе, другой на 1sqlite

Прикрепленные файлы:

_ЗапросОстаткиИОбороты_Фокс_СкульЛайт.ert
# Ответить
273. sss999 13.11.2013 16:41
я посмотрел да,там нет выборки по названию dbf,и он еще не открывается я какую то неправильную видно dll foxpro зарегистрировал ош фоксЗапрос.Выполнить("EXECSCRIPT('SET ANSI OFF')");
{\\TSCLIENT\D\_ЗАПРОСОСТАТКИИОБОРОТЫ_ФОКС_СКУЛЬЛАЙТ.ERT(13)}: FAILED! ICommandText::Execute(): Variable ' ' is not found.
Ответили: (274)
# Ответить
274. Ёпрст 14.11.2013 09:25
(273) поставить этот провайдер:
(если не стоит заплатка от hogik, выполнять запросы через этот провайдер можно только в НЕ монопольной базе)
http://www.microsoft.com/downloads/details.aspx?FamilyId=E1A87D8F-2D58-491F-A0FA-95A3289C5FD4&displaylang=en
Ответили: (275)
# Ответить
275. sss999 15.11.2013 10:07
(274) Ёпрст, я качал эту dll,она не устанавливается на виртуальной машине,говорит не могу установится через подключение к удаленному столу.
# Ответить
276. sss999 26.11.2013 11:12
Я тут все воюю с запросом,не могу во понять почему не работает конструкция Where Жур.IDDocDef = $ВидДокумента.Реализация,и в связи с эти хотелось бы понять как она вообще работает.Вот к этому запросу хотел прилепить,что бы потом еще добавить отбор по реквизиту который есть только у реализации.
select distinct
СпрКонтр.Descr as Контрагент,
СпрДог.Descr as Договор,
Sum(iif(покуп.debkred=1, Покуп.Sp2201, -Покуп.Sp2201) )as СуммаПродОстаток,
Sum(Покуп.Sp2201) as СуммаПрод,
Sum(Sp2203) as СуммаСебест,
Max(покуп.SP2198) as [док $Документ ]
from
ra2207 as покуп
LEFT JOIN SC92 as СпрДог
LEFT JOIN SC134 as СпрКонтр
ON СпрКонтр.id= СпрДог.parentext
ON Покуп.SP2195 = СпрДог.ID

left JOIN 1Sjourn as Жур

ON Жур.IDDoc = покуп.SP2198
Group by Контрагент,Договор
# Ответить
277. sss999 26.02.2014 10:53
Не подскажешь в чем ошибка,1sqllite лежит в базе.Ошибка такая,в обработке прямой запрос создается Объект

{C:\Base77\База\ПрямойЗапрос.ert(1
ПрямойЗапрос::СоздатьОбъектыЗапроса(Строка ПутьКБазеSQL=:memory:) : Неудачная попытка создания объекта
БазаSQLite = СоздатьОбъект("SQLiteBase");
{C:\Base77\База\ПрямойЗапрос.ert(1057) }
Ответили: (278)
# Ответить
278. Ёпрст 26.02.2014 13:54
(277)
ЗагрузитьВнешнююКомпоненту("1sqlite.dll") нет в коде
# Ответить
279. sss999 17.05.2016 13:40
(129) vip, про какое решение речь?
# Ответить
280. starik-2005 17.05.2016 14:09
А под линухом работает?
# Ответить
Внимание! За постинг в данном форуме $m не начисляются.
Внимание! Для написания сообщения необходимо авторизоваться
Текст сообщения*
Прикрепить файл






IE 2016