УТ11.4 Создание элементов справочника НоменклатураПрисоединенныеФайлы
Слепил функцию
Функция СоздатьПрикрФайлНаСервере(ПутьКФайлу,Том,НомеклатураСсылка)
Спр=Справочники.НоменклатураПрисоединенныеФайлы.СоздатьЭлемент();
Спр.ВладелецФайла=НомеклатураСсылка;
Спр.Автор=ПараметрыСеанса.ТекущийПользователь;
Спр.ДатаСоздания=ТекущаяДата();
спр.ТипХраненияФайла=Перечисления.ТипыХраненияФайлов.ВТомахНаДиске;
Спр.ПутьКФайлу=ПутьКФайлу;
Спр.Том=Том;
Спр.Описание=ПутьКФайлу;
Спр.Расширение="jpg";
Попытка
Спр.Записать();
Сообщить("Записан "+Спр.Ссылка+" "+" "+Том+ПутьКФайлу+" "+НомеклатураСсылка);
Исключение
Сообщить("При записи "+Спр.Ссылка+"//Ошибка:"+ОписаниеОшибки());
КонецПопытки;
Возврат спр.Ссылка;
КонецФункции
Не удалось открыть файл:
.jpg
который присоединен к:
Присоединен к Номенклатура : —
по причине: двоичные данные файла были удалены. Возможно, файл очищен как ненужный или удален антивирусной программой.
Обратитесь к администратору.
.
Путь к файлу — это имя файла без расширения.
Файл реально существует. Режим хранения — на диске в каталоге Том
..
Подскажите, что я мог забыть в коде или лишнее?
Нашёл функцию РаботаСФайлами.СоздатьФайлНаОсновеФайлаНаДиске(ВладелецФайлов, ПутьКФайлуНаДиске);
Параметр
// ВладелецФайлов — ОпределяемыйТип.ВладелецПрисоединенныхФайлов — папка файлов или объект, к которому
// требуется прикрепить добавляемый файл.
У меня есть НоменклатураСсылка. Как преобразовать НоменклатураСсылка во ВладелецФайлов?
Разрулил. Окончательный код.
Функция СоздатьПрикрФайлНаСервере(Знач Результат,Знач Выборка)
ПутьКФайлу=СтрЗаменить(Результат.ПолноеИмяФайла,Результат.Том.ПолныйПутьWindows,"");
ТипСтр=Новый ОписаниеТипов(Метаданные.ОпределяемыеТипы.ВладелецПрисоединенныхФайлов.Тип);
ВладелецФайлов=ТипСтр.ПривестиЗначение(Выборка.Ссылка);
Спр=Справочники.НоменклатураПрисоединенныеФайлы.СоздатьЭлемент();
Спр.Наименование=Результат.ИмяФайла;
Спр.ВладелецФайла=ВладелецФайлов;
Спр.Автор=ПараметрыСеанса.ТекущийПользователь;
Спр.ИндексКартинки=РаботаСФайламиСлужебныйКлиентСервер.ПолучитьИндексПиктограммыФайла(Неопределено);
Спр.СтатусИзвлеченияТекста=Перечисления.СтатусыИзвлеченияТекстаФайлов.Извлечен;
Спр.ТипХраненияФайла=Перечисления.ТипыХраненияФайлов.ВТомахНаДиске;
Спр.ПутьКФайлу=ПутьКФайлу; //Здесь путь файла без Тома
Спр.Том=Результат.Том.Том;
Спр.Описание="Картинка "+ПутьКФайлу;
Спр.Расширение="jpg";
Спр.Заполнить(Неопределено);
Спр.ДатаМодификацииУниверсальная= СуществующийФайл.ПолучитьУниверсальноеВремяИзменения();
Спр.Размер=СуществующийФайл.Размер();
Спр.ДатаСоздания=СуществующийФайл.ПолучитьВремяИзменения();
Спр.Изменил=ПараметрыСеанса.ТекущийПользователь;
Попытка
Спр.Записать();
Сообщить("Записан "+Результат.ИмяФайла+" —> "+ВладелецФайлов);
Возврат спр.Ссылка;
Исключение
Сообщить("При записи "+Результат.ИмяФайла+" —> "+ ВладелецФайлов+" ?"+ОписаниеОшибки());
Возврат Неопределено;
КонецПопытки;
КонецФункции
..
Исправил ошибки:
-в реквизит Том надо было передавать СправочникСсылка.Тома
-в реквизит ВладелецФайла передал нужный тип (по факту СправочникСсылка. Номенклатура
-добавил заполнение реквизитов с параметрами файла на диске
-в реквизит ПутьКФайлу надо было передавать полный путь к файлу без пути к тому
После этого заработало.
.
В БСП были функции работы с файлами (справочник Файлы), но я не смог прикрутить к справочнику НоменклатураПрикрепленныеФайлы. Поэтому вернулся к первоначальному коду и правил его
.
для меня этот квест завершён
Двоичные данные файла были удалены возможно файл очищен как ненужный 1с
При попытке открыть документ "экземплярбюджета" появляется ошибка типа:
______________
: Не удалось открыть файл:
Вспомогательные данные бюджета.dat
который присоединен к:
Присоединен к Экземпляр бюджета : Экземпляр бюджета 000000ХХХ от ХХ.ХХ.ХХХХ 0:00:00
по причине: двоичные данные файла были удалены. Возможно, файл очищен как ненужный или удален антивирусной программой.
Обратитесь к администратору.
______________
В моем понимании — при попадании в процедуру ВосстановитьСохраненныйМакет(ПараметрыМакетаБюджета.ВерсияДанных) из формы документа, 1С "помнит" какую то версию документа, путь к которой сохранен в самой программе, но при попытке обращения по этому пути самого dat файла не обнаруживается (да его там действительно нет) и вываливается данная ошибка.
1С получить из временного хранилища
В связи с новым подходом в программировании на платформе 8.2 возникла необходимость передачи данных между клиентом и сервером при этом прямая передача в виде параметров имеет ряд ограничений. И тогда был введен объект «Временное хранилище».
Чем полезно временное хранилище:
- Не надо создавать объекты в конфигурации
- Доступно и с сервера и с клиента
- Можно записать любой объект
Временное хранилище это не объект конфигурации, а объект платформы поэтому для разработчика он выглядит как черный ящик. Можно туда положить что-то получив псевдоним(адрес) и получить из него что-то указав псевдоним(адрес). Но узнать что находится во временном хранилище и сколько нельзя. В ниже рассмотренных примерах помещение в хранилище происходит на клиенте, а чтение на сервере. Хотя можно передавать данные и в обратном направлении.
Синтаксис работы с хранилищем простой:
Передав параметром, данные которые хотим поместить(Посылка) и УникальныйИдентификатор получаем Адрес, по которому потом можно будет обратиться. Причем передаваемый идентификатор не является получаемым в последствии адресом. Вместо идентификатора можно передать строку Адреса, по которому и будет помещено наше значение, но это не любая строка! Строка Адреса выглядит примерно вот так «e1cib/tempstorage/ae5c5472-0266-4892-9073-20392dd5a6a6» .
УникальныйИдентификатор может быть как новый так и существующей формы, в последнем случае значение в хранилище будет храниться пока существует форма. Если не передать уникальный идентификатор, то при следующем серверном вызове значение уже будет удалено.
Чтобы получить из хранилища нужно только указать адрес:
Также можно удалить помещенный объект, используя адрес
Если помещаемые данные не являются объектами конфигурации, то для того чтобы их поместить нужно перевести в доступный тип – «ДвоичныеДанные»
Помещение в хранилище
Здесь мы сначала преобразуем файл в формат двоичных данных и только потом помещаем их в хранилище
Чтение из хранилища
В интернете есть множество примеров как на сервере записать полученные данные в базу, поэтому ниже приводится другой пример, когда файл полученный на сервере открывается для работы. В качестве такого файла используется XML.
Если мы имеем дело с файлами, то может оказаться удобным метод ПоместитьФайл. Он преобразует файл в двоичные данные и записывает их во ВременноеХранилище. При этом параметром можно настроить открытие диалогового окна для выбора файла. Сделаю оговорку, этот метод нельзя использовать на сервере.
В параметре Адрес, можно указать Адрес в который нужно записать файл, если нужен новый адрес, то нужно передать пустую строку.
Истина – открывает окно для выбора папки и имени файла, при значении Истина есть возможность открыть файл."КопияФайла.xml" – Имя файла под которым будет сохранен файл.Адрес – это адрес в хранилище,ПолучитьФайл(Адрес,"Копияфайла.xml" , Истина);Чтобы сохранить файл из временного хранилища на Клиенте можно использовать метод
Содержание
В хранилище значения можно сохранить почти любую информацию, например,
. картинки (фотки):
ТекИзображение.Объект = СпрТкани.Ссылка; ТекИзображение.ВидДанных = Перечисления.ВидыДополнительнойИнформацииОбъектов.Изображение; Хранилище = Новый ХранилищеЗначения(НоваяКартинка, Новый СжатиеДанных()); ТекИзображение.Хранилище = Хранилище.Получить();
// в этом месте он все выводит . ЭлементыФормы.ПолеКартинки1.Картинка = Хранилище.Получить(); ТекИзображение.Записать();
. табличный документ:
. произвольные файлы (двоичные данные):
ХЗ = Новый ХранилищеЗначения(Новый ДвоичныеДанные(файл));
Восьмерка поддерживает сжатие данных, помещаемых в хранилище:
ХЗ = Новый ХранилищеЗначения(Новый ДвоичныеДанные(файл),Новый СжатиеДанных(9));
. внешние обработки и отчеты:
Работа с хранилищем
Если это были ДвоичныеДанные, то их можно восстановить из хранилища значения методом Получить и записать в файл методом Записать().
Если ТипЗнч(Хранилище) <> Тип("ДвоичныеДанные") Тогда
Если это был, например, Word-документ (doc-файл, или другой файл зарегистрированного типа), то его можно открыть так:
Чтобы очистить поле типа Хранилище значения, нужно присвоить ему Неопределено:
Работа с файлами и картинками во встроенном языке 1С:Предприятия 8
Назначение
В управляемом приложении реализован новый механизм работы с файлами. Он обеспечивает обмен файлами между информационной базой и клиентским приложением. Особенностью данного механизма является то, что он ориентирован на использование в тонком клиенте и Веб-клиенте и разработан с учетом ограничений на работу с файлами, накладываемыми веб-браузерами.
Механизм представляет собой набор методов, с помощью которых можно поместить данные, хранящиеся локально у пользователя, во временное хранилище информационной базы, перенести эту информацию из временного хранилища в базу данных и получить ее обратно на компьютер пользователя. Наиболее распространенные прикладные задачи, решаемые этим механизмом, – это хранение сопроводительной информации, например, изображений товаров, связанных с договорами документов и т. п.
Область действия методов
Временное хранилище
Временное хранилище — это специализированная область информационной базы, в которую могут быть помещены двоичные данные. Основное назначение – это временное хранение информации при клиент-серверном взаимодействии до ее переноса в базу данных.
Необходимость во временном хранилище возникает из-за того, то в модели работы веб-браузера требуется передать выбранный пользователем файл непосредственно на сервер без возможности его хранения на клиенте. При передаче файла он помещается во временное хранилище и уже потом может быть использован при записи объекта в базу данных.
Наиболее типичная решаемая временным хранилищем прикладная задача – обеспечение доступа к файлам или картинкам до того, как объект будет записан в информационную базу, например, в форме элемента.
Файл или двоичные данные, помещенные в хранилище, идентифицируются уникальным адресом, который в дальнейшем можно использовать в операциях записи, чтения или удаления. Этот адрес выдают методы записи файла во временное хранилище. Отдельный метод во встроенном языке позволяет определить, является ли переданный адрес адресом, указывающим на данные во временном хранилище.
Информационная база
Механизм позволяет получить доступ к двоичным данным, хранящимся в реквизитах типа ХранилищеЗначений.
Как и в случае временного хранилища, доступ к информации возможен через специальный адрес. Получить его можно через специальный метод, передав ссылку на объект или ключ записи регистра сведений, и имя реквизита. В случае табличной части дополнительно требуется передать и индекс строки табличной части.
Методы работы с файлами имеют ограничение при работе с реквизитами информационной базы. Для них, в отличие от временного хранилища, доступно только чтение информации, но не ее запись или удаление.
Описание методов работы с файлами
Сохранение данных во временное хранилище
Наиболее типичный сценарий использования данного механизма предусматривает первоначальное размещение данных пользователя во временное хранилище. Для этого предназначены два метода: ПоместитьФайл() и ПоместитьФайлВоВременноеХранилище().
Первый метод, ПоместитьФайл(), помещает файл из локальной файловой системы во временное хранилище. Метод может принимать целевой адрес в хранилище. Если же он не определен или является пустой строкой, то будет создан новый файл и метод вернет его адрес через соответствующий параметр.
Если параметр, определяющий интерактивный режим работы, равен Истина, то метод отобразит стандартное диалоговое окно выбора файла, в котором можно выбрать файл для помещения в хранилище. В этом случае метод также вернет адрес выбранного файла.
Как результат метод возвращает Ложь, если пользователь в интерактивном режиме отказался от совершения операции в диалоге выбора файла. Метод доступен только на клиенте.
Второй метод, ПоместитьФайлВоВременноеХранилище(), схож с предыдущим, за исключением того, что он доступен на сервере, а данные для записи во временное хранилище представляются не в виде пути в файловой системе, а в виде переменной типа ДвоичныеДанные. Точно так же, если не указан целевой адрес, создается новый файл в хранилище. Его адрес возвращается как результат функции.
Получение файла из временного хранилища
При записи объекта в информационную базу может понадобиться извлечь данные из временного хранилища и поместить их, например, в реквизит. Для этого есть соответствующий серверный метод — ПолучитьФайлИзВременногоХранилища(). Этот метод извлекает данные из временного хранилища и возвращает их как результат. Для этого необходимо указать адрес во временном хранилище. Этот адрес возвращают вышеописанные методы ПоместитьФайл() и ПоместитьФайлВоВременноеХранилище() в случае их успешного выполнения.
Удаление файла из временного хранилища
После того, как данные сохранены в реквизите, файл во временном хранилище можно удалить. Для этого есть метод УдалитьФайлИзВременногоХранилища(), который удаляет файл из временного хранилища. Метод принимает в параметре адрес файла во временном хранилище. Доступен на сервере.
Проверка адреса на принадлежность временному хранилищу
Адрес файла может указывать как на временное хранилище, так и на реквизит в информационной базе. Для проверки его типа существует метод ЭтоАдресВременногоХранилища().
Он проверяет, что переданный адрес является адресом, указывающим на хранилище. Возвращает Истина, если адрес указывает на временное хранилище. Метод доступен на сервере.
Получение адреса реквизита
После того, как данные помещены в реквизит в информационной базе, может потребоваться получить доступ к ним с помощью файловых методов.
Но прежде чем получить данные, например из реквизита, необходимо получить адрес этого реквизита. Для этого существует метод ПолучитьАдресФайлаВИнформационнойБазе().
Его назначение – вернуть адрес файла в информационной базе по исходным параметрам. Для этого необходимо передать ключ объекта (это может быть как ссылка на объект, так и ключ записи регистра сведений) и имя реквизита. Если нужно получить адрес файла, хранимого в реквизите табличной части, до имени реквизита в параметре, задающем имя реквизита, необходимо добавить имя табличной части и точку «.». Метод доступен как на клиенте, так и на сервере.
Получение файла из информационной базы
Метод ПолучитьФайл() получает файл из информационной базы и сохраняет его в локальную файловую систему пользователя. Первый параметр определяет адрес файла в реквизите или во временном хранилище файлов. Второй параметр определяет целевое расположение полученного файла. В не интерактивном режиме необходимо указать путь. В интерактивном режиме параметр является опциональным.
По умолчанию метод исполняется в интерактивном режиме, то есть последний параметр равен Истина. Это значит, что выдается диалоговое окно, в котором можно указать действие с полученным файлом: запустить его или сохранить по указанному пользователем расположению. Если активен интерактивный режим, а параметр Целевой путь к файлу на диске не указан, то операция открытия файла не доступна. Возвращает булевское значение. Ложь означает, что пользователь выбрал отмену операции в диалоговом окне сохранения файлов в интерактивном режиме.
Пример использования файловых методов
// Получение в интерактивном режиме файла с диска // и помещение его во временное хранилище &НаКлиенте Процедура ВыбратьФайлСДискаИЗаписать()
// Копирование файла из временного хранилища в реквизит // справочника, запись объекта,удаление файла из временного // хранилища &НаСервере Процедура ПоместитьФайлОбъекта(АдресВременногоХранилища)
// Считывание файла из реквизита и сохранение его // на локальном диске в интерактивном режиме &НаКлиенте Процедура ПрочитатьФайлИСохранитьНаДиск()
Поддержка адресов в поле картинки
Элемент управления Поле картинки поддерживает отображение картинки, заданной адресом файла во временном хранилище или в базе данных.
Для этого в свойстве Данные элемента формы необходимо задать реквизит строкового типа. Значение этого реквизита и будет интерпретироваться как адрес картинки.
Пример // Привязка поля картинки к адресу картинки во временном // хранилище. АдресКартинки реквизит формы строкового типа
Ограничения при работе с Веб-клиентом
Работа описываемого механизма при использовании Веб-клиента имеет некоторые ограничения. Эти ограничения связаны с особенностями модели безопасности браузера. Так, например, клиент самостоятельно не может сохранить файл в локальную файловую систему, то есть доступен только интерактивный вариант клиентских методов ПоместитьФайл() и ПолучитьФайл(). При попытке использовать не интерактивный режим генерируется исключение. Диалоговые окна, отображаемые в интерактивном режиме, специфичны для конкретного типа браузера.
Особенности при работе с ХранилищемЗначений на Клиенте
Когда у Документа в табличной части есть реквизит типа ХранилищеЗначений, то тормозит открытие формы документа, если в этом реквизите записаны данные большого размера.
Возможно, при открытии формы, на клиент передается не ссылка на данные находящиеся в ХранилищеЗначений, а сами данные.
- В свойствах табличного реквизита формы есть флаг "Использовать всегда". Если он установлен, то содержимое поля всегда передается между сервером и клиентом – например, при открытии формы. Этот флаг надо отключить, но при этом нужно учесть это в коде, так как по умолчанию значения этого поля на клиенте не будет. Пример можно посмотреть в 1С:Архив.
Ещё лучше использовать временное хранилище для передачи файлов между клиентом и сервером.
Введение
Известно, что в хранилище значений можно поместить только переменные сериализуемого типа. В документации по встроенному языку и в синтакс-помощнике в описании объектов возможность сериализации указывается отметкой "Сериализуется".
При помещении во временное хранилище значений, сериализация которых не поддерживается, возникает ошибка. Текст ошибки зависит от типа переменной. Рассмотрим подробнее каждый из типов.
Хранилище значения
При помещении значения в хранилище конструктором Новый ХранилищеЗначения( , ) может возникать ошибка "Переданное значение не может быть помещено в ХранилищеЗначения, поскольку не сериализуется или содержит вложенный несериализуемый элемент".

Если в качестве помещаемого значения выступает несериализуемый элемент, то проблем не возникает – мы сразу видим, что он не сериализуется и предпринимаем необходимые действия в зависимости от потребности автоматизации.
Если в качестве помещаемого значения выступает сериализуемая коллекция (например, Структура) с вложенными элементами, то поиск конкретного не сериализуемого значения может принести немало хлопот.
Ниже представлена функция, позволяющая определить, где в коллекциях находятся несериализуемые элементы.
Временное хранилище
При помещении значения во временное хранилище методом ПоместитьВоВременноеХранилище( , ) может возникать ошибка " Переданное значение не может быть помещено во временное хранилище ".
Здесь казалось бы все по аналогии с хранилищем значения, но возник нюанс: если в качестве данных выступает сериализуемая коллекция с вложенными элементами, сериализация которых не поддерживается, то ошибки не возникает.
Т.е. вот такой код выдает ошибку:
Не знаю, это баг или фича, пока отправил письмо на v8 с просьбой признать ошибку. По результатам ответа, пополню статью.
В нижепредставленной функции организована проверка и на помещение во временное хранилище. Т.к. механизм очевидно другой, то реализован специальный параметр, который явно указывает какое хранилище проверяем.
Функции поиска несериалиуемого значения
Их две. Первая – собственно вызов с передачей проверяемого объекта:
Вторая – служебная рекурсия для определения путей несериализуемых объектов:
Двоичные данные в 1С 8.3

Двоичные данные платформы 1С:Предприятие – это универсальный объект встроенного языка программирования для работы с файлами. Благодаря объекту ДвоичныеДанные можно любой файл представить в виде последовательности байт. Объект доступен в тонком клиенте, веб-клиенте, мобильном клиенте, на сервере, толстом клиенте, внешнем соединении, мобильном приложении (клиент/сервер).
Объект сериализуется
Данный объект может быть сериализован в/из XML, может использоваться в реквизитах управляемой формы, а также он может быть сериализован в/из XDTO. Тип XDTO, соответствующий данному объекту, определяется в пространстве имен . Имя типа XDTO может быть любым из перечисленных: base64Binary, hexBinary.
Благодаря тому, что двоичные данные доступны и на клиенте, и на сервере, мы можем смело передавать файл в виде двоичных данных с клиента на сервер, однако рекомендованный «шаблон» для передачи файла – использовать хранилище значений.
Задачи, для решения которых можно использовать двоичные данные:
- Хранение файлов в базе данных (с использованием ХранилищеЗначения);
- Передача файла с клиента на сервер;
- Передача файлов при работе с протоколом HTTP;
- Передача вложений при работе с электронными письмами;
- Криптография;
- Представления файла в виде текста (с использованием Base64).
Работа с двоичными данными:
Данный пример кода показывает, как прочитать двоичные данные и передать их с клиента на сервер, используя объект ДвоичныеДанные.
Примеры по работе с двоичными данными
Самый очевидный пример, где применяются двоичные данные, – сохранение файла в базе данных. Для хранения файла в виде двоичных данных необходимо в объекте добавить реквизит с типом «ХранилищеЗначений». Далее представлен пример кода по работе с реквизитом (заполнение значения и получение значения).
Заполнение:
Получение (фрагмент кода, выполняемый на сервере):
Рассмотрим еще один пример: скачивание картинки из интернета и отображение ее на управляемой форме. Для этого также добавляем реквизит с типом ХранилищеЗначения, в котором будет помещаться картинка в двоичном формате.
Рис.1 Скачивание картинки из интернета
Функция, скачивающая картинку из интернета:
Использование функции:
Теперь у нас в реквизите «Аватар» лежат двоичные данные картинки. Чтобы картинку вывести на управляемую форму, необходимо добавить реквизит формы «Тип строка», перекинуть его на форму (drag-and-drop), либо создать самостоятельно элемент формы, указав в поле «Путь к данным» наш реквизит «Картинка», после чего изменить вид на «Поле картинки».
Рис.2 Поле картинки
По событию ПриСозданииНаСервере
Готово, на форме у нас картинка.
Двоичные данные и потоки
Говоря о двоичных данных, стоит упомянуть о возможности работы с потоками. Она появилась относительно недавно, а именно в версии 8.3.9. Чтобы потоком можно было читать из двоичных данных, применяется метод ОткрытьПотокДляЧтения. Допустим, у нас в базе данных лежит заархивированный xml-файл (как хранить файлы в базе данных рассматривалось ранее). Нам нужно вывести пользователю содержимое этого файла, или у вас настроен какой-то обмен, и вы передаете файлы в заархивированном виде (для экономии трафика).
Последовательность действий при работе с двоичными данными без использования потоков:
- Получить двоичные данные из базы;
- Записать их во временный файл;
- Разархивировать;
- Удалить временный файл;
- Прочитать разархивированный файл.
Последовательность действий при работе с потоками:
- Получить двоичные данные из базы;
- Открыть поток для чтения;
- Разархивировать;
- Прочитать разархивированный файл.
Пример кода без использования потоков:
Пример кода по работе с потоком:
Если диск у вас на SSD, рекомендую использовать потоки не только в примере с архивацией, а везде, где это возможно. Да, в данном примере все же происходит запись на диск (разархивация), но будем надеяться, когда-нибудь 1С реализует метод двоичных данных ОткрытьПотокДляЗаписи.
Работа с Base64
Base64 – это стандарт, позволяющий кодировать двоичные данные в виде строки (для кодирования используется 64 символа таблицы ASCII, отсюда и название). Тип ДвоичныеДанные сериализуем, то есть его можно представить в виде XML, для этого применяется объект встроенного языка СериализаторXDTO. После сериализации данные представлены одним узлом base64Binary, содержимое которого есть последовательность байт, закодированная в формате Base64.
строка в Base64
Платформа 1С также позволяет кодировать двоичные данные, не прибегая к сериализации. Для этого есть две функции:
Они преобразуются в Base64 и обратно в двоичные данные.
Если у вас остались вопросы по работе с двоичными данными в среде 1С:Предприятие, обратитесь к нашим специалистам и получите консультацию по 1С 8.3 или воспользуйтесь услугами по сопровождению 1С.
Не открываются прикрепленные файлы, если к ним длинный путь в 1С
Добрый день. Прикрепляю к операциям вручную Заявление на зачет (принятое ИФНС). Когда пытаюсь его открыть и просмотреть, появляется сообщение о превышении длины пути. Как правильно прикреплять файлы, чтобы можно было просмотреть на основании какого док сделана данная операция
Обсуждение (13)
Добрый день!
Попробуйте выполнить следующее:
-переименуйте прикрепляемый файл на более короткое название
— измените рабочий каталог на более короткое имя и попробуйте файл прикрепить от туда.
Поспешила отчитаться. С одним получилось, с другим — нет. Не могу удалить. И дальше тоже не получается, в какой бы каталог я его не помещала с измененным именем
Приложение
Светлана, в присланном скрине наименование файла видно, что очень длинное. Все-таки нужно его укоротить, иначе не получится присоединить корректно.
Если посмотреть, как заложено в 1С прикрепление файла, то можно видеть следующее: команда «Присоединить файл» обращается к специальной обработке 1С «Работа с файлами» к конкретной форме «Присоединенные файлы».
Прилагаю скрин.
Приложение
Если открыть эту форму, можно увидеть, что под наименование файла выделено всего 150 символов!
И это без данных диска, каталога и папок вложений! То есть полный путь со всеми этими составляющими будет еще больше!
Попробуйте перенести файл в корень диска С: так вы сминимизируете путь до файла. Или создайте отдельную папку Сохраненные файлы на корне диска С:. Если внутри у вас будут подпапки по контрагентам, датам и прочему — вы опять увелитите длину пути к файлу, а он добавляется к длине наименования!
Поэтому никаких вложений и минимальное наименование файла при прикреплении.
Добрый день, Ирина. Я не могу удалить файл с длинным именем из вложения.
Приложение
Прикрепленные файлы удаляются по правой кн. мыши с выбором из контекстного меню команды Удалить.
Приложение
А полный путь файла (без имени самого файла) , который сохраняется во временных папках 1с вы можете посмотреть по команде кн. ЕЩЕ-Дополнительно — Открыть каталог файла. Как я и писала — он длинный.
В приложенном мной фале видно, что «удаление» не активно
Дело в том, что данными пользуются другие сотрудники. И во вложении нужен только один файл. (С коротким именем я вставила, теперь их 2) Второй с длинным именем не могу удалить.
Приложение
Нажмите команду Отменить редактирование: вы намеренно или нет открыли раньше команду Редактировать. После этого команда Удалить должна быть активна.
Вот демонстрирую на примере: у вас ссылка на файл выделена зеленым — это признак редактирования прикрепленного файла.
Я воспроизвела ситуацию.
После отмены редактирования активизировались команды Пометить на удаление и Удалить. По последней я удалила файл.
Если у вас не получится удалить ссылку на файл типовым методом, что я вам показала, вашу ситуацию должен рассмотреть программист 1С.
Победил ошибку загрузки XLS из временного файла
Дорабатывал обработку загрузки прихода из Excel. Обработка изначально была не моя, все хорошо работало, но внезапно клиент в облаке переехал с файловой базы на SQL, потому что файловая тормозила.
И тут 1С начала писать, что файл не обнаружен. Оказывается, код загрузки из Excel был написан только под толстого клиента. Пришлось дорабатывать стандартным образом:
//На клиенте
ДД = Новый ДвоичныеДанные ( ПолноеИмяФайла );
//На сервере
ПолноеИмяФайла = ПолучитьИмяВременногоФайла ( «XLS» );
ДД . Записать ( ПолноеИмяФайла );
ТабДок = Новый ТабличныйДокумент ;
ТабДок . Прочитать ( ПолноеИмяФайла , СпособЧтенияЗначенийТабличногоДокумента . Текст );
Доработал и забыл. Как вдруг новая напасть — попросили доработать обработку, начинаю ее отлаживать, а она не считывает данные из XLSX файла.
Причем выдает ошибку доступа к временному файлу:

Я попробовал записывать во временный каталог, но это не принесло результата:
ТекКаталог = ПолучитьИмяВременногоФайла ();
СоздатьКаталог ( ТекКаталог );
ПолноеИмяФайла = ТекКаталог + «\» + Новый УникальныйИдентификатор () + ТипФайла ; //ПолучитьИмяВременногоФайла(«XLS»);
ДД . Записать ( ПолноеИмяФайла );
Ф = Новый Файл ( ПолноеИмяФайла );
Сообщить ( ПолноеИмяФайла + » Существует: » + Ф . Существует ());
ТабДок = Новый ТабличныйДокумент ;
ТабДок . Прочитать ( ПолноеИмяФайла , СпособЧтенияЗначенийТабличногоДокумента . Текст ); //, ТипФайлаТабличногоДокумента.ODS);
Причем 1С писала, что файл существует:

Тогда почему же она не может его считать? Задачу нужно было решить срочно, причем прикладную логику я уже сделал, а споткнулся на мелочи. Я уже было хотел перейти на локальный компьютер для разработки (тем более что на сервере из соображений быстродействия отключена отладка). Но тут мне пришла мысль впервые попробовать использовать не временные файлы, а потоки:
ПотокДанных = Новый ПотокВПамяти ();
ЗаписьДД = Новый ЗаписьДанных ( ПотокДанных );
ЗаписьДД . Записать ( ДД );
ЗаписьДД . Закрыть ();
ПотокДанных . Перейти ( 0 , ПозицияВПотоке . Начало );
ТабДок = Новый ТабличныйДокумент ;
ТабДок . Прочитать ( ПотокДанных , СпособЧтенияЗначенийТабличногоДокумента . Текст , ТипФайлаТабличногоДокумента . ODS );
ПотокДанных . Закрыть ();
Увы, при этом выдавалась все та же ошибка доступа. Кроме того, в документации я посмотрел, что из памяти можно считывать не все форматы, а только MXL и ODS. Бред, конечно, но такова 1С.
И тут до меня дошло попробовать поменять расширение на XLSX:
//на клиенте
ДД = Новый ДвоичныеДанные ( ПолноеИмяФайла );
Ф = Новый Файл ( ПолноеИмяФайла );
ТипФайла = Ф . Расширение );
//на сервере
ТекКаталог = ПолучитьИмяВременногоФайла ();
СоздатьКаталог ( ТекКаталог );
ПолноеИмяФайла = ТекКаталог + «\» + Новый УникальныйИдентификатор () + ТипФайла ;
ДД . Записать ( ПолноеИмяФайла );
ДД = Новый ДвоичныеДанные ( ПолноеИмяФайла );
ТабДок = Новый ТабличныйДокумент ;
ТабДок . Прочитать ( ПолноеИмяФайла , СпособЧтенияЗначенийТабличногоДокумента . Текст );
И всё заработало. У 1С, как обычно, беда с диагностикой ошибок. Она пишет совсем не ту ошибку, которая вызывает проблему. Доступ к файлу есть, просто формат файла 1С определяет по расширению, а не содержимому файла.