Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Присоединенные файлы к документу

Добрый день! УТ 11.1.10
Пытаюсь реализовать присоединение фотографий к документу.
Содрал все из Справочник.Номенклатура формы и процедуры ,в общем все 1 в 1
Но при добавлении фотки к документу вылетает ошибка

Код:
{ОбщийМодуль.ПрисоединенныеФайлыСлужебный.Модуль(1449)}: Ошибка при добавлении присоединенного файла.
У владельца файлов "Документ cервиса 00СЦ-0770 от 24.02.2016 11:31:50" типа "Документ cервиса"
не указан основной справочник для хранения файлов.

В этом случае параметр "НоваяСсылкаНаФайл" должен быть указан.
    ВызватьИсключение СокрЛП(ТекстОшибки);
Вроде бы все делал как у справочника номенклатура но не могу понять где искать этот НоваяСсылкаНаФайл

Вот из общего модуля процедура
Код:
// Возвращает имя справочника для указанного владельца или вызывает исключение,
// если их более одного.
//
// Параметры:
//  ВладелецФайлов  - Ссылка - объект, к которому добавляется файл.
//  ИмяСправочника  - Строка, если заполнено, то выполняется проверка
//                    наличия справочника среди справочников владельца для хранения файлов.
//                    Если не заполнено, возвращает имя основного справочника.
//  ЗаголовокОшибки - Строка - заголовок ошибки.
//                  - Неопределено - не вызывать исключение, а вернуть пустую строку.
//  ИмяПараметра    - Строка - имя требуемого параметра для определения имени справочника.
//  ОкончаниеОшибки - Строка - окончание ошибки (только для случая, когда ИмяПараметра = Неопределено).
//
Функция ИмяСправочникаХраненияФайлов(ВладелецФайлов, ИмяСправочника = "",
    ЗаголовокОшибки = Неопределено, ОкончаниеОшибки = Неопределено) Экспорт
   
    НеВызыватьИсключение = (ЗаголовокОшибки = Неопределено);
    ИменаСправочников = ИменаСправочниковХраненияФайлов(ВладелецФайлов, НеВызыватьИсключение);
   
    Если ИменаСправочников.Количество() = 0 Тогда
        Если НеВызыватьИсключение Тогда
            Возврат "";
        КонецЕсли;
       
        ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
            ЗаголовокОшибки + Символы.ПС +
            НСтр("ru = 'У владельца файлов ""%1"" типа ""%2""
                       |нет справочников для хранения файлов.'"),
            Строка(ВладелецФайлов),
            Строка(ТипЗнч(ВладелецФайлов)));
    КонецЕсли;
   
    Если ЗначениеЗаполнено(ИмяСправочника) Тогда
        Если ИменаСправочников[ИмяСправочника] <> Неопределено Тогда
            Возврат ИмяСправочника;
        КонецЕсли;
   
        Если НеВызыватьИсключение Тогда
            Возврат "";
        КонецЕсли;
       
        ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
            ЗаголовокОшибки + Символы.ПС +
            НСтр("ru = 'У владельца файлов ""%1"" типа ""%2""
                       |нет справочника ""%3"" для хранения файлов.'"),
            Строка(ВладелецФайлов),
            Строка(ТипЗнч(ВладелецФайлов)),
            Строка(ИмяСправочника));
    КонецЕсли;
   
    ОсновнойСправочник = "";
    Для каждого КлючИЗначение Из ИменаСправочников Цикл
        Если КлючИЗначение.Значение = Истина Тогда
            ОсновнойСправочник = КлючИЗначение.Ключ;
            Прервать;
        КонецЕсли;
    КонецЦикла;
   
    Если ЗначениеЗаполнено(ОсновнойСправочник) Тогда
        Возврат ОсновнойСправочник;
    КонецЕсли;
       
    Если НеВызыватьИсключение Тогда
        Возврат "";
    КонецЕсли;
   
    ШаблонПричиныОшибки =
        НСтр("ru = 'У владельца файлов ""%1"" типа ""%2""
            |не указан основной справочник для хранения файлов.'") + Символы.ПС;
           
    ПричинаОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
        ШаблонПричиныОшибки, Строка(ВладелецФайлов), Строка(ТипЗнч(ВладелецФайлов)));
       
    ТекстОшибки = ЗаголовокОшибки + Символы.ПС
        + ПричинаОшибки + Символы.ПС
        + ОкончаниеОшибки;
       
    ВызватьИсключение СокрЛП(ТекстОшибки);
   
КонецФункции
Ответ:
Ну зайдите в этот справочник - хранения файлов владельца, посмотрите какие реквизиты, какие типы используются. Без документации - скуритесь что-то внедрять
Вопрос: Загрузка прикрепляемых файлов в папку на диске

Здравствуйте форумчане. Помогите разобраться.

Ситуация следующая. В самописной БД создал механизм прикрепления файлов к документам. Сохраняются файлы (в основном это word и pdf) в ХранилищеЗначения справочник файлы, но в по причинам большого количества прикрепляемых файлов возникла необходимость сохранять файлы в папку на томе. И на этот моменте у меня возникли проблемы… Подскажите пожалуйста как изменить место сохранения файлов.

Вот код

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

ЗУП3
Пишу обработку по рассылке отчетов на электронную почту сотрудников, в виде вложения. На строчке:
Если ПоместитьФайлы(ПомещаемыеФайлы, ПомещенныеФайлы, , Ложь, ) Тогда
Выдает ошибку: 
Ошибка при вызове метода контекста (ПоместитьФайлы)
Если ПоместитьФайлы(ПомещаемыеФайлы, ПомещенныеФайлы, , Ложь, ) Тогда
по причине:
Ошибка доступа к файлу 'C:\temp'. 5(0x00000005): Отказано в доступе.


Если закомментировать строчки с прикреплением вложения, то письмо отправляется, правда без вложения. Ниже код:


&НаКлиенте
Процедура ОтправитьПочту(Команда)
    
    Если объект.ТабличнаяЧасть.Количество()>0 Тогда
        Для каждого СтрокаТЧ из Объект.ТабличнаяЧасть Цикл
            
            мФайлы = Новый Массив;
            мФайлы.Добавить(СтрокаТЧ.ПутьКФайлу);
            Вложения = ДобавлениеФайлаКВложениям(мФайлы);
            
            ТемаПисьма = ЭтотОбъект.Объект.ТемаПисьма; 
            ТелоПисьма = "ТелоПисьма";
            ПочтовыйАдресКому = СтрокаТЧ.ЭлектронныйАдрес;
            ПараметрыПисьма = СформироватьПараметрыПисьма(Пароль,ТелоПисьма, ТемаПисьма, ПочтовыйАдресКому,ПочтовыйАдресКопии ,Вложения);
            ИдентификаторОтправки = ""; 
            ИдентификаторОтправки = ОтправитьПочтовоеСообщение(Объект.УчетнаяЗапись, ПараметрыПисьма);   
            
        КонецЦикла;
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Функция ДобавлениеФайлаКВложениям(мФайл = Неопределено)
    Перем ПомещенныеФайлы;
    
    ПомещаемыеФайлы = Новый Массив;
    
    Для каждого Файл из мФайл Цикл
        Если Файл <> Неопределено Тогда
            Файлы = Новый ОписаниеПередаваемогоФайла;
            Файлы.Имя = Файл;
            ПомещаемыеФайлы.Добавить(Файлы);
        КонецЕсли;
    КонецЦикла;
    
    Если ПодключитьРасширениеРаботыСФайлами() Тогда
        ПомещенныеФайлы = Новый Массив;
        Если ПоместитьФайлы(ПомещаемыеФайлы, ПомещенныеФайлы, , Ложь, ) Тогда  //вот здесь ошибка доступа к файлу

            Возврат ДобавитьФайлыВСписок(ПомещенныеФайлы);
        КонецЕсли;
    Иначе
        ПоказатьПредупреждение(,НСтр("ru = 'В Веб-клиенте без установленного расширения работы с файлами добавление файлов не поддерживается.'"));
        Возврат Неопределено;
    КонецЕсли;
    
КонецФункции
Ответ: я Еще думал почему 1С ругается на каталог, сообщая что это файл. Ну думаю "так и должно быть..."
Вопрос: Копировать файл с правами

Добрый день, помогите, пожалуйста.
Такая проблема: есть пользователь 1С, который будет сохранять файл в папку на внешнем диске, необходимо ограничить доступ этого пользователя к папке, чтобы он мог только записывать туда файл и мог в дальнейшем открывать его только для чтения (просмотра).
Возможно ли как-то записывать файл в папку под правами или каким-либо образом передавать файл на сервер, чтобы там файл записывался от имени пользователя 1USP1CV8? Как решить эту проблему?
Ответ: сделал вот так:
В Обработке прописал:

АдресХранилища = ПоместитьВоВременноеХранилище(ПолноеИмяФайла,);

ПоместитьФайл(АдресХранилища,ПолноеИмяФайла,ПолноеИмяФайла,Ложь,);
        СС_ОбщийМодуль.СохранитьФайл(АдресХранилища,ПутьСохраненногоФайла);

В СС_ОбщийМодуль добавил процедуру:

Процедура СохранитьФайл(АдресХранилища,Путь) Экспорт
ФайлИзХранилища = ПолучитьИзВременногоХранилища(Строка(АдресХранилища));
ФайлИзХранилища.Записать(Путь);
КонецПроцедуры    

Выходит ошибка доступа к файлу:
{ОбщийМодуль.СС_ОбщийМодуль.Модуль(1386)}: Ошибка при вызове метода контекста (Записать)
    ФайлИзХранилища.Записать(Путь);
по причине:
Ошибка доступа к файлу '\\terminal\Файлы\2.pdf'
Вопрос: 1c 8.2 Копирование файлов под доменной учеткой

Добрый день.

Направьте плиз на путь, куда копать. Разрабатываю свою конфу, сделал возможность прикрепления файлов к документу. Система клиент-серверная, сервер запущен под доменной учеткой usr1c, на сетевом диске создал папку куда будут попадать файлы, дал на эту папку полные права usr1c. В форме документа процедуры прикрепления:
....
    ПолныеПрава.СоздатьКаталогПодАдмином (л_ПапкаОбъекта);
    л_ПолноеИмяСохраняемогоФайла=л_ПапкаОбъекта+"\"+п_Файл.Имя;
    

...
    ПолныеПрава.КопироватьФайлПодАдмином(л_ПолноеИмяФайлаИсточника,л_ПолноеИмяСохраняемогоФайла);

...

ПолныеПрава - это общий модуль с галочкой Сервер.

Когда с клиентского места пытаюсь прикрепить файл то каталог создается без проблем, а вот файл не копируется пишет  Ошибка копирования файлов .... Каталог не обнаружен.

Я так понимаю что программа пытается с сервера скопировать исходный файл, а путь берется с клиента (ну и сам файл лежит то на клиенте). Как это обойти?
Ответ: используй временное хранилище
на клиенте - файл в него
на сервере - достать и сохранить в нужную папку
Вопрос: Замена правил обмена в файле выгрузки

Всем доброе!
Есть файл выгрузки xml по правилам обмена. Соответственно, в нем есть блок
Код:
<ПравилаОбмена>
...
</ПравилаОбмена>
И есть второй файл, как бы шаблон этого блока.
Необходимо заменить блок правил в файле выгрузки на блок из файла шаблона.
Придется по-элементно читать ЧтениеXML и писать в третий временный файл через ЗаписьXML? Или есть более удобный способ?

P.S. Предчувствую резонный вопрос "Зачем?" Необходимо защититься от изменений правил в Источнике, т.е. всегда загружать по эталону из Приемника.
Ответ:
Написал. Есть некоторые сомнения в оптимальности. Запись во временный xml через ЗаписьXML, а потом ЧтениеТекста, чтобы запхнуть все это в файл который был первоначально передан.
С методологической точки грубых ошибок нет?
Код:
// Процедура заменяет блок <ПравилаОбмена>...</ПравилаОбмена> в переданном файле .xml
// на блок из шаблона, в котором хранится фрагмент файла выгрузки по эталонным правилам.
//
// Параметры
//   ИмяФайлаXML  - Тип: Строка - Полное имя файла с данными выгрузки,
//                     в  котором будем менять блок <ПравилаОбмена>
//
// Возвращаемое значение:
//   ИмяФайлаРезультатаXML   - Тип: Строка - Путь
//
Процедура ЗаменитьПравилаОбменаВФайлеВыгрузкиWS(ИмяФайлаXML)

    ФайлВыгрузкиXML = Новый ЧтениеXML;
    ФайлВыгрузкиXML.ОткрытьФайл(ИмяФайлаXML);
   
    ШаблонПравил = Новый ЧтениеXML;
    ПутьКШаблонуПравил = ПолучитьШаблонПравилОбмена();
    ШаблонПравил.ОткрытьФайл(ПутьКШаблонуПравил);
   
    ИмяФайлаРезультатаXML = ПолучитьИмяВременногоФайла(".xml");
    РезультатXML = Новый ЗаписьXML;
    РезультатXML.ОткрытьФайл(ИмяФайлаРезультатаXML);
   
    Пока ФайлВыгрузкиXML.Прочитать() Цикл
       
        ТипУзла = ФайлВыгрузкиXML.ТипУзла;
       
        Если ТипУзла = ТипУзлаXML.НачалоЭлемента и ФайлВыгрузкиXML.Имя = "ПравилаОбмена" Тогда
            ФайлВыгрузкиXML.Пропустить();
           
            Пока ШаблонПравил.Прочитать() Цикл
               
                Если ШаблонПравил.ТипУзла = ТипУзлаXML.НачалоЭлемента и ШаблонПравил.Имя = "ПравилаОбмена" Тогда
                    РезультатXML.ЗаписатьТекущий(ШаблонПравил);
                    Пока ШаблонПравил.Прочитать() Цикл
                        РезультатXML.ЗаписатьТекущий(ШаблонПравил);
                        Если ШаблонПравил.ТипУзла = ТипУзлаXML.КонецЭлемента и ШаблонПравил.Имя = "ПравилаОбмена" Тогда
                            Прервать;
                        КонецЕсли;
                    КонецЦикла;
                    Прервать;
                КонецЕсли;   
            КонецЦикла;
           
        Иначе   
            РезультатXML.ЗаписатьТекущий(ФайлВыгрузкиXML);
        КонецЕсли;
       
    КонецЦикла;
   
    ФайлВыгрузкиXML.Закрыть();
    ШаблонПравил.Закрыть();
    РезультатXML.Закрыть();
   
    Текст = Новый ЧтениеТекста(ИмяФайлаРезультатаXML);
    СообщениеОбмена = Текст.Прочитать();
    ЗаписьТекста = Новый ЗаписьТекста(ИмяФайлаXML, КодировкаТекста.UTF8);
    ЗаписьТекста.Записать(СообщениеОбмена);
    ЗаписьТекста.Закрыть();
   
КонецПроцедуры // ЗаменитьПравилаОбмена()
Вопрос: как выбрать куда сохранить созданый текстовый файл

как сохранить текстовый файл в любое место выбрав просто путь и сохранить этот файл с определенным именем
Код:
    ПутьКФайлу ="С:\\файл.txt";   
    Если ЗначениеЗаполнено(ПутьКФайлу) Тогда
       
        Текст = Новый ТекстовыйДокумент;
       
        Выборка = Справочники.Банки.Выбрать();
        Пока Выборка.Следующий() Цикл       
            // выводим в файл код и наименование, разделенные    
            // разделителем ‘;’       
            Текст.ДобавитьСтроку(""+Выборка.Код+";"+Выборка.Наименование);           
        КонецЦикла;   
        // запись в текстовый файл
        Текст.Записать(ПутьКФайлу,КодировкаТекста.UTF8);
    конецесли;
Ответ:
уже сделал спасибо
Код:
Режим = РежимДиалогаВыбораФайла.Сохранение;
ДиалогСохраненияФайла = Новый ДиалогВыбораФайла(Режим);
ДиалогСохраненияФайла.ПолноеИмяФайла = "Выгрузка";
Фильтр = "Текст(*.txt)|*.txt";  
ДиалогСохраненияФайла.Фильтр = Фильтр;
ДиалогСохраненияФайла.МножественныйВыбор = Ложь;
ДиалогСохраненияФайла.Заголовок = "Выберите место сохранения файла";
Если ДиалогСохраненияФайла.Выбрать() Тогда
   ПутьКФайлу = ДиалогСохраненияФайла.ПолноеИмяФайла;
// выбрали файл, сохраняем в него данные
ДанныеВыгрузки(ПутьКФайлу);  
КонецЕсли;
Вопрос: v7: Как грамотней организовать ожидание появления определенного файла?

В общем ситуация следующая:
В 1с производим некие действия, в результате чего формируется простой текстовый файл задания с данными в определенном каталоге для сторонней программы. В ответ этот сторонний софт создает что-то типа файла ответа. 1с его читает и по результату ответа делает свои дела дальше.
Время формирования ответа всегда разное, зависит от данных, передаваемых из 1с. После отработки всего процесса файлы задания и ответа удаляются.
Сделал фиксированную паузу в 15 секунд, после чего ищу файл ответа. Всё работает, но пользователи утверждают что типа долго ждать и всё такое. Типа ответы приходят раньше чем из читает 1с.

Вопрос: Как лучше организовать ожидание появления файла? чтобы ответ обрабатывался сразу после появления файла ответа ...
Ответ: Используешь вк
Которая мониторит появление файла
Работе не мешает
По факту появления файла генерится внешнее событие
Отрабатываешь его (типа как сканирование штрихкода)
И все
Вопрос: Проблема с записью присоединенного файла программно

Коллеги, добрый день! Разработаю свою конфигурацию. Версия БСП 2.4.6.

Ситуация: Есть справочник ФизическиеЛица с возможностью присоединения фотографий (как в УТ 11.3). при добавлении фото создается элемент в справочнике ФизическиеЛицаПрисоединенныеФайлы, фото отображается на форме. Все разработано с БСП 2.4.6 См Скрин



В объекте есть реквизит Фото с типом "ФизическиеЛицаПрисоединенныеФайлы"

Если добавлять контекстно, то никаких проблем нет. Добавляется фото и в присоединенных файлах оно тоже есть, реквизит объекта "Фото " корректно заполняется.

Проблема: Хочу заполнить справочник физических лиц программно из Active Directory. Проблем с получением файлов из AD программно нет (если полученный файл записать в каталог, то он корректно открывается). Создаю присоединенный файл так:

ПрисоединенныйФайл = ПрисоединенныеФайлы.ДобавитьФайл(ФизЛицоОбъект.Ссылка,
ИмяФайлаБезРасширения,
СтруктураПараметров.Расширение
,,,
ВременныйАдрес);


Заполняю реквизит Фото этим присоединенным файлом, но при контекстном открытии ничего не заполнено

Смотрю в ЖР:



Хотя в отладчике смотрю, там файл создается, ошибок никаких нет.


Кто сталкивался? В чем проблема? Заранее спасибо!
Ответ:
Еще посмотрел. Вызвал следующую функцию:

РаботаСФайламиСлужебныйВызовСервера.СоздатьФайлСВерсией(ПараметрыВыполнения.ВладелецФайла,СведенияОФайле);

Но в ЖР :





Совсем ничего не понятно, что происходит...


В процедуре и файл создаваться должен и версия файла, но ничего не происходит..
Вопрос: Обработка Excel файла

Всем доброго дня, помогите с проблемкой:

Формирую прайс, сохраняю его в эксель - 
        ТабДок.Записать(ПутьКФайлуВыгрузки,ТипФайлаТабличногоДокумента.XLSX);

После этого его заново открываю и обрабатываю

    //Создаем подключение к Excel

    Попытка
        Excel = Новый COMОбъект("Excel.Application"); 
    Исключение  
        Сообщить("MS Excel не установлен на компьютере!",10); 
        Возврат; 
    КонецПопытки;
    
    //Открываем файл

    Если Не ПроверитьСуществованиеФайла(Путь) Тогда
        Сообщить("Невозможно открыть файл, проверьте наличие файла по указанному пути!");
        Возврат;
    КонецЕсли;
    
    Excel.Workbooks.Open(Путь); 
    
    //Открываем активную книгу

    Книга = Excel.ActiveWorkbook;    
    
    СтраницаСНоменклатурой = Excel.Sheets(1);

провожу манипуляции с ячейками и сохраняю - 

        Книга.SaveAs(Путь,-4143); 

но при открытии эксель ругается - 
"не удалось открыть файл 111.xlsx так как формат или расширение этого файла являются недопустимыми. Убедитесь, что файл не поврежден и расширение его имени соответствует формату.

В чем проблема? Причем до обработки он открывается нормально, что-то происходит с ним когда я его открываю для обработки и сохраняю... пробовал даже убирать все своим манипуляции с ячейками и просто открывал и сохранял.
Ответ: () СПАСИБО БОЛЬШОЕ!
Вот где собака порылась :)
В итоге табдок сохраняю в XLSX а потом после обработки файла делаю - Книга.SaveAs(Путь,51);