![]() |
![]() |
![]() |
|
Документооборот Передача файла во внутренний документ через COM | ☑ | ||
---|---|---|---|---|
0
osnnm
18.09.15
✎
13:52
|
Выполняю загрузку информации по номенклатуре в УПП, параллельно мне нужно создать в Документообороте задачу по обработке этой информации. Внутренний документ и маршрут согласования в ДО настроены и работаю успешно.
Через 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"); КД.ПоставленНаКонтроль = Истина; КД.Предмет = НД.Ссылка; КД.СнятСКонтроля = Ложь; Попытка КД.Записать(); Исключение Предупреждение("Не удалось записать контроль:" + Символы.ПС + ОписаниеОшибки()); КонецПопытки; ПутьКФайлу = ""; ИмяФайла = ""; РаботаСФайлами.ПолучитьКаталогИИмяФайла(ЭтотОбъект.ПутьКФайлуСпецификации,ПутьКФайлу,ИмяФайла); //////////////////////////////////////////////////////////////////////////////// ФайлСпецификации = ДО.NewObject("Файл",ЭтотОбъект.ПутьКФайлуСпецификации); ДО.ФайловыеФункцииСлужебныйКлиентСервер.ПроверитьВозможностьЗагрузкиФайла(ФайлСпецификации); СвОФайле = ДО.РаботаСФайламиКлиентСервер.СведенияОФайле("ФайлСВерсией",ФайлСпецификации); // Создание карточки Файла в БД. Попытка СсылкаНаФайл = ДО.РаботаСФайламиВызовСервера.СоздатьФайлСВерсией(НД.Ссылка,СвОФайле); Исключение ТекстОшибки = ДО.ФайловыеФункцииСлужебныйКлиентСервер.ОшибкаСозданияНовогоФайла(ИнформацияОбОшибке()); КонецПопытки; Если ТекстОшибки <> "" Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = ТекстОшибки; Сообщение.Сообщить(); Возврат; КонецЕсли; //////////////////////////////////////////////////////////////////////////////// Ошибка вылетает: {Форма.Форма.Форма(74)}: Ошибка при вызове метода контекста (ОшибкаСозданияНовогоФайла) ТекстОшибки = ДО.ФайловыеФункцииСлужебныйКлиентСервер.ОшибкаСозданияНовогоФайла(ИнформацияОбОшибке()); по причине: Произошла исключительная ситуация (1C:Enterprise 8.3.6.2237): {ОбщийМодуль.ФайловыеФункцииСлужебныйКлиентСервер.Модуль(395)}: Ошибка при вызове метода контекста (КраткоеПредставлениеОшибки) Несоответствие типов (параметр номер '1') Как сделать передачу файла по COM в ДО? Неужели никто не делал??? |
|||
1
aleks_default
18.09.15
✎
14:06
|
А зайти в ОбщийМодуль.ФайловыеФункцииСлужебныйКлиентСервер.Модуль(395)} и посмотреть что там не судьба?
|
|||
2
osnnm
18.09.15
✎
14:25
|
Функция ПолучитьУникальноеИмяСПутем(ИмяКаталога, ИмяФайла, ТипПлатформыТекущий) Экспорт
РезультирующийПуть = ""; Счетчик = 0; ЦиклНомер = 0; Успешно = Ложь; ГенераторСлучая = Неопределено; #Если Не ВебКлиент Тогда // ТекущаяДата() используется только для генерации случайного числа, // поэтому приведение к ТекущаяДатаСеанса не требуется. ГенераторСлучая = Новый ГенераторСлучайныхЧисел(Секунда(ТекущаяДата())); #КонецЕсли Пока НЕ Успешно И ЦиклНомер < 100 Цикл НомерКаталога = 0; #Если Не ВебКлиент Тогда НомерКаталога = ГенераторСлучая.СлучайноеЧисло(0, 25); #Иначе НомерКаталога = Секунда(ТекущаяДата()) % 26; #КонецЕсли КодБукваA = КодСимвола("A", 1); КодКаталога = КодБукваA + НомерКаталога; БукваКаталога = Символ(КодКаталога); ПодКаталог = ""; // Частичный путь // По умолчанию вначале будет класть в корень, а уже потом, // если не сможет, то в A, B, ... Z, A1, B1, .. Z1, .. A2, B2 и т.д. Если Счетчик = 0 Тогда ПодКаталог = ""; Иначе ПодКаталог = БукваКаталога; ЦиклНомер = Окр(Счетчик / 26); Если ЦиклНомер <> 0 Тогда ЦиклНомерСтрока = Строка(ЦиклНомер); ПодКаталог = ПодКаталог + ЦиклНомерСтрока; КонецЕсли; ПодКаталог = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ПодКаталог, ТипПлатформыТекущий); КонецЕсли; ПолныйПодКаталог = ИмяКаталога + ПодКаталог; // Создать каталог для файлов КаталогНаДиске = Новый Файл(ПолныйПодКаталог); Если НЕ КаталогНаДиске.Существует() Тогда СоздатьКаталог(ПолныйПодКаталог); КонецЕсли; ФайлПопытки = ПолныйПодКаталог + ИмяФайла; Счетчик = Счетчик + 1; // Проверить, есть ли файл с таким именем ФайлНаДиске = Новый Файл(ФайлПопытки); Если НЕ ФайлНаДиске.Существует() Тогда // нет такого файла РезультирующийПуть = ПодКаталог + ИмяФайла; Успешно = Истина; КонецЕсли; КонецЦикла; Возврат РезультирующийПуть; КонецФункции Путь передается в строке в структуре в таком виде "D:\ИП-СКП399-1 СП.xlsx", ничего криминального я не вижу. Можно ли посмотреть отладчиком вызов из COM? |
|||
3
Проггер
18.09.15
✎
14:35
|
может у РаботаСФайламиВызовСервера нет галки внешнее соединение?
|
|||
4
aleks_default
18.09.15
✎
14:41
|
(2) можно
Отладка-Подключение |
|||
5
aleks_default
18.09.15
✎
14:44
|
А если так
ТекстОшибки = ДО.ФайловыеФункцииСлужебныйКлиентСервер.ОшибкаСозданияНовогоФайла(ДО.ИнформацияОбОшибке()); |
|||
6
osnnm
18.09.15
✎
14:49
|
{Форма.Форма.Форма(74)}: Метод объекта не обнаружен (ИнформацияОбОшибке)
ТекстОшибки = ДО.ФайловыеФункцииСлужебныйКлиентСервер.ОшибкаСозданияНовогоФайла(ДО.ИнформацияОбОшибке()); Непрокатило... |
|||
7
osnnm
18.09.15
✎
15:56
|
(3) Галка внешние соединения у модуля РаботаСФайламиВызовСервера установлена.
|
|||
8
aleks_default
18.09.15
✎
16:09
|
(7)Ну смысл ошибки в том что ты в функцию во внешнем соединении передаешь структуру, возвращаемую функцией глобального контекста ИнформацияОбОшибке(), а передавать можно только простейшие типы.
|
|||
9
Проггер
18.09.15
✎
16:13
|
А если вместо ТекстОшибки = ДО.ФайловыеФункцииСлужебныйКлиентСервер.ОшибкаСозданияНовогоФайла(ИнформацияОбОшибке()) написать Сообщить(ОписаниеОшибки())?
|
|||
10
aleks_default
18.09.15
✎
16:15
|
(9)Это... млять, выход!
|
|||
11
osnnm
18.09.15
✎
16:22
|
(8) Я понимаю, что проблема в том, что при передаче параметров в функцию СсылкаНаФайл = ДО.РаботаСФайламиВызовСервера.СоздатьФайлСВерсией(НД.Ссылка,СвОФайле);
НД.Ссылка - должна быть ссылка на объект Внутренний документ в базе ДО, а оно: Свойство Значение Тип НД.Ссылка COMОбъект COMОбъект BelongsToItem Ошибка чтения значения Code "0000-025137" Строка Copy Ошибка чтения значения DataVersion "AAAAAAepsjc=" Строка DeletionMark Ложь Булево Description "Заявка на ввод нового изделия Переходник радиочастотный ИП-СКП399-1" Строка FullCode Ошибка чтения значения FullDescr Ошибка чтения значения GetForm Ошибка чтения значения GetObject Ошибка чтения значения IsEmpty Ошибка чтения значения IsFolder Ложь Булево Level Ошибка чтения значения Metadata Ошибка чтения значения Owner Неопределено Parent COMОбъект COMОбъект Predefined Ложь Булево PredefinedDataName "" Строка Ref COMОбъект COMОбъект UUID Ошибка чтения значения Адресат COMОбъект COMОбъект Бессрочный Ложь Булево Валюта COMОбъект COMОбъект ВидДокумента COMОбъект COMОбъект ВопросДеятельности COMОбъект COMОбъект ГрифДоступа COMОбъект COMОбъект ДатаНачалаДействия 01.01.0001 0:00:00 Дата ДатаОкончанияДействия 01.01.0001 0:00:00 Дата ДатаРегистрации 01.01.0001 0:00:00 Дата ДатаСоздания 18.09.2015 16:18:09 Дата Дело COMОбъект COMОбъект ДополнительныеРеквизиты COMОбъект COMОбъект Заголовок "Заявка на ввод нового изделия Переходник радиочастотный ИП-СКП399-1" Строка ЗапретитьАвтоматическоеДобавлениеУчастниковРабочейГруппы Ложь Булево Зарегистрировал COMОбъект COMОбъект КоличествоЛистов 1 Число КоличествоПриложений 0 Число КоличествоЭкземпляров 1 Число Комментарий "" Строка КонтактноеЛицо COMОбъект COMОбъект Корреспондент COMОбъект COMОбъект Корреспонденты COMОбъект COMОбъект ЛистовВПриложениях 0 Число НеДействует Ложь Булево НоменклатураДел COMОбъект COMОбъект Организация COMОбъект COMОбъект Ответственный COMОбъект COMОбъект Папка COMОбъект COMОбъект Подготовил COMОбъект COMОбъект ПодписалОтКорреспондента COMОбъект COMОбъект ПодписанЭП Ложь Булево Подразделение COMОбъект COMОбъект ПорядокПродления COMОбъект COMОбъект Проект COMОбъект COMОбъект РегистрационныйНомер "" Строка Содержание "Заявка на ввод нового изделия Переходник радиочастотный ИП-СКП399-1" Строка СрокИсполнения 01.01.0001 0:00:00 Дата СубъектыПерсональныхДанных COMОбъект COMОбъект Сумма 0 Число УдалитьЗапретитьАвтоматическоеДобавлениеУчастниковРабочейГруппы Ложь Булево УдалитьКорреспондентыДляСписков "" Строка УдалитьРезолюции COMОбъект COMОбъект УдалитьШаблон COMОбъект COMОбъект УдалитьЭлектронныеЦифровыеПодписи COMОбъект COMОбъект Утвердил COMОбъект COMОбъект ЧисловойНомер 0 Число Шаблон COMОбъект COMОбъект элд_Напечатано Ложь Булево Может попробовать найти ссылку как: Ref COMОбъект COMОбъект???? |
|||
12
Проггер
18.09.15
✎
16:25
|
(10) это не выход, а способ посмотреть ошибку
|
|||
13
osnnm
18.09.15
✎
16:27
|
(12) Да мне бы чтоб файл добавить :-) ошибка мне менее интересна :-)
|
|||
14
Проггер
18.09.15
✎
16:30
|
(13) что пишет то? ошибку поправишь и добавишь
|
|||
15
osnnm
18.09.15
✎
16:43
|
(14) Последняя версия ошибки :-)
{Форма.Форма.Форма(72)}: Ошибка при вызове метода контекста (СоздатьФайлСВерсией): Произошла исключительная ситуация (1C:Enterprise 8.3.6.2237): {ОбщийМодуль.РаботаСФайламиВызовСервера.Модуль(445)}: Ошибка при вызове конструктора (ДвоичныеДанные) Каталог не обнаружен '' ФайлСпецификации = ДО.NewObject("Файл",ЭтотОбъект.ПутьКФайлуСпецификации); Если ДО.ФайловыеФункцииСлужебныйКлиентСервер.ПроверитьВозможностьЗагрузкиФайла(ФайлСпецификации) Тогда СвОФайле = ДО.РаботаСФайламиКлиентСервер.СведенияОФайле("ФайлСВерсией",ФайлСпецификации); // Создание карточки Файла в БД. Попытка СсылкаНаФайл = ДО.РаботаСФайламиВызовСервера.СоздатьФайлСВерсией(НД.Ссылка,СвОФайле); Исключение Сообщить(ОписаниеОшибки()); КонецПопытки; КонецЕсли; Вероятно ссылку на документ мы победили,буду пытаться скормить функции пути к файлу без структуры. Заполнение структуры подозреваю на косяк... Но это уже в понедельник! |
|||
16
Проггер
18.09.15
✎
16:47
|
уже лучше, если бы ты был сервером ты бы увидел тот путь который ты ему подсовываешь?
|
|||
17
osnnm
21.09.15
✎
11:07
|
Рабочий код создания внутреннего документа с вложенным файлом через COM:
v83_Com = Новый COMObject("v83.ComConnector");// ComConnector"); // v83_Com = Новый COMObject("v83.Application");// Application"); Попытка ДО=v83_Com.Connect("Srvr=pc265:2541; Ref=DOCCORP_WORK; Usr=***; PWD=***"); Исключение СтрСообщения = "Ошибка инициализации! "+ОписаниеОшибки(); Сообщить(СтрСообщения); КонецПопытки; НД = ДО.Справочники.ВнутренниеДокументы.СоздатьЭлемент(); СтрЗаполнения = ДО.Справочники.ШаблоныВнутреннихДокументов.НайтиПоНаименованию("Заявка на ввод нового изделия"); НД.Заполнить(СтрЗаполнения); НД.Организация = ДО.Справочники.Организации.НайтиПоКоду("00-000001"); НД.Наименование = "Заявка на ввод нового изделия "+Строка(ЭтаФорма.ЭлементыФормы.Номенклатура.Значение); НД.ГрифДоступа = ДО.Справочники.ГрифыДоступа.НайтиПоНаименованию("Общий").Ссылка; НД.Заголовок = "Заявка на ввод нового изделия "+Строка(ЭтаФорма.ЭлементыФормы.Номенклатура.Значение); НД.Содержание = "Заявка на ввод нового изделия "+Строка(ЭтаФорма.ЭлементыФормы.Номенклатура.Значение); НД.КоличествоЛистов = 1; НД.КоличествоЭкземпляров = 1; НД.Подготовил = ДО.Справочники.Пользователи.НайтиПоНаименованию(ДО.ПользователиИнформационнойБазы.ТекущийПользователь().FullName).Ссылка; НД.Подразделение = ДО.РаботаСПользователями.ПолучитьПодразделение(НД.Подготовил); НД.Ответственный = ДО.Справочники.Пользователи.НайтиПоНаименованию("Игинов Александр Александрович (Главный конструктор)").Ссылка; НД.ВидДокумента = ДО.Справочники.ВидыВнутреннихДокументов.НайтиПоНаименованию("Заявка на ввод нового изделия").Ссылка; НД.Утвердил = ДО.Справочники.Пользователи.НайтиПоНаименованию("Игинов Александр Александрович (Главный конструктор)").Ссылка; НД.Шаблон = ДО.Справочники.ШаблоныВнутреннихДокументов.НайтиПоНаименованию("Заявка на ввод нового изделия").Ссылка; НД.ВопросДеятельности = ДО.Справочники.ВопросыДеятельности.НайтиПоНаименованию("Формирование нормативно-справочной базы").Ссылка; НД.Папка = ДО.Справочники.ПапкиВнутреннихДокументов.НайтиПоНаименованию("Заявки").Ссылка; НД.ДатаСоздания = ТекущаяДата(); Попытка НД.Записать(); Исключение Предупреждение("Не удалось записать внутренний документ:" + Символы.ПС + ОписаниеОшибки()); КонецПопытки; КД = ДО.Справочники.Контроль.СоздатьЭлемент(); КД.Наименование = "Контролировать """ + НД.Наименование+ """""" + " от " + Формат(НД.ДатаСоздания,"ДЛФ=DT"); КД.Автор = ДО.Справочники.Пользователи.НайтиПоНаименованию(ДО.ПользователиИнформационнойБазы.ТекущийПользователь().FullName).Ссылка; КД.ДатаПостановкиНаКонтроль = ТекущаяДата(); КД.Контролер = НД.Утвердил; КД.Описание = "Контролировать """ + НД.Наименование+ """" + " от " + Формат(НД.ДатаСоздания,"ДЛФ=DT"); КД.ПоставленНаКонтроль = Истина; КД.Предмет = НД.Ссылка; КД.СнятСКонтроля = Ложь; Попытка КД.Записать(); Исключение Предупреждение("Не удалось записать контроль:" + Символы.ПС + ОписаниеОшибки()); КонецПопытки; ПутьКФайлу = ""; ИмяФайла = ""; РаботаСФайлами.ПолучитьКаталогИИмяФайла(ЭтотОбъект.ПутьКФайлуСпецификации,ПутьКФайлу,ИмяФайла); //////////////////////////////////////////////////////////////////////////////// ФайлСпецификации = ДО.NewObject("Файл",ЭтотОбъект.ПутьКФайлуСпецификации); Если ДО.ФайловыеФункцииСлужебныйКлиентСервер.ПроверитьВозможностьЗагрузкиФайла(ФайлСпецификации) Тогда СвОФайле = ДО.РаботаСФайламиКлиентСервер.СведенияОФайле("ФайлСВерсией",ФайлСпецификации); СвОФайле.АдресВременногоХранилищаФайла = ЭтотОбъект.ПутьКФайлуСпецификации; // Создание карточки Файла в БД. Попытка СсылкаНаФайл = ДО.РаботаСФайламиВызовСервера.СоздатьФайлСВерсией(НД.Ссылка,СвОФайле); Исключение Сообщить(ОписаниеОшибки()); КонецПопытки; КонецЕсли; ///////////////////////////////////////////////////////////////////////////////// Моя большая БЛАГОДАРНОСТЬ всем принявшим участие в решении проблемы!!! |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |