Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) Создание документа в другой БД (число прочтений - 4892 )
Sirtoo
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 17
Зарегистрирован: 29. Июля 2008
Создание документа в другой БД
30. Ноября 2010 :: 09:50
Печать  
Всем привет, может кто поделится примером:

Платформа 8x , задача - создать в другой базе документ, заполнить его и записать, все через ADO.

Заранее спасибо всем откликнувшимся! )
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Создание документа в другой БД
Ответ #1 - 30. Ноября 2010 :: 10:05
Печать  
Sirtoo писал(а) 30. Ноября 2010 :: 09:50:
Всем привет, может кто поделится примером:

Платформа 8x , задача - создать в другой базе документ, заполнить его и записать, все через ADO.

Заранее спасибо всем откликнувшимся! )


Запаришься. Это возможно, но слишком много действий придется делать. Проще сделать через OLE.

Кстати, этот раздел форума посвящен семерке, а для восьмерки есть отдельный...
  
Наверх
 
IP записан
 
Sirtoo
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 17
Зарегистрирован: 29. Июля 2008
Re: Создание документа в другой БД
Ответ #2 - 30. Ноября 2010 :: 10:41
Печать  
Ок, спс пойду там поспрашаю. Все таки хочется попробовать.
  
Наверх
 
IP записан
 
Sirtoo
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 17
Зарегистрирован: 29. Июля 2008
Re: Создание документа в другой БД
Ответ #3 - 30. Ноября 2010 :: 10:47
Печать  
Хотя если есть пример на семерке, мне бы тоже пригодился, просто нужен "скелет", принцип то будет тот же самый.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Создание документа в другой БД
Ответ #4 - 30. Ноября 2010 :: 10:55
Печать  
а чем com не устраивает ?

Напрямую очень плохо
1. Сложно
2.По лицензии 8-ки нельзя
3.Надо ставить блокировки такие же в каких работает восьмерка
(если этого не сделаешь можешь получить хорошие грабли)
т.е. должен будешь полностью разобраться с их блокировками.


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


I Love YaBB 2!

Сообщений: 17
Зарегистрирован: 29. Июля 2008
Re: Создание документа в другой БД
Ответ #5 - 30. Ноября 2010 :: 10:59
Печать  
COM таки тратит ощутимое время на соединение, а хотелось бы он- лайн перебрасывать документы после их создания и не держать постоянно открытое соединение.

Естетсвенно если не выйдет с ADO, придется  писать OLE, но хочу попытаться.

С блокировками да, видел примеры, правда опять же на 7.7
  
Наверх
 
IP записан
 
lustin
1c++ power user
Отсутствует


1C *.*, ROR, Java - на
этом остановимся

Сообщений: 907
Местоположение: Москва
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Re: Создание документа в другой БД
Ответ #6 - 30. Ноября 2010 :: 11:01
Печать  
Sirtoo писал(а) 30. Ноября 2010 :: 09:50:
Всем привет, может кто поделится примером:

Платформа 8x , задача - создать в другой базе документ, заполнить его и записать, все через ADO.

Заранее спасибо всем откликнувшимся! )


Напиши код программного создания документа. выставь точки остановки. лови SQL код Профайлером. Анализируй.

Однако я полностью согласен с Z1, и к тому же пока не встречал на просторах сети ни одного примера как это сделать.


  

бизнес-процесс как техническое задание прекрасно, только у бизнеса нет процессов; у бизнеса есть желание выжить
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Создание документа в другой БД
Ответ #7 - 30. Ноября 2010 :: 11:02
Печать  
Sirtoo писал(а) 30. Ноября 2010 :: 10:59:
COM таки тратит ощутимое время на соединение, а хотелось бы он- лайн перебрасывать документы после их создания и не держать постоянно открытое соединение.

Естетсвенно если не выйдет с ADO, придется  писать OLE, но хочу попытаться.

С блокировками да, видел примеры, правда опять же на 7.7


так ты открой соеденение  (OLE) и не закрывай
с ado же все тоже самое ( даже круче ado иногда может терять соеденение) открыл - работаешь - когда не надо закрыл.
  
Наверх
 
IP записан
 
Sirtoo
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 17
Зарегистрирован: 29. Июля 2008
Re: Создание документа в другой БД
Ответ #8 - 30. Ноября 2010 :: 11:04
Печать  
lustin писал(а) 30. Ноября 2010 :: 11:01:

Напиши код программного создания документа. выставь точки остановки. лови SQL код Профайлером. Анализируй.

Однако я полностью согласен с Z1, и к тому же пока не встречал на просторах сети ни одного примера как это сделать.

А это идея, спасибо ...
  
Наверх
 
IP записан
 
lustin
1c++ power user
Отсутствует


1C *.*, ROR, Java - на
этом остановимся

Сообщений: 907
Местоположение: Москва
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Re: Создание документа в другой БД
Ответ #9 - 30. Ноября 2010 :: 11:05
Печать  
Sirtoo писал(а) 30. Ноября 2010 :: 10:59:
COM таки тратит ощутимое время на соединение, а хотелось бы он- лайн перебрасывать документы после их создания и не держать постоянно открытое соединение.

Естетсвенно если не выйдет с ADO, придется  писать OLE, но хочу попытаться.

С блокировками да, видел примеры, правда опять же на 7.7


Посмотри в сторону очереди сообщений, начать можно со статьи про использование MSMQ на ИТСнике.

ЗЫ Если конечно не хочешь сделать именно онлайн обмен (то есть в момент записи в одну базу получить документ в другой базе)
  

бизнес-процесс как техническое задание прекрасно, только у бизнеса нет процессов; у бизнеса есть желание выжить
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Sirtoo
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 17
Зарегистрирован: 29. Июля 2008
Re: Создание документа в другой БД
Ответ #10 - 30. Ноября 2010 :: 11:09
Печать  
lustin писал(а) 30. Ноября 2010 :: 11:05:
ЗЫ Если конечно не хочешь сделать именно онлайн обмен (то есть в момент записи в одну базу получить документ в другой базе)

первоначальная идея именно такая  Улыбка
  
Наверх
 
IP записан
 
lustin
1c++ power user
Отсутствует


1C *.*, ROR, Java - на
этом остановимся

Сообщений: 907
Местоположение: Москва
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Re: Создание документа в другой БД
Ответ #11 - 30. Ноября 2010 :: 11:46
Печать  
Sirtoo писал(а) 30. Ноября 2010 :: 11:09:
lustin писал(а) 30. Ноября 2010 :: 11:05:
ЗЫ Если конечно не хочешь сделать именно онлайн обмен (то есть в момент записи в одну базу получить документ в другой базе)

первоначальная идея именно такая  Улыбка


было такое исследование Глобальные транзакции в сервис-ориентированной архитектуре и... 1С
  

бизнес-процесс как техническое задание прекрасно, только у бизнеса нет процессов; у бизнеса есть желание выжить
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Sirtoo
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 17
Зарегистрирован: 29. Июля 2008
Re: Создание документа в другой БД
Ответ #12 - 06. Декабря 2010 :: 06:47
Печать  
[b][color=#0000ff]Вот что получилось в итоге:[/color][/b]

[color=#009900]Саме сложное было понять, как из GUID формата 1С получить идентификатор в том виде, как он хранится в SQL.
(например 0xAA5900304866028611DFFBC2534E1E07) [/color]

[code]Перем ADO,cmd,LastGUID;


Процедура ВыполнитьПереносДокумента(Ссылка)
     
     УстановитьСоединение();
           
     Дата        = Формат(Ссылка.Дата,"ДЛФ=DT");
     Номер       = Ссылка.Номер;
     Состояние   = ПолучитьИдентификаторЭлементаПеречисления(Ссылка.Состояние);
     
     КлючУникальности = ПроверитьДокументНаУникальность(Дата,Номер);
     Если ЗначениеЗаполнено(КлючУникальности) Тогда
           ОбновитьСостояниеСуществующегоДокумента(КлючУникальности,Состояние);
           Возврат ;
     КонецЕсли;      

     Организация = ПолучитьИдентификаторЭлементаСправочника(Ссылка.Организация);
     Контрагент  = ПолучитьИдентификаторЭлементаСправочника(Ссылка.Контрагент);
       Комментарий = СокрЛП(Ссылка.Комментарий);
     Перевозчик      = ПолучитьИдентификаторЭлементаСправочника(Ссылка.Перевозчик);
           
     ВариантПолучения  = ПолучитьИдентификаторЭлементаПеречисления(Ссылка.ВариантПолучения);
     
     Бензовоз          = ПолучитьИдентификаторЭлементаСправочника(Ссылка.Бензовоз);
     Водитель          = ПолучитьИдентификаторЭлементаСправочника(Ссылка.Водитель);
     Нефтебаза         = ПолучитьИдентификаторЭлементаСправочника(Ссылка.Нефтебаза);
     
     НомерДоверенности = Ссылка.НомерДоверенности;
       ДатаДействия      = Формат(Ссылка.ДатаДействия,"ДЛФ=DT");
     
     КлючУникальности = Новый УникальныйИдентификатор;
     КлючУникальности = ПолучитьGUIDПоУникальномуИдентификатору(КлючУникальности);
     

     // создаем сам документ

     ТекстЗапроса ="
     |exec sp_executesql  N'
     |INSERT INTO _Document3247 WITH(REPEATABLEREAD) 62RRef,_Fld3266,_Fld3272)
     @P20)',
     |N'@P1 varbinary(16),
     |@P2 varbinary(1),
     |@P3 datetime,
     |@P4 datetime,
     |@P5 nvarchar(10),
     |@P6 varbinary(1),
     |@P7 varbinary(16),
     |@P8 varbinary(16),
     |@P10 ntext,
     |@P11 varbinary(16),
     |@P12 varbinary(16),
     |@P13 varbinary(16),
     |@P14 varbinary(16),
     |@P15 numeric(16,3),
     |@P16 varbinary(16),
     |@P18 datetime,
     |@P20 ntext',
     |"+КлючУникальности+",
     |0x00,
     |'"+Дата+"',
     |'"+Дата+"',
     |N'"+Номер+"',
     |0x00,
     |"+Организация+",
     |"+Контрагент+",
     |N'"+Комментарий+"',
     |"+Перевозчик+",
     |"+Водитель+",
     |"+Бензовоз+",
     |"+ВариантПолучения+",
     |"+Ссылка.СуммаДокумента+",
     |"+Состояние+",
     |'"+ДатаДействия+"',
     |N'"+НомерДоверенности+"'
     |";
           
     Cmd.CommandText =ТекстЗапроса;

     Состояние("Выполнение запроса");
     
     НачатьТранзакцию();
     RS= Cmd.Execute();
     ЗафиксироватьТранзакцию();
     

     // пишем табличную часть к нему

     Если Ссылка.Товары.Количество() = 0 Тогда
           Возврат;
     КонецЕсли;
     
     ПередаваемаяСтрока = Ссылка.Товары[0];
     Номенклатура       = ПолучитьИдентификаторЭлементаСправочника(ПередаваемаяСтрока.Номенклатура);
     Количество         = 0.0");
     Нефтебаза          = ПолучитьИдентификаторЭлементаСправочника(ПередаваемаяСтрока.Нефтебаза);
     Секция             = СокрЛП(ПередаваемаяСтрока.Секция);
     Калибровка         = 0.0");
     
     АЗС1               = ПолучитьИдентификаторЭлементаСправочника(ПередаваемаяСтрока.АЗС1);
     АЗС2               = ПолучитьИдентификаторЭлементаСправочника(ПередаваемаяСтрока.АЗС2);
     
     ЕдиницаИзм         = ),Номенклатура);
     
     ТекстЗапроса ="
     |exec sp_executesql N'INSERT INTO _Document3247_VT3273 WITH(REPEATABLEREAD)
     |VALUES(@P1,@P2,@P3,@P4,@P5,@P6,@P7,@P8,@P9,@P10,@P11)',
     |N'@P1 varbinary(16),
     |@P2 varbinary(4),
     |@P3 numeric(6,1),
     |@P4 varbinary(16),
     |@P5 numeric(16,4),
     |@P6 varbinary(16),
     |@P7 varbinary(16),
     |@P8 ntext,
     |@P9 numeric(11,1),
     |@P10 varbinary(16),
     |@P11 varbinary(16)',
     |"+КлючУникальности+",
     |0x00000001,
     |1.0,
     |"+Номенклатура+",
     |"+Количество+",
     |"+ЕдиницаИзм+",
     |"+Нефтебаза+",
     |N'"+Секция+"',
     |"+Калибровка +",
     |"+АЗС1+",
     |"+АЗС2+"
     |";
                 
     Cmd.CommandText =ТекстЗапроса;
           
     НачатьТранзакцию();
     RS= Cmd.Execute();
     ЗафиксироватьТранзакцию();
           
     Состояние("Запись выполнена успешно");
     Попытка    
           ADO.Close();
     Исключение
           Сообщить(ОписаниеОшибки());
     КонецПопытки;
     
КонецПроцедуры[/code]
« Последняя редакция: 06. Декабря 2010 :: 09:03 - Sirtoo »  
Наверх
 
IP записан
 
Sirtoo
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 17
Зарегистрирован: 29. Июля 2008
Re: Создание документа в другой БД
Ответ #13 - 06. Декабря 2010 :: 06:49
Печать  
Код
Выбрать все
Функция ПолучитьИдентификаторЭлементаСправочника(СсылкаНаЭлементСправочника)

	GUID = "0x00000000000000000000000000000000";

	ТипСправочника = ТипЗнч(СсылкаНаЭлементСправочника);

	Попытка
		Если ТипСправочника = Тип("СправочникСсылка.Организации") Тогда
			SQLНаименованиеТаблицы = "_Reference25";
		ИначеЕсли ТипСправочника = Тип("СправочникСсылка.Контрагенты") Тогда
			SQLНаименованиеТаблицы = "_Reference21";
		ИначеЕсли ТипСправочника = Тип("СправочникСсылка.ФизическиеЛица") Тогда
			SQLНаименованиеТаблицы = "_Reference92";
		ИначеЕсли ТипСправочника = Тип("СправочникСсылка.ПТК_МоделиТС") Тогда
			SQLНаименованиеТаблицы = "_Reference26";
		ИначеЕсли ТипСправочника = Тип("СправочникСсылка.Склады") Тогда
			SQLНаименованиеТаблицы = "_Reference32";
		ИначеЕсли ТипСправочника = Тип("СправочникСсылка.Номенклатура") Тогда
			SQLНаименованиеТаблицы = "_Reference22";
		ИначеЕсли ТипСправочника = Тип("СправочникСсылка.ПТК_ПунктыНазначения") Тогда
			SQLНаименованиеТаблицы = "_Reference68";
		КонецЕсли;

		// этих попробуем сначала по ИНН найтить
		Если ТипСправочника = Тип("СправочникСсылка.Организации") ИЛИ ТипСправочника = Тип("СправочникСсылка.Контрагенты")
			И  ЗначениеЗаполнено(СсылкаНаЭлементСправочника.ИНН) Тогда
			ИНН = СсылкаНаЭлементСправочника.ИНН;

			Если ТипСправочника = Тип("СправочникСсылка.Организации") Тогда
				НаименованиеПоля = "_Fld372";
			Иначе
				НаименованиеПоля = "_Fld325";
			КонецЕсли;

			ТекстЗапроса ="
			|exec sp_executesql N'SELECT
			|Table_Q_000_T_001._IDRRef AS f_1
			|FROM
			|Таблица Table_Q_000_T_001 WITH(NOLOCK)
			|WHERE
			|Table_Q_000_T_001."+НаименованиеПоля+" = @P1',N'@P1 nvarchar(12)',N'"+ИНН+"'
			|";

			ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"Таблица",SQLНаименованиеТаблицы);

			Cmd.CommandText =ТекстЗапроса;
			RS= Cmd.Execute();

			Если Rs.EOF() = 0 Тогда
				COMSafeArray = Rs.Fields(0).Value;
				GUID = ПолучитьGUIDизCOMSafeArray(COMSafeArray);
				GUID = ПолучитьGUIDПоУникальномуИдентификатору(GUID);
				Возврат GUID;
			КонецЕсли;

		КонецЕсли;

  	     // во всех остальные случаях просто по наименованию
		Наименование = СсылкаНаЭлементСправочника.Наименование;

		ТекстЗапроса ="
		|exec sp_executesql N'SELECT
		|Table_Q_000_T_001._IDRRef AS f_1
		|FROM
		|Таблица Table_Q_000_T_001 WITH(NOLOCK)
		|WHERE
		|Table_Q_000_T_001._Description = @P1',N'@P1 nvarchar(100)',N'"+Наименование+"'  
		|";

		ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"Таблица",SQLНаименованиеТаблицы);

		Cmd.CommandText =ТекстЗапроса;
		RS= Cmd.Execute();

		Если Rs.EOF() = 0 Тогда
			COMSafeArray = Rs.Fields(0).Value;
			GUID = ПолучитьGUIDизCOMSafeArray(COMSafeArray);
			GUID = ПолучитьGUIDПоУникальномуИдентификатору(GUID);
		КонецЕсли;

		Если GUID = "0x00000000000000000000000000000000" Тогда
			// не нашли, надо создать нового
			GUID = СоздатьНовыйэлементСправочника(СсылкаНаЭлементСправочника)
		КонецЕсли;

	Исключение
		Сообщить(ОписаниеОшибки());
	КонецПопытки;

	LastGUID = GUID;

	Возврат GUID;

КонецФункции
 

« Последняя редакция: 06. Декабря 2010 :: 08:21 - Sirtoo »  
Наверх
 
IP записан
 
Sirtoo
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 17
Зарегистрирован: 29. Июля 2008
Re: Создание документа в другой БД
Ответ #14 - 06. Декабря 2010 :: 06:49
Печать  
[code]Функция ПолучитьGUIDПоУникальномуИдентификатору(Знач UUID)
     ч1 = Сред(UUID,20,4);
     ч2 = Сред(UUID,25,12);
     ч3 = Сред(UUID,15,4);
     ч4 = Сред(UUID,10,4);
     ч5 = Сред(UUID,1,8);
     Возврат "0x" + ч1 + ч2 + ч3 + ч4 + ч5;
КонецФункции

Функция Из_10_В_Любую(Знач Значение=0,Нотация=36)
     Если Нотация<=0 Тогда Возврат("") КонецЕсли;
     Значение=Число(Значение);
     Если Значение<=0 Тогда Возврат("00") КонецЕсли;
     Значение=Цел(Значение);
     Результат="";
     Пока Значение>0 Цикл
           льтат;
           Значение=Цел(Значение/Нотация);
     КонецЦикла;
     Результат=?(СтрДлина(Результат)=1,"0"+Результат,Результат);
     Возврат Результат;
КонецФункции

Функция ПолучитьGUIDизCOMSafeArray(COMSafeArray)
     МассивGuid=COMSafeArray.Выгрузить();
     GUIDСсылки="";
     Для н=12 по 15 Цикл
           GUIDСсылки=GUIDСсылки+Из_10_В_Любую(МассивGuid[н],16)
     КонецЦикла;
     GUIDСсылки=GUIDСсылки+"-";
     
     Для н=10 по 11 Цикл
           GUIDСсылки=GUIDСсылки+Из_10_В_Любую(МассивGuid[н],16)
     КонецЦикла;
     GUIDСсылки=GUIDСсылки+"-";
     
     Для н=8 по 9 Цикл
           GUIDСсылки=GUIDСсылки+Из_10_В_Любую(МассивGuid[н],16)
     КонецЦикла;
     GUIDСсылки=GUIDСсылки+"-";
     Для н=0 по 1 Цикл
           GUIDСсылки=GUIDСсылки+Из_10_В_Любую(МассивGuid[н],16)
     КонецЦикла;
     GUIDСсылки=GUIDСсылки+"-";
     Для н=2 по 7 Цикл
           GUIDСсылки=GUIDСсылки+Из_10_В_Любую(МассивGuid[н],16)
     КонецЦикла;
     
     ВозвЗнач=Новый УникальныйИдентификатор(GUIDСсылки);
     Возврат ВозвЗнач;
КонецФункции
[/code]
« Последняя редакция: 06. Декабря 2010 :: 08:16 - Sirtoo »  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать