Привет Всем
Обновили конфигурацию с версии 8.2 на 8.3 , есть регистр сведений «ПрикрепленныеФайлы» для хранения файлов в ХранилищеЗначений, в обычном режиме файлы свободно сохраняются и открываются, а вот при открытии в веб клиенте сразу выскакивает окно с ошибкой Процедура или функция с указанным именем не определена
(ПолучитьИмяВременногоФайла) опыта в разработке пока мало подскажите где подправить?
вот полный код модуля формы:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ЗаписьЗнч = РеквизитФормыВЗначение(«Запись»);
Если ЗаписьЗнч.Файл.Получить() <> Неопределено Тогда
Элементы.ОткрытьФайл.Видимость = Истина;
Иначе
Элементы.ОткрытьФайл.Видимость = Ложь;
КонецЕсли;
Если ЗаписьЗнч.Файл.Получить() <> Неопределено Тогда
Если Не РольДоступна(Метаданные.Роли.ПолныеПрава) Тогда
Элементы.Период.ТолькоПросмотр = Истина;
Элементы.Владелец.ТолькоПросмотр = Истина;
Элементы.Комментарий.ТолькоПросмотр = Истина;
Элементы.Автор.ТолькоПросмотр = Истина;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ЗагрузитьФайл(Файл)
ЗаписьЗнч = РеквизитФормыВЗначение(«Запись»);
ЗаписьЗнч.Файл = Новый ХранилищеЗначения(ПолучитьИзВременногоХранилища(Файл), Новый СжатиеДанных(9));
ЗначениеВРеквизитФормы(ЗаписьЗнч, «Запись»);
ЗаписьЗнч.Записать();
ЭтаФорма.Прочитать();
КонецПроцедуры
&НаСервере
Функция РольДоступнаПолныеПрава()
Возврат РольДоступна(Метаданные.Роли.ПолныеПрава);
КонецФункции
&НаКлиенте
Процедура ИмяФайлаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
диалог.МножественныйВыбор = Ложь;
диалог.Заголовок = «Выберите прикрепляемый файл»;
Если диалог.Выбрать() Тогда
файл = Новый Файл(диалог.ПолноеИмяФайла);
Запись.ИмяФайла = файл.Имя;
ЗагрузитьФайл(ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(файл.ПолноеИмя)));
Элементы.ОткрытьФайл.Видимость = Истина;
Если Не РольДоступнаПолныеПрава() Тогда
Попытка
ЭтаФорма.ВладелецФормы.Родитель.Элементы.Список.Обновить();
Исключение
КонецПопытки;
ЭтаФорма.Закрыть();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ВыгрузитьФайл()
ЗаписьЗнч = РеквизитФормыВЗначение(«Запись»);
Возврат ПоместитьВоВременноеХранилище(ЗаписьЗнч.Файл.Получить());
КонецФункции
&НаКлиенте
Процедура ОткрытьФайл(Команда)
файлВремХр = ВыгрузитьФайл();
ИмяВрФайла = ПолучитьИмяВременногоФайла(Запись.ИмяФайла);
ПолучитьФайл(файлВремХр, ИмяВрФайла, Ложь);
ЗапуститьПриложение(ИмяВрФайла);
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Если Элементы.ОткрытьФайл.Видимость И Не РольДоступнаПолныеПрава() Тогда
ОткрытьФайл(Неопределено);
ЭтаФорма.Закрыть();
КонецЕсли;
Если Не ЗначениеЗаполнено(Запись.ИмяФайла) Тогда
Запись.Автор=НазначитьАвтора();
Попытка
//Запись.Владелец = ЭтаФорма.ВладелецФормы.Родитель.Документ;
//Запись.Автор=ПолучитьАвтора();
Исключение
КонецПопытки;
КонецЕсли;
КонецПроцедуры
С Уважением Дамир
sv201
17.07.14
✎
13:22
Всем добрый день
*********************************************************
ИмяВременногоФайла = ПолучитьИмяВременногоФайла(«.png»);
Картинка = Новый Картинка(ИмяВременногоФайла, Истина);
Файл = Новый Файл(ИмяВременногоФайла);
*********************************************************
Помогите с синтаксисом, на обычных формах отрабатывает а на управляемых не отрабатывает.
Deon
17.07.14
✎
13:29
А что пишет?
sv201
17.07.14
✎
13:34
На обычных формах когда выполняешь создается временный файл,
а на управляемых ничего не происходит файл не создается, и при дальнейшем использовании «ИмяВременногоФайла» 1С выдает ошибку Файл не существует, когда переходишь по пути создания временного файла, действительно файла нету.
Naumov
17.07.14
✎
13:42
(2) Кхм, а где вы ищите записанный файл?
Приведенный код выполняется на сервере?
Naumov
17.07.14
✎
13:42
+ БАза Клиент-серверная?
sv201
17.07.14
✎
13:45
и на клиенте пробывал и на сервере?
База файловая
sv201
17.07.14
✎
13:45
и на клиенте пробывал и на сервере.
ИсчадиеADO
17.07.14
✎
13:49
ИмяВременногоФайла = ПолучитьИмяВременногоФайла(«.png»);
Бинарник = новый ДвоичныеДанные;
Бинарник.Записать(ИмяВременногоФайла);
зы: по памяти, так что проверь
Deon
17.07.14
✎
13:52
А ведь и правда, файл стоило записать, чтобы он появился
sv201
17.07.14
✎
13:58
не отрабатывает, вот на клиенте выдал ошибку
{Обработка.ПечатьЭтикетокИЦенников.Форма.ФормаТовары.Форма(420)}: Ошибка при вызове конструктора (ДвоичныеДанные)
Бинарник = новый ДвоичныеДанные(ИмяВременногоФайла);
по причине:
Файл не обнаружен ‘C:\Users\Admin.It-consalt.000\AppData\Local\Temp\v8_5FBD_4.png’
RomaH
17.07.14
✎
14:03
(9) не тупи
ИсчадиеADO
17.07.14
✎
14:07
(9) вот код, получает картинку из записи рег.св. и кнопка записать в файл
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ЗаписьНаСервере = РеквизитФормыВЗначение(«Запись»);
Бинарник = ЗаписьНаСервере.Печать.Получить();
Картинка = ПоместитьВоВременноеХранилище(Бинарник, УникальныйИдентификатор);
ЗаписьНаСервере = неопределено;
КонецПроцедуры
&НаКлиенте
Процедура ЗаписатьВФайл(Команда)
ИмяФайла = «»; //ПолучитьИмяВременногоФайла(«.jpg»);
Интерактивно = истина;
Если ПолучитьФайл(Картинка, ИмяФайла, Интерактивно) Тогда
//Бинарник = ПолучитьИзВременногоХранилища(Картинка);
//Бинарник.Записать(ИмяФайла);
КонецЕсли;
КонецПроцедуры
ИсчадиеADO
17.07.14
✎
14:09
(9) если ты хочешь записать в файл, то двоичные данные должны уже быть, например получены из хранилища значений, или помещены во временное хранилище
ИсчадиеADO
17.07.14
✎
14:10
у Чистова на сайте гуглится
Исчадие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С.
Окружение:
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. Прикрепил ссылку на пример обработки.




