1с как передать таблицу значений с сервера на клиент

Обновлено: 04.07.2024

Если есть необходимость передать таблицу значений с сервера на клиент в 1С можно использовать несколько вариантов. Для начала можно начать с временного хранилища 1С – самого лаконичного варианта:

Где данные — это наша таблица значений, а адрес — это уникальный идентификатор или строка, куда нам нужно передать таблицу значений 1С. Например:

Для получения на клиенте таблицы значений достаточно будет использовать следующий код:

2. Заполнение таблицы значений формы

Самый лаконичный способ передать на клиента таблицу значений не означает, что это самый правильный вариант. Самым правильным (судя по экзаменам платформы 1С) является вариант заполнение Таблицы значений формы. Для начала необходимо добавить в форму новый реквизит с типом «ТаблицаЗначений» и именем «ТаблицаЗначенийФормы». На сервере пишем следующий код строки 1С:

//Считаем, что тут вы получили таблицу значений, у которой необходимо передать данные на форму

ТЗ = ПолучитьТЗ();

ДобавляемыеРеквизиты = Новый Массив;
УдаляемыеРеквизиты = Новый Массив;

//Получаем уже созданную на форме Таблицу значений 1С

ИмяТФ = «ТаблицаЗначенийФормы”;

ТаблицаФормы = РеквизитФормыВЗначение(«ТаблицаЗначенийФормы»);

Для Каждого ТекКолонка из ТаблицаФормы.Колонки Цикл
УдаляемыеРеквизиты.Добавить(ТаблицаЗначенийФормы + «.» + ТекКолонка.Имя);
КонецЦикла;

Для Каждого ТекКолонка из ТЗ.Колонки Цикл
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ТекКолонка.Имя, ТекКолонка.ТипЗначения, ИмяТФ));
КонецЦикла;

//Добавим новые, удалим старые колонки
ИзменитьРеквизиты(ДобавляемыеРеквизиты, УдаляемыеРеквизиты);
// Поместим значение в реквизит формы 1С
ЗначениеВРеквизитФормы(ТЗ, ИмяТФ);

После выполнения этой процедуры на форме обновится таблица значений на клиенте 1С, и вы сможете оперировать ими.

3. ЗначениеВСтрокуВнутр() – только для толстого клиента 1С 8.3

Третий вариант – передать таблицу значений на клиент 1С. Для этого используется ЗначениеВСтрокуВнутр(), но лучше его не использовать, ибо эта функция на данный момент доступна только на толстом клиенте 1С 8.3. Сам код похож на временное хранилище:

//Укладываем ТЗ в строку

тзВСтроке = ЗначениеВСтрокуВнутр(тз);

//Вытаскиваем ТЗ из строки

тз = ЗначениеИзСтрокиВнутр(тзВСтроке);

Есть еще много вариантов передачи таблицы значений 1С на клиента, начиная со структур, заканчивая XML, но стоит ли их использовать решать Вам. В данной статье перечислены варианты которые покроют 100% нужд.


1С 8.3 Передача Таблицы Значений с сервера на клиент


Пример 1. Передать ТЗ на клиент с сервера (через процедуру ОбщегоНазначения) в 1С 8.3:

Процедура ПередатьТаблицуЗначенийНаКлиент ( Элемент ) Экспорт

ОбщегоНазначения . ТаблицаЗначенийВМассив ( ТаблицаЗначений );

Пример 2. Передать ТЗ на клиент с сервера (через Временное хранилище) в 1С 8.3:

Процедура ПередатьТаблицуЗначенийНаКлиент ( ТаблицаЗначений ) Экспорт

АдресХранилищаСТЗ = ПоместитьВоВременноеХранилище ( ТаблицаЗначений , ЭтаФорма . УникальныйИдентификатор );
ПереносТЗ = ПолучитьИзВременногоХранилища ( АдресХранилищаСТЗ );

Пример 3. Передать ТЗ на клиент с сервера (через ЗначениеВСтрокуВнутр и ЗначениеИзСтрокиВнутр) в 1С 8.3:

&НаКлиенте
Процедура ПолучитьТаблицуНаСервере ( Команда )

ТЗ_Стр = ПолучитьТЗНаСервере (); // Получаем данные на сервере
ТаблицаЗначений = ЗначениеИзСтрокиВнутр ( ТЗ_Стр );

&НаСервере
Функция ПолучитьТЗНаСервере ( ТЗ )

Возврат ЗначениеВСтрокуВнутр ( ТЗ );

Пример 4. Передать ТЗ на клиент с сервера (через реквизит формы в 1С 8.3:

&НаСервере
Функция ПередатьТаблицуЗначенийНаКлиент ( ОбъектСсылка , ИмяТабличнойЧасти )

ОбъектЗначение = ОбъектСсылка . ПолучитьОбъект ();
ОбъектТЧ = ОбъектЗначение [ ИмяТабличнойЧасти ]. Выгрузить ();

МассивРеквизитов = Новый Массив ;
МассивСтарыхРеквизитов = Новый Массив ;
МассивКолонок = Новый Массив ;

ИдКоллекции = "РеквизитФормыТЗ" ; // Реквизит формы с типом Табл.Значений

ТаблицаФормы = РеквизитФормыВЗначение ( ИдКоллекции );

Для Каждого Колонка Из ТаблицаФормы . Колонки Цикл
МассивСтарыхРеквизитов . Добавить ( ИдКоллекции + "." + Колонка . Имя );
КонецЦикла;

Для Каждого Колонка Из ОбъектТЧ . Колонки Цикл
МассивРеквизитов . Добавить ( Новый РеквизитФормы ( Колонка . Имя , Колонка . ТипЗначения , ИдКоллекции ));
МассивКолонок . Добавить ( Колонка . Имя );
КонецЦикла;

// Добвляем новые и удаляем старые колонки
ЭтаФорма . ИзменитьРеквизиты ( МассивРеквизитов , МассивСтарыхРеквизитов );

// Помещаем значение в реквизит формы
ЗначениеВРеквизитФормы ( ОбъектТЧ , ИдКоллекции );

Пример 5. Передать ТЗ на клиент с сервера (через Массив из структур) в 1С 8.3:

// Преобразуем ТаблицуЗначений в Массив из структур.
Функция ПреобразоватьТЗвМассив ( ТЗ ) Экспорт

МассивТЗ = Новый Массив ;
Для Каждого СтрокаТЗ Из ТЗ Цикл

СтруктураТЗ = Новый Структура ;
Для Каждого ИмяКолонки Из ТЗ . Колонки Цикл
СтруктураТЗ . Вставить ( ИмяКолонки . Имя , СтрокаТЗ [ ИмяКолонки . Имя ]);
КонецЦикла;

МассивТЗ . Добавить ( СтруктураТЗ );

// Преобразуем Массив из структур в ТаблицуЗначений
Функция ПреобразоватьМассивВТЗ ( МассивТЗ ) Экспорт

ТЗ = Новый ТаблицаЗначений ;

Для Каждого ЭлементМассива Из МассивТЗ Цикл

// Колонки для таблицы значений
Если ТЗ . Колонки . Количество () = 0 Тогда
Для Каждого ЗнМассив Из ЭлементМассива Цикл
ТЗ . Колонки . Добавить ( ЗнМассив . Ключ );
КонецЦикла;
КонецЕсли;

// Заполняем таблицу значений данными
НоваяСтрока = ТЗ . Добавить ();
Для Каждого ЗнМассив Из ЭлементМассива Цикл
НоваяСтрока [ ЗнМассив . Ключ ] = ЗнМассив . Значение ;
КонецЦикла;
КонецЦикла;

После разделения выполнения программного кода на два контекста (клиент и сервер), у разработчиков появилось множество проблем, при переводе конфигурации с обычных форм на управляемые. Одна из них - это отсутствие возможности передачи объекта типа ТаблицаЗначений с сервера на клиент. Объект этого типа имеет много полезных методов, которые упрощают жизнь разработчику, поэтому свою жизнь без таблицы значений я не представляю возможной. Вариантов решения два: конвертировать таблицу значений в другой тип (например, в массив структур), либо динамически создавать реквизит формы типа ТаблицаЗначений (на самом деле тип ДанныеФормыКоллекция) и заполнить его данными.

Здесь все просто, обходим в цикле строки таблицы значений, данные каждой строки вставляем в структуру, а структуру добавляем в массив.

&НаСервере
Функция ПолучитьТЗКакМассивСтруктур()

МояТаблицаЗначений = СоздатьТаблицуЗначений();

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

Возврат МассивСтруктур;

&НаКлиенте
Процедура ПолучитьДанные()

Минус данного решения - это отсутствие тех самых полезных методов таблицы значений.

Этот вариант намного сложнее, но выполнив его, считайте что к одному из пунктов экзамена на знание платформы 1С 8.2 или 8.3 "Специалист" вы подготовились. Здесь используется динамическое создание реквизитов формы. Алгоритм, примерно, такой: создается реквизит формы с типом ТаблицаЗначений, для этого реквизита создаются подчиненные реквизиты (колонки таблицы) и производиться загрузка данных таблицы значений в новый реквизит формы.

Первым делом, необходимо у формы создать реквизит ИмяТаблицыЗначений с типом ТаблицаЗначений.


Рисунок 1. Реквизит формы типа ТаблицаЗначений

А потом написать следующий код:

Далее на клиенте можно смело обращаться к свежеиспеченной таблице значений ЭтаФорма.ИмяТаблицыЗначений.

Иногда так случается, что код, выполняемый на сервере, выгружает файлы во временную папку сервера, а они нужны на клиенте. А всё из-за разделения выполнения кода на два контекста: на сервере и на клиенте. Что бы побороть эту проблему, в арсенале платформы 1С имеются две функции: ПолучитьФайл и ПолучитьФайлы. Эти функции получают набор файлов и сохраняют их в локальную файловую систему пользователя. Более подробнее описание смотри в синтакс-помощнике.

Допустим, имеется обработка с макетами, которые хранят файлы в виде двоичных данных. Необходимо сохранить эти файлы во временную папку локального компьютера. Всё бы хорошо, только доступ к макетам доступен в контексте сервера. Приступим к реализации задачи.

Сперва, на сервере получаем двоичные данные файлов и помещаем их во временное хранилище, адреса файлов во временном хранилище записываем в массив:
// Функция помещает двоичные данные файлов во временное хранилище.
//
// Возвращаемое значение:
// Массив - массив с двоичными данными файлов.
//
&НаСервере
Функция ПолучитьФайлыИзМакетов()

АдресаВоВременномХранилище = Новый Массив;

ОбрОбъект = РеквизитФормыВЗначение("Объект");
ДД_Макет1 = ОбрОбъект.ПолучитьМакет("Макет1");
АдресаВоВременномХранилище.Добавить(ПоместитьВоВременноеХранилище(ДД_Макет1, ЭтаФорма.УникальныйИдентификатор));
ДД_Макет2 = ОбрОбъект.ПолучитьМакет("Макет1");
АдресаВоВременномХранилище.Добавить(ПоместитьВоВременноеХранилище(ДД_Макет2, ЭтаФорма.УникальныйИдентификатор));

Возврат АдресаВоВременномХранилище;

Что такое РеквизитФормыВЗначение и с чем его едят читать здесь.

Далее все действия по получению файлов выполняем на клиенте, следующий код довольно самодокументируемый, поэтому описывать его принцип работы не буду:
&НаКлиенте
Процедура ОткрытьФайлы(Команда)

ФайлыМакетов = ПолучитьФайлыИзМакетов();

// Создаем описание получаемых файлов.
ОписанияФайлов = Новый Массив;
Для Каждого ФайлМакета Из ФайлыМакетов Цикл
ОписаниеФайла = Новый ОписаниеПередаваемогоФайла(ПолучитьИмяВременногоФайла(), ФайлМакета);
ОписанияФайлов.Добавить(ОписаниеФайла);
КонецЦикла;

// Сохраняем файлы из временного хранилища в локальную файловую систему.
ПолученныеФайлы = Новый Массив;
ПолучитьФайлы(ОписанияФайлов, ПолученныеФайлы, , Ложь);

// Открываем файлы.
Для Каждого ПолученныйФайлы Из ПолученныеФайлы Цикл
ЗапуститьПриложение(ПолученныйФайлы.Имя);
КонецЦикла;

КонецПроцедуры

Читайте также: