Всем доброго времени суток!
Работаю с обработкой, которую делал другой программист.
Поместила его таблицу значений в массив при помощи функции в общем модуле "ТаблицаЗначенийВМассив". Теперь на клиенте нужно ее распаковать.
Подскажите пожалуйста как лучше всего это сделать. Может есть стандартная функция для этого?
(Конфигурация - УТ)
Есть такой вариант:
Работаю с обработкой, которую делал другой программист.
Поместила его таблицу значений в массив при помощи функции в общем модуле "ТаблицаЗначенийВМассив". Теперь на клиенте нужно ее распаковать.
Подскажите пожалуйста как лучше всего это сделать. Может есть стандартная функция для этого?
(Конфигурация - УТ)
Есть такой вариант:
НоваяТЗ = Новый ТаблицаЗначений;
Для Каждого Строка Из Массив Цикл
Новаястрока = НоваяТЗ.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка);
КонецЦикла;
По теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Ну, в толстом клиенте ТЗ таки есть.
Можно заполнить этими данными реквизит формы с типом ТаблицаЗначений.
Или создать какую табличную часть и заполнять ее.
Все зависит от того - что вы хотите с этими данными делать.
А так - код в (1) вполне имеет право на жизнь.
Можно заполнить этими данными реквизит формы с типом ТаблицаЗначений.
Или создать какую табличную часть и заполнять ее.
Все зависит от того - что вы хотите с этими данными делать.
А так - код в (1) вполне имеет право на жизнь.
(7) Я поняла такую логику.
1. На сервере читается файл Эксель, формируется ТаблицаЗначений;
2. Потом эта таблица значений идет на процедуру на клиенте (НО НЕ ДОХОДИТ ПОТОМУ ЧТО ОНА ТАБЛИЦА ЗНАЧЕНИЙ)
3. В этой процедуре на клиенте формируются новые элементы справочника из данных таблицы значений.
1. На сервере читается файл Эксель, формируется ТаблицаЗначений;
2. Потом эта таблица значений идет на процедуру на клиенте (НО НЕ ДОХОДИТ ПОТОМУ ЧТО ОНА ТАБЛИЦА ЗНАЧЕНИЙ)
3. В этой процедуре на клиенте формируются новые элементы справочника из данных таблицы значений.
(1)
// Функция преобразует ТаблицуЗначений в Массив из структур.
//
&НаСервереБезКонтекста
Функция ПреобразоватьТаблицуЗначенийВМассив(тзДанные)
мсДанные = Новый Массив;
// Запишем в массив
Для Каждого СтрокаТЗ Из тзДанные Цикл
стСтрокаТаблицы = Новый Структура;
Для Каждого ИмяКолонки Из тзДанные.Колонки Цикл
стСтрокаТаблицы.Вставить(ИмяКолонки.Имя, СтрокаТЗ[ИмяКолонки.Имя]);
КонецЦикла;
мсДанные.Добавить(стСтрокаТаблицы);
КонецЦикла;
Возврат мсДанные;
КонецФункции // ПреобразоватьТаблицуЗначенийВМассив()
// Функция преобразует Массив из структур в ТаблицуЗначений.
//
&НаСервереБезКонтекста
Функция ПреобразоватьМассивВТаблицуЗначений(мсДанные)
тзДанные = Новый ТаблицаЗначений;
Для Каждого ЭлементМассива Из мсДанные Цикл
// Рисуем колонки для таблицы
Если тзДанные.Колонки.Количество() = 0 Тогда
Для Каждого ЗначениеСтруктуры Из ЭлементМассива Цикл
тзДанные.Колонки.Добавить(ЗначениеСтруктуры.Ключ);
КонецЦикла;
КонецЕсли;
// Добавляем данные в таблицу
НоваяСтрока = тзДанные.Добавить();
Для Каждого ЗначениеСтруктуры Из ЭлементМассива Цикл
НоваяСтрока[ЗначениеСтруктуры.Ключ] = ЗначениеСтруктуры.Значение;
КонецЦикла;
КонецЦикла;
Возврат тзДанные;
КонецФункции // ПреобразоватьМассивВТаблицуЗначений()
Показать
(1)есть прекрасная конструкция НоваяТЗ.загрузитьКолонку(массив, "имяколонки").
Строки предварительно надо создать пустыми по количеству элементов массива, делается на сервере, пакуется в структуру и через ПоместитьВоВременноеХранилище(Адрес) можно получить на клиенте. Код обработки весьма интересен и своеобразен. Но полной картины нет.
Строки предварительно надо создать пустыми по количеству элементов массива, делается на сервере, пакуется в структуру и через ПоместитьВоВременноеХранилище(Адрес) можно получить на клиенте. Код обработки весьма интересен и своеобразен. Но полной картины нет.
Это стандартная функция "ТаблицаЗначенийВМассив":
Функция ТаблицаЗначенийВМассив(ТаблицаЗначений) Экспорт
Массив = Новый Массив();
СтруктураСтрокой = "";
НужнаЗапятая = Ложь;
Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл
Если НужнаЗапятая Тогда
СтруктураСтрокой = СтруктураСтрокой + ",";
КонецЕсли;
СтруктураСтрокой = СтруктураСтрокой + Колонка.Имя;
НужнаЗапятая = Истина;
КонецЦикла;
Для Каждого Строка Из ТаблицаЗначений Цикл
НоваяСтрока = Новый Структура(СтруктураСтрокой);
ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка);
Массив.Добавить(НоваяСтрока);
КонецЦикла;
Возврат Массив;
КонецФункции
Показать
Это часть обработки, может у кого-то будет время посмотреть на нее.
&НаКлиенте
Процедура Команда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;
ИтогоХар = Характерстика+" "+ЗначениеХарактеристики;
ТекНом = СозданиеНом(ТекНаимен, УИД, НомерНоменклатурнойГруппы, Объект.ВидНом, Ложь, Ложь,ЕдИзмерения);
// Функция СозданиеНом(НаимНом = "", Номер_группы = "",Номер_родителя = "", ВидНом = Неопределено,ЭтоГруппаааа = Ложь,ТолькоГруппы = Ложь, ЕИ); //Здесь Номер_группы - УИД (артикул)
///Добавим Свойство
//НовоеСвойство = НовоеСвойств("Характеристика");
НовоеСвойство = Неопределено;
//Добавим характеристику
ДобавлХаракт(Объект.ВидНом,ИтогоХар,НовоеСвойство);
КонецЦикла;
КонецПроцедуры
Показать
Для передачи на клиент используйте Структуру, однако зачем вообще передавать значения на клиент и Там создавать элементы? Метод СоздатьЭлемент() работает только на сервере и в режиме толстого клиента, в котором пользователи никогда и не работают. Вы бы привели полный код обработки, чтобы ясность внести
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот