Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Горячая тема (более 10 ответов) 1sqlite и не родные таблицы 1С (число прочтений - 3805 )
varelchik
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 788
Зарегистрирован: 22. Мая 2006
1sqlite и не родные таблицы 1С
23. Декабря 2010 :: 08:43
Печать  
Народ подскажите как через 1sqlite
связать не родную таблицу и 1sjourn.
В SQL версии это я знаю как навоять, а вот тута чет торможу.
Просю ногами не пинать, бо только начал изучать 1sqlite ситуация заставила.
  
Наверх
 
IP записан
 
CaBaT
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 718
Местоположение: Санкт-Петербург
Зарегистрирован: 26. Октября 2007
Пол: Мужской
Re: 1sqlite и не родные таблицы 1С
Ответ #1 - 23. Декабря 2010 :: 08:55
Печать  
Я делал через Attach
http://www.sqlite.org/lang_attach.html
  
Наверх
 
IP записан
 
varelchik
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 788
Зарегистрирован: 22. Мая 2006
Re: 1sqlite и не родные таблицы 1С
Ответ #2 - 23. Декабря 2010 :: 09:14
Печать  
А маленький пример можно пошагово?
  
Наверх
 
IP записан
 
CaBaT
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 718
Местоположение: Санкт-Петербург
Зарегистрирован: 26. Октября 2007
Пол: Мужской
Re: 1sqlite и не родные таблицы 1С
Ответ #3 - 23. Декабря 2010 :: 09:25
Печать  
1. подключаешь файл sqlite
2. пишешь запрос с обращением r полям таблиц из файла

вот кусок кода подключения файла sqlite
Код
Выбрать все
Функция ПодключитьБД(_ФайлБД,_ИмяБД) Экспорт
	Если _БД.Открыта() = 1 Тогда
		Если ФС.СуществуетФайл(_ФайлБД) = 1 Тогда
			_Запрос = _БД.НовыйЗапрос();
			_Текст = "attach database '" + СокрЛП(_ФайлБД) + "' as " + СокрЛП(_ИмяБД);
			_Результат = _Запрос.ВыполнитьЗапрос(_Текст);
             КонецЕсли;
	КонецЕсли;
	Возврат 0;
КонецФункции 



Запрос получается типа такого:

Код
Выбрать все
select
  Поле_из_1С,
  Поле_из_Таблицы_ФайлаSQLite
from
  Таблица_1С
left join
  [<ИмяПодКоторымПодключилФайлSQLite>].ТаблицаИзФайлаSQLite 



В select-ах квадратные скобки необязательны, а вот в update и insert надо.
  
Наверх
 
IP записан
 
varelchik
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 788
Зарегистрирован: 22. Мая 2006
Re: 1sqlite и не родные таблицы 1С
Ответ #4 - 23. Декабря 2010 :: 09:35
Печать  
От блин.
Не выходит.
вот последовательность:
ИмяФайла=КаталогИБ()+"docsidd.dbf";
ИмяИндекса=СтрЗаменить(ИмяФайла,"dbf","cdx");
Если ФС.СуществуетФайл(ИмяФайла)=0 Тогда
     БД=СоздатьОбъект("XBase");
     БД.ДобавитьПоле("iddoc","S",9,0);
     БД.ДобавитьПоле("stat","N",1,0);
     БД.ДобавитьИндекс("idx","iddoc",1,0,);
     БД.СоздатьФайл(ИмяФайла,ИмяИндекса);
     БД.ЗакрытьФайл();
КонецЕсли;
база = СоздатьОбъект("SQLiteBase");
база.Открыть(":memory:");
запрос = база.НовыйЗапрос();
стат=запрос.ВыполнитьЗапрос("PRAGMA journal_mode = OFF");
стат=запрос.ВыполнитьЗапрос("ATTACH DATABASE '"+ИмяФайла+"' as Доки");
вот здесь сыпит ошибку:
стат=запрос.ВыполнитьЗапрос("ATTACH DATABASE '"+ИмяФайла+"' as Доки");
{D:\DATA\EXTFORMS\ДВФ.ERT(38)}: file is encrypted or is not a database
  
Наверх
 
IP записан
 
CaBaT
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 718
Местоположение: Санкт-Петербург
Зарегистрирован: 26. Октября 2007
Пол: Мужской
Re: 1sqlite и не родные таблицы 1С
Ответ #5 - 23. Декабря 2010 :: 09:39
Печать  
Э, так ты хочешь dbf-ную таблицу присоединить?
Нет, так не получится.
Как вариант, если не очень большая - всосать в память во временную и потом соединить с 1С-кой таблицей.
  
Наверх
 
IP записан
 
varelchik
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 788
Зарегистрирован: 22. Мая 2006
Re: 1sqlite и не родные таблицы 1С
Ответ #6 - 23. Декабря 2010 :: 09:44
Печать  
CaBaT писал(а) 23. Декабря 2010 :: 09:39:
Э, так ты хочешь dbf-ную таблицу присоединить?
Нет, так не получится.
Как вариант, если не очень большая - всосать в память во временную и потом соединить с 1С-кой таблицей.


Ну да конечно.
у меня вот как в SQL это сделано:
           |select
           |      d.iddoc [Заявка $Документ],
           |      j.iddocdef Заявка_вид
           |from docsidd d (nolock)
           |inner join _1sjourn j (nolock) on j.iddoc=d.iddoc
           |WHERE
           |d.stat=1
           |and
           |j.closed &1=1
           |and
           |d.iddoc IN (SELECT right(val,9) FROM #Докум)
типа такого мне надо чтоб на dbf-ной базе работало.
Это вообще реально?
  
Наверх
 
IP записан
 
CaBaT
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 718
Местоположение: Санкт-Петербург
Зарегистрирован: 26. Октября 2007
Пол: Мужской
Re: 1sqlite и не родные таблицы 1С
Ответ #7 - 23. Декабря 2010 :: 09:56
Печать  
Так может dbf-ную таблицу перегнать в формат SQLite?
  
Наверх
 
IP записан
 
varelchik
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 788
Зарегистрирован: 22. Мая 2006
Re: 1sqlite и не родные таблицы 1С
Ответ #8 - 23. Декабря 2010 :: 09:59
Печать  
CaBaT писал(а) 23. Декабря 2010 :: 09:56:
Так может dbf-ную таблицу перегнать в формат SQLite?

Так может подскажешь как?
Смысл вообще следующий.
База распределенная.
У документов есть принак ЕстьДокументы.
Все бы хорошо, но вот только иногда это признак меняют в закрытых периодах.
Т.е. у проведенных документов.
А так как УРБД по барабану что делали с документом, то на постой у меня слетает последовательнось в закрытый период.
Я конечно сделал что эти данные не регистрировались, но при перепроведении в ЦБ даные расползаються на перефирии и естественно накрывають то что там есть.
По сему я решил организовать это во внешней таблице, что 1С не затирала данные.
С SQL базой это без проблем, а вот с DBF проблема.
Можно было бы использовать OLEDB та оно в монопольном небудет работать.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: 1sqlite и не родные таблицы 1С
Ответ #9 - 23. Декабря 2010 :: 10:12
Печать  
OLEDB в монопольном режиме работает и очень давно..
А ежели скульлайт пользуешь, то создай саму базу в нём и нужную табличку в ней.
Потом пиши в неё, читай что хочешь..
ЗЫ: вот только одновременно писать в неё народ не сможет, только по-очереди..
  
Наверх
 
IP записан
 
CaBaT
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 718
Местоположение: Санкт-Петербург
Зарегистрирован: 26. Октября 2007
Пол: Мужской
Re: 1sqlite и не родные таблицы 1С
Ответ #10 - 23. Декабря 2010 :: 10:12
Печать  
Ну так может не мучить мозг, и сделать по аналогии с SQL, только данные хранить во внешнем файле SQLite?

Только имей ввиду - SQLite не очень подходит для множественного доступа..
Хотя у меня сейчас крутиться одна задача с одновременным доступом наверное до 20 человек, но табличка ну очень маленькая - 600кил на сегодня, плюс так как по сети не очень работало, я ее кеширую в память (пока маленькая)
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: 1sqlite и не родные таблицы 1С
Ответ #11 - 23. Декабря 2010 :: 10:15
Печать  
Вот, в качестве примера - база в скульлайт для записи-чтения заблокированных объектов базы:
Поделка
  
Наверх
 
IP записан
 
varelchik
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 788
Зарегистрирован: 22. Мая 2006
Re: 1sqlite и не родные таблицы 1С
Ответ #12 - 23. Декабря 2010 :: 10:33
Печать  
CaBaT писал(а) 23. Декабря 2010 :: 10:12:
Ну так может не мучить мозг, и сделать по аналогии с SQL, только данные хранить во внешнем файле SQLite?

Только имей ввиду - SQLite не очень подходит для множественного доступа..
Хотя у меня сейчас крутиться одна задача с одновременным доступом наверное до 20 человек, но табличка ну очень маленькая - 600кил на сегодня, плюс так как по сети не очень работало, я ее кеширую в память (пока маленькая)

Так она у меня вообще будет мизер.
2 поля строка 9 и число 1
  
Наверх
 
IP записан
 
CaBaT
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 718
Местоположение: Санкт-Петербург
Зарегистрирован: 26. Октября 2007
Пол: Мужской
Re: 1sqlite и не родные таблицы 1С
Ответ #13 - 23. Декабря 2010 :: 10:35
Печать  
Eprst писал(а) 23. Декабря 2010 :: 10:15:
Вот, в качестве примера - база в скульлайт для записи-чтения заблокированных объектов базы:
Поделка

Кстати, надо бы прикрутить, есть такая проблема Улыбка
  
Наверх
 
IP записан
 
CaBaT
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 718
Местоположение: Санкт-Петербург
Зарегистрирован: 26. Октября 2007
Пол: Мужской
Re: 1sqlite и не родные таблицы 1С
Ответ #14 - 23. Декабря 2010 :: 10:36
Печать  
varelchik писал(а) 23. Декабря 2010 :: 10:33:
Так она у меня вообще будет мизер.
2 поля строка 9 и число 1

Ну дык тогда вперед на мины! Улыбка
  
Наверх
 
IP записан
 
varelchik
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 788
Зарегистрирован: 22. Мая 2006
Re: 1sqlite и не родные таблицы 1С
Ответ #15 - 23. Декабря 2010 :: 10:37
Печать  
МДА.
Извините что я такой тормоз.
Походу я неправильно понял концепцию SQLite.
По примеру все понял.
  
Наверх
 
IP записан
 
CaBaT
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 718
Местоположение: Санкт-Петербург
Зарегистрирован: 26. Октября 2007
Пол: Мужской
Re: 1sqlite и не родные таблицы 1С
Ответ #16 - 23. Декабря 2010 :: 10:39
Печать  
Eprst писал(а) 23. Декабря 2010 :: 10:15:
Вот, в качестве примера - база в скульлайт для записи-чтения заблокированных объектов базы:
Поделка

А как режиме WAL работает? Проблем нет?
  
Наверх
 
IP записан
 
varelchik
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 788
Зарегистрирован: 22. Мая 2006
Re: 1sqlite и не родные таблицы 1С
Ответ #17 - 23. Декабря 2010 :: 15:13
Печать  
Все огромное спасибо.
Разобралси что ды как.
вот кстати и пример чего мене надо было.
Код
Выбрать все
	Если ЭтоSQL=1 Тогда
		Запрос=глСоединение();
		ТекстЗапроса = "
		|If not Exists (Select *
		|               From sysobjects
		|               Where id = object_id('docsidd') and objectproperty(id, 'IsUserTable') = 1
		|          )
		|   Create table docsidd (iddoc varchar(9) primary key not null
		|,
		|							stat int
		|                      )";

		Если Запрос.ВыполнитьСкалярный(ТекстЗапроса) = 0 Тогда
			ЗаписьЖурналаРегистрации("Инициализация docsidd: ошибка инициализации", "Инициализация", "Инициализация таблиц SQL", , 5);
		КонецЕсли;
		Текст="
		|select
		|	d.stat ЕстьДокументы
		|from docsidd d (nolock)
		|WHERE
		|d.iddoc=?
		|";
		Если Запрос.Подготовить(Текст)=0 Тогда
			Сообщить(Запрос.GetLastError());
			Возврат;
		КонецЕсли;
		Запрос.ДобПараметр(1,14,9,0);
	Иначе
		ИмяБД = КаталогИБ()+"baza.db3";
		база = СоздатьОбъект("SQLiteBase");
		база.Открыть(ИмяБД);
		Запрос = база.НовыйЗапрос();
		Запрос.ВыполнитьЗапрос("PRAGMA journal_mode=WAL");
		Текст="
		|Create  table if not EXISTS
		|docsidd (
		|   iddoc char(9) primary key not null,
		|   stat int
		|)";
		Запрос.ВыполнитьЗапрос(Текст);
		Текст="
		|select
		|	stat
		|from docsidd
		|WHERE
		|iddoc=@ВыбДок
		|";
		Запрос.Подготовить(Текст);
	КонецЕсли;
 


это при открытии журнала.
потом 2 процедура обновления таблицы
Код
Выбрать все
Процедура ЕстьДокументы(Фл)
	Если ПустоеЗначение(ТекущийДокумент)=1 Тогда
		Возврат;
	КонецЕсли;  
	Если глЕстьРеквизитШапки("ЕстьДокументы",ТекущийДокумент.Вид()) <> Да Тогда
		Возврат;
	КонецЕсли;
	Если ЭтоSQL=1 Тогда
		Запрос.УстПараметр(1,ТекущийДокумент,0);
		ТЗ=Запрос.ВыполнитьИнструкцию();
		стат=ТЗ.КоличествоСтрок();
		ЗапросОбновление=глСоединение();
			ЗапросОбновление.УстановитьТекстовыйПараметр("ВыбДок",ТекущийДокумент);
		Если стат=0 Тогда
			Текст="INSERT INTO docsidd (iddoc,stat) VALUES(:ВыбДок,"+Фл+")";
			Результат=ЗапросОбновление.ВыполнитьСкалярный(Текст);
		Иначе
			Текст="update docsidd
			|set stat="+Фл+"
			|from docsidd d
			|WHERE
			|d.iddoc=:ВыбДок
			|";
			Результат=ЗапросОбновление.ВыполнитьСкалярный(Текст);
		КонецЕсли;
	Иначе
		ИмяБД = КаталогИБ()+"baza.db3";
		база = СоздатьОбъект("SQLiteBase");
		база.Открыть(ИмяБД);
		ЗапросОбновление= база.НовыйЗапрос();
		ЗапросОбновление.ВыполнитьЗапрос("PRAGMA journal_mode=WAL");
		ЗапросОбновление.Подставлять("ВыбДок",ТекущийДокумент);
		Текст="INSERT or REPLACE INTO docsidd VALUES (:ВыбДок,"+Фл+")";
		Стат=ЗапросОбновление.ВыполнитьЗапрос(Текст);
	КонецЕсли;
КонецПроцедуры

 


и функция для вывода информации о наличии документов
Код
Выбрать все
Функция фЕстьДокументы()
	Если ПустоеЗначение(ТекущийДокумент)=1 Тогда
		Возврат "";
	КонецЕсли;  
	Если ЭтоSQL=1 Тогда
		Запрос.УстПараметр(1,ТекущийДокумент,0);
		Если Число(Запрос.ВыполнитьСкалярный())=1 Тогда
			Возврат "+";
		КонецЕсли;
	Иначе
		Запрос.УстановитьПараметр("@ВыбДок",ТекущийДокумент);
		Стат=Запрос.Выполнить();
		рез=Стат.КоличествоСтрок();
		Если рез=1 Тогда
			Если Стат.ПолучитьЗначение(1,1)=1 Тогда
				Возврат "+";
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
КонецФункции

 

  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: 1sqlite и не родные таблицы 1С
Ответ #18 - 24. Декабря 2010 :: 06:14
Печать  
CaBaT писал(а) 23. Декабря 2010 :: 10:39:
Eprst писал(а) 23. Декабря 2010 :: 10:15:
Вот, в качестве примера - база в скульлайт для записи-чтения заблокированных объектов базы:
Поделка

А как режиме WAL работает? Проблем нет?


у меня все в терминале, проблем нет..
ЗЫ: по крайней мере, мне теперь не звонят и не просят узнать, кто открыл объект бд.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать