powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / [игнор отключен] [закрыт для гостей] / загрузка с 1С в SQl
26 сообщений из 26, показаны все 2 страниц
загрузка с 1С в SQl
    #37396096
Нужно с 1С 8.2 получить таблицу и с данным этой таблицы обновить таблицу в SQL 2000. Таблицу с 1С я уже получил, но вот только не понимаю как загрузить ее в SQL не получается. Вот примерные наброски того чего сделал:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
стрПодключения = "driver={SQL Server};server=Server04;uid='';pwd='';database=Sbyt_T;trusted_connection=yes";
		
	
	АДОДБКоннект = Новый COMОбъект("ADODB.Connection");
	АДОДБКоннект.ConnectionTimeOut = 300 ; 
	АДОДБКоннект.CursorLocation =  2 ;    //adUseServer
    Попытка
		АДОДБКоннект.Open(стрПодключения);
		Сообщить("Соединение с SQL-сервером " + ИмяСервера + " осуществлено в "+ТекущаяДата());
	Исключение 
		
		Предупреждение("Невозможно установить соединение с SQL-сервером " + ИмяСервера+ ОписаниеОшибки()); 
		АДОДБКоннект.Close();
		Возврат;
	КонецПопытки; 

	Сообщить("Выполняем запрос 1С");

	
	      //Добавление данных во временную таблицу
		    Запрос = Новый Запрос;
		  МенеджерВТ=Новый МенеджерВременныхТаблиц;
	  Запрос.МенеджерВременныхТаблиц=МенеджерВТ;
	   Запрос.Текст="
	   |ВЫБРАТЬ РАЗЛИЧНЫЕ
	|РеализацияТоваровУслуг.Ссылка Как Документ,
	|ЗначенияСвойствОбъектов.Свойство,
|	ЗначенияСвойствОбъектов.Значение,
|	СчетФактураВыданный.Номер
|ИЗ
|	Документ.СчетФактураВыданный КАК СчетФактураВыданный
|		ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
|			ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
|			ПО РеализацияТоваровУслуг.Ссылка = ЗначенияСвойствОбъектов.Объект
|		ПО (СчетФактураВыданный.ДокументОснование = РеализацияТоваровУслуг.Ссылка)
|ГДЕ
|	ЗначенияСвойствОбъектов.Свойство = &Свойство
|	И РеализацияТоваровУслуг.ДоговорКонтрагента.РеализацияНаЭкспорт = &РеализацияНаЭкспорт
|	И РеализацияТоваровУслуг.Дата МЕЖДУ &ДатаНач И &ДатаКон";
		     

    ДатаНач=НачалоДня(ЭлементыФормы.НачалоПериода.Значение);
	ДатаКон=КонецДня(ЭлементыФормы.КонецПериода.Значение);
	  РеализацияНаЭкспорт = Ложь;
	
	Свойство=ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоКоду("00000000009");
	сообщить(Свойство);
	сообщить(РеализацияНаЭкспорт);

		
	Запрос.УстановитьПараметр("ДатаНач", ДатаНач);
	Запрос.УстановитьПараметр("ДатаКон", ДатаКон);
	Запрос.УстановитьПараметр("Свойство", Свойство);
	Запрос.УстановитьПараметр("РеализацияНаЭкспорт", РеализацияНаЭкспорт);
	
	
	 РезультатТаблица = Запрос.Выполнить().Выгрузить();
	 
	  Результат = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
	Данные1С.Очистить();
	Пока Результат.Следующий()  Цикл 
		//Если Результат.Регистратор = "" Тогда
		Строка = Данные1С.Добавить();
		Строка.Документ=Результат.Документ;
		Строка.Свойство=Результат.Свойство;
		Строка.Значение=Результат.Значение;
		Строка.Номер=Результат.Номер;
		NomDok= Результат.Значение;
		FacturaID=Результат.Номер;
		//Загрузка из таблицы в SQL
	//Connection.Open(стрПодключения);
		RS=Новый ComОбъект("ADODB.Recordset");
	RS.ActiveConnection = АДОДБКоннект;
	  RS.CursorType =  3 ; 
	  RS.LockType =  1 ;
	  ЗапросДобавление = Новый Запрос;
	   	ЗапросДобавление.Текст = "INSERT INTO [Table_1]
           |([NomDok]
     |      ,[FacturaID])
     |VALUES
      |     "+NomDok+",
      |     "+FacturaID+"";
	
		RS.Open(ЗапросДобавление);
	 	 	   RS.Close();
	         		
		//КонецЕсли;
	КонецЦикла;
  Сообщить("Данные успешно загружены");
	АДОДБКоннект.close(); 
...
Рейтинг: 0 / 0
загрузка с 1С в SQl
    #37396356
AHDP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для операций, не подразумевающих получение данных надо использовать RS.Execute
...
Рейтинг: 0 / 0
загрузка с 1С в SQl
    #37396959
rigus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А так?

ЗапросДобавление = "INSERT INTO [Table_1]
|([NomDok]
| ,[FacturaID])
|VALUES(
| "+NomDok+",
| "+FacturaID+")";
RS.Execute(ЗапросДобавление);
...
Рейтинг: 0 / 0
загрузка с 1С в SQl
    #37397007
rigusА так?

ЗапросДобавление = "INSERT INTO [Table_1]
|([NomDok]
| ,[FacturaID])
|VALUES(
| "+NomDok+",
| "+FacturaID+")";
RS.Execute(ЗапросДобавление);

Вот что пишет.
{Форма.ФормаОтчета1.Форма(119)}: Метод объекта не обнаружен (Execute)
RS.Execute(ЗапросДобавление);
...
Рейтинг: 0 / 0
загрузка с 1С в SQl
    #37397014
rigus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Execute -это метод ADODB.Connection
Т.е в Вашем случае нужно чтото типа
АДОДБКоннект.Execute(ЗапросДобавление);
...
Рейтинг: 0 / 0
загрузка с 1С в SQl
    #37397018
rigusExecute -это метод ADODB.Connection
Т.е в Вашем случае нужно чтото типа
АДОДБКоннект.Execute(ЗапросДобавление);

В этом случае пишет

{Форма.ФормаОтчета1.Форма(119)}: Ошибка при вызове метода контекста (Execute)
АДОДБКоннект.Execute(ЗапросДобавление);
по причине:
Типы не совпадают (0)
...
Рейтинг: 0 / 0
загрузка с 1С в SQl
    #37397074
rigus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приведите скрипт создания таблицы. (В MS правой кнопкой на таблице сценарий используя create)
Это нужно чтобы понять какие типы у Вас в sql таблице. и приведите что Вы пытаетесь туда закинуть
т.е. нужно чему равно ваше значение ЗапросДобавление
В общем Вам нужно отладить ваш sql запрос для начала.
...
Рейтинг: 0 / 0
загрузка с 1С в SQl
    #37397117
на мой взгляд конструкции типа

ЗапросДобавление = "INSERT INTO [Table_1]
|([NomDok]
| ,[FacturaID])
|VALUES(
| "+NomDok+",
| "+FacturaID+")";
RS.Execute(ЗапросДобавление);

не айс...

лучше сделать на самом sql-сервере хранимую процедуру, куда засунуть все эти инсерты и прочие конструкции, а из 1С уже вызывать эту хранимую процедуру, передавая туда нужные параметры... да и работать будет быстрей, т.к. сама sql-конструкция будет выполняться на стороне сервера все-таки...
как пример:
1. создать на sql-сервере хранимую процедуру sp_AddRecords, где есть нужная конструкция из INSERT
2. а из 1С сделать примерно так
СоединениеСSQL=АДОДБКоннект.Open(стрПодключения)
Cmd = Новый COMОбъект("ADODB.Command");
Cmd.ActiveConnection = СоединениеСSQL;
Cmd.Prepared = 1;
Cmd.CommandText = "sp_AddRecords " + параметр1 + "," + параметр2 + "," + параметр3;
Cmd.Execute();
СоединениеСSQL.Close();
...
Рейтинг: 0 / 0
загрузка с 1С в SQl
    #37397140
AHDP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КонецЦиклана мой взгляд конструкции типа

ЗапросДобавление = "INSERT INTO [Table_1]
|([NomDok]
| ,[FacturaID])
|VALUES(
| "+NomDok+",
| "+FacturaID+")";
RS.Execute(ЗапросДобавление);

не айс...

лучше сделать на самом sql-сервере хранимую процедуру, куда засунуть все эти инсерты и прочие конструкции, а из 1С уже вызывать эту хранимую процедуру, передавая туда нужные параметры... да и работать будет быстрей, т.к. сама sql-конструкция будет выполняться на стороне сервера все-таки...
как пример:
1. создать на sql-сервере хранимую процедуру sp_AddRecords, где есть нужная конструкция из INSERT
2. а из 1С сделать примерно так
СоединениеСSQL=АДОДБКоннект.Open(стрПодключения)
Cmd = Новый COMОбъект("ADODB.Command");
Cmd.ActiveConnection = СоединениеСSQL;
Cmd.Prepared = 1;
Cmd.CommandText = "sp_AddRecords " + параметр1 + "," + параметр2 + "," + параметр3;
Cmd.Execute();
СоединениеСSQL.Close();

Нарушите лицензионное соглашение. 1С не разрешает обращаться к своей базе напрямую.
...
Рейтинг: 0 / 0
загрузка с 1С в SQl
    #37397162
rigus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to AHDP
Каким боком это нарушает соглашение? Ведь данные пишутся в левую таблицу которая не является 1с овской, а данные из 1с берутся стандартным 1совским запросом.
...
Рейтинг: 0 / 0
загрузка с 1С в SQl
    #37397300
AHDP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rigus,

Так я ж КонцуЦикла отвечал. ;)
...
Рейтинг: 0 / 0
загрузка с 1С в SQl
    #37397423
ну вопрос спорный, хотя вариантов масса...
1. если sql сервер был куплен в составе 1с, то наличие и использование на нем левых баз есть уже нарушение лицензионного соглашения и не важно каким способом они заполняются
2. если идет запись из sql-ой базы 1с или даже из файловой в какую-то другую базу на sql-сервере, который был куплен отдельно от 1с, то никаких нарушений лицензионного соглашения нет (это все равно, что заполнение из 1С какого-нибудь вордовского файла)
3. если речь идет о своей базе, то на мой взгляд тоже не важно каким из способов прямого обращения идет запись в таблицу..
ведь в старттопике тоже прямое обращение к таблице 1С, а не через создание всяких 1с-овских менеджеров записи и пр.
такшта хрен редьки не слаще...
...
Рейтинг: 0 / 0
загрузка с 1С в SQl
    #37397597
rigusПриведите скрипт создания таблицы. (В MS правой кнопкой на таблице сценарий используя create)
Это нужно чтобы понять какие типы у Вас в sql таблице. и приведите что Вы пытаетесь туда закинуть
т.е. нужно чему равно ваше значение ЗапросДобавление
В общем Вам нужно отладить ваш sql запрос для начала.
Запрос SQL отлажен он такой :
INSERT INTO [Table_1]
([NomDok]
,[FacturaID])
VALUES
(793640,
'ЧЭА00000615')

Первый столбец числовой, второй строковый.
...
Рейтинг: 0 / 0
загрузка с 1С в SQl
    #37397639
AHDP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КонецЦиклану вопрос спорный, хотя вариантов масса...
1. если sql сервер был куплен в составе 1с, то наличие и использование на нем левых баз есть уже нарушение лицензионного соглашения и не важно каким способом они заполняются
2. если идет запись из sql-ой базы 1с или даже из файловой в какую-то другую базу на sql-сервере, который был куплен отдельно от 1с, то никаких нарушений лицензионного соглашения нет (это все равно, что заполнение из 1С какого-нибудь вордовского файла)
3. если речь идет о своей базе, то на мой взгляд тоже не важно каким из способов прямого обращения идет запись в таблицу..
ведь в старттопике тоже прямое обращение к таблице 1С, а не через создание всяких 1с-овских менеджеров записи и пр.
такшта хрен редьки не слаще...

Лицензионым (1С) и сублицензионным (Микрософт - 1С) соглашением запрещено:
1. Использование SQL сервера, идущего в поставке продукта другого вендора в качестве составной части, для иных операций.
2. Операции с данными, содержащимися в базах 1С, минуя платформу.
...
Рейтинг: 0 / 0
загрузка с 1С в SQl
    #37397682
КонецЦиклана мой взгляд конструкции типа

ЗапросДобавление = "INSERT INTO [Table_1]
|([NomDok]
| ,[FacturaID])
|VALUES(
| "+NomDok+",
| "+FacturaID+")";
RS.Execute(ЗапросДобавление);

не айс...

лучше сделать на самом sql-сервере хранимую процедуру, куда засунуть все эти инсерты и прочие конструкции, а из 1С уже вызывать эту хранимую процедуру, передавая туда нужные параметры... да и работать будет быстрей, т.к. сама sql-конструкция будет выполняться на стороне сервера все-таки...
как пример:
1. создать на sql-сервере хранимую процедуру sp_AddRecords, где есть нужная конструкция из INSERT
2. а из 1С сделать примерно так
СоединениеСSQL=АДОДБКоннект.Open(стрПодключения)
Cmd = Новый COMОбъект("ADODB.Command");
Cmd.ActiveConnection = СоединениеСSQL;
Cmd.Prepared = 1;
Cmd.CommandText = "sp_AddRecords " + параметр1 + "," + параметр2 + "," + параметр3;
Cmd.Execute();
СоединениеСSQL.Close();

Попробовал через создание хранимой процедуры не работает, пишет ошибку:

{Форма.ФормаОтчета1.Форма(117)}: Ошибка при вызове метода контекста (Execute)
Cmd.Execute();
по причине:
Произошла исключительная ситуация (ADODB.Command): The connection cannot be used to perform this operation. It is either closed or invalid in this context.
...
Рейтинг: 0 / 0
загрузка с 1С в SQl
    #37397724
rigus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр ВеликийЗапрос SQL отлажен он такой :
INSERT INTO [Table_1]
([NomDok]
,[FacturaID])
VALUES
(793640,
'ЧЭА00000615')

Первый столбец числовой, второй строковый.
Ну тогда апострофы не забудьте добавить в 1с -запрос
"INSERT INTO [Table_1]
|([NomDok]
| ,[FacturaID])
|VALUES(
| "+NomDok+",
| ' "+FacturaID+" ' )";
...
Рейтинг: 0 / 0
загрузка с 1С в SQl
    #37397775
rigusАлександр ВеликийЗапрос SQL отлажен он такой :
INSERT INTO [Table_1]
([NomDok]
,[FacturaID])
VALUES
(793640,
'ЧЭА00000615')

Первый столбец числовой, второй строковый.
Ну тогда апострофы не забудьте добавить в 1с -запрос
"INSERT INTO [Table_1]
|([NomDok]
| ,[FacturaID])
|VALUES(
| "+NomDok+",
| ' "+FacturaID+" ' )";

У меня они с апострофом
//ЗапросДобавление = Новый Запрос;
// ЗапросДобавление.Текст = "INSERT INTO [Table_1]
// |([NomDok]
// | ,[FacturaID])
// |VALUES
// | ("+NomDok+",
// | '"+FacturaID+"')";
//
// АДОДБКоннект.Execute(ЗапросДобавление);
...
Рейтинг: 0 / 0
загрузка с 1С в SQl
    #37397784
Сделал вариант через процедуру, этот Execute в 1С не работает, в SQL отлаживался работает процедура и входные данные:


Cmd = Новый COMОбъект("ADODB.Command");
Cmd.ActiveConnection = СоединениеСSQL;
Cmd.Prepared = 1;
Cmd.CommandText = "exec sp_AddRecords " + NomDok + ",'" + FacturaID + "'";
Cmd.Выполнить();
СоединениеСSQL.Close();
...
Рейтинг: 0 / 0
загрузка с 1С в SQl
    #37397797
rigus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр Великийrigusпропущено...

У меня они с апострофом
//ЗапросДобавление = Новый Запрос;
// ЗапросДобавление.Текст = "INSERT INTO [Table_1]
...
// АДОДБКоннект.Execute(ЗапросДобавление);
Бред
Нужно
Либо
так
//ЗапросДобавление = Новый Запрос;
// ЗапросДобавление.Текст = "INSERT INTO [Table_1]
...
// АДОДБКоннект.Execute(ЗапросДобавление.Текст);

или
так
//ЗапросДобавление = "INSERT INTO [Table_1]
...
// АДОДБКоннект.Execute(ЗапросДобавление);[/quot]

То что Вы не умеете пользоваться не значит что это не работает.
...
Рейтинг: 0 / 0
загрузка с 1С в SQl
    #37397847
rigusАлександр Великийпропущено...

Бред
Нужно
Либо
так
//ЗапросДобавление = Новый Запрос;
// ЗапросДобавление.Текст = "INSERT INTO [Table_1]
...
// АДОДБКоннект.Execute(ЗапросДобавление.Текст);

или
так
//ЗапросДобавление = "INSERT INTO [Table_1]
...
// АДОДБКоннект.Execute(ЗапросДобавление);

То что Вы не умеете пользоваться не значит что это не работает.[/quot]

За себя говори, я листинг написал, а тот старый листинг, комментирование, потому что я сделал через процедуру
...
Рейтинг: 0 / 0
загрузка с 1С в SQl
    #37398065
Получилось загрузить в SQL оказывается надо было вот так:

АДОДБКоннект = Новый COMОбъект("ADODB.Connection");
Попытка

АДОДБКоннект.Open(стрПодключения);
ТекстЗапроса="exec sp_AddRecords " + NomDok + ",'" + FacturaID + "'";
АДОДБКоннект.Execute(ТекстЗапроса,,);
АДОДБКоннект.Close();
АДОДБКоннект="";
Сообщить("Соединение с SQL-сервером " + ИмяСервера + " осуществлено в "+ТекущаяДата());
Исключение

Предупреждение("Невозможно установить соединение с SQL-сервером " + ИмяСервера+ ОписаниеОшибки());
АДОДБКоннект.Close();
Возврат;
КонецПопытки;
...
Рейтинг: 0 / 0
загрузка с 1С в SQl
    #37398769
А вот как сделать чтоб возвращать текст того что пишется в message и выводить в 1с
...
Рейтинг: 0 / 0
загрузка с 1С в SQl
    #37400648
Фотография valex13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Функция ВыполнитьSQLЗапрос(Запрос, Сервер, БД ) Экспорт

Если ЗначениеНеЗаполнено(Сервер) Тогда
Сервер = Константы.юзрSQLНаименованиеСервера.Получить();
КонецЕсли;

Если ЗначениеНеЗаполнено(БД) Тогда
БД = Константы.юзрSQLНаименованиеБазыДанных.Получить() ;
КонецЕсли;

Попытка
стрПодключения = "Provider=sqloledb;Data Source=" + Сервер + ";Initial Catalog=" + БД + ";Integrated Security=SSPI";

Коннект = Новый COMОбъект("ADODB.Connection");
Коннект.ConnectionString = стрПодключения ;
Коннект.ConnectionTimeout = 9999;
Коннект.CommandTimeout = 9999;
Коннект.Open();

РекордСет = Новый COMОбъект("ADODB.Recordset");
Исключение
СообщитьОбОшибке("Не возможно подключить к MS SQL серверу .." + ОписаниеОшибки());
Возврат Неопределено;
КонецПопытки;

Попытка
РекордСет = Коннект.Execute(Запрос);
Исключение
СообщитьОбОшибке("Ошибка при выполнении запроса: " + Запрос + Символы.ПС + ОписаниеОшибки());
Возврат Неопределено;
КонецПопытки;
Возврат РекордСет;

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

// Пример использования функции
// Подключение к SQL серверу производится по доменной аутентификации

РекодСет = ВыполнитьSQLЗапрос("Insert into T1(ID, Param) Values (1,'Test1') Select * from T1 where ID = 1",,)
Пока НЕ РекордСет.EOF Цикл
Сообщить( "Данные: " + СокрЛП(РекордСет.Fields("Param").Value));
КонецЦикла;
...
Рейтинг: 0 / 0
загрузка с 1С в SQl
    #37400686
valex13Функция ВыполнитьSQLЗапрос(Запрос, Сервер, БД ) Экспорт

Если ЗначениеНеЗаполнено(Сервер) Тогда
Сервер = Константы.юзрSQLНаименованиеСервера.Получить();
КонецЕсли;

Если ЗначениеНеЗаполнено(БД) Тогда
БД = Константы.юзрSQLНаименованиеБазыДанных.Получить() ;
КонецЕсли;

Попытка
стрПодключения = "Provider=sqloledb;Data Source=" + Сервер + ";Initial Catalog=" + БД + ";Integrated Security=SSPI";

Коннект = Новый COMОбъект("ADODB.Connection");
Коннект.ConnectionString = стрПодключения ;
Коннект.ConnectionTimeout = 9999;
Коннект.CommandTimeout = 9999;
Коннект.Open();

РекордСет = Новый COMОбъект("ADODB.Recordset");
Исключение
СообщитьОбОшибке("Не возможно подключить к MS SQL серверу .." + ОписаниеОшибки());
Возврат Неопределено;
КонецПопытки;

Попытка
РекордСет = Коннект.Execute(Запрос);
Исключение
СообщитьОбОшибке("Ошибка при выполнении запроса: " + Запрос + Символы.ПС + ОписаниеОшибки());
Возврат Неопределено;
КонецПопытки;
Возврат РекордСет;

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

// Пример использования функции
// Подключение к SQL серверу производится по доменной аутентификации

РекодСет = ВыполнитьSQLЗапрос("Insert into T1(ID, Param) Values (1,'Test1') Select * from T1 where ID = 1",,)
Пока НЕ РекордСет.EOF Цикл
Сообщить( "Данные: " + СокрЛП(РекордСет.Fields("Param").Value));
КонецЦикла;

Мне нужно то что выводится в message я же написал например

(1518 row(s) affected)
...
Рейтинг: 0 / 0
загрузка с 1С в SQl
    #37400998
Фотография XenoX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ройтесь в свойствах ADODB.Recordset там это все есть (Курите MSDN) точно в свойство ткнуть не могу, не помню.
...
Рейтинг: 0 / 0
загрузка с 1С в SQl
    #37402942
У меня без проблем выгрузка на SQL2000 работает по такой схеме

При большом объеме выгружаемых данных лучше использовать метод Выбрать()


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
Перем АДОДБКоннект, стрПодключения, ИмяСервера, ОшибкаSQL, ТаблицаSQL, ЗапросВ, ВыполнитьЗапрос, Результат;


Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
	
	Отказ = истина;
	
	СтартД = ТекущаяДата();

    ИмяСервера = "NASA.EKSMO-SALE.RU";
	ИмяБазы = "infanalit";
	ИмяПользователя = "sa";
	Пароль = "";
	Сообщить(Символы.ПС + Символы.ПС + "* * *  В Ы Г Р У З К А  НОМЕНКЛАТУРЫ  НА SQL-СЕРВЕР '" + ИмяСервера + "'  * * *");

	
	стрПодключения    = "Provider=SQLOLEDB.1;
	|Pwd="+Пароль+";
	|User ID="+ИмяПользователя+";
	|Data Source=" + ИмяСервера + ";
	|Initial Catalog=" + ИмяБазы + "";
	
	АДОДБКоннект = Новый COMОбъект("ADODB.Connection");
	АДОДБКоннект.ConnectionTimeOut = 300 ; 
	//АДОДБКоннект.CursorLocation =  3 ;    //adUseClient
	АДОДБКоннект.CursorLocation =  2 ;    //adUseServer
	
	ЗапросВ = Новый Запрос;
	
	Попытка
		ВыгрузитьЦеныНоменклатуры();
	
		ЗапуститьJob("+ manual _v8_ЦеныНоменклатуры");
		
		РазностьСек = ТекущаяДата() - СтартД;
		ПрошлоЧасМинСек = РазностьСек /  3600 ;
		ПрошлоЧас = Цел(ПрошлоЧасМинСек);
		ПрошлоМинСек = ((ПрошлоЧасМинСек - ПрошлоЧас)* 3600 )/ 60 ;
		ПрошлоМин = Цел(ПрошлоМинСек);
		ПрошлоСек = Цел((ПрошлоМинСек - ПрошлоМин)* 60 );
		
		ВыполненоЗа = "Выполнено за " + ПрошлоЧас + "час. " + ПрошлоМин + "мин. " + ПрошлоСек  + "сек.";
		Сообщить(ВыполненоЗа);
		
		СообщитьНаПочту("OK! _ Выгрузка на SQL v8_ЦеныНоменклатуры.epf", "Обработка завершена успешно" + Символы.ПС + ВыполненоЗа + Символы.ПС + "Ждите подтверждения на Почту от SQL-Сервера");
		ЗавершитьРаботуСистемы(Ложь);
		
	Исключение
		Сообщить(Символы.ПС + ОписаниеОшибки() + Символы.ПС + "Место останова: " + ОшибкаSQL);
		СообщитьНаПочту("1C Ошибка Выполнения Обработки _ Выгрузка на SQL v8_ЦеныНоменклатуры.epf", ОшибкаSQL +":"+ Символы.ПС + Символы.ПС + ОписаниеОшибки());
	КонецПопытки;
	
	
КонецПроцедуры	


 Процедура ВыгрузитьЦеныНоменклатуры()
	 
	ТаблицаSQL = "v8_ЦеныНоменклатуры";
	ОшибкаSQL="ВыгрузитьЦеныНоменклатуры";

	Товары = Новый СписокЗначений;
	Товары.Добавить(Справочники.Номенклатура.НайтиПоКоду("000000000000000001"));  // Книги
	Товары.Добавить(Справочники.Номенклатура.НайтиПоКоду("000000000000000002"));  // Канцы
	Товары.Добавить(Справочники.Номенклатура.НайтиПоКоду("000000000000000003"));  // Аудио. 
	//Товары.Добавить(Справочники.Номенклатура.НайтиПоКоду("ITD000000000138804"));  // Новая Продукция Дети Земли. Книга третья. Охотники на мамонтов
	//Товары.Добавить(Справочники.Номенклатура.НайтиПоКоду("ITD000000000134590"));  // Новая Продукция Заготовки на зиму. Большая книга рецептов
	//Товары.Добавить(Справочники.Номенклатура.НайтиПоКоду("ITD000000000139428"));  // Новая Продукция Консервированные грибы
	
	//Товары.Добавить(Справочники.Номенклатура.НайтиПоКоду("000000000000000003"));  // Аудио. Перенесли под Книги
	//Товары.Добавить(Справочники.Номенклатура.НайтиПоКоду("000000000000000004"));  // Журналы. Перенесли под Книги
	ЗапросВ.УстановитьПараметр("Товары",Товары);
	
	
	//ЗапросВ.УстановитьПараметр("ТипЦены",Справочники.ТипыЦенНоменклатуры.НайтиПоКоду("000000001")); //Оптовая
	ЗапросВ.УстановитьПараметр("Валюта",Справочники.Валюты.НайтиПоКоду("810")); //руб

	ЗапросВ.Текст = "ВЫБРАТЬ
|	началопериода(Цены.Период, день) КАК Дата,
|	Цены.Номенклатура.Код КАК Код,
|	Цены.Цена КАК Цена
|ИЗ
|	РегистрСведений.ЦеныНоменклатуры КАК Цены
|ГДЕ
|	Цены.Регистратор ССЫЛКА Документ.УстановкаЦенНоменклатуры
|	И Цены.Номенклатура В ИЕРАРХИИ (&Товары)	
//|	И Цены.ТипЦен = &ТипЦены	
|	И Цены.ТипЦен = ЗНАЧЕНИЕ(Справочник.ТипыЦенНоменклатуры.Оптовая)	
|	И Цены.Валюта = &Валюта";
	
			

	Сообщить(Формат(ТекущаяДата(), "ДЛФ=В") + ": Запрашиваем Историю Цен");
	ВыполнитьЗапрос = ЗапросВ.Выполнить();
	Сообщить(Формат(ТекущаяДата(), "ДЛФ=В") + ": Запрос выполнен ...");
	
	Сообщить(Формат(ТекущаяДата(), "ДЛФ=В") + ": Инициализация Сервера ...");
    Попытка
		АДОДБКоннект.Open(стрПодключения);
	Исключение 
		АДОДБКоннект.Close();
		Сообщить("Невозможно установить соединение с SQL-сервером " + ИмяСервера);
		ОшибкаSQL=ТаблицаSQL;
		ВызватьИсключение;
	КонецПопытки; 

	
    Попытка
	//	АДОДБКоннект.Execute("IF OBJECT_ID(N'" + ТаблицаSQL + "','U') IS not NULL drop table " + ТаблицаSQL );
	
		АДОДБКоннект.Execute("IF OBJECT_ID(N'" + ТаблицаSQL + "','U') IS not NULL truncate table " + ТаблицаSQL
		+ " else CREATE TABLE " + ТаблицаSQL + " (
	
										|НомеклатураКод varchar(18) COLLATE Cyrillic_General_CI_AS null,
										|Дата datetime null,
										|ЦенаПрайс money null)"
										
						);
		АДОДБКоннект.Execute("BEGIN TRANSACTION");
		АДОДБКоннект.Execute("set implicit_transactions off");
	Исключение 
		АДОДБКоннект.Close();
		Сообщить("Невозможно Create/Drop/BEGIN TRANSACTION table на SQL-сервере " + ИмяСервера); 
		ОшибкаSQL=ТаблицаSQL;
		ВызватьИсключение;
	КонецПопытки; 
	
	СтрокаРез = ВыполнитьЗапрос.Выбрать();
	Сообщить(Формат(ТекущаяДата(), "ДЛФ=В") + ": Выгружаем " + СтрокаРез.Количество() + " записей ...");
	
	Пока СтрокаРез.Следующий() Цикл
		
	    Попытка
			
			АДОДБКоннект.Execute("Insert INTO " + ТаблицаSQL + " values ("
			
										+ "'" + СокрП(СтрокаРез.Код) + "',"
										+ ?(СтрокаРез.Дата='00010101',"null,","'" + СтрокаРез.Дата + "',")
										+ "" + Формат(СтрокаРез.Цена,"ЧГ=0; ЧРД='.'; ЦДЧ=2; ЧН=0") + ")"
			);
			
			
		Исключение 
			Сообщить("Ошибка вставки данных в SQL: " + ОписаниеОшибки());
			АДОДБКоннект.Execute("Commit");
			АДОДБКоннект.Execute("set implicit_transactions on");
			АДОДБКоннект.Close();
			ОшибкаSQL=ТаблицаSQL;
			ВызватьИсключение;
		КонецПопытки; 
		
		ОбработкаПрерыванияПользователя();
	КонецЦикла;
	
	Попытка
		АДОДБКоннект.Execute("update _v8_Актуальность set Актуальность='" + ТекущаяДата() + "', DTS = null  where Таблица='" + ТаблицаSQL +"'");
	Исключение 
		Сообщить("Невозможно Update на SQL-сервере " + ИмяСервера); 
		АДОДБКоннект.Execute("Commit");
		АДОДБКоннект.Execute("set implicit_transactions on");
		АДОДБКоннект.Close();
		ОшибкаSQL=ТаблицаSQL;
		ВызватьИсключение;
	КонецПопытки; 
	
	
    Попытка
		АДОДБКоннект.Execute("Commit");
		АДОДБКоннект.Execute("set implicit_transactions on");
	
	Исключение 
		Сообщить("Невозможно Commit на SQL-сервере " + ИмяСервера); 
		АДОДБКоннект.Close();
		ОшибкаSQL=ТаблицаSQL;
		ВызватьИсключение;
	КонецПопытки; 
		
	АДОДБКоннект.Close();
	
	Сообщить(Формат(ТекущаяДата(), "ДЛФ=В") + ": -->> Выгружено в табл. SQL " + ТаблицаSQL + Символы.ПС);

КонецПроцедуры




Процедура ЗапуститьJob(Job)
	
    Попытка
		АДОДБКоннект.Open(стрПодключения);
		АДОДБКоннект.Execute("EXEC msdb.dbo.sp_start_job N'" + Job + "'");
		АДОДБКоннект.Close();
		Сообщить(Символы.ПС + Формат(ТекущаяДата(), "ДЛФ=В") + ": Запущена Задача Финальной обработки на SQL-сервере - " + ИмяСервера + Символы.ПС + Job + Символы.ПС + "Ждите Подтверждения по E-Mail" + Символы.ПС);
	Исключение 
		Сообщить(ОписаниеОшибки());
		Сообщить(Символы.ПС + "Запуск Задачи Финальной обработки на SQL-сервере " + ИмяСервера + " не произошел");
		АДОДБКоннект.Close();
		ОшибкаSQL=Job;
		ВызватьИсключение;
	КонецПопытки; 
	
КонецПроцедуры


Процедура СообщитьНаПочту(Заголовок,Сообщение)
	
	Попытка
		objNotesSession = Новый COMОбъект("Notes.NotesSession");
		objNotesMailFile = objNotesSession.GETDATABASE(objNotesSession.getenvironmentstring("MailServer", True), objNotesSession.getenvironmentstring("Mailfile", True));
		Открыто = objNotesMailFile.IsOpen;
		Если НЕ Открыто Тогда Открываем=objNotesMailFile.OpenMail КонецЕсли;
		objNotesDocument = objNotesMailFile.CREATEDOCUMENT;

		objNotesDocument.Form = "Memo";
	        
		objNotesDocument.Importance = "1";
		objNotesDocument.SendTo = "shhitova.nm@eksmo-sale.ru";
		objNotesDocument.CopyTo = "Romanovskiy.DA@eksmo-sale.ru";
		objNotesDocument.Subject = Заголовок;

		objRichStyle = objNotesSession.CreateRichTextStyle;
	    objNotesField = objNotesDocument.CREATERICHTEXTITEM("Body");
		objNotesField.APPENDTEXT (Сообщение);
		
		
	    objNotesDocument.PostedDate = ТекущаяДата();
	    objNotesDocument.Send (False);
		objNotesSession.Close();
	Исключение
		Сообщить(ОписаниеОшибки());
		Сообщить(Символы.ПС + "Отправка Почты не удалась");
		ОшибкаSQL="СообщитьНаПочту";
		ВызватьИсключение;
	КонецПопытки;
КонецПроцедуры	
...
Рейтинг: 0 / 0
26 сообщений из 26, показаны все 2 страниц
Форумы / [игнор отключен] [закрыт для гостей] / загрузка с 1С в SQl
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]