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

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) Я туплю как мне переписать код(
Оставьте свое сообщение
Вакансии
Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)

Программист 1С
Москва
зарплата от 250 000 руб.
Полный день

Программист 1C
Волгоград
зарплата от 200 000 руб.
Полный день

Аналитик
Санкт-Петербург
зарплата от 200 000 руб. до 250 000 руб.
Полный день