Передача файла во внутренний документ через COM

1. 00s 17.09.15 10:30 Сейчас в теме
Выполняю загрузку информации по номенклатуре в УПП, параллельно мне нужно создать в Документообороте задачу по обработке этой информации. Внутренний документ и маршрут согласования в ДО настроены и работаю успешно.
Через COM подключаюсь к ДО и создаю внутренние задачи, ставлю на контроль без проблем, а с добавлением файла во внутренний документ возникли проблемы. Никто не подключал программно файлы во внутренние документы через COM?

Кусочек РАБОТАЮЩЕГО кода по созданию внутренних документов:
v83_Com = Новый COMObject("v83.ComConnector");// ComConnector");
		Попытка 
			ДО=v83_Com.Connect("Srvr=pc265:2541; Ref=DOCCORP_WORK; Usr=***; PWD=***");
		Исключение
			СтрСообщения = "Ошибка инициализации! "+ОписаниеОшибки();
			Сообщить(СтрСообщения);
		КонецПопытки;
		НД = ДО.Справочники.ВнутренниеДокументы.СоздатьЭлемент();
		СтрЗаполнения = ДО.Справочники.ШаблоныВнутреннихДокументов.НайтиПоНаименованию("Заявка на ввод нового изделия");
		НД.Заполнить(СтрЗаполнения);
		НД.Организация = ДО.Справочники.Организации.НайтиПоКоду("00-000001");
		НД.Наименование = "Заявка на ввод нового изделия "+Строка(ЭтаФорма.ЭлементыФормы.Номенклатура.Значение);
		НД.ГрифДоступа = ДО.Справочники.ГрифыДоступа.НайтиПоНаименованию("Общий").Ссылка;
		НД.Заголовок = "Заявка на ввод нового изделия "+Строка(ЭтаФорма.ЭлементыФормы.Номенклатура.Значение);
		НД.Содержание = "Заявка на ввод нового изделия "+Строка(ЭтаФорма.ЭлементыФормы.Номенклатура.Значение);
		НД.КоличествоЛистов = 1;
		НД.КоличествоЭкземпляров = 1;
		НД.Подготовил = ДО.Справочники.Пользователи.НайтиПоНаименованию(ДО.ПользователиИнформационнойБазы.ТекущийПользователь().FullName).Ссылка;
		НД.Подразделение = ДО.РаботаСПользователями.ПолучитьПодразделение(НД.Подготовил);
		НД.Ответственный = ДО.Справочники.Пользователи.НайтиПоНаименованию("Игинов Александр Александрович (Главный конструктор)").Ссылка;
		НД.ВидДокумента = ДО.Справочники.ВидыВнутреннихДокументов.НайтиПоНаименованию("Заявка на ввод нового изделия").Ссылка;
		НД.Утвердил = ДО.Справочники.Пользователи.НайтиПоНаименованию("Игинов Александр Александрович (Главный конструктор)").Ссылка;
		НД.Шаблон = ДО.Справочники.ШаблоныВнутреннихДокументов.НайтиПоНаименованию("Заявка на ввод нового изделия").Ссылка;
		НД.ВопросДеятельности = ДО.Справочники.ВопросыДеятельности.НайтиПоНаименованию("Формирование нормативно-справочной базы").Ссылка;
		НД.Папка = ДО.Справочники.ПапкиВнутреннихДокументов.НайтиПоНаименованию("Заявки").Ссылка;
		НД.ДатаСоздания = ТекущаяДата();
		Попытка
			НД.Записать();
		Исключение
			Предупреждение("Не удалось записать внутренний документ:" + Символы.ПС + ОписаниеОшибки());
		КонецПопытки;
		КД = ДО.Справочники.Контроль.СоздатьЭлемент();
		КД.Наименование = "Контролировать """ + НД.Наименование+ """""" + " от " + Формат(НД.ДатаСоздания,"ДЛФ=DT");
		КД.Автор = ДО.Справочники.Пользователи.НайтиПоНаименованию(ДО.ПользователиИнформационнойБазы.ТекущийПользователь().FullName).Ссылка;
		КД.ДатаПостановкиНаКонтроль =  ТекущаяДата();
//		КД.ИсполнителиСтрокой = ПолучитьИсполнителейСтрокой()
		КД.Контролер = НД.Утвердил;
		КД.Описание = "Контролировать """ + НД.Наименование+ """" + " от " + Формат(НД.ДатаСоздания,"ДЛФ=DT");
		КД.ПоставленНаКонтроль = Истина;
		КД.Предмет = НД.Ссылка;
		КД.СнятСКонтроля = Ложь;
		Попытка
			КД.Записать();
		Исключение
			Предупреждение("Не удалось записать контроль:" + Символы.ПС + ОписаниеОшибки());
		КонецПопытки;
Показать



Помогите Люди Добрые!!!!
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. vovan_victory 63 17.09.15 11:51 Сейчас в теме
(1) 00s,это у меня в правилах обмена. После загрузки внутреннего документа.
Объект - это справочник внутренние документы
	СсылкаНового = Объект.Ссылка;
	
	Результат = Новый Структура;
	Результат.Вставить("ФайлДобавлен", Ложь);
	Результат.Вставить("ФайлСсылка",   Неопределено);
	Результат.Вставить("ТекстОшибки",  "");
	
	ТаблицаФайлов = ЗначениеИзСтрокиВнутр(ПараметрыОбъекта.Получить("Файлы"));
	
	Для Каждого СТр Из ТаблицаФайлов Цикл 
		ВременныйКаталог = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ПолучитьИмяВременногоФайла());
		
		СоздатьКаталог(ВременныйКаталог);
		ФайлКлиента = Новый Файл(ВременныйКаталог+СТр.ИмяФайла);
		
		СТр.ДвоичныеДанные.Записать(ВременныйКаталог+СТр.ИмяФайла); 
		
		
		ФайловыеФункцииСлужебныйКлиентСервер.ПроверитьВозможностьЗагрузкиФайла(ФайлКлиента);
		
		АдресВременногоХранилищаТекста = "";
		
		ВремяИзменения              = ФайлКлиента.ПолучитьВремяИзменения();
		ВремяИзмененияУниверсальное = ФайлКлиента.ПолучитьУниверсальноеВремяИзменения();
		Если Стр.ИмяФайла <> Неопределено Тогда
			ИмяСоздания = ФайлКлиента.ИмяБезРасширения;
		Иначе
			ИмяСоздания = ФайлКлиента.ИмяБезРасширения;
		КонецЕсли;
		
		ИмяФайла  = ИмяСоздания + ФайлКлиента.Расширение;
		РазмерВМб = ФайлКлиента.Размер() / (1024 * 1024);
		
		ТекстСостояния = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru = 'Идет сохранение файла ""%1"" (%2 Мб).
		|Пожалуйста, подождите...'"),
		ИмяФайла,
		ФайловыеФункцииСлужебныйКлиентСервер.ПолучитьСтрокуСРазмеромФайла(РазмерВМб));
		
		// Помещение файла во временное хранилище.
		АдресВременногоХранилищаФайла = "";
		
		ПомещаемыеФайлы = Новый Массив;
		Описание = Новый ОписаниеПередаваемогоФайла(ФайлКлиента.ПолноеИмя, "");
		ПомещаемыеФайлы.Добавить(Описание);
		
		ПомещенныеФайлы = Новый Массив;
		//ФайлыПомещены = ПоместитьФайлы(ПомещаемыеФайлы, ПомещенныеФайлы, , Ложь, Новый УникальныйИдентификатор);
		//АдресВременногоХранилищаФайла = ПоместитьВоВременноеХранилище(ПомещаемыеФайлы,Новый УникальныйИдентификатор);
		//Если НЕ ФайлыПомещены Тогда
		//	Отказ = Истина;
		//КонецЕсли;
		АдресВременногоХранилищаФайла = ВременныйКаталог+СТр.ИмяФайла;
		
		Если ПомещенныеФайлы.Количество() = 1 Тогда
			АдресВременногоХранилищаФайла = ПомещенныеФайлы[0].Хранение;
		КонецЕсли;
		
		// Создание карточки Файла в БД.
		Попытка
			Результат.ФайлСсылка = РаботаСФайламиВызовСервера.СоздатьФайлСВерсией(
			СсылкаНового,
			ИмяСоздания,
			ОбщегоНазначенияКлиентСервер.РасширениеБезТочки(ФайлКлиента.Расширение),
			ВремяИзменения,
			ВремяИзмененияУниверсальное,
			ФайлКлиента.Размер(),
			АдресВременногоХранилищаФайла,
			АдресВременногоХранилищаТекста,
			Ложь,         // Это не Веб-клиент.
			Неопределено, // Пользователь.
			"",           // Комментарий.
			Неопределено,
			Истина, 	  //ХранитьВерсии
			Истина,      // ЗаписатьВИсторию.
			Неопределено);
			Результат.ФайлДобавлен = Истина;
		Исключение
			Результат.ТекстОшибки = ФайловыеФункцииСлужебныйКлиентСервер.ОшибкаСозданияНовогоФайла(ИнформацияОбОшибке());
		КонецПопытки;
		
		Если Результат.ТекстОшибки <> "" Тогда
			Сообщение = Новый СообщениеПользователю;
			Сообщение.Текст = Результат.ТекстОшибки;
			Сообщение.Сообщить();
			
		КонецЕсли;
		
		ПараметрыОповещения = Новый Структура;
		ПараметрыОповещения.Вставить("Владелец", СсылкаНового);
		ПараметрыОповещения.Вставить("Файл",     Результат.ФайлСсылка);
		ПараметрыОповещения.Вставить("Событие",  "СозданФайл");
	КонецЦикла;
Показать
3. 00s 17.09.15 13:11 Сейчас в теме
Большое СПАСИБО!
Буду пытаться перетащить все это под COM...
4. 00s 17.09.15 15:40 Сейчас в теме
Получилось создать файл, получить сведения о файле тоже, но РаботаСФайламиВызовСервера.СоздатьФайлСВерсией(ДО.Справочники.ВнутренниеДокументы.НайтиПоКоду(НД.Код).Ссылка,СвОФайле) Валится с ошибкой. Текст:

ФайлСпецификации = ДО.NewObject("Файл",ЭтотОбъект.ПутьКФайлуСпецификации);
ДО.ФайловыеФункцииСлужебныйКлиентСервер.ПроверитьВозможностьЗагрузкиФайла(ФайлСпецификации);
СвОФайле = ДО.РаботаСФайламиКлиентСервер.СведенияОФайле("ФайлСВерсией",ФайлСпецификации);
// Создание карточки Файла в БД.
Попытка
СсылкаНаФайл = ДО.РаботаСФайламиВызовСервера.СоздатьФайлСВерсией(ДО.Справочники.ВнутренниеДокументы.НайтиПоКоду(НД.Код).Ссылка,СвОФайле);
Исключение
ТекстОшибки = ДО.ФайловыеФункцииСлужебныйКлиентСервер.ОшибкаСозданияНовогоФайла(ИнформацияОбОшибке());
КонецПопытки;

Ошибка:
{Форма.Форма.Форма(70)}: Ошибка при вызове метода контекста (ОшибкаСозданияНовогоФайла)
ТекстОшибки = ДО.ФайловыеФункцииСлужебныйКлиентСервер.ОшибкаСозданияНовогоФайла(ИнформацияОбОшибке());
по причине:
Произошла исключительная ситуация (1C:Enterprise 8.3.6.2237): {ОбщийМодуль.ФайловыеФункцииСлужебныйКлиентСервер.Модуль(395)}: Ошибка при вызове метода контекста (КраткоеПредставлениеОшибки)
Несоответствие типов (параметр номер '1')

Вероятно, причина в ссылке на внутренний документ, хотя в контроле ссылка работала успешно!
КД.Предмет = НД.Ссылка;

Может быть нужно загружать файл в Хранилище сразу? И брать ссылку на него в запись справочника Файлы?
5. Serginio 938 17.09.15 15:44 Сейчас в теме
Передай как Base64 Base64Строка(<Значение>) и Base64Значение(<Строка>)
6. 00s 17.09.15 16:37 Сейчас в теме
(5) Serginio,
Извиняй не понял... Как это сделать? править на той стороне функцию РаботаСФайламиВызовСервера.СоздатьФайлСВерсией для раскодирования Base64Строка(Base64Значение(<Строка>))? или как? Для чего COM объект передавать как строку, вместо ссылки на элемент справочника?
7. Serginio 938 18.09.15 15:52 Сейчас в теме
Например для внешних отчетов есть ограничение на работу с файлами
http://www.forum.mista.ru/topic.php?id=698585
Но там это можно обойти через указание на то что отчет не должен работать в безопасном режиме.
ДО.ВнешниеОбработки.Создать(ПутьКОбработке,false);

Скорее всего ты работаешь в безопасном режиме.

А вообще для работы через COM лучше использовать внешние обработки. Проще отлаживать и проще использовать.
8. mikhail.tsybikov 16.11.20 09:22 Сейчас в теме
Спасибо, статья очень полезная
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот