for flooders
:: Главная :: Решения :: Статьи :: Сайт М. Дроздова :: Файловый архив :: Книга по VFP 9 :: Русский Help Online :: OFF-LINE Форум
   Л и с о в о д ы   в с е х   с т р а н,  о б ъ е д и н я й т е с ь !!!  

Список Форумов  :: Вопросы по 1С
   :: Помощь сайту :: 

Синхронизация с MS SQL
Аспид
Автор

Сообщений: 3136
Откуда: Москва
Дата: 17.01.17 09:03:12ОтветитьЦитировать
1С:Предприятие 8.3 (8.3.8.2054)
Бухгалтерия предприятия, редакция 3.0 (3.0.44.204)
Есть синхронизация контрагентов, между 1С и нашей БД на MS SQL.
Односторонняя. Тока из 1С. В нашем ПО контрагенты не трогаются. Только выбираются.

Где то за год эксплуатации, 2 раза налетал на ошибку. В нашей БД меняется контрагент - наименование и реквизиты. А код 1С от старого.
В 1С синхронизация вызывается из формы элемента, из "После запуска на сервере"
Сокращенный код
  
  	MStxt   	=	ТекущийОбъект.Наименование;  
  	MStxtFull   = 	ТекущийОбъект.НаименованиеПолное;	  
  	MScod1s	 	= 	ТекущийОбъект.Код;  
          ...  
    
  	CmdMS.CommandText = "Cust1SV8Ins";  
  	  
  	CmdMS.Parameters.Append(CmdMS.CreateParameter("TXT",200,1,250,MStxt));  
  	CmdMS.Parameters.Append(CmdMS.CreateParameter("TXTFUll",200,1,250,MStxtFull));   
  	CmdMS.Parameters.Append(CmdMS.CreateParameter("COD1S",129,1,9,MScod1s));	  
          ...
Т.е. везде использую ТекущийОбъект, который передается параметром из формы.
В ХП Cust1SV8Ins. Только основное, чо относится к делу
  
  ALTER PROCEDURE[dbo].[Cust1SV8Ins]  
  	@TXT		varchar(250)=NULL,  
  	@TXTfull	varchar(250)=null,  
  	@COD1S		char(9)='',  
  ...  
 *Выбираю @id базы, наплюйте на top 1  
   select top 1 @id=id_custom from custom where cod1s=@COD1S and ismark=0 order by ID_CUSTOM   
    
  	if @id is null  
  	begin  
 *тут все ясно, и без проблем  
  		insert into custom (txt,TXTfull,cod1s,...)   
  			values (@TXT,@TXTfull,@COD1S,...)   
    
  		select @id=SCOPE_IDENTITY()  
  	end   
  	else  
 * явно вот тут   
  	UPDATE [dbo].[custom]  
  		   SET txt = @TXT  
  			  ,[cod1s] = @COD1S  
  			  ,[txtfull] = @txtfull  
                          ...  
  		 WHERE ID_CUSTOM=@id

Впечатление, что где то передается код1С от другой записи.
Но я беру ТекущийОбъект.
В логе написано, что изменение сделал 1C:Enterprise 8.3
Более того, последний косяк увидел вчера, сделано изменение 24.10.2016
И контрагента, на который поменялось, вообще нет в 8.3
Что то я в тупике(


------------------
Ratings: 0 negative/0 positive

Re: Синхронизация с MS SQL
PaulWist

Сообщений: 12921
Дата: 17.01.17 09:12:57ОтветитьЦитировать
MStxt   	=	ТекущийОбъект.Наименование;    
    	MStxtFull   = 	ТекущийОбъект.НаименованиеПолное;	    
    	MScod1s	 	= 	ТекущийОбъект.Код;

Размерность в 1С совпадает с параметрами ХП?

@TXT		varchar(250)=NULL,    
    	@TXTfull	varchar(250)=null,    
    	@COD1S		char(9)='',


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive

Re: Синхронизация с MS SQL
Аспид
Автор

Сообщений: 3136
Откуда: Москва
Дата: 17.01.17 09:19:39ОтветитьЦитировать
Да, конечно.
По моему, при несовпадении, адо даже ругается.
Нет. Тут нету косяков.
  
  	@TXT		varchar(250),  
  	@TXTfull	varchar(250),  
  	@COD1S		char(9),
  
  	CmdMS.Parameters.Append(CmdMS.CreateParameter("TXT",200,1,250,MStxt));  
  	CmdMS.Parameters.Append(CmdMS.CreateParameter("TXTFUll",200,1,250,MStxtFull));   
  	CmdMS.Parameters.Append(CmdMS.CreateParameter("COD1S",129,1,9,MScod1s));


------------------




Исправлено: Аспид, 17.01.17 09:21
Ratings: 0 negative/0 positive

Re: Синхронизация с MS SQL
PaulWist

Сообщений: 12921
Дата: 17.01.17 09:26:39ОтветитьЦитировать
1. И табличка custom тоже имеет такую же размерность?

2. Вот это "безобразие"

select top 1 @id=id_custom from custom where cod1s=@COD1S and ismark=0 order by ID_CUSTOM     
        
    	if @id is null

я бы по другому переписал:

  
    	if not exists   
  	(  
  	select top 1 id_custom from custom where cod1s=@COD1S and ismark=0 order by 	ID_CUSTOM  
  	)


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)




Исправлено: PaulWist, 17.01.17 09:26
Ratings: 0 negative/0 positive

Re: Синхронизация с MS SQL
Аспид
Автор

Сообщений: 3136
Откуда: Москва
Дата: 17.01.17 10:19:14ОтветитьЦитировать
так мне id нужен.
Он же в апдейте используется
Размерности те же.
Вообще, в ХП все настолько прозрачно, что полагаю дело не в ней, а в 1С
Где то там не тот код1с цепляется. Почему - не пойму(


------------------




Исправлено: Аспид, 17.01.17 10:21
Ratings: 0 negative/0 positive

Re: Синхронизация с MS SQL
PaulWist

Сообщений: 12921
Дата: 17.01.17 10:36:47ОтветитьЦитировать
Аспид
так мне id нужен.
Он же в апдейте используется
Размерности те же.
Вообще, в ХП все настолько прозрачно, что полагаю дело не в ней, а в 1С
Где то там не тот код1с цепляется. Почему - не пойму(

1. Дык, ты же этот ID получаешь из комбинации
cod1s=@COD1S and ismark=0
значит и обновление тоже должно быть на основании этих реквизитов.

2. Как раз с ХП не всё прозрачно, у тебя ismark=0 установлен вольюнтаристким путём, например у тебя НЕ существует запись, где cod1s=@COD1S and ismark=0, те может существовать cod1s=@COD1S and ismark=1, то запрос

select top 1 @id=id_custom from custom where cod1s=@COD1S and ismark=0 order by ID_CUSTOM

вернёт null !

В это время другой клиент для cod1s=@COD1S изменяет с ismark=1 на ismark=0, то ты получаешь дубль для cod1s=@COD1S

3. Или лог делай в 1С и на сервере, что бы знать, что передаётся и принимается.


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive

Re: Синхронизация с MS SQL
pasha_usue

Сообщений: 2916
Откуда: Е-бург
Дата: 17.01.17 13:15:46ОтветитьЦитировать
1. Еще раз, откуда вызывается? Из какого события? Может, "ПослеЗаписиНаСервере"?
2. Почему "ТекущийОбъект"? Откуда он взялся?



Исправлено: pasha_usue, 17.01.17 13:16
Ratings: 0 negative/0 positive

Re: Синхронизация с MS SQL
Аспид
Автор

Сообщений: 3136
Откуда: Москва
Дата: 17.01.17 15:17:34ОтветитьЦитировать
Ну точно оговорился)
вот вызов
  
  &НаСервере  
  Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)  
  _MSSQL.СохранениеКонтрагента(ТекущийОбъект);


------------------
Ratings: 0 negative/0 positive

Re: Синхронизация с MS SQL
Foxtrot

Сообщений: 3303
Откуда: Бишкек
Дата: 26.01.17 20:03:44ОтветитьЦитировать
событие ПослеЗаписи() вроде генерится даже если объект не менять в прямом смысле а просто пометить на удаление
Так что ismark=0 не канает имхо, и его мона/нуна удалить


------------------
P.S. будете проходить мимо, не стесняйтесь, проходите
Ratings: 0 negative/0 positive



Извините, только зарегистрированные пользователи могут писать в этом форуме.

On-line: 9 of63  and Guests: 8


© 2000-2018 Fox Club 
Яндекс.Метрика