Поле объекта не обнаружено в мобильном приложении

1. user1345957 12.06.20 06:22 Сейчас в теме
Помогите пожалуйста решить ошибку и разобраться в ней. Ошибка показана на картинке.
Была создана обработка по сохранению динамического списка в файл эксель.
При этом динамический список имеет данные справочника.
Если нужно скинуть обработку или ссылку на неё, то скажите я скинул.
Прикрепленные файлы:
По теме из базы знаний
Найденные решения
7. Zab 12.06.20 13:32 Сейчас в теме
(6)
Выдет так ?

ТабДок.Записать(ИмяФайла,ТипФайлаТабличногоДокумента.MXL);

(6)
Мобильный эксель сможет открыть mxl ?

думаю, нет

pdf сможете на мобильнике посмотреть
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Zab 12.06.20 09:05 Сейчас в теме
Обычно такая ошибка, если у вас в коде идет обращение к реквизиту объекта в переменной XLS97. А там не объект, а что-то типа Неопределено. Надо смотреть по коду выше, как инициализируется переменная, и почему в нее не попал ожидаемый объект.
Обработку можете не сбрасывать, а вот листинг кода, со отрокой, где ошибка и где инициализация переменной будет полезно.
3. user1345957 12.06.20 11:59 Сейчас в теме
(2) https://infostart.ru/public/170527/

В обработке для чего-то использовалось хранилище настроек которое недоступно для мобильного приложения.

Место с кодом (ошибка временно закомментирована):
&НаКлиенте
Процедура СохранитьВФайлExcel(ТабДок)
	Каталог = КаталогВременныхФайлов();
	Попытка
		УдалитьФайлы(Каталог,"tmp*.xls*");
	Исключение
	КонецПопытки;
	Попытка
		СоздатьКаталог(Каталог); 
		Имя = "tmp_"+Формат(ТекущаяДата(), "ДФ=yyyy-MM-dd-чч-мм-сс")+".xls";
		ИмяФайла =  Каталог + Имя; 
		//ТабДок.Записать(ИмяФайла,ТипФайлаТабличногоДокумента.XLS97);
		ЗапуститьПриложение(ИмяФайла);
	Исключение
		Сообщить(ОписаниеОшибки());
	КонецПопытки;
КонецПроцедуры
Показать



Весь код:
&НаКлиенте
Процедура СохранитьВФайлExcel(ТабДок)
	Каталог = КаталогВременныхФайлов();
	Попытка
		УдалитьФайлы(Каталог,"tmp*.xls*");
	Исключение
	КонецПопытки;
	Попытка
		СоздатьКаталог(Каталог); 
		Имя = "tmp_"+Формат(ТекущаяДата(), "ДФ=yyyy-MM-dd-чч-мм-сс")+".xls";
		ИмяФайла =  Каталог + Имя; 
		//ТабДок.Записать(ИмяФайла,ТипФайлаТабличногоДокумента.XLS97);
		ЗапуститьПриложение(ИмяФайла);
	Исключение
		Сообщить(ОписаниеОшибки());
	КонецПопытки;
КонецПроцедуры

&НаКлиенте
Процедура СохранитьВExcel(ТекстЗапроса,Отбор,Параметры) Экспорт
	ТабДок = ВExcel(ТекстЗапроса,Отбор,Параметры);
	СохранитьВФайлExcel(ТабДок)
КонецПроцедуры

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



//---------------------------------------------------------------------------------------
// Сохранение/Восстановление значений параметров
&НаСервере
Процедура СохранитьНастройкиНаСервере()
	//Настройки = Новый Структура("ПодстрокаПоиска");
	//Настройки.ПодстрокаПоиска = ПодстрокаПоиска;
	//ИмяОбработки =  РеквизитФормыВЗначение("Объект");
	//
	//ХранилищеОбщихНастроек.Сохранить(ИмяОбработки,"Настройки",Настройки);
КонецПроцедуры

&НаСервере
Процедура ВосстановитьНастройкиНаСервере()
	//Попытка
	//	ИмяОбработки =  РеквизитФормыВЗначение("Объект");
	//	Настройки = ХранилищеОбщихНастроек.Загрузить(ИмяОбработки, "Настройки");
	//	ПодстрокаПоиска = ?(ЗначениеЗаполнено(Настройки.ПодстрокаПоиска),Настройки.ПодстрокаПоиска,"");
	//Исключение
	//КонецПопытки;
КонецПроцедуры


//---------------------------------------------------------------------------------------
// Функция возвращает табличный документ, сформированный исходя из переданных
// параметров динамического списка:
//    ТекстЗапроса
//    Отбор - коллекция отборов, установленных для динамического списка
//    Параметры - параметры запроса
&НаСервере
Функция ВExcel(ТекстЗапроса,Отбор,Параметры) Экспорт
	ТабДок = Новый ТабличныйДокумент;
	// Сформируем структуру колонок
	Запрос = Новый Запрос;
	Для каждого Парам Из Параметры.Элементы Цикл
		Запрос.УстановитьПараметр(Парам.Параметр,Парам.Значение); 
	КонецЦикла;
	Запрос.Текст = СтрЗаменить(ТекстЗапроса,"ВЫБРАТЬ","ВЫБРАТЬ ПЕРВЫЕ 1");
	ТЗ = Запрос.Выполнить().Выгрузить();
	
	СКД = Новый СхемаКомпоновкиДанных;
	ИД = СКД.ИсточникиДанных.Добавить();
	ИД.Имя = "ИсточникДанных";
	ИД.ТипИсточникаДанных = "Local";
	НаборДанных = СКД.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
	НаборДанных.Имя = "НаборДанных1";
	НаборДанных.Запрос = ТекстЗапроса;
	НаборДанных.ИсточникДанных = "ИсточникДанных";
	
	// Добавим параметры запроса в СКД
	Если Параметры.Элементы.Количество() > 0 Тогда
		Шрифт = Новый Шрифт("Arial",10);
		Секция = ТабДок.ПолучитьОбласть("R1");
		Область1 = Секция.Область("R1C1");
		Область2 = Секция.Область("R1C2");
		Область1.Шрифт = Шрифт;
		Область2.Шрифт = Шрифт;
		Область1.Текст = "Параметры запроса:";		
		ТабДок.Вывести(Секция);
		Область1.Текст = "";		
		ЭлементыСКД = СКД.ВариантыНастроек[0].Настройки.ПараметрыДанных.Элементы;
		Для каждого Парам Из Параметры.Элементы Цикл
			НовыйПарам =  ЭлементыСКД.Добавить();
			НовыйПарам.Параметр = Парам.Параметр;
			НовыйПарам.Значение = Парам.Значение;
			НовыйПарам.Использование = Истина;
			
			Область2.Текст = Строка(Парам.Параметр)+" = " + Строка(Парам.Значение);		
			ТабДок.Вывести(Секция);
		КонецЦикла;
	КонецЕсли;
	
	Для каждого Колонка Из ТЗ.Колонки Цикл
		Имя = Колонка.Имя;
		Поле = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
		Поле.Поле = Имя;
		Поле.ПутьКДанным = Имя;
		Поле.Заголовок = Имя;
	КонецЦикла; 
	
	Настройки = СКД.НастройкиПоУмолчанию;
	ГруппировкаДет = Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
	ГруппировкаДет.Использование = Истина;
	ВыбранныеПоля = ГруппировкаДет.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
	ВыбранныеПоля.Использование = Истина;
	
	//Настройки.ПараметрыВывода.УстановитьЗначениеПараметра("ВыводитьПараметрыДанных", ТипВыводаТекстаКомпоновкиДанных.Выводить);
	
	
	Для каждого Колонка Из ТЗ.Колонки Цикл
		Имя = Колонка.Имя;
		ВыбранныеПоля = Настройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
		ВыбранныеПоля.Использование = Истина;
		ВыбранныеПоля.Заголовок = Имя;
		ВыбранныеПоля.Поле = Новый ПолеКомпоновкиДанных(Имя);	
	КонецЦикла; 
	
	ЭлементыОтбораСКД = Настройки.Отбор.Элементы;
	СформироватьОтборы(ЭлементыОтбораСКД,Отбор.Элементы);
	
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	
	//МакетКомпоновки = КомпоновщикМакета.Выполнить( СКД , СКД.НастройкиПоУмолчанию ,,, Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
	МакетКомпоновки = КомпоновщикМакета.Выполнить( СКД , Настройки ,,, Тип("ГенераторМакетаКомпоновкиДанных"));
	ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновкиДанных.Инициализировать( МакетКомпоновки ,  );
	
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	ПроцессорВывода.УстановитьДокумент(ТабДок);
	
	ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
	Возврат ТабДок;
КонецФункции

&НаСервере
Функция ПолучитьТекстЗапроса()
	Возврат Список.ТекстЗапроса;
КонецФункции

&НаСервере
Функция ПолучитьОтбор()
	Возврат Список.Отбор;
КонецФункции

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

&НаКлиенте
Процедура КомандаExcel(Команда)
	СохранитьВExcel(ПолучитьТекстЗапроса(),ПолучитьОтбор(),ПолучитьПараметры());
КонецПроцедуры

&НаСервере
Процедура ОбновитьПараметрПодстрокаПоиска()
	Список.Параметры.УстановитьЗначениеПараметра("ПодстрокаПоиска",  ПодстрокаПоиска);
КонецПроцедуры

&НаКлиенте
Процедура ПодстрокаПоискаПриИзменении(Элемент)
	ОбновитьПараметрПодстрокаПоиска();
КонецПроцедуры

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	ВосстановитьНастройкиНаСервере();
	//Список.Параметры.УстановитьЗначениеПараметра("ПодстрокаПоиска",  ПодстрокаПоиска);
КонецПроцедуры

&НаКлиенте
Процедура ПриЗакрытии()
	СохранитьНастройкиНаСервере();
КонецПроцедуры

&НаКлиенте
Процедура ОтборПоЗначению(Команда)
	Префикс = Элементы.Список.Имя;
	ИмяЭлемента = Элементы.Список.ТекущийЭлемент.Имя;
	Длина = СтрДлина(Префикс);
	ИмяПоля = Сред(ИмяЭлемента,Длина+1);
	ТекЗначение = Элементы.Список.ТекущиеДанные[ИмяПоля];	
	ЭлементыОтбора = Список.Отбор.Элементы;
	
	ЭлементОтбораДанных = ЭлементыОтбора.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	
	ЭлементОтбораДанных.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ИмяПоля);
	ЭлементОтбораДанных.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ЭлементОтбораДанных.ПравоеЗначение = ТекЗначение;
	ЭлементОтбораДанных.Использование = Истина;
КонецПроцедуры

&НаКлиенте
Процедура ОтменитьОтборы(Команда)
	Для каждого ЭлементОтбора Из Список.Отбор.Элементы Цикл
		ЭлементОтбора.Использование = Ложь;
	КонецЦикла;
КонецПроцедуры
Показать
4. Zab 12.06.20 13:19 Сейчас в теме
Цитирую синтакс-помощник

ТабличныйДокумент (SpreadsheetDocument)
Записать (Write)
Вариант синтаксиса: В файл

Синтаксис:

Записать(<ИмяФайла>, <ТипФайлаТаблицы>)
Параметры:

<ИмяФайла> (обязательный)

Тип: Строка.
Имя файла, в котором сохраняется табличный документ.
<ТипФайлаТаблицы> (необязательный)

Тип: ТипФайлаТабличногоДокумента.
Формат, в котором будет сохранен табличный документ.
Значение по умолчанию: MXL.
Описание варианта метода:

Запись табличного документа в файл.
Вариант синтаксиса: В поток

Синтаксис:

Записать(<Поток>, <ТипФайлаТаблицы>)
Параметры:

<Поток> (обязательный)

Тип: Поток, ПотокВПамяти, ФайловыйПоток.
Поток для записи табличного документа.
<ТипФайлаТаблицы> (необязательный)

Тип: ТипФайлаТабличногоДокумента.
Формат, в котором будет сохранен табличный документ.
Значение по умолчанию: MXL.
Описание варианта метода:

Запись табличного документа в поток.
Описание:

Записывает табличный документ в файл.

Доступность:

Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер).
Примечание:

При работе на сервере, веб-клиенте или через внешнее соединение нет возможности сохранять в формате XLS95.
Не поддерживается сохранение в PDF картинок типа Метафайл.
При работе на веб-клиенте вызов метода выполняет обращение к серверу.
При работе на мобильной платформе возможно сохранение только в форматах MXL и PDF.
При выводе в формат PDF шрифты, которые нельзя внедрять, а также шрифты, не являющиеся TrueType или OpenType, будут заменены на шрифт Arial. Если данный шрифт не обнаружен, то будет использован шрифт Helvetica.
Пример:

ТабДок.Записать("C:\My Documents\Таблица2.mxl");

Показать

Думаю, проблема в том, что на мобильной платформе запись в эксель просто недоступна
5. Zab 12.06.20 13:22 Сейчас в теме
Попробуйте в mxl сохранить для уверенности.
6. user1345957 12.06.20 13:28 Сейчас в теме
(5) Выдет так ?
ТабДок.Записать(ИмяФайла,ТипФайлаТабличногоДокумента.XLS97);


Мобильный эксель сможет открыть mxl или mxl7 ?
7. Zab 12.06.20 13:32 Сейчас в теме
(6)
Выдет так ?

ТабДок.Записать(ИмяФайла,ТипФайлаТабличногоДокумента.MXL);

(6)
Мобильный эксель сможет открыть mxl ?

думаю, нет

pdf сможете на мобильнике посмотреть
8. user1345957 12.06.20 13:33 Сейчас в теме
(7) а если сразу переводить в xls или xlsx ?
9. user1345957 12.06.20 13:37 Сейчас в теме
(7) спасибо, а с каких версий mxl поддерживается экселем ?
10. Zab 12.06.20 13:44 Сейчас в теме
(9) увы, mxl внутренний формат табличного документа 1С. Я когда-то видел приблуду, которая их открывала в Excell. Но это было не на мобильниках.
11. user1345957 12.06.20 13:46 Сейчас в теме
(10) получается пользователю придётся вручную потом конвертировать mxl в xls или xlsx ?
А как дописать обработку чтобы перед сохранением пользователь мог указать путь куда сохранится mxl-файл ?
12. Zab 12.06.20 13:54 Сейчас в теме
(11)
получается пользователю придётся вручную потом конвертировать mxl в xls или xlsx ?

не уверен, что в ручную сконвертирует на мобильнике.

Я бы смотрел в сторону формирования csv - его эксель откроет, а сформировать его можно как простой текст с разделителями. Правда в него может выгрузиться только таблица без форматирования и заголовков.

Либо, если доступен сервер 1С по сети, то отадавал-бы данные туда и получал готовый файл.
13. user1345957 12.06.20 13:58 Сейчас в теме
(12)
ния csv - его эксель отк


Если csv то думаю будет так:

&НаКлиенте
Процедура СохранитьВФайлExcel(ТабДок)
	Каталог = КаталогВременныхФайлов();
	Попытка
		УдалитьФайлы(Каталог,"tmp*.xls*");
	Исключение
	КонецПопытки;
	Попытка
		СоздатьКаталог(Каталог); 
		Имя = "tmp_"+Формат(ТекущаяДата(), "ДФ=yyyy-MM-dd-чч-мм-сс")+".csv";
		ИмяФайла =  Каталог + Имя; 
		ТабДок.Записать(ИмяФайла,ТипФайлаТабличногоДокумента.csv);
		ЗапуститьПриложение(ИмяФайла);
	Исключение
		Сообщить(ОписаниеОшибки());
	КонецПопытки;
КонецПроцедуры
Показать


Если через сервер то я не знаю как. Еще не пробовал.
14. user1345957 12.06.20 14:00 Сейчас в теме
(12) нет формата csv
Прикрепленные файлы:
15. Zab 12.06.20 15:34 Сейчас в теме
(14) не все так просто. CSV надо формировать руками, примерно, как у вас формируется табличный документ. А потом записать как текст.
Простой пример
Более полный пример
16. user1345957 12.06.20 15:38 Сейчас в теме
(15) Но тут есть одно, в этом коде выбираются строки, а мне нужно чтобы все строки были выбраны из динамического списка:
Мне выходит как-то написать цикл, а как?
Процедура ВыполнитьЭкспорт(М)

     Т=СоздатьОбъект("Текст");

     //выборка

     М.ВыбратьСтроки();

     Пока М.ПолучитьСтроку()=1 Цикл

          Состояние("Экспорт: "+Цел(М.НомерСтроки/М.КоличествоСтрок()*100)+"%");

          тФирма=М.Фирма.ПолныйКод();

          тТовар=М.Товар.ПолныйКод();

          тСклад=М.Склад.ПолныйКод();

          тКоличество=М.Количество;

          тСумма=М.Сумма;

          Т.ДобавитьСтроку("Фирма="+ тФирма +";Товар="+ тТовар +";Склад="+ тСклад +";Количество="+ тКоличество +";Сумма="+ тСумма +";");    

     КонецЦикла;

     //файл

     Файл="export"+Формат(ДатаК,"Д ГГГГММДД")+".csv";

     Т.Записать(Файл);

     Сообщить("Файл с данными сохранен в каталоге экспортной БД: "+КаталогИБ()+Файл);

КонецПроцедуры
Показать
18. Zab 12.06.20 16:33 Сейчас в теме
(16)
Мне выходит как-то написать цикл, а как?


ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений.Вывести (DataCompositionResultValueCollectionOutputProcessor.Output)
ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений (DataCompositionResultValueCollectionOutputProcessor)
Вывести (Output)
Синтаксис:

Вывести(<ПроцессорКомпоновки>, <ВозможностьПрерыванияПользователем>)
Параметры:

<ПроцессорКомпоновки> (обязательный)

Тип: ПроцессорКомпоновкиДанных.
Процессор компоновки данных, из которого будут получаться элементы результата.
<ВозможностьПрерыванияПользователем> (необязательный)

Тип: Булево.
Указывает, может ли пользователь прервать вывод при помощи комбинации клавиш Ctrl + Break.
Значение по умолчанию: Ложь.
Возвращаемое значение:

Тип: ТаблицаЗначений; ДеревоЗначений.
Показать

И потом обходить циклом ТЗ
user1345957; +1 Ответить
19. user1345957 12.06.20 20:29 Сейчас в теме
(18)
ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений.Вывести


Вы я так понимаю имеете ввиду вот это?

Но я не понял тогда куда именно прописать (в какое событие) ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений.
17. user1345957 12.06.20 16:12 Сейчас в теме
(15) Я туплю как мне переписать код(
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот