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