|
Запись данных напрямую в SQL используя Asp.Net | ☑ | ||
|---|---|---|---|---|
|
0
S_H_I_Z
05.06.12
✎
14:25
|
Собственно сам сабж. Столкнулся с проблемой. Вернее с рядом проблем, но начну помаленьку:
1. Заполнение столбца _Code - Куда ещё записываються данные о счётчике? Объясню. Например последний код в таблице был 00000007. Логично, что следующий должен быть 000000008. Напрямую записываю строку с таким кодом. (да простят меня создатели 1с за то что я забил на лиц.соглашение). Но после записи в самой 1с при создании новой записи присвоиться код 000000008. Не могу понять где храняться эти значения ещё помимо самого справочника. Чтобы его править дабы небыло конфликтов. Это очень важно! 2. _IDRRef - Заполняю произвольным уникальным идентификатором "Convert(binary(16),NEWID())" - всё ли верно? или есть ещё варианты и тут тоже есть подводные камни? 3. _Version !!! вопреки логике не даёт записывать туда значение типа timestamp, а именно @@DBTS. Кто сталкивался? |
|||
|
1
vde69
05.06.12
✎
14:25
|
7.7 ???
|
|||
|
2
H A D G E H O G s
05.06.12
✎
14:26
|
(1) фИГА СЕ.
IDRRef |
|||
|
3
H A D G E H O G s
05.06.12
✎
14:26
|
(0) Все не так, все не то.
|
|||
|
4
H A D G E H O G s
05.06.12
✎
14:27
|
(0) IDRRef - перевернут; Код/Номер выдается 1С-кой.
|
|||
|
5
S_H_I_Z
05.06.12
✎
14:27
|
to vde69
1c 8.1 - если ты о платформе. MS SQL 2005 Но суть не в этом. Или есть разница? |
|||
|
6
vde69
05.06.12
✎
14:27
|
(2) ну да, обшибся :)
|
|||
|
7
S_H_I_Z
05.06.12
✎
14:34
|
to H A D G E H O G s
1c не при делах в тот момент когда ведёться запись в таблицы. Она ничего не выдаёт и не фиксирует. Записываю сразу в SQL таблицы. И не могу понять где в таблицах храниться этот "счётчик" чтобы его плюсануть. |
|||
|
8
H A D G E H O G s
05.06.12
✎
14:39
|
(7) Нету счетчика.
1С делает Max(_Code) первый раз и похоже хранит (кэширует) его на сервере. |
|||
|
9
H A D G E H O G s
05.06.12
✎
14:40
|
счаст я немного подумаю
|
|||
|
10
vde69
05.06.12
✎
14:41
|
(8) таблица params интересная :)
|
|||
|
11
S_H_I_Z
05.06.12
✎
14:41
|
подумать - это хорошо =)))) я с ура 6ть часов сижу думаю уже =)))))))
|
|||
|
12
Sammo
05.06.12
✎
14:42
|
(7) ОбновитьНумерациюОбъектов
|
|||
|
13
Sammo
05.06.12
✎
14:43
|
И главное вопрос - нафига? Чем не устраивают стандартные механизмы?
|
|||
|
14
H A D G E H O G s
05.06.12
✎
14:45
|
ОбновитьНумерациюОбъектов();
:-) |
|||
|
15
shuhard
05.06.12
✎
14:45
|
(0)[Не могу понять где храняться эти значения ещё помимо самого справочника. Чтобы его править дабы небыло конфликтов. Это очень важно! ]
сервер приложений хранит это в своей памяти а чтобы не было конфликтов используй префикс для разделения кодов, введённых 1С и напрямую |
|||
|
16
vde69
05.06.12
✎
14:46
|
(11) я-бы на твоем месте профайлером цепанул родные запросы 1с и уже дальше думал-бы
|
|||
|
17
H A D G E H O G s
05.06.12
✎
14:46
|
После ОбновитьНумерациюОбъектов(); sql делает
SELECT MAX(T1._Code) FROM _Reference16 T1 WITH(NOLOCK) заново. |
|||
|
18
H A D G E H O G s
05.06.12
✎
14:47
|
Но конечно так, как в (0) - нельзя делать!!
Использовать богомерский asp.Net вместо рассово полезного Дельфи. |
|||
|
19
S_H_I_Z
05.06.12
✎
14:48
|
to Sammo, механизмы устраивают =))))) Но есть одно НО. есть задача реализовать Вэб интерфейс к 1ске(СРМ). Но стандартные средства не позволяют этого сделать, т.к. уже сделал (Web расширение 1.1) и работает крайне медленно, а при условии что IIS сервер переедет очень далеко, а сама база будет храниться ещё дальше, то ни Web расширение Ни другие средства 1с не позволяют сделать чтото быстро работающие... Вот и решено писать в базу напрямую. В основном конечно происходит только чтение из базы, но есть пара справочников - которые нужно поплнять "на лету"... Вот и копаюсь в поисках истины =)))
|
|||
|
20
H A D G E H O G s
05.06.12
✎
14:50
|
(19) Пипец
|
|||
|
21
H A D G E H O G s
05.06.12
✎
14:52
|
(19) 1cv8.2 + Тонкий/Web-клиент, не?
|
|||
|
22
vde69
05.06.12
✎
14:52
|
(19) LOL
Делашь распределенку, чилдера отправляешь - далеко на сервер с вебом, с ним и работаешь там. Если не устраивает штатный интерфейс - делаешь быстрый и простой через ком интерфейс во первых ты не станешь тащить блокировки в основную базу, во вторых безопасность на порядок выше, нет прямого доступа |
|||
|
23
S_H_I_Z
05.06.12
✎
14:53
|
to shuhard
Видимо так и прийдёться делать... Раз сервер приложений сам гдето хранит (((( Хотя я уверен, что он тоже гдето в SQL хранит всё своё барахло из памяти... |
|||
|
24
H A D G E H O G s
05.06.12
✎
14:54
|
Видно, ТС действительно далеко, и сильно лагает сетка.
|
|||
|
25
S_H_I_Z
05.06.12
✎
14:55
|
тонкий клиент - не то ((((
Чтобы стало понятно что делаеться - вот тестовый пример: http://95.56.246.198/ после выбора жать поиск. остальное ещё не переделано. |
|||
|
26
МихаилМ
05.06.12
✎
14:55
|
как будете бороться с записью во время реструктуризации
+ иногда 1с меняет внутрение названия полей бд |
|||
|
27
shuhard
05.06.12
✎
14:55
|
(23)[Хотя я уверен, что он тоже гдето в SQL хранит всё своё барахло из памяти.]
что мешает сделать базу из одного справочника и запустить профайлер ? |
|||
|
28
S_H_I_Z
05.06.12
✎
14:58
|
to МихаилМ
Это конечно проблема, но сама конфигурация практически не меняеться. Прийдёться следить за этим конечно, но я поглядел логику при ресруктуризации именя таблиц практически не меняються. |
|||
|
29
S_H_I_Z
05.06.12
✎
15:00
|
to vde69
я далёк от распределёнки )))) Да и переделывать слишком много всего нужно будет. А времени 3 месяца всего. А тут почти всё готово. И нужно то всего навсего заменить чутку кода где идёт чтение и запись в 1с =)))) |
|||
|
30
vde69
05.06.12
✎
15:04
|
(29) кто потом все это дерьмо будет поддерживать?
3 месяца работы - вполне достаточно что-бы сделать полноценный портал например на битрексе |
|||
|
31
H A D G E H O G s
05.06.12
✎
15:09
|
ОбновитьНумерациюОбъектов();
Тебе уже сказали же. |
|||
|
32
S_H_I_Z
05.06.12
✎
15:09
|
Проблема в том, что по непонятным причинам IIS выдаёт ошибки и отказываеться работать с Web расширением. Причины - переполнение памяти. Слишком много ресурсов "кушает" 1ска. При открытии страниц сервер занимает очень много памяти. + Web расширение не удалось поставить на 64х битную Windows 2008 Server. Тех поддержка после почти месяца переписки так и не дала внятного ответа как же установить вэб расширение на 64х битную винду без изврата... И битрикс наверняка используют в основе вэб расширение, т.к. их разработки были до ввода 8.2 и тонких вэб клиентов. Нехочу на одни и теже грабли второй раз наступить ))))
А вот работа напрямую с SQL происходит очень быстро )))) |
|||
|
33
H A D G E H O G s
05.06.12
✎
15:11
|
А вот работа напрямую с SQL происходит очень быстро ))))
Что мешает вместо напрямую с SQL использовать ComConnector? |
|||
|
34
S_H_I_Z
05.06.12
✎
15:11
|
to H A D G E H O G s
Этот вариант не отметаю... может есть ещё другие =))) Если правильно понял, то ПередЗаписью сделать ОбновитьНумерациюОбъектов(); ? |
|||
|
35
S_H_I_Z
05.06.12
✎
15:12
|
***** Что мешает вместо напрямую с SQL использовать ComConnector?
Пробовал. Медленно + очень много памяти "сжирает" сервер. И патом перестаёт работать выдавая ошибку переполнения памяти. |
|||
|
36
shuhard
05.06.12
✎
15:12
|
(32)[И битрикс наверняка используют в основе вэб расширение]
нет конечно php иначе тормозил бы немерено |
|||
|
37
H A D G E H O G s
05.06.12
✎
15:15
|
(35) Неверю.
|
|||
|
38
S_H_I_Z
05.06.12
✎
15:15
|
Ну битрикс в любом случае - готовый Портал. И чтобы его прикрутить к существующей нестандартной конфигурации - нужно время.
Мне нужно немного иное решение. Которое уже сделано и нужно только заменить чтение и запись =)))) Причём чтобы после этого 1с - не пострадала )))) |
|||
|
39
H A D G E H O G s
05.06.12
✎
15:18
|
(34) Если правильно понял, то ПередЗаписью сделать ОбновитьНумерациюОбъектов(); ?
Нет. Тебе надо после прямой записи в SQL делать через ComConnector ОбновитьНумерациюОбъектов(); ? ибо новый код/номер генериться в момент открытия формы нового справочника/документа. Либо делать в ПередОткрытием() формы справочника. |
|||
|
40
shuhard
05.06.12
✎
15:18
|
(38) [Причём чтобы после этого 1с - не пострадала ]
ну а лобовые варианты записи в 1С средствами 1С, например регламентной операцией , когда ты пишешь в собственную таблицу, а 1С переносит в справочник ? |
|||
|
41
H A D G E H O G s
05.06.12
✎
15:18
|
ОбновитьНумерациюОбъектов(МетаданныеСправочника)
|
|||
|
42
H A D G E H O G s
05.06.12
✎
15:19
|
(40) Брррр.
|
|||
|
43
H A D G E H O G s
05.06.12
✎
15:19
|
Я рекомендую автору разобраться с ComConnectorom. Это легкая вещь по сути и при прямых руках и память не теряет и работает быстро.
|
|||
|
44
S_H_I_Z
05.06.12
✎
15:22
|
При использовании ComConnector есть ещё один ньюанс - количество ключей 1с )))) у меня их всего на 80 пользователей. А к сайту будет обращаться гораздо больше народу. Ломать 1с не хочу =(
|
|||
|
45
shuhard
05.06.12
✎
15:23
|
(42) а зря, нормальный способ синхронизации, если в реквизите справочника в 1С хранить код приблуды
|
|||
|
46
H A D G E H O G s
05.06.12
✎
15:23
|
(44) Выдели нууу, 20 ComConnectorov, остальные потоки пусть ждут своей очереди по мьютексу.
|
|||
|
47
H A D G E H O G s
05.06.12
✎
15:25
|
Если ComConnector на каждый запрос не создавать заново, а хранить в глобальной переменной - все работает махом.
У самого сервис на Дельфи+SQL Express+ComConnector+Апач+Тонкий. Сервис предоставляет доступ по инетерету, вся логика в ОбщемМодуле(ComConnector), администрирование - через Тонкий. |
|||
|
48
vde69
05.06.12
✎
15:37
|
(44) зачем тебе несколько сом конекторов? на всех пользователей можно использовать 1,
для этого во все функции и процедуры вставляешь дополнительный параметр ID_User и внутри процедур делай переинициализацию параметров сеанса. конечно 1000 конектов в один так не загонишь, но 10-20 легко... у iss есть пример в демо каталоге как это сделать (несколько конектов с разных ап в одной сесии) |
|||
|
49
H A D G E H O G s
05.06.12
✎
15:40
|
(48) Очередь надо будет делать, если несколько потоков.
|
|||
|
50
S_H_I_Z
05.06.12
✎
15:50
|
Покажи свой сервис =))))) дай ссылочку =)))) Погляжу что да как по производительности. В своё время больше всего уважал Дельфи =)
|
|||
|
51
H A D G E H O G s
05.06.12
✎
15:59
|
(50) Нильзя. Военные разработки. Могу показать код работы с Connectom для толпы.
function CheckRegParamInDatabase(RegInfo:PRegInfo;Action:String;RemoteIP:string;var UIDContragent:string):String; var i:Integer; hMutex,hWait:Cardinal; UIDString:String; begin Result:='ServerError'; CoInitializeEx(nil,0); hMutex:=CreateMutex(nil,false,Pchar('ConnectionIsBusy')); hWait:=WaitForSingleObject(hMutex,10000); if hWait=WAIT_OBJECT_0 then begin if not CreateConnect() Then exit; try UIDString:=GUIDToString(RegInfo^.EnterpriseUID); UIDString:=StringReplace(UIDString,'{','',[rfReplaceAll]); UIDString:=StringReplace(UIDString,'}','',[rfReplaceAll]); Result:=Connection.ОбщегоНазначения.ТестированиеКонфигурации(RegInfo^.Configuration,UIDString,Action); UIDContragent:=Connection.ОбщегоНазначения.ПолучитьИДТекущегоКонтрагента(); except AddLog('Не удалось выполнить запрос к базе 1С.',RemoteIP); end; ReleaseMutex(hMutex); end else AddLog('Не удалось выполнить запрос к базе 1С. 1С занята.',RemoteIP); CloseHandle(hMutex); |
|||
|
52
H A D G E H O G s
05.06.12
✎
16:01
|
Connection - глобальная переменная, получается:
function CreateConnect():Boolean; var tmp:string; begin Result:=false; if not VarIsEmpty(Connection) then begin try tmp:=Connection.Метаданные.Имя; if tmp='УЛД' then begin Result:=true; exit; end; except end; end; try Connect:=CreateOleObject('v82.comconnector'); except AddLog('Не удалось выполнить соединение с базой 1С. Не установлены компоненты 1С для работы с внешним соединением!'); Connect:=Unassigned; Connection:=Unassigned; exit; end; try Connection:=Connect.Connect(MakeConnectionString()); except Connect:=Unassigned; Connection:=Unassigned; AddLog('Не удалось выполнить соединение с базой 1С.'); exit; end; Result:=true; end; |
|||
|
53
S_H_I_Z
08.06.12
✎
14:38
|
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
ОбновитьНумерациюОбъектов(ЭтотОбъект.Метаданные()); КонецПроцедуры Не работает =(((( Работает только в том случае если у пользователя права администратора. В остальных случаях ошибка нарушения прав доступа. Где собака зарыта? =( |
|||
|
54
rs_trade
08.06.12
✎
14:41
|
(0) на Version забей. Оно само.
|
|||
|
55
rs_trade
08.06.12
✎
14:45
|
(0) не пиши в 1С напрямую. плохо кончишь.
|
|||
|
56
H A D G E H O G s
08.06.12
✎
14:46
|
(53)
Глобальный контекст (Global context) УстановитьПривилегированныйРежим (SetPrivilegedMode) Не? |
|||
|
57
Bober
08.06.12
✎
14:52
|
(0) использовать веб-сервисы не айс?
|
|||
|
58
S_H_I_Z
11.06.12
✎
12:01
|
в 8.1 нету таких функций же?
Мне нужно в 8.1 =( |
|||
|
59
S_H_I_Z
11.06.12
✎
12:05
|
Хотя нет. в 8.1 есть ... буду разбираться что да как там....
|
|||
|
60
S_H_I_Z
11.06.12
✎
12:12
|
Нет всё таки в 8.1 нету данной функции... =(
Другие варианты есть? |
|||
|
61
S_H_I_Z
12.06.12
✎
10:32
|
Сабж по заполнению поля _Code.
Чтобы небыло проблем после записи произвольных кодов в базу 1с нужно: 1. В общих модулях создать модуль с правами "Привелигилированный". Там простецкая процедура: ---------------------------------------- Процедура ппУстановитьНовыйКод() Экспорт ОбновитьНумерациюОбъектов(Метаданные.Справочники.<ИмяСправочника>); КонецПроцедуры ---------------------------------------- 2. На форме элемента справочника в процедуре ПередОткрытием запускать данную процедуру. И коды будут автообновляться согласно правилам 1с. Таким образом неважно какие права у пользователя. Обновление кодов произойдёт на стороне сервера без учёта прав. |
| Форум | Правила | Описание | Секции | Поиск |