Имя: Пароль:
1C
1С v8
Запись данных напрямую в 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с.


Таким образом неважно какие права у пользователя. Обновление кодов произойдёт на стороне сервера без учёта прав.
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс