Получитьимявременногофайла 1с ошибка

Привет Всем
Обновили конфигурацию с версии 8.2 на 8.3 , есть регистр сведений «ПрикрепленныеФайлы» для хранения файлов в ХранилищеЗначений, в обычном режиме файлы свободно сохраняются и открываются, а вот при открытии в веб клиенте сразу выскакивает окно с ошибкой Процедура или функция с указанным именем не определена
(ПолучитьИмяВременногоФайла) опыта в разработке пока мало подскажите где подправить?
вот полный код модуля формы:

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

&НаСервере
Процедура ЗагрузитьФайл(Файл)
   ЗаписьЗнч = РеквизитФормыВЗначение(«Запись»);
   ЗаписьЗнч.Файл = Новый ХранилищеЗначения(ПолучитьИзВременногоХранилища(Файл), Новый СжатиеДанных(9));
   ЗначениеВРеквизитФормы(ЗаписьЗнч, «Запись»);
   ЗаписьЗнч.Записать();
   ЭтаФорма.Прочитать();
КонецПроцедуры

&НаСервере
Функция РольДоступнаПолныеПрава()
   Возврат РольДоступна(Метаданные.Роли.ПолныеПрава);
КонецФункции

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

                     КонецПопытки;
         ЭтаФорма.Закрыть();
      КонецЕсли;
   КонецЕсли;
КонецПроцедуры

&НаСервере
Функция ВыгрузитьФайл()
   ЗаписьЗнч = РеквизитФормыВЗначение(«Запись»);
   Возврат ПоместитьВоВременноеХранилище(ЗаписьЗнч.Файл.Получить());
КонецФункции

&НаКлиенте
Процедура ОткрытьФайл(Команда)

             файлВремХр = ВыгрузитьФайл();
   ИмяВрФайла = ПолучитьИмяВременногоФайла(Запись.ИмяФайла);
   ПолучитьФайл(файлВремХр, ИмяВрФайла, Ложь);
   ЗапуститьПриложение(ИмяВрФайла);
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)

      Если Элементы.ОткрытьФайл.Видимость И Не РольДоступнаПолныеПрава() Тогда
      ОткрытьФайл(Неопределено);
      ЭтаФорма.Закрыть();
   КонецЕсли;
   Если Не ЗначениеЗаполнено(Запись.ИмяФайла) Тогда
      Запись.Автор=НазначитьАвтора();
      Попытка
         //Запись.Владелец = ЭтаФорма.ВладелецФормы.Родитель.Документ;
         //Запись.Автор=ПолучитьАвтора();
      Исключение

               КонецПопытки;
   КонецЕсли;
КонецПроцедуры
С Уважением Дамир

ПолучитьИмяВременногоФайла на УФ не отрабатывает ☑ 0

sv201

17.07.14

13:22

Всем добрый день

*********************************************************

ИмяВременногоФайла = ПолучитьИмяВременногоФайла(«.png»);

Картинка = Новый Картинка(ИмяВременногоФайла, Истина);

Файл = Новый Файл(ИмяВременногоФайла);

*********************************************************

Помогите с синтаксисом, на обычных формах отрабатывает а на управляемых не отрабатывает.

1

Deon

17.07.14

13:29

А что пишет?

2

sv201

17.07.14

13:34

На обычных формах когда выполняешь создается временный файл,

а на управляемых ничего не происходит файл не создается, и при дальнейшем использовании «ИмяВременногоФайла» 1С выдает ошибку Файл не существует, когда переходишь по пути создания временного файла, действительно файла нету.

3

Naumov

17.07.14

13:42

(2) Кхм, а где вы ищите записанный файл?

Приведенный код выполняется на сервере?

4

Naumov

17.07.14

13:42

+ БАза Клиент-серверная?

5

sv201

17.07.14

13:45

и на клиенте пробывал и на сервере?

База файловая

6

sv201

17.07.14

13:45

и на клиенте пробывал и на сервере.

7

ИсчадиеADO

17.07.14

13:49

ИмяВременногоФайла = ПолучитьИмяВременногоФайла(«.png»);

Бинарник = новый ДвоичныеДанные;

Бинарник.Записать(ИмяВременногоФайла);

зы: по памяти, так что проверь

8

Deon

17.07.14

13:52

А ведь и правда, файл стоило записать, чтобы он появился

9

sv201

17.07.14

13:58

не отрабатывает, вот на клиенте выдал ошибку

{Обработка.ПечатьЭтикетокИЦенников.Форма.ФормаТовары.Форма(420)}: Ошибка при вызове конструктора (ДвоичныеДанные)

    Бинарник = новый ДвоичныеДанные(ИмяВременногоФайла);

по причине:

Файл не обнаружен ‘C:\Users\Admin.It-consalt.000\AppData\Local\Temp\v8_5FBD_4.png’

10

RomaH

17.07.14

14:03

(9) не тупи

11

ИсчадиеADO

17.07.14

14:07

(9) вот код, получает картинку из записи рег.св. и кнопка записать в файл

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

    ЗаписьНаСервере = РеквизитФормыВЗначение(«Запись»);

    Бинарник = ЗаписьНаСервере.Печать.Получить();

    Картинка = ПоместитьВоВременноеХранилище(Бинарник, УникальныйИдентификатор);

    ЗаписьНаСервере = неопределено;    

КонецПроцедуры

&НаКлиенте

Процедура ЗаписатьВФайл(Команда)

    ИмяФайла = «»; //ПолучитьИмяВременногоФайла(«.jpg»);

    Интерактивно = истина;

    Если ПолучитьФайл(Картинка, ИмяФайла, Интерактивно) Тогда

        //Бинарник = ПолучитьИзВременногоХранилища(Картинка);

        //Бинарник.Записать(ИмяФайла);    

    КонецЕсли;

КонецПроцедуры

12

ИсчадиеADO

17.07.14

14:09

(9) если ты хочешь записать в файл, то двоичные данные должны уже быть, например получены из хранилища значений, или помещены во временное хранилище

13

ИсчадиеADO

17.07.14

14:10

у Чистова на сайте гуглится

14

ИсчадиеADO

17.07.14

14:11

о, а вот и GROOVY. Хау!

Дорабатывал обработку загрузки прихода из Excel. Обработка изначально была не моя, все хорошо работало, но внезапно клиент в облаке переехал с файловой базы на SQL, потому что файловая тормозила.

И тут 1С начала писать, что файл не обнаружен. Оказывается, код загрузки из Excel был написан только под толстого клиента. Пришлось дорабатывать стандартным образом:

//На клиенте
ДД = Новый ДвоичныеДанные(ПолноеИмяФайла);//На сервере
ПолноеИмяФайла = ПолучитьИмяВременногоФайла(«XLS»);
ДД.Записать(ПолноеИмяФайла);
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(ПолноеИмяФайла, СпособЧтенияЗначенийТабличногоДокумента.Текст);

Доработал и забыл. Как вдруг новая напасть — попросили доработать обработку, начинаю ее отлаживать, а она не считывает данные из XLSX файла.

Причем выдает ошибку доступа к временному файлу:

Я попробовал записывать во временный каталог, но это не принесло результата:

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

Причем 1С писала, что файл существует:

Тогда почему же она не может его считать? Задачу нужно было решить срочно, причем прикладную логику я уже сделал, а споткнулся на мелочи. Я уже было хотел перейти на локальный компьютер для разработки (тем более что на сервере из соображений быстродействия отключена отладка). Но тут мне пришла мысль впервые попробовать использовать не временные файлы, а потоки:

ПотокДанных = Новый ПотокВПамяти();
ЗаписьДД = Новый ЗаписьДанных(ПотокДанных);
ЗаписьДД.Записать(ДД);
ЗаписьДД.Закрыть();
ПотокДанных.Перейти(0, ПозицияВПотоке.Начало);
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(ПотокДанных, СпособЧтенияЗначенийТабличногоДокумента.Текст, ТипФайлаТабличногоДокумента.ODS);
ПотокДанных.Закрыть();

Увы, при этом выдавалась все та же ошибка доступа. Кроме того, в документации я посмотрел, что из памяти можно считывать не все форматы, а только MXL и ODS. Бред, конечно, но такова 1С.

И тут до меня дошло попробовать поменять расширение на XLSX:

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

И всё заработало. У 1С, как обычно, беда с диагностикой ошибок. Она пишет совсем не ту ошибку, которая вызывает проблему. Доступ к файлу есть, просто формат файла 1С определяет по расширению, а не содержимому файла.

Время факт: 0,5 час. На поиски решения проблемы.

Описание ошибки
Во время работы в информационной базе используя веб-клиент в неожиданные моменты времени могут возникать ошибки примерно одного содержания:

Процедура или функция с указанным именем не определена…

Связано это с тем, что код в некоторых модулях расширения не рассчитан на работу в веб-клиенте. Проверка конфигурации выявила 9 синтаксических ошибки:

{InfostartToolkitPROF ОбщийМодуль.ИТК_БуферОбменаКлиент.Модуль(21,23)}: Процедура или функция с указанным именем не определена (ПолучитьИмяВременногоФайла)
ИмяВременногоФайла = <>ПолучитьИмяВременногоФайла(); (Проверка: Веб-клиент)
{InfostartToolkitPROF ОбщийМодуль.ИТК_ОбщийКлиентСервер.Модуль(667,2)}: Процедура или функция с указанным именем не определена (ЗаписатьJSON)
<>ЗаписатьJSON(ЗаписьJSON, Коллекция); (Проверка: Веб-клиент)
{InfostartToolkitPROF ОбщийМодуль.ИТК_ОбщийКлиентСервер.Модуль(677,14)}: Процедура или функция с указанным именем не определена (ПрочитатьJSON)
Результат = <>ПрочитатьJSON(ЧтениеJSON); (Проверка: Веб-клиент)
{InfostartToolkitPROF ОбщийМодуль.ИТК_РедакторКодаКлиент.Модуль(952,19)}: Процедура или функция с указанным именем не определена (ПолучитьИмяВременногоФайла)
ПолноеИмяФайла = <>ПолучитьИмяВременногоФайла(«zip»); (Проверка: Веб-клиент)
{InfostartToolkitPROF ОбщийМодуль.ИТК_РедакторКодаКлиентСервер.Модуль(144,40)}: Переменная не определена (ПереносСтрокJSON)
Параметры = Новый ПараметрыЗаписиJSON(<>ПереносСтрокJSON.Нет); (Проверка: Веб-клиент)
{InfostartToolkitPROF ОбщийМодуль.ИТК_РедакторКодаКлиентСервер.Модуль(154,2)}: Процедура или функция с указанным именем не определена (ЗаписатьJSON)
<>ЗаписатьJSON(ЗаписьJSON, Коллекция); (Проверка: Веб-клиент)
{InfostartToolkitPROF ОбщийМодуль.ИТК_Строки.Модуль(1348,14)}: Переменная не определена (СериализаторXDTO)
СхемаXDTO = <>СериализаторXDTO.ЗаписатьXDTO(Объект); (Проверка: Веб-клиент)
{InfostartToolkitPROF ОбщийМодуль.ИТК_Строки.Модуль(1374,24)}: Переменная не определена (ФабрикаXDTO)
XDTOLocalStringType = <>ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(«http://v8.1c.ru/8.1/data/core», «LocalStringType»)); (Проверка: Веб-клиент)
{InfostartToolkitPROF ОбщийМодуль.ИТК_Строки.Модуль(1374,44)}: Переменная не определена (ФабрикаXDTO)
XDTOLocalStringType = ФабрикаXDTO.Создать(<>ФабрикаXDTO.Тип(«http://v8.1c.ru/8.1/data/core», «LocalStringType»)); (Проверка: Веб-клиент)
{InfostartToolkitPROF ОбщийМодуль.ИТК_Строки.Модуль(1379,25)}: Переменная не определена (ФабрикаXDTO)
LocalStringItemType = <>ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(«http://v8.1c.ru/8.1/data/core», «LocalStringItemType»)); (Проверка: Веб-клиент)
{InfostartToolkitPROF ОбщийМодуль.ИТК_Строки.Модуль(1379,45)}: Переменная не определена (ФабрикаXDTO)
LocalStringItemType = ФабрикаXDTO.Создать(<>ФабрикаXDTO.Тип(«http://v8.1c.ru/8.1/data/core», «LocalStringItemType»)); (Проверка: Веб-клиент)
{InfostartToolkitPROF ОбщийМодуль.ИТК_ФормаКлиент.Модуль(1340,21)}: Процедура или функция с указанным именем не определена (ПолучитьИмяВременногоФайла)
ИмяПервогоФайла = <>ПолучитьИмяВременногоФайла(«txt»); (Проверка: Веб-клиент)
{InfostartToolkitPROF ОбщийМодуль.ИТК_ФормаКлиент.Модуль(1341,21)}: Процедура или функция с указанным именем не определена (ПолучитьИмяВременногоФайла)
ИмяВторогоФайла = <>ПолучитьИмяВременногоФайла(«txt»); (Проверка: Веб-клиент)
{InfostartToolkitPROF Обработка.ИТК_КонсольРазработчика.Форма.Основная.Форма(4660,21)}: Процедура или функция с указанным именем не определена (ПолучитьИмяВременногоФайла)
ИмяПервогоФайла = <>ПолучитьИмяВременногоФайла(Расширение); (Проверка: Веб-клиент)
{InfostartToolkitPROF Обработка.ИТК_КонсольРазработчика.Форма.Основная.Форма(4661,21)}: Процедура или функция с указанным именем не определена (ПолучитьИмяВременногоФайла)
ИмяВторогоФайла = <>ПолучитьИмяВременногоФайла(Расширение); (Проверка: Веб-клиент)
{InfostartToolkitPROF Обработка.ИТК_КонсольРазработчика.Форма.АнализПланаЗапроса.Форма(441,13)}: Процедура или функция с указанным именем не определена (ПолучитьИмяВременногоФайла)
ИмяФайла = <>ПолучитьИмяВременногоФайла(«sqlplan»); (Проверка: Веб-клиент)
{InfostartToolkitPROF Обработка.ИТК_Пользователи.Форма.ЗапускПодПользователем.Форма(57,2)}: Процедура или функция с указанным именем не определена (ЗапуститьСистему)
<<?>>ЗапуститьСистему(Команда); (Проверка: Веб-клиент)

Сценарий воспроизведения
Шаги по воспроизведению:

  1. Запустить ИБ в веб-клиенте.
  2. Перейти к любому списку объектов ИБ, где в командной панели есть подменю инструментов разработчика. Например, для конфигураций на БСП открыть справочник пользователей.
  3. Выделить любой элемент списка и используя подменю инструментов открыть «Редактор объекта».

Появится сообщение об ошибке:
image

Ожидаемое поведение, если бы ошибки не было
При работе с инструментами в веб-клиенте должны отсутствовать сообщения об ошибках синтаксиса встроенного языка 1С.

Окружение:
Infostart Toolkit 2.0.3

Платформа: 8.3.17.1989 (Linux x86-64)
Режим БД: клиент-серверный

Конфигурация:
1С:Комплексная автоматизация 2 (2.5.6.220)
Основной режим запуска: Управляемое приложение
Режим совместимости: Версия8_3_16
Версия БСП: 3.1.3.535

Клиент:
ОС: Windows x86 ()
Язык: ru_RU
Режим запуска: Управляемое приложение

Для наиболее точного ответа на вопрос необходимо указывать полную версию платформы 1С:Предприятие и, желательно, указать программный код в котором возникли проблемы.

Ваша задача обычно решается таким кодом:

&НаКлиенте
Процедура ВыбратьФайл(Команда)

    НачатьПодключениеРасширенияРаботыСФайлами(Новый ОписаниеОповещения(
        "ОповещениеПодключенияРасширенияРаботыСФайлами", ЭтотОбъект));

КонецПроцедуры // ВыбратьФайл()

&НаКлиенте
Процедура ОповещениеПодключенияРасширенияРаботыСФайлами(Подключено, 
    ДополнительныеПараметры) Экспорт

    Если Подключено Тогда

        Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
        Диалог.Заголовок = НСтр("ru='Выберите файл загрузки в формате (*.xls, *.xlsx, *.xml, *.csv, *.txt)'");
        Диалог.ПолноеИмяФайла = "";
        Диалог.МножественныйВыбор = Ложь;
        Диалог.ПредварительныйПросмотр = Истина;
        Диалог.Фильтр = "Формат (*.xls;*.xlsx;*.xml;*.csv;*.txt)|*.xls;*.xlsx;*.xml;*.csv;*.txt|"; 
        Диалог.Показать(Новый ОписаниеОповещения("ОповещениеВыборФайла", ЭтотОбъект));

    Иначе

        // Сообщить что не удалось подключить расширение

    КонецЕсли;

КонецПроцедуры // ОповещениеПодключенияРасширенияРаботыСФайлами()

&НаКлиенте
Процедура ОповещениеВыборФайла(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт

    Если ВыбранныеФайлы = Неопределено Тогда
        Возврат;
    КонецЕсли;    

    Если ВыбранныеФайлы.Количество() = 1 Тогда

        НачатьПомещениеФайла(Новый ОписаниеОповещения("ОповещениеВыборФайлаНаСервере", ЭтотОбъект), 
            , // Можно указать строковой реквизит тогда адрес будет так же в этом реквизите 
            ВыбранныеФайлы[0], 
            Ложь, 
            УникальныйИдентификатор);

    Иначе
        // Сообщить что можно выбрать только один файл
    КонецЕсли;

КонецПроцедуры // ОповещениеВыборФайла() 

&НаСервере
Процедура ОповещениеВыборФайлаНаСервере(Результат, Адрес, ВыбранноеИмяФайла, 
    ДополнительныеПараметры) Экспорт

    ПутьКФайлу = ПолучитьИмяВременногоФайла();
    ДвоичныеДанные = ПолучитьИзВременногоХранилища(Адрес);
    ДвоичныеДанные.Записать(ПутьКФайлу); 

    ТекстовыйДокумент = Новый ТекстовыйДокумент();
    ТекстовыйДокумент.Прочитать(ПутьКФайлу);
    Содержимое = ТекстовыйДокумент.ПолучитьТекст();

    УдалитьФайлы(ПутьКФайлу);

КонецПроцедуры // ОповещениеВыборФайлаНаСервере() 

P.S. Прикрепил ссылку на пример обработки.

Понравилась статья? Поделить с друзьями:

Интересное по теме:

  • Полутора километрами исправьте ошибки
  • Получено следующее предупреждение о неустранимой ошибке 70 36887
  • Полупозвонок у плода может быть ошибка врача отзывы
  • Полукровка ошибка опять слушать
  • Полученные продукты разделили на две равных части ошибка

  • Добавить комментарий

    ;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: