МассивВТаблицуЗначений

1. dreamcreal 17.02.17 18:44 Сейчас в теме
Всем доброго времени суток!

Работаю с обработкой, которую делал другой программист.
Поместила его таблицу значений в массив при помощи функции в общем модуле "ТаблицаЗначенийВМассив". Теперь на клиенте нужно ее распаковать.

Подскажите пожалуйста как лучше всего это сделать. Может есть стандартная функция для этого?
(Конфигурация - УТ)

Есть такой вариант:
НоваяТЗ = Новый ТаблицаЗначений;

Для Каждого Строка Из Массив Цикл 
Новаястрока = НоваяТЗ.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка);
КонецЦикла;
AnKonAlm; +1 Ответить
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
7. antz 17.02.17 18:59 Сейчас в теме
Ну, в толстом клиенте ТЗ таки есть.
Можно заполнить этими данными реквизит формы с типом ТаблицаЗначений.
Или создать какую табличную часть и заполнять ее.
Все зависит от того - что вы хотите с этими данными делать.

А так - код в (1) вполне имеет право на жизнь.
dreamcreal; +1 Ответить
9. dreamcreal 17.02.17 19:07 Сейчас в теме
(7) Я поняла такую логику.

1. На сервере читается файл Эксель, формируется ТаблицаЗначений;
2. Потом эта таблица значений идет на процедуру на клиенте (НО НЕ ДОХОДИТ ПОТОМУ ЧТО ОНА ТАБЛИЦА ЗНАЧЕНИЙ)
3. В этой процедуре на клиенте формируются новые элементы справочника из данных таблицы значений.
13. SP17081992 5 18.02.17 09:58 Сейчас в теме
(1)
// Функция преобразует ТаблицуЗначений в Массив из структур.
//
&НаСервереБезКонтекста
Функция ПреобразоватьТаблицуЗначенийВМассив(тзДанные) 
    
    мсДанные = Новый Массив;
        
    // Запишем в массив
    Для Каждого СтрокаТЗ Из тзДанные Цикл
        
        стСтрокаТаблицы = Новый Структура;
        Для Каждого ИмяКолонки Из тзДанные.Колонки Цикл
            стСтрокаТаблицы.Вставить(ИмяКолонки.Имя, СтрокаТЗ[ИмяКолонки.Имя]);
        КонецЦикла;
        
        мсДанные.Добавить(стСтрокаТаблицы);
        
    КонецЦикла;
    
    Возврат мсДанные;
    
КонецФункции // ПреобразоватьТаблицуЗначенийВМассив()

// Функция преобразует Массив из структур в ТаблицуЗначений.
//
&НаСервереБезКонтекста
Функция ПреобразоватьМассивВТаблицуЗначений(мсДанные) 
    
    тзДанные = Новый ТаблицаЗначений;
    
    Для Каждого ЭлементМассива Из мсДанные Цикл
        // Рисуем колонки для таблицы
        Если тзДанные.Колонки.Количество() = 0 Тогда
            Для Каждого ЗначениеСтруктуры Из ЭлементМассива Цикл
                тзДанные.Колонки.Добавить(ЗначениеСтруктуры.Ключ);
            КонецЦикла;
        КонецЕсли;
        
        // Добавляем данные в таблицу
        НоваяСтрока = тзДанные.Добавить();
        Для Каждого ЗначениеСтруктуры Из ЭлементМассива Цикл
            НоваяСтрока[ЗначениеСтруктуры.Ключ] = ЗначениеСтруктуры.Значение;
        КонецЦикла;
    КонецЦикла;
    
    Возврат тзДанные;
    
КонецФункции // ПреобразоватьМассивВТаблицуЗначений()
Показать
15. lefthander 18.02.17 10:27 Сейчас в теме
(1)есть прекрасная конструкция НоваяТЗ.загрузитьКолонку(массив, "имяколонки").
Строки предварительно надо создать пустыми по количеству элементов массива, делается на сервере, пакуется в структуру и через ПоместитьВоВременноеХранилище(Адрес) можно получить на клиенте. Код обработки весьма интересен и своеобразен. Но полной картины нет.
2. dreamcreal 17.02.17 18:47 Сейчас в теме
Это стандартная функция "ТаблицаЗначенийВМассив":

Функция ТаблицаЗначенийВМассив(ТаблицаЗначений) Экспорт
	
	Массив = Новый Массив();
	СтруктураСтрокой = "";
	НужнаЗапятая = Ложь;
	Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл
		Если НужнаЗапятая Тогда
			СтруктураСтрокой = СтруктураСтрокой + ",";
		КонецЕсли;
		СтруктураСтрокой = СтруктураСтрокой + Колонка.Имя;
		НужнаЗапятая = Истина;
	КонецЦикла;
	Для Каждого Строка Из ТаблицаЗначений Цикл
		НоваяСтрока = Новый Структура(СтруктураСтрокой);
		ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка);
		Массив.Добавить(НоваяСтрока);
	КонецЦикла;
	Возврат Массив;

КонецФункции
Показать
3. antz 17.02.17 18:52 Сейчас в теме +0.03 $m
Фраза "на клиенте" наталкивает меня на мысль, что у вас управляемые формы.
В управляемых формах на клиенте нет таблицы значений.
dreamcreal; +1 Ответить
4. dreamcreal 17.02.17 18:54 Сейчас в теме
5. antz 17.02.17 18:56 Сейчас в теме
(4) ¯\_(ツ)_/¯
dj_serega; Сурикат; dreamcreal; +3 Ответить
6. dreamcreal 17.02.17 18:57 Сейчас в теме
(3) Именно управляемые.

Тогда эти данные должны остаться в виде массива?
8. dreamcreal 17.02.17 19:00 Сейчас в теме
(3)

Он прочитал на сервере экселевский файл и передал ТаблицуЗначений на клиент - а так не работает...
Прикрепленные файлы:
10. dreamcreal 17.02.17 19:12 Сейчас в теме
Это часть обработки, может у кого-то будет время посмотреть на нее.


&НаКлиенте
Процедура Команда1(Команда)
	
	Файл = Объект.Файл	;
	ТЗ =  ПрочитатьЛистЭксель(Файл) ;
	
	//1.Номенклатура
	Если Объект.НомерЛиста = 1 Тогда 		
	СозданиеНовоенькойНом(ТЗ);		
		
	//2.Создаем подгруппу номенклатуры	 	
	Иначе 		 
		//Создаем единожды основной вид номенклатуры-он будет один 
		Если НЕ ПустаяСтрока(Объект.НазваниеНовогоВидаНоменклатуры) Тогда 			 
			ВидНом = СоздатьВидНоменкл(Объект.НазваниеНовогоВидаНоменклатуры,"77777");
			Объект.ВидНом = ВидНом.Ссылка;
		КонецЕсли;
		
		Для Каждого СтрТз Из ТЗ Цикл 
			//СТруктураДан = Новый Структура;
			//СТруктураДан.Вставить("Строка",СтрТз);
			ТолькоГруппы = Истина;
			СозданиеПОдгруппыНоменкалтуры(СтрТз,ТолькоГруппы,Объект.ВидНом);	
		КонецЦикла;
		
		//Назначим родителей
		Для Каждого СтрТз Из ТЗ Цикл 						
			//СТруктураДан = Новый Структура;
			//СТруктураДан.Вставить("Строка",СтрТз);
			ТолькоГруппы = Ложь;
			СозданиеПОдгруппыНоменкалтуры(СтрТз,ТолькоГруппы,Объект.ВидНом);	
		КонецЦикла;
	КонецЕсли;
	
КонецПроцедуры


Функция ПрочитатьЛистЭксель(ИмяФайла)
	
	 	//подключаемся к эксел
	Попытка
		Excel = Новый COMОбъект("Excel.Application");
		Excel.WorkBooks.Open(ИмяФайла);		
	Исключение
		Сообщить("Ошибка при открытии файла с помощью Excel! Загрузка не будет произведена!");
		Сообщить(ОписаниеОшибки());
		Возврат Ложь;
	КонецПопытки;
	
	Попытка
		//Открываем необходимый лист
		Excel.Sheets(Объект.НомерЛиста).Select(); // лист 1, по умолчанию
	Исключение
		//Закрываем Excel
		Excel.ActiveWorkbook.Close();
		Excel = 0;
		Сообщить("Файл "+Строка(ИмяФайла)+" не соответствует необходимому формату! Первый лист не найден!");
		//ОтменитьТранзакцию();
		Возврат Ложь;
	КонецПопытки;
	ВсегоСтрок = Excel.Cells.SpecialCells(11).Row;
	ВсегоКолонок = Excel.Cells.SpecialCells(11).Column;
	
	//****************************************************************************
	// Создание описания типов для таблицы значений
	КС = Новый КвалификаторыСтроки(120);
	Массив = Новый Массив;
	Массив.Добавить(Тип("Строка"));
	ОписаниеТиповС = Новый ОписаниеТипов(Массив, , КС);	
	//****************************************************************************
	
	ТЗФайла = Новый ТаблицаЗначений;
	Если Объект.НомерЛиста = 1 Тогда
		//Создаем номенклатуры	
		
		НомерКолонки = 1;
		СчетчикХарактеристик = 1;
		Пока  НомерКолонки <= ВсегоКолонок   Цикл 
			
			НазваниеКолонки = Строка( Excel.Cells(1, НомерКолонки).Text)+"__"+Строка(НомерКолонки);
			ТЗФайла.Колонки.Добавить(НазваниеКолонки,ОписаниеТиповС);							
			НомерКолонки = НомерКолонки +1;				
			
		КонецЦикла;	
		
	Иначе 
		
		//Создаем Групы номенклатуры	
		ТЗФайла.Колонки.Добавить("Номер_группы",ОписаниеТиповС);       //1
		ТЗФайла.Колонки.Добавить("Название_группы",ОписаниеТиповС);    //2
		ТЗФайла.Колонки.Добавить("Номер_родителя",ОписаниеТиповС);     //4
		
	КонецЕсли;
	
	ТекСтрокаДок = 2;
	Индикатор1   = 1;
	
	Если Объект.НомерЛиста = 1 Тогда //Номенклатура  		
				
		Пока ТекСтрокаДок <= ВсегоСтрок Цикл 		
			
			НомерКолонкиНом = 1;
		
			Если "" <> СокрЛП(""+Excel.Cells(ТекСтрокаДок, 2).Text)  Тогда
				НоваяСтрокаНом = ТЗФайла.Добавить();    Иначе  Продолжить;
			КонецЕсли;
			
			Пока НомерКолонкиНом < ВсегоКолонок Цикл 				
				НазваниеКолонки = Строка( Excel.Cells(1, НомерКолонкиНом).Text)+"__"+Строка(НомерКолонкиНом);
				НомерКолонкиСтроки = НомерКолонкиНом - 1;
				НоваяСтрокаНом[НомерКолонкиСтроки] = Строка( Excel.Cells(ТекСтрокаДок, НомерКолонкиНом).Text);
				НомерКолонкиНом = НомерКолонкиНом +1; 				
			КонецЦикла; 	
					
			ТекСтрокаДок = ТекСтрокаДок+1;				
			
		КонецЦикла;	 	//
		
	Иначе //Группы
		
		Пока Истина Цикл 		
			//ОбработкаПрерыванияПользователя();
			Попытка
				Проверка = СокрЛП(""+Excel.Cells(ТекСтрокаДок, 1).Text);         // 12 сталдло 4 			
			Исключение
				Сообщить("Ошибка чтения файла!!!");
				Проверка = "";
			КонецПопытки; 		
			
			Если ПустаяСтрока(Проверка)  Тогда
				//Если ПустаяСтрока(ПроверкаСлед) Тогда
				Сообщить("Всего прочитано строк: "+ ТекСтрокаДок);
				Прервать;  
				//КонецЕсли; 		
			КонецЕсли;		
			
			Если "" <> СокрЛП(""+Excel.Cells(ТекСтрокаДок, 1).Text)  Тогда
				//Строки
				НоваяСтрокаПлатеж = ТЗФайла.Добавить();
				
				НоваяСтрокаПлатеж.Номер_группы    = СокрЛП(""+Excel.Cells(ТекСтрокаДок, 1).Text);  //	
				НоваяСтрокаПлатеж.Название_группы = СокрЛП(""+Excel.Cells(ТекСтрокаДок, 2).Text);  		
				НоваяСтрокаПлатеж.Номер_родителя  = СокрЛП(""+Excel.Cells(ТекСтрокаДок, 4).Text);
				
			КонецЕсли;				
			
			ТекСтрокаДок = ТекСтрокаДок+1;		
			
		КонецЦикла;	 	//
		
	КонецЕсли;
	
Возврат ТЗФайла;
КонецФункции



Процедура  СозданиеНовоенькойНом(ТЗ)
	
	Для Каждого СтрТЗ Из ТЗ Цикл 
		
		Валюта                    = СтрТЗ.Валюта__7;
		//ЕдИзмерения               = СтрТЗ.Единица_измерения__8;
		ЕдИзмерения               = ПолучитьЕИ(СтрТЗ.Единица_измерения__8);
	
		НомерНоменклатурнойГруппы = СтрТЗ.Номер_группы__15 ; //СтрТЗ.Идентификатор_подраздела__22;
		КодТовара                 = СтрТЗ.Код_товара__1;
		ТекНаимен                 = СтрТЗ.Название_позиции__2;
		Цена                      = СтрТЗ.Цена__6;
		УИД                       = СтрТЗ.Уникальный_идентификатор__20; 
		
		//Первая характеристика
		Характерстика             = СтрТЗ.Название_Характеристики__29;
		ЗначениеХарактеристики    = СтрТЗ.Значение_Характеристики__31; 		
		ИтогоХар                  = Характерстика+" "+ЗначениеХарактеристики;
		
		ТекНом  = СозданиеНом(ТекНаимен,    УИД,              НомерНоменклатурнойГруппы, Объект.ВидНом, Ложь, Ложь,ЕдИзмерения);	
	//	Функция   СозданиеНом(НаимНом = "", Номер_группы = "",Номер_родителя = "",        ВидНом = Неопределено,ЭтоГруппаааа = Ложь,ТолькоГруппы = Ложь, ЕИ); //Здесь Номер_группы - УИД (артикул)
	

		
		///Добавим Свойство
		//НовоеСвойство = НовоеСвойств("Характеристика");  
		
		НовоеСвойство = Неопределено;
		//Добавим характеристику 	
		ДобавлХаракт(Объект.ВидНом,ИтогоХар,НовоеСвойство); 
	КонецЦикла;   
	
КонецПроцедуры

Показать
14. lefthander 18.02.17 10:11 Сейчас в теме
11. dreamcreal 17.02.17 20:47 Сейчас в теме
12. starik-2005 3039 17.02.17 21:18 Сейчас в теме
Создай таблицу значений на форме и не парь моск.
16. vadim1011985 100 18.02.17 11:16 Сейчас в теме
Почему бы не перенести весь код в модуль обработки - это решит большую часть проблем и как уже предложили создать ТЗ на форме или сделать реквизитом обработки или табличной частью
17. leks88 25 18.02.17 11:57 Сейчас в теме
Для передачи на клиент используйте Структуру, однако зачем вообще передавать значения на клиент и Там создавать элементы? Метод СоздатьЭлемент() работает только на сервере и в режиме толстого клиента, в котором пользователи никогда и не работают. Вы бы привели полный код обработки, чтобы ясность внести
18. dreamcreal 18.02.17 18:19 Сейчас в теме
Ребята, всем спасибо! Буду все советы изучать и пробовать!!!!!
19. strelvan 72 12.03.21 09:11 Сейчас в теме
Что Вы за люди? Тема называется МассивВТаблицуЗначений - А обсуждаете наоборот ТаблицаЗначенийВМассив. Странные люди ....
Sahautdinova1987; Santa1; klaus38; О.Ж; fishenemy; +5 Ответить
Оставьте свое сообщение

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