gifts2017

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
433
.zip 408,69Kb 433 Бесплатно
Пример использования (поиск клиентов/товаров в ДБФ базе 1С)
.1214222839 8,01Kb
25.09.09
294
.1214222839 8,01Kb 294 Бесплатно
Мини-консоль для запуска запроса.
.1214287828 7,33Kb
25.09.09
292
.1214287828 7,33Kb 292 Бесплатно
Пример использования. Универсальное дерево документов (для ДБФ)
.1214287870 7,44Kb
25.09.09
254
.1214287870 7,44Kb 254 Бесплатно
Документация к 1.0.2.3
.zip 62,42Kb
05.02.10
336
.zip 62,42Kb 336 Бесплатно
Пример использования. Отчет "Состояние заявки" для ТиС ДБФ. (работает только на дату ТА)
.1214393726 12,42Kb
30.05.15
239
.1214393726 12,42Kb 239 Бесплатно

См. также

Подписаться Добавить вознаграждение

Комментарии

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

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

А можно ли этим чудом потянуть данные из постороннего дбф (не из базы)?
В обработке "поисктовара" не прошли попытки типа :
запрос.ВыполнитьЗапрос("create virtual table Товары1 using dbeng(Dt1628)") ;
текст="SELECT * FROM Товары1" ; //(c путями к файлу игрался)

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

Жмешь F5.
Видишь все товары, чьи наименования начинаются на Б, В. Если есть товар с названием "Г", его тоже увидишь.
23. Владимир (hogik) 24.06.08 17:10
(19)(Сhe Burashka)
“выборку справочника … делает мгновенно...”
Если в запросе не используется индекс – естественно. Это к вопросу (5) из http://infostart.ru/projects/2089. Выборка обычный циклом без индекса будет работать также быстро.
24. Владимир (hogik) 24.06.08 19:15
Интересная разработка. В части подцепить внешнюю СУБД и дать удобный интерфейс к ней – отлично. А в части прямых запросов к DBFной базе данных 1Са, для данной СУБД – очередной самообман. Достаточно иметь средство отключения индекса при просмотре таблицы и скорость выборки, для некоторых задач, значительно повысится. При этом можно будет пользоваться стандартными языковыми средствами 1Са обработки данных. Конечно для полноценной (эффективной) обработки данных полезно иметь возможность искать и позиционироваться на запись по ключу (чего нет в стандартном языке 1Са), но это реализуется гораздо проще и в использовании проще, чем написание никчемных запросов.
Хотя это дело вкуса :-)
25. Александр Орефков (orefkov) 24.06.08 23:18
(24)
Буду очень благодарен, если ты покажешь мне, на каких типичных задачах в 1С помогла бы выборка в физическом порядке записей.
Тупая выборка из таблица без упорядочивания мало кому интересна.
А "никчемные" запросы рвут язык 1С как тузик грелку, хоть на родном движке dbeng32, хоть на прилепленном тобой движке.
Дико извиняюсь, но твою подмену движка 1С я рассматриваю как попытку поставить более мощный движок на машину с квадратными колесами (язык 1С).
Как не форсируй движок, только грохота от колес больше, а толку не много.
А эта разработка - попытка к боле-менее нормальному движку (dbeng32) приделать круглые колеса, на каких во всем мире принято ездить.
26. Владимир (hogik) 25.06.08 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, то на нем “ездят” многие. Только “управляют” этой “машиной” люди с головой.
27. Владимир (hogik) 25.06.08 01:54
(26)+
Да, совсем забыл сказать. В (19) Сергей (Сhe Burashka) отметил высокую скорость выборки в Вашей разработке. Думаю, он пробовал “поисктовара.ert”. Я в (23) написал “Если…”. Вношу исправления в своё сообщение. Никаких “если”. Именно так и есть. Таблица просматривается в физической последовательности. Это и есть основная причина быстрого выполнения выборки информации. И запрос (как инструмент) не имеет к повышению скорости никакого отношения.
28. Александр Орефков (orefkov) 25.06.08 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.08 09:22
В дополнение к 28.
Вообще-то, приведенный тобой отчет делается вообще без перебора справочника товаров.
JohnyDeath; +1 Ответить
30. Александр Орефков (orefkov) 25.06.08 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С пока не вижу.
31. Евгений Мартыненков (JohnyDeath) 25.06.08 10:39
ПолуОФФ: Саш, а может ты телепат докрутишь так, чтоб было удобно писАть запросы для 1sqlite?
32. Александр Орефков (orefkov) 25.06.08 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
33. Сhe Burashka (CheBurator) 25.06.08 12:38
прям битва титанов, Орефкова и Ходжика ... ;-)
читать это все жутко интересно... Просьба к мэтрам, по возможности, конструктивно обсуждать, а то вы чего-то злобствовать начали...
По мну, например данная разработка видимо будет стартовой площадкой к освоению прямых запросов на 1С++ - потренируюсь пока на DBFe - как-то оно чуть более понятно...
.. в качестве варианта предлагаю запрограммить парочку тяжелых отчетов для типовой тис, например, отчет о состоянии заявки...
тьфу, как-то все сумбурно...
34. Андрей (Свой) 25.06.08 12:49
восьмерка нервно курит в сторонке :)
35. Евгений Мартыненков (JohnyDeath) 25.06.08 12:50
(33) .. в качестве варианта предлагаю запрограммить парочку тяжелых отчетов для типовой тис, например, отчет о состоянии заявки...
Кому предлагаешь? Если сам хочешь вкурить, то сам и пробуй написать. ;)
36. Сhe Burashka (CheBurator) 25.06.08 12:56
38. Сhe Burashka (CheBurator) 25.06.08 12:58
Тут панимаешь монстры пиписьками меряются ;-) - куда уж мне ;-)
По хорошему, взять две типовые ТиСы, на одну сабж прикрутить, на вторую - движок Ходжика
и рассмотреть - +/-, удобства/неудобства и т.д. - весьма пользительный и интересный материал бы получился (имхо)
39. Андрей (Свой) 25.06.08 13:39
Бухитоги не видит компонента ?
40. Евгений Мартыненков (JohnyDeath) 25.06.08 13:46
(38) ну если ты возьмёшься переписать все трудные места на прямые запросы - флаг в руки. ИМХО, это очень кропотливая работа и никто просто так делать её не будет
41. Евгений Мартыненков (JohnyDeath) 25.06.08 13:47
(36,37) А что хитрого? Я ж тебе без иронии посоветовал. А по-другому никак: пока сам не сядишь, никакой чужой запрос тебе не поможет.
42. vip (vip) 25.06.08 13:59
(41) Товарищ Че будет ждать подробной документации и всеобъемлющих примеров.
Хорошо еще, что не сказал, что стыдно выкладывать такую сырую поделку без должного документирования и что разработчики в очередной раз зажрались.
43. Александр Орефков (orefkov) 25.06.08 15:38
(33)
Ну, вот сляпал "Состояние заявки". Проверьте. Единственно, что период берется только от дкумента до ТА.
ВК для отчета нужно 1.0.1.4
44. Владимир (hogik) 25.06.08 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Са и в моей разработке. И желательно в реальных условиях – по сети.
45. Сhe Burashka (CheBurator) 25.06.08 18:24
Спасибо всем откликнувшимся!!!!!!! особенно товарищу Орефкову, чья... ну эта... принадлежность оказалась самой длинной ;-)
Буду тестить и активно вкуривать...
ПОТОМУ ЧТО 8-КА МЕНЯ НЕ ПОРАДОВАЛА СВОИМ БЫСТРОДЕЙСТВИЕМ...
46. Владимир (hogik) 25.06.08 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);   
   КонецЦикла;
    Таб.Сортировать("ВидТов");
   Таб.ВыбратьСтроку();
    Таб.Сортировать("Код");
   Таб.ВыбратьСтроку();
    Таб.Сортировать("Наименование");
   Таб.ВыбратьСтроку();
КонецПроцедуры
Показать полностью
47. Сhe Burashka (CheBurator) 25.06.08 22:28
..мдя... это надо осмыслить...
48. Александр Орефков (orefkov) 25.06.08 23:37
(39)
В компоненте есть доступ к системным таблицам 1Sxxxx.
Так что вполне можно обратится к бухитогам.
Только пока не сделана типизация :Субконто.
Но доделаю в ближайшее время.
(46)
О, вот пошел конструктивный разговор. Отлично. Таки вот рассказываю, как выполняются запросы в SQLite.
Текст запроса парсится движком SQLite, и для выполнения запроса создается "мини-программа", некий байт-код,
который затем исполняется виртуальной машиной SQLite (VDBE - virtual database engine - часть движка SQLite)
Эту программу можно просмотреть - достаточно перед текстом запроса добавить слово "explain", и вместо выполнения запроса будет возвращена программа его выполнения.
Это преамбула была. А теперь амбула.
Если посмотреть программу выполнения того запроса, то можно увидеть, что алгоритмически она практически эквивалентна приведенному тобой алгоритму.
Но. Выполнения этой программы делается не интерпретатором 1С, а интерпретатором SQLite, который гораздо шустрее.
Кроме того, заточен он именно на выполнение типичных операций с данными, например, вместо примитивного поиска/вставки в ТЗ используется поиск/вставка в индексированной временной таблице и тп.
Вот такие плюсы вырисовываются - вместо ручного написания алгоритма на 1С, с медленным выполнением его интерпретатором 1С, более короткий и лаконичный запрос, который преобразуется практически в такой же алгоритм, но еще и выполняемый гораздо быстрее и эффективнее.
49. Александр Орефков (orefkov) 25.06.08 23:40
Народ, кто-нить пробовал проверить выложенный отчет "Состояние заявки" ?
Интересны результаты на нормальных базах, а то я только на демке ТиСа проверял.
Да, там если фильтр по товару ставить, немного лишних данных может вылазить, не обращайте внимания, я попозже поправлю.
50. Владимир (hogik) 26.06.08 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 (sbs) 26.06.08 01:53
(49) посмотрел отчет о состоянии на живой базе. У нас в регистр.резервыТМЦ добавлено измерение "партии", поэтому в строках документа и движениях номенклатура может повторяться.
В этом случае получаем Резерв = Выписано * КоличествоСтрокСДаннойНоменклатурой. (В общем-то случай частный...).
По скорости со штатным запросом сравнивать смысла нет - отрабатывает мгновенно.
52. Сhe Burashka (CheBurator) 26.06.08 02:51
Поясните, плиз, что значит " навигационные алгоритмы", "навигационный способ"...?
я догадываюсь, но хочется определенности...
53. Сhe Burashka (CheBurator) 26.06.08 02:55
что-то я потерялся... обсуждение чего идет..? Ходжик говорит, что то, что сделал Орефков - это типа "костыль" для инвалида - ходить будет, и даже возможно бегать сможет, но в соревнованиях - не выиграет... и в соревнованиях имеет смысл допускать инвалидов, которым вместо костылей приживили фоигенные сервомотрочики вместо ног...? типа правильно я понял?
54. Сhe Burashka (CheBurator) 26.06.08 03:13
бегло затестил обработку по отчету о состоянии заявки - переделал вывод в базовых единицах.. ну что сказать... штатная считала... эээээ... не хочится озвучивать... - взял заявку из ПРЕДЫДУЩЕГО МЕСЯЦА - считала штатная отчетина более полутора минут - мне ждать надоело - полез комменты читать - орефковская - отсчитала секунды за 3-4 (субъективно большую часть времени заняло обновление строки состояния)... В штатной все время занимает расчет остатков на дату заявки - идет долгая сборка данных...
55. Сhe Burashka (CheBurator) 26.06.08 03:18
в проверяемой заявке - 400 строк...
56. Владимир (hogik) 26.06.08 03:56
(52,53)(Сhe Burashka)
Навигационный способ, в части чтения:
1) Установить позицию на запись в таблице по ключу индекса или номеру записи.
2) Переместиться по таблице на N записей к началу или концу таблицы от текущей записи в порядке индекса или физическом порядке.
3) Установить позицию на начало или конец таблицы в порядке индекса или физическом порядке.
Моя основная мысль в данном осуждении, что утверждение Александра “запросы рвут язык 1С как тузик грелку” есть самообман. Я считаю, что в языке 1Са не хватает навигационных команд для написания полноценных и эффективных алгоритмов. И запрос к этому не имеет никакого отношения. Запрос в данной разработке лишь использует полный набор навигационных команд. Возможно не всегда оптимальным образом. Писать алгоритм в виде заброса или непосредственно навигационными командами – дело вкуса. Однако при написании алгоритма непосредственно навигационными командами можно всегда обеспечить максимальную эффективность.
Далее мы сползли на обсуждение моего “прилепленного” движка, т.к. в нем, кроме всего прочего, есть расширения стандартного языка 1Са в части прямого доступа к таблицам навигационными командами. Естественно, далее я стал говорить о “всем прочем” в моей разработке. И пытаюсь подвести собеседника к тому, что мной изготовленные “костыли” имеют большее значение, чем средства написания алгоритмов выборки. Т.е., что “содержание” важнее “формы”. Хотя и признаю, что “форма” в этой разработке сделана хорошо.
На вопрос “обсуждение чего идет..?” затрудняюсь ответить. Обмен текстами идет, но, по-моему, в разных темах. :-(((
57. Владимир (hogik) 26.06.08 04:23
+(56)(Сhe Burashka)
Кстати. Использование разработки 1SQLite не отменяет возможности использования моей разработки в части режима клиент/сервер. Единственно, что запросы будут выполняться на стороне клиента. Т.е. в чистом виде будут давать только удобство их написания, а не повышать эффективность системы в целом как это задумывалось для клиент/серверной технологии. При этом если, в моей разработке на CodeBase использовать не клиент/серверный режим (у меня это названо – ПДБД) в режиме терминал сервер, то все мои доработки остаются в силе в части:
1) Снятия ограничения на размер таблицы.
2) Устранения клинчей.
3) Разгрузка 100% занятости процессора.
4) Более высокая скорость работы движка.
5) Решение проблемы потери эффективности для больших таблиц.
6) Неограниченное количество пользователей (бесплатно).
7) И т.д.
Кроме этого можно использовать одновременно с 1SQLite и мои расширения штатного языка 1Са в части прямого доступа к таблицам.
58. Александр Орефков (orefkov) 26.06.08 08:48
(54)
В типовой ТиС (по крайней мере в той версии, что у меня есть (9.2 7.70.947)) для этого отчета не совсем оптимален регистр Заявки и ЗаказыЗаявки.
Если в регистре Заявки у измерения ЗаявкаПокупателя включить "Отбор движений", в ЗаказыЗаявки у измерения ЗаявкаПокупателя поставить "Отбор итогов", и слегка переписать запрос, можно добится еще большей скорости выполнения отчета.
(57)
А вот это радует.
Если я правильно понял, можно использовать с 1С твой движок, и моя компонента все-равно будет работать?
59. Александр Орефков (orefkov) 26.06.08 09:00
(53)
Не по словам суди, а по делам.
Ты ведь пример отчета запускал. Костыль это или сервомоторчик?
К тому же можно взять, и запустить код из (30), (32), (46), замерить время.

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

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

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

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

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

P.S. Это ни в коем случае не упрёк или наезд. Это просто реплика из зала. Личное мнение на основе личного опыта.
69. Александр Орефков (orefkov) 27.06.08 09:44
+68
Я бы уточнил - без этого никогда оптимальноне решишь задачу методами декларативными
70. Алексей (ADirks) 27.06.08 10:37
эээ... да, слово пропустил :)
71. Владимир (hogik) 27.06.08 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 для своих разработок. Но у меня получилось, так, что больших удобств пользователь не получал.
72. Владимир (hogik) 28.06.08 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С отобразить на функции СУБД “более прямым способом”.
73. Андрей (Свой) 28.06.08 13:18
Ура ! Бухитоги сделаны !!!
74. Донат Каверин (Donat) 28.06.08 18:01
+(72)
В случае с Advantage стоит ещё вспомнить о её цене. :-(
75. Владимир (hogik) 28.06.08 18:13
+(74)
И сравнить ее с ценой MS SQL ;-)
76. kitt al;dskjf;ldasjkf (kitt) 28.06.08 18:47
2orefkov, Саша, а есть ли в планах на будущее добавление возможности работы с произвольной базой 1с дбф, типа OLEDBdata.ПрисоединитьИБ() в 1срр?
77. Александр Орефков (orefkov) 28.06.08 21:30
(76)
Не знаю. Я пока не смог подключить движок 1С к другой базе.
78. Андрей (Свой) 28.06.08 22:34
натолкните на путь истинный, как добраться до бухитогов... собственной головой дошел только до того что нужно создать запрос "create virtual table Проводки using dbeng(_1С.ENTRY)" :(
можно примерчик, как хотябы осв по счету сделать (например остатки по складу)... или как сделать аналог СКД(Счет,ТипСуммы,Валюта,Субконто)
79. Андрей (Свой) 28.06.08 23:32
вроде получается.... подключил в консоли таблицу Проводки, теперь работает запрос
select
Docid,
ktsc0,
accdtid
from Проводки
where DATE > 20080427 and DATE < 20080629 and accdtid = ' N'

где N - идентификатор счета10.1
я на правильном пути ?
80. Сhe Burashka (CheBurator) 29.06.08 00:51
81. Сhe Burashka (CheBurator) 29.06.08 03:10
Только что родилось мега-предложение по функционалу.. и тут я задумался... - а неужели orefkov глупее меня...? ;-) смотрю - нет! есть! есть "Укладка в базу данных SQLite ТаблицЗначений".... оле-оле-оле-оле! теперь можно из файла загнать в ТЗ и применить сабж! (и так хитро с ленинским прищуром: а есть ли возможность загнать в базу данных SQLite текстовый файл с разделителями напрямую, без промежуточного чтения в ТЗ...?
82. Владимир (hogik) 29.06.08 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.
Разбираться бум? Если – да. То как?
83. Владимир (hogik) 29.06.08 04:10
+(82)
Слетает сразу после первого вызова:
GetTable() для RG405
84. Андрей (Свой) 29.06.08 16:56
никак не получается использовать типизацию Субконто :(
85. angro (angro) 29.06.08 21:48
"Факт подключения виртуальной таблицы фиксируется в базе SQLite. Поэтому повторное создание таблицы с таким же ЖелаемоеИмяТаблицы не получится. " - то есть если запустить 2-е копии 1с-ки, то работать не будет? или для каждой 1с-ки свой экземпляр базы будет?
86. Евгений Мартыненков (JohnyDeath) 29.06.08 22:36
(85) В каждой сессии 1С ты создаёшь свой экземпляр класса "SQLiteBase", поэтому у всех базы SQLite "как бы" разные.
87. Александр Орефков (orefkov) 30.06.08 09:26
(85)
+ 86 - более того, факт подключения таблиц фиксируется отдельно для каждой открытой базы SQLite.
То есть даже если в одной сессии 1С открыть две разные базы SQLite, набор подключенных таблиц у каждой свой.
(82)
Ничего вроде не мешает скачать исходники, собрать отладочную версию и проверить.
88. desty (lustin) 30.06.08 13:22
(81)
импорт файлов возможен с помощью консольной программы sqlite (http://www.sqlite.org/cvstrac/wiki?p=ImportingFiles)
но этот способ не очень красив так как для этого придется предварительно создать таблицу с нужной структурой

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

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


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

как получить колонку с материалами ?
97. Александр Орефков (orefkov) 01.07.08 08:20
(96)
Для типизации Субконто в колонках запроса должно присутствовать поле ИмяПоляССубконто_вид, содержащее вид субконто. те
select
SC0 [мат:Субконто],
VSC0 [мат_вид]
obdt1,
SC1
from Остатки
where accid = ' N' and DATE = 20060101

98. Александр Орефков (orefkov) 01.07.08 08:22
(95)
Можешь показать, как ты обнаружил разницу в количестве операций чтения справочника?
99. Александр Орефков (orefkov) 01.07.08 08:27
(96)
Так же, если точно известно, что в полученной выборке будут только субконто одного вида (как в твоем примере), то можно написать и так:
select
substr(SC0, 1, 9) [Мат_вид:Справочник.Материалы],
obdt1,
SC1
from Остатки
where accid = ' N' and DATE = 20060101
В данном случае - под поле субконто 1С отводит строку 13 символов.
Но если тип значения субконто - справочник конкретного вида, она в эти 13 символов пишет внутренний идентификатор элемента без указания вида справочника, те использует только 9 символов.
Типизация :Справочник.Материалы ожидает именно строки длинной 9 символов, и если колонка 13 символов, не делает типизацию.
100. Андрей (Свой) 01.07.08 10:13
(97), (99) Спасибо большое, работают оба примера, причем
вариант (99) где substr(SC0, 1, 9) работает быстрее, судя по обращениям к винту в этом варианте запрос к меньшему количеству таблиц происходит
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа