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

