Передать таблицу значений в реквизит формы

Содержание:

1.       Использование временного хранилища 1С

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

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

1.      Использование временного хранилища 1С

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

ПоместитьВоВременноеХранилище(<Данные>, <Адрес>)

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

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

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

ПолучитьИзВременногоХранилища(ЭтаФорма.УникальныйИдентификтор);  

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

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

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


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


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


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


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


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


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


Для Каждого ТекКолонка из ТаблицаФормы.Колонки Цикл


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


КонецЦикла;



Для Каждого ТекКолонка из ТЗ.Колонки Цикл


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


КонецЦикла;



//Добавим новые, удалим старые колонки


ИзменитьРеквизиты(ДобавляемыеРеквизиты, УдаляемыеРеквизиты);


// Поместим значение в реквизит формы 1С


ЗначениеВРеквизитФормы(ТЗ, ИмяТФ);

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

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

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


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


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


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


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

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

Специалист компании «Кодерлайн»

Роман Барабанов

(3)

как-то так.

   
       ОписаниеТиповЧислоСтрока0 = Новый ОписаниеТипов(«Строка, Число, Дата, NULL»,

                                              Новый КвалификаторыЧисла(64, 32, ДопустимыйЗнак.Любой),

                                              Новый КвалификаторыСтроки(0, ДопустимаяДлина.Переменная));

   
   Массив = Новый Массив;

   
   МассивУдаляемыхКолонокТЗ = Новый Массив;

   
   Для Каждого Эл Из Элементы.ТЗ1.ПодчиненныеЭлементы Цикл

       МассивУдаляемыхКолонокТЗ.Добавить(Эл);

   КонецЦикла;

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

       Элементы.Удалить(Эл);

   КонецЦикла;

   
   Для Каждого Колонка Из ТЗ.Колонки Цикл

       Массив.Добавить(Новый РеквизитФормы(Колонка.Имя, ОписаниеТиповЧислоСтрока0,»ТЗ1″));

   КонецЦикла;

   
   
   МассивУд = Новый Массив;

   Для Каждого Реквизит Из ПолучитьРеквизиты(«ТЗ1») Цикл

       МассивУд.Добавить(Реквизит.Путь + «.» + Реквизит.Имя);

   КонецЦикла;    

   ИзменитьРеквизиты(Массив, МассивУд);

   
   Для Каждого Реквизит Из Массив Цикл

       Эл = Элементы.Добавить(Реквизит.Имя, Тип(«ПолеФормы»), Элементы.ТЗ1);

       Эл.вид = ВидПоляФормы.ПолеВвода;

       Эл.доступныеТипы = Новый ОписаниеТипов(Колонка.ТипЗначения);

       Эл.ПутьКДанным = «ТЗ1.»+Эл.Имя;

       Эл.Формат = «ЧГ=0»;

   КонецЦикла;

   
   ЗначениеВРеквизитФормы(ТЗ,  «ТЗ1»);

Сегодня пол дня просидел над простой задачей проброса таблицы значений из модуля объекта в реквизит формы. Гугление толку не давало. Но в коде одной из обработок обнаружилось нужное решение) Оно оказалось настолько простым и логичным, что я не смог сдержать смех.

Суть — в модуле объекта формируем таблицу значений, загружаем таблицу значений в табличную часть объекта. Потом в модуле объекта создаем функцию которая возвращает таблицу значений выгруженную из реквизита объекта.

Для поиска решения я создал в тестовый пример для не типовой конфигурации.

Ниже представлены скриншоты рабочего примера. В своей базе вы должны самостоятельно сформировать ТЗ. Я привязался к конкретной конфигурации из-за необходимости проверить, что работа с ссылками ведется корректно.

Реквизиты объекта
Настройки формы

Стоит обратить внимание, что на форме табличное поле связано с данными реквизита формы, а не реквизитом объекта.

Модуль формы
Модуль объекта

Также, здесь мы видим как в 1С можно выполнить на клиенте в модуле формы обращение к функции Модуля объекта. Делаем функцию в модуле объекта Экспортной. Получаем Объект через РеквизитФормыВЗначение, вызываем экспортную функцию общего модуля.

Передача таблицы значений с сервера на клиент

Отличия функций РеквизитФормыВЗначение и ДанныеФормыВЗначение

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

Вариант №1

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


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

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

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

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

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

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

ДанныеТаблицы = ПолучитьТЗКакМассивСтруктур();

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

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

Вариант №2

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

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

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

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


&НаСервере
Функция ОтправитьТаблицуЗначенийНаКлиент()

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

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

МассивКолонок = Новый Массив;
ИмяТаблицыФормы = "ИмяТаблицыЗначений";

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

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

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

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

Возврат МассивКолонок;

КонецФункции // ОтправитьТаблицуЗначенийНаКлиент()

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

Перейти к контенту

Перейти в раздел примеры кода 1С 8.3:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

КонецФункции

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

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

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

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

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

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

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

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

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

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

   Возврат МассивКолонок;

КонецФункции

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

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

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

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

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

   КонецЦикла;

   Возврат МассивТЗ;

КонецФункции

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

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

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

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

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

   Возврат ТЗ;

КонецФункции

Copyright©, «Программист 1С в г.Минске», 22.06.2021

Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник

добейте кодик в через реквизит формы

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

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

МассивКолонок = Новый Массив;

ИдКоллекции = «Таблица»;

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

Для Каждого Колонка из КоллекцияФормы.Колонки Цикл

МассивУдаляемыхРеквизитов.Добавить(ИдКоллекции + «.» + Колонка.Имя);

КонецЦикла;

Для Каждого Колонка из ТЗ.Колонки Цикл

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

МассивКолонок.Добавить(Колонка.Имя);

КонецЦикла;

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

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

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

Для Каждого Элемент из Элементы Цикл

Если Лев(Элемент.Имя, 8) = ИдКоллекции + «_» Тогда

МассивУдаляемыхРеквизитов.Добавить(Элемент);

КонецЕсли;

КонецЦикла;

Для Каждого Элемент Из МассивУдаляемыхРеквизитов Цикл

Элементы.Удалить(Элемент);

КонецЦикла;

Для Каждого Колонка из ТЗ.Колонки Цикл

НовыйЭлемент = Элементы.Добавить(ИдКоллекции + «_» + Колонка.Имя, Тип(«ПолеФормы»), Элементы.Таблица);

НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;

НовыйЭлемент.ПутьКДанным = ИдКоллекции + «.» + Колонка.Имя;

КонецЦикла;

Возврат МассивКолонок;

Через ЗначениеВСтрокуВнутр и ЗначениеИзСтрокиВнутр

&НаКлиенте

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

ТЗВСтроке = ПолучитьТЗНаСервере();

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

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

// Функция получает данные на сервере

&НаСервере

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

// Для примера сформируем ТЗ с данными

ТЗ = ЗаполнитьТЗДанными();

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

КонецФункции

Через реквизит Формы

// Создаем реквизит формы «ВремТабЗнач» с типом данных: Таблица значений

// Ревкизит будет использоваться для передачи данных с сервера на клиент.

&НаСервере

Функция ПолучитьТЧ(ОбъектСсылка,ИмяТЧ)

ЗначениеОбъекта = ОбъектСсылка.ПолучитьОбъект();

ТабРез = ЗначениеОбъекта[ИмяТЧ].выгрузить();

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

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

МассивКолонок = Новый Массив;

ИдКоллекции=»ВремТабЗнач»;

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

Для каждого ТекКол из КоллФормы.Колонки Цикл

МассивУдаляемыхРеквизитов.Добавить(ИдКоллекции+».»+ТекКол.Имя);

КонецЦикла;

Для каждого ТекКол из ТабРез.Колонки Цикл

МассивДобавляемыхРеквизитов.Добавить(

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

МассивКолонок.Добавить(ТекКол.Имя);

КонецЦикла;

// Добавим новые, удалим старые колонки

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

// Поместим значение в реквизит формы

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

// вернем массив колонок в обрабатываемой ТЗ, например для более простого перебора

Возврат МассивКолонок;

КонецФункции

Через Временное хранилище

АдресХранилища = ПоместитьВоВременноеХранилище(МассивДанных,ЭтаФорма.УникальныйИдентификатор);

ПротоколПереноса = ПолучитьИзВременногоХранилища(АдресХранилища);

Через обычный возврат

&НаКлиенте

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

ТЗ = ЗаполнитьТЗДанными();

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

//Функция заполняет ТЗ

&НаСервере

Функция ЗаполнитьТЗДанными()

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

ТЗ.Колонки.Добавить(«Поле1»);

ТЗ.Колонки.Добавить(«Поле2»);

ТЗ.Колонки.Добавить(«Поле3»);

ТЗ.Колонки.Добавить(«Поле4»);

ТЗ.Колонки.Добавить(«Поле5»);

Для i = 1 По 3 Цикл

НоваяСтр = ТЗ.Добавить();

НоваяСтр.Поле1 = i;

НоваяСтр.Поле2 = 2*i;

НоваяСтр.Поле3 = 3*i;

НоваяСтр.Поле4 = 4*i;

НоваяСтр.Поле5 = 5*i;

КонецЦикла;

Возврат ТЗ;

КонецФункции

Понравилась статья? Поделить с друзьями:
  • Передача автомобиля страховой компании ндс
  • Поликлиника номер 1 время работы терапевта
  • Поликлиника пятницкое шоссе 29 часы работы
  • Поликлиника ру на сухаревской время работы
  • Поликлиника сиреневый бульвар время работы