Поле объекта не обнаружено в мобильном приложении
Помогите пожалуйста решить ошибку и разобраться в ней. Ошибка показана на картинке.
Была создана обработка по сохранению динамического списка в файл эксель.
При этом динамический список имеет данные справочника.
Если нужно скинуть обработку или ссылку на неё, то скажите я скинул.
Была создана обработка по сохранению динамического списка в файл эксель.
При этом динамический список имеет данные справочника.
Если нужно скинуть обработку или ссылку на неё, то скажите я скинул.
Прикрепленные файлы:
По теме из базы знаний
- Прямая печать из мобильного приложения
- Загрузка номенклатуры c картинками (несколько потоков одновременно) и сопутствующими данными в базу и любые документы из yml, xls, xlsx, xlsm, ods, ots, csv для УТ 10.3, УТ 11 (все), БП 3, КА 2, ERP 2, УНФ 1.6/3.0, Розница 2/3.0
- Серверная часть тиражного мобильного приложения (бекапы, обмены, обновления)
- Как начать зарабатывать на разработке мобильных приложений уже завтра!
- Sales force automation: мобильное приложение мерчандайзера на платформе 1С с распознаванием товара на 15 языках в одном из крупнейших агентств на нашем континенте (и не только)
Найденные решения
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Обычно такая ошибка, если у вас в коде идет обращение к реквизиту объекта в переменной XLS97. А там не объект, а что-то типа Неопределено. Надо смотреть по коду выше, как инициализируется переменная, и почему в нее не попал ожидаемый объект.
Обработку можете не сбрасывать, а вот листинг кода, со отрокой, где ошибка и где инициализация переменной будет полезно.
Обработку можете не сбрасывать, а вот листинг кода, со отрокой, где ошибка и где инициализация переменной будет полезно.
(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);
ТекЗначение = Элементы.Список.ТекущиеДанные[ИмяПоля];
ЭлементыОтбора = Список.Отбор.Элементы;
ЭлементОтбораДанных = ЭлементыОтбора.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбораДанных.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ИмяПоля);
ЭлементОтбораДанных.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбораДанных.ПравоеЗначение = ТекЗначение;
ЭлементОтбораДанных.Использование = Истина;
КонецПроцедуры
&НаКлиенте
Процедура ОтменитьОтборы(Команда)
Для каждого ЭлементОтбора Из Список.Отбор.Элементы Цикл
ЭлементОтбора.Использование = Ложь;
КонецЦикла;
КонецПроцедуры
Показать
Цитирую синтакс-помощник
ТабличныйДокумент (SpreadsheetDocument)
Записать (Write)
Вариант синтаксиса: В файл
Синтаксис:
Записать(<ИмяФайла>, <ТипФайлаТаблицы>)
Параметры:
<ИмяФайла> (обязательный)
Тип: Строка.
Имя файла, в котором сохраняется табличный документ.
<ТипФайлаТаблицы> (необязательный)
Тип: ТипФайлаТабличногоДокумента.
Формат, в котором будет сохранен табличный документ.
Значение по умолчанию: MXL.
Описание варианта метода:
Запись табличного документа в файл.
Вариант синтаксиса: В поток
Синтаксис:
Записать(<Поток>, <ТипФайлаТаблицы>)
Параметры:
<Поток> (обязательный)
Тип: Поток, ПотокВПамяти, ФайловыйПоток.
Поток для записи табличного документа.
<ТипФайлаТаблицы> (необязательный)
Тип: ТипФайлаТабличногоДокумента.
Формат, в котором будет сохранен табличный документ.
Значение по умолчанию: MXL.
Описание варианта метода:
Запись табличного документа в поток.
Описание:
Записывает табличный документ в файл.
Доступность:
Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер).
Примечание:
При работе на сервере, веб-клиенте или через внешнее соединение нет возможности сохранять в формате XLS95.
Не поддерживается сохранение в PDF картинок типа Метафайл.
При работе на веб-клиенте вызов метода выполняет обращение к серверу.
При работе на мобильной платформе возможно сохранение только в форматах MXL и PDF.
При выводе в формат PDF шрифты, которые нельзя внедрять, а также шрифты, не являющиеся TrueType или OpenType, будут заменены на шрифт Arial. Если данный шрифт не обнаружен, то будет использован шрифт Helvetica.
Пример:
ТабДок.Записать("C:\My Documents\Таблица2.mxl");
Показать
Думаю, проблема в том, что на мобильной платформе запись в эксель просто недоступна
ТабличныйДокумент (SpreadsheetDocument)
Записать (Write)
Вариант синтаксиса: В файл
Синтаксис:
Записать(<ИмяФайла>, <ТипФайлаТаблицы>)
Параметры:
<ИмяФайла> (обязательный)
Тип: Строка.
Имя файла, в котором сохраняется табличный документ.
<ТипФайлаТаблицы> (необязательный)
Тип: ТипФайлаТабличногоДокумента.
Формат, в котором будет сохранен табличный документ.
Значение по умолчанию: MXL.
Описание варианта метода:
Запись табличного документа в файл.
Вариант синтаксиса: В поток
Синтаксис:
Записать(<Поток>, <ТипФайлаТаблицы>)
Параметры:
<Поток> (обязательный)
Тип: Поток, ПотокВПамяти, ФайловыйПоток.
Поток для записи табличного документа.
<ТипФайлаТаблицы> (необязательный)
Тип: ТипФайлаТабличногоДокумента.
Формат, в котором будет сохранен табличный документ.
Значение по умолчанию: MXL.
Описание варианта метода:
Запись табличного документа в поток.
Описание:
Записывает табличный документ в файл.
Доступность:
Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер).
Примечание:
При работе на сервере, веб-клиенте или через внешнее соединение нет возможности сохранять в формате XLS95.
Не поддерживается сохранение в PDF картинок типа Метафайл.
При работе на веб-клиенте вызов метода выполняет обращение к серверу.
При работе на мобильной платформе возможно сохранение только в форматах MXL и PDF.
При выводе в формат PDF шрифты, которые нельзя внедрять, а также шрифты, не являющиеся TrueType или OpenType, будут заменены на шрифт Arial. Если данный шрифт не обнаружен, то будет использован шрифт Helvetica.
Пример:
ТабДок.Записать("C:\My Documents\Таблица2.mxl");
Думаю, проблема в том, что на мобильной платформе запись в эксель просто недоступна
(11)
не уверен, что в ручную сконвертирует на мобильнике.
Я бы смотрел в сторону формирования csv - его эксель откроет, а сформировать его можно как простой текст с разделителями. Правда в него может выгрузиться только таблица без форматирования и заголовков.
Либо, если доступен сервер 1С по сети, то отадавал-бы данные туда и получал готовый файл.
получается пользователю придётся вручную потом конвертировать mxl в xls или xlsx ?
не уверен, что в ручную сконвертирует на мобильнике.
Я бы смотрел в сторону формирования csv - его эксель откроет, а сформировать его можно как простой текст с разделителями. Правда в него может выгрузиться только таблица без форматирования и заголовков.
Либо, если доступен сервер 1С по сети, то отадавал-бы данные туда и получал готовый файл.
(12)
Если csv то думаю будет так:
Если через сервер то я не знаю как. Еще не пробовал.
ния csv - его эксель отк
Если csv то думаю будет так:
&НаКлиенте
Процедура СохранитьВФайлExcel(ТабДок)
Каталог = КаталогВременныхФайлов();
Попытка
УдалитьФайлы(Каталог,"tmp*.xls*");
Исключение
КонецПопытки;
Попытка
СоздатьКаталог(Каталог);
Имя = "tmp_"+Формат(ТекущаяДата(), "ДФ=yyyy-MM-dd-чч-мм-сс")+".csv";
ИмяФайла = Каталог + Имя;
ТабДок.Записать(ИмяФайла,ТипФайлаТабличногоДокумента.csv);
ЗапуститьПриложение(ИмяФайла);
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
ПоказатьЕсли через сервер то я не знаю как. Еще не пробовал.
(14) не все так просто. CSV надо формировать руками, примерно, как у вас формируется табличный документ. А потом записать как текст.
Простой пример
Более полный пример
(15) Но тут есть одно, в этом коде выбираются строки, а мне нужно чтобы все строки были выбраны из динамического списка:
Мне выходит как-то написать цикл, а как?
Мне выходит как-то написать цикл, а как?
Процедура ВыполнитьЭкспорт(М)
Т=СоздатьОбъект("Текст");
//выборка
М.ВыбратьСтроки();
Пока М.ПолучитьСтроку()=1 Цикл
Состояние("Экспорт: "+Цел(М.НомерСтроки/М.КоличествоСтрок()*100)+"%");
тФирма=М.Фирма.ПолныйКод();
тТовар=М.Товар.ПолныйКод();
тСклад=М.Склад.ПолныйКод();
тКоличество=М.Количество;
тСумма=М.Сумма;
Т.ДобавитьСтроку("Фирма="+ тФирма +";Товар="+ тТовар +";Склад="+ тСклад +";Количество="+ тКоличество +";Сумма="+ тСумма +";");
КонецЦикла;
//файл
Файл="export"+Формат(ДатаК,"Д ГГГГММДД")+".csv";
Т.Записать(Файл);
Сообщить("Файл с данными сохранен в каталоге экспортной БД: "+КаталогИБ()+Файл);
КонецПроцедуры
Показать
(16)
И потом обходить циклом ТЗ
Мне выходит как-то написать цикл, а как?
ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений.Вывести (DataCompositionResultValueCollectionOutputProcessor.Output)
ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений (DataCompositionResultValueCollectionOutputProcessor)
Вывести (Output)
Синтаксис:
Вывести(<ПроцессорКомпоновки>, <ВозможностьПрерыванияПользователем>)
Параметры:
<ПроцессорКомпоновки> (обязательный)
Тип: ПроцессорКомпоновкиДанных.
Процессор компоновки данных, из которого будут получаться элементы результата.
<ВозможностьПрерыванияПользователем> (необязательный)
Тип: Булево.
Указывает, может ли пользователь прервать вывод при помощи комбинации клавиш Ctrl + Break.
Значение по умолчанию: Ложь.
Возвращаемое значение:
Тип: ТаблицаЗначений; ДеревоЗначений.
ПоказатьПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений (DataCompositionResultValueCollectionOutputProcessor)
Вывести (Output)
Синтаксис:
Вывести(<ПроцессорКомпоновки>, <ВозможностьПрерыванияПользователем>)
Параметры:
<ПроцессорКомпоновки> (обязательный)
Тип: ПроцессорКомпоновкиДанных.
Процессор компоновки данных, из которого будут получаться элементы результата.
<ВозможностьПрерыванияПользователем> (необязательный)
Тип: Булево.
Указывает, может ли пользователь прервать вывод при помощи комбинации клавиш Ctrl + Break.
Значение по умолчанию: Ложь.
Возвращаемое значение:
Тип: ТаблицаЗначений; ДеревоЗначений.
И потом обходить циклом ТЗ
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот