Имя: Пароль:
1C
 
Документооборот Передача файла во внутренний документ через 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("Файл",ЭтотОбъект.ПутьКФайлуСпецификации);
        Если ДО.ФайловыеФункцииСлужебныйКлиентСервер.ПроверитьВозможностьЗагрузкиФайла(ФайлСпецификации) Тогда
            СвОФайле = ДО.РаботаСФайламиКлиентСервер.СведенияОФайле("ФайлСВерсией",ФайлСпецификации);
            СвОФайле.АдресВременногоХранилищаФайла = ЭтотОбъект.ПутьКФайлуСпецификации;
            // Создание карточки Файла в БД.
            Попытка
                СсылкаНаФайл = ДО.РаботаСФайламиВызовСервера.СоздатьФайлСВерсией(НД.Ссылка,СвОФайле);
            Исключение
                Сообщить(ОписаниеОшибки());
            КонецПопытки;
        КонецЕсли;
        /////////////////////////////////////////////////////////////////////////////////


Моя большая БЛАГОДАРНОСТЬ всем принявшим участие в решении проблемы!!!
Ошибка? Это не ошибка, это системная функция.