Вставка BLOB в таблицы ORACLE средствами 1С 8.х с использованием Microsoft OLEDB Provider

08.08.19

Интеграция - Внешние источники данных

Столкнулся с необходимостью выгружать картинки из 1С 8 в ORACLE-таблицу.

Столкнулся с необходимостью выгружать картинки из 1С 8 в ORACLE-таблицу.

Информация в интернетах по этому поводу сводится к тому, что Microsoft OLEDB Provider шибко убогий, используй OracleOLEDB провайдер и будет тебе Щастье.

Я с этим фактом мириться не хотел ровно по той причине, что платформа 1С 8.3, при использовании объекта Внешние Источники Данных, использует именно Microsoft OLEDB Provider и BLOB-ы при этом спокойно вставляются.

Решение, как это часто бывает, оказалось простым, если не учитывать сколько времени пришлось потратить на его создание, собирая информацию из разных источников буквально по крупицам.

//Создаем обычный 1С запрос, поля называем, как они называются в таблице ORACLE.
//!!! Поля с BLOB располагаем последними !!!

Если РезультатЗапроса.Пустой() Тогда
	Возврат;
КонецЕсли;

Соединение = Новый COMОбъект("ADODB.Connection");
Команда = Новый COMОбъект("ADODB.Command");
СтрокаСоединения = "Driver={Oracle in OraClient11g_home1};Dbq=<DB_NAME>;Uid=<USER_NAME>;Pwd=<PASSWORD>";

Попытка
	Соединение.Open(СтрокаСоединения);
	Команда.ActiveConnection = Соединение;
	Соединение.CommandTimeout = 0;
	Статус = Соединение.State;
	Параметры = Команда.Parameters;
Исключение
	#Если Клиент Тогда 
	Сообщить(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
	#КонецЕсли	
	Возврат;
КонецПопытки;

Если ОчищатьТаблицу Тогда	
	Команда.CommandText = 
	"Delete From " + ИмяТаблицыOracle;
	Команда.Execute();
КонецЕсли;

Команда.CommandText = 
"INSERT INTO " + ИмяТаблицыOracle + " (BLOB_Name, BLOB_DATA) VALUES(?,?)";

Параметр = Команда.CreateParameter("BLOB_NAME", 200, 1, 1000);
Параметры.Append(Параметр);

ИмяВременногоФайла = ПолучитьИмяВременногоФайла();
Поток = Новый COMОбъект("ADODB.Stream");
Поток.Open();

Пока Выборка.Следующий() Цикл
	Параметры.Item("BLOB_Name").Value = Выборка.BLOB_NAME;
	Если Выборка.BLOB_DATA <> NULL Тогда
		Значение = Выборка.BLOB_DATA.Получить();
		Если ТипЗнч(Значение) = Тип("Картинка") Тогда
			Значение = Значение.ПолучитьДвоичныеДанные();
		КонецЕсли;
		РазмерБайт = Значение.Размер();
		Значение.Записать(ИмяВременногоФайла);
		Поток.LoadFromFile(ИмяВременногоФайла);
		Значение = Поток.ReadText();
	Иначе
		Значение = "";
		РазмерБайт = 1;
	КонецЕсли;
	Если Параметры.Count > 0 Тогда
		Для Сч = -(Параметры.Count - 1) По 0 Цикл
			Если Параметры.Item(-Сч).Name = "BLOB_DATA" Тогда
				Параметры.Delete(-Сч);
				Прервать;
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;
	Параметр = Команда.CreateParameter("BLOB_DATA", 205, 1, РазмерБайт);
	Параметры.Append(Параметр);
 	Параметры.Item("BLOB_DATA").AppendChunk(Значение);
	Попытка 
		Команда.Execute();
	Исключение
		#Если Клиент Тогда 
		Сообщить(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
		#КонецЕсли
	КонецПопытки;
КонецЦикла;

УдалитьФайлы(ИмяВременнногоФайла);
Соединение.Close();

При создании этого решения хотелось бы отдельное "спасибо" сказать разработчикам платформы 1С. Все действия выполнялись на версии платформы 8.3.14.1779

Если сделать:

ДвоичныеДанные.Записать(ИмяВременногоФайла);
Поток = Новый ЧтениеТекста(ИмяВременногоФайла, КодировкаТекста.UTF16);
Значение = Поток.Прочитать();

то Значение будет содержать строку, которая отличается от той, что выдает ADODB.Stream и она даже не "влазит" в Параметры.Item(Колонка.Имя).AppendChunk(Значение) - появляется сообщенио о том, что используется не правильный символ.

 

Если сделать:

ЧтениеДанных = Новый ЧтениеДанных(ДвоичныеДанные, КодировкаТекста.UTF16);
Значение = ЧтениеДанных.ПрочитатьСимволы();

то Значение будет содержать строку, которая отличается и от той, что выдает ADODB.Stream, и от той, что выдает ЧтениеТекста. Значение при этом без проблем залазит в Параметры.Item(Колонка.Имя).AppendChunk(Значение), но в итоге картинка из него не собирается вообще, а представляется из себя просто набор байт.

OLE MS OLEDB BLOB ORACLE

См. также

Перенос данных из Парус 8 в ЗГУ 3

Зарплата Внешние источники данных Бюджетный учет Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 8 учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

84000 руб.

19.08.2020    22449    19    1    

22

Перенос данных из Парус 10 в ЗГУ ред.3

Внешние источники данных Кадровый учет Файловый обмен (TXT, XML, DBF), FTP Обмен между базами 1C Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 10 учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

60000 руб.

05.10.2022    9208    9    8    

10

Перенос данных из Парус 7.хх в ЗГУ ред.3

Внешние источники данных Зарплата Бюджетный учет Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 7.хх учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

24000 руб.

24.04.2017    48702    97    163    

86

Перенос начальных остатков из Парус 7.71 в БГУ

Внешние источники данных Взаиморасчеты Учет ОС и НМА Логистика, склад и ТМЦ Бюджетный учет Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 2.0 1С:Бухгалтерия государственного учреждения Государственные, бюджетные структуры Россия Бюджетный учет Платные (руб)

Перенос словарей и начальных остатков из ПП Парус-Бухгалтерия Бюджет 7.71 в 1Сv8 БГУ2. Заполнение словарей и документов по вводу начальных остатков. Не требуется установка ПП Парус7. Возможна дозагрузка. Позволит автоматически и наиболее полно ввести данные в программу для начала работы. 

15600 руб.

08.12.2011    81567    128    123    

147

Перенос данных из Парус 10 (Торнадо) в ЗГУ ред.3 через Excel

Внешние источники данных Загрузка и выгрузка в Excel Зарплата Бюджетный учет Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате из Парус 10(Торнадо) учреждений через файлы Excel в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ). В принципе, обработка может быть использована для загрузки из файлов Excel, полученных из любых информационных систем.

24000 руб.

16.11.2018    30002    20    31    

21

Загрузка спецификаций в УНФ из системы Базис-мебельщик

Производство готовой продукции (работ, услуг) Внешние источники данных Платформа 1С v8.3 1С:Управление нашей фирмой 1.6 Лесное и деревообрабатывающее хозяйство Россия Управленческий учет Платные (руб)

Обработка предназначена для загрузки файлов, выгруженных из системы Базис-мебельщик, в справочник "Спецификации" для последующих процессов учета и диспетчирования полуфабрикатов и изделий.

7200 руб.

24.06.2021    19127    52    50    

29
Оставьте свое сообщение