(3)
как-то так.
ОписаниеТиповЧислоСтрока0 = Новый ОписаниеТипов(«Строка, Число, Дата, NULL»,
Новый КвалификаторыЧисла(64, 32, ДопустимыйЗнак.Любой),
Новый КвалификаторыСтроки(0, ДопустимаяДлина.Переменная));
Массив = Новый Массив;
МассивУдаляемыхКолонокТЗ = Новый Массив;
Для Каждого Эл Из Элементы.ТЗ1.ПодчиненныеЭлементы Цикл
МассивУдаляемыхКолонокТЗ.Добавить(Эл);
КонецЦикла;
Для Каждого Эл Из МассивУдаляемыхКолонокТЗ Цикл
Элементы.Удалить(Эл);
КонецЦикла;
Для Каждого Колонка Из ТЗ.Колонки Цикл
Массив.Добавить(Новый РеквизитФормы(Колонка.Имя, ОписаниеТиповЧислоСтрока0,»ТЗ1″));
КонецЦикла;
МассивУд = Новый Массив;
Для Каждого Реквизит Из ПолучитьРеквизиты(«ТЗ1») Цикл
МассивУд.Добавить(Реквизит.Путь + «.» + Реквизит.Имя);
КонецЦикла;
ИзменитьРеквизиты(Массив, МассивУд);
Для Каждого Реквизит Из Массив Цикл
Эл = Элементы.Добавить(Реквизит.Имя, Тип(«ПолеФормы»), Элементы.ТЗ1);
Эл.вид = ВидПоляФормы.ПолеВвода;
Эл.доступныеТипы = Новый ОписаниеТипов(Колонка.ТипЗначения);
Эл.ПутьКДанным = «ТЗ1.»+Эл.Имя;
Эл.Формат = «ЧГ=0»;
КонецЦикла;
ЗначениеВРеквизитФормы(ТЗ, «ТЗ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:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)// Создаем таблицу значений
ТЗ = Новый ТаблицаЗначений;// Добавляем колонки в таблицу значений
ТЗ.Колонки.Добавить(«Овощь»);
ТЗ.Колонки.Добавить(«Цвет»);
ТЗ.Колонки.Добавить(«Вкус»);// Добавляем строки в таблицу значений
Стр = ТЗ.Добавить();
Стр.Овощь = «Дыня»;
Стр.Цвет = «Желтая»;
Стр.Вкус = «Сладкая»;Стр = ТЗ.Добавить();
Стр.Овощь = «Лук»;
Стр.Цвет = «Зеленый»;
Стр.Вкус = «Горький»;Стр = ТЗ.Добавить();
Стр.Овощь = «Помидор»;
Стр.Цвет = «Красный»;
Стр.Вкус = «Сочный»;// ТабРеквизит — таблица значений на форме
ЗначениеВРеквизитФормы(ТЗ, «ТабРеквизит»);
КонецПроцедуры
Программный вывод таблицы значений в таблицу на форму:
Пример вызова: ПрограммныйВыводТаблицыЗначенийВТаблицуНаФорму(МодульОбъкта.ТЗИзExcel, «ТЗИзExcel», Истина, Истина);
// Процедура — Программный вывод таблицы значений в таблицу на форму
//
// Параметры:
// ТаблицаЗначенийДляВывода — ТаблицаЗначений — ТаблицаЗначений для вывода на форму
// ИмяРеквизитаФормы — Строка — Наименование реквизита формы ДанныеФормыКоллекция
// ИспользованиеКолонкиОтметка — Булево — Вывод колокни отметка
// ТолькоКнопкаОткрытия — Булево — Отображение кнопок
//
&НаСервере
Процедура ПрограммныйВыводТаблицыЗначенийВТаблицуНаФорму(ТаблицаЗначенийДляВывода, ИмяРеквизитаФормы, ИспользованиеКолонкиОтметка = Ложь, ТолькоКнопкаОткрытия = Истина)
// Функционал данного механизма служит для программного вывода «Таблицы значений»
// в реквизит управляемой формы с типом «ДанныеФормыКоллекция». Может быть полезен
// в задачах, где состав колонок выгружаемой таблицы значений может меняться.
// Механизм предусматривает работу как с реквизитом объекта, так и с реквизитом формы.
// Также реализована возможность быстрого добавления колонки «Отметка» и настройки доступности кнопок полей.
// Процедура должна быть размещена в модуле формы.
Попытка
Если ТипЗнч(ТаблицаЗначенийДляВывода) = Тип(«ТаблицаЗначений») Тогда
Если ТипЗнч(ИмяРеквизитаФормы) = Тип(«Строка») Тогда
// Опрелеляем является заполняемый реквизит, реквизитом объекта или реквизитом формы
Если Объект.Свойство(ИмяРеквизитаФормы) И ТипЗнч(Объект[ИмяРеквизитаФормы]) = Тип(«ДанныеФормыКоллекция») Тогда
ПутьКДаннымФормыКоллекция = «Объект.» + ИмяРеквизитаФормы;
ОбъектДляОтображенияНаФорме = РеквизитФормыВЗначение(«Объект.» + ИмяРеквизитаФормы);
ЭтоРеквизитОбъекта = Истина;
ИначеЕсли ТипЗнч(ЭтаФорма[ИмяРеквизитаФормы]) = Тип(«ДанныеФормыКоллекция») Тогда
ПутьКДаннымФормыКоллекция = ИмяРеквизитаФормы;
ОбъектДляОтображенияНаФорме = РеквизитФормыВЗначение(ИмяРеквизитаФормы ,Тип(«ТаблицаЗначений»));
ЭтоРеквизитОбъекта = Ложь;
КонецЕсли;
КонецЕсли;
МассивУдаляемыхРеквизитов = Новый Массив;
МассивДобавляемыхРеквизитов = Новый Массив;
МассивИсключаемыхРеквизитов = Новый Массив;
// Формируем массив колонок для удаления
Для Каждого Колонка Из ОбъектДляОтображенияНаФорме.Колонки Цикл
МассивУдаляемыхРеквизитов.Добавить(ПутьКДаннымФормыКоллекция + «.» + Колонка.Имя);
КонецЦикла;
// Удаляем колонки с формы
Для Каждого Колонка Из ОбъектДляОтображенияНаФорме.Колонки Цикл
ЭлементКолонки = Элементы.Найти(ИмяРеквизитаФормы + Колонка.Имя);
Если НЕ ЭлементКолонки = Неопределено Тогда
Элементы.Удалить(ЭлементКолонки);
КонецЕсли;
КонецЦикла;
// Добавляем колонку «Отметка»
Если ИспользованиеКолонкиОтметка Тогда
НоваяКолонка = Новый РеквизитФормы(«Отметка», Новый ОписаниеТипов(«Булево»), ПутьКДаннымФормыКоллекция);
МассивДобавляемыхРеквизитов.Добавить(НоваяКолонка);
КонецЕсли;
// Формируем массив колонок из таблицы значений
Для Каждого Колонка Из ТаблицаЗначенийДляВывода.Колонки Цикл
Если Колонка.ТипЗначения.Типы().Найти(Тип(«Тип»)) = Неопределено Тогда
НоваяКолонка = Новый РеквизитФормы(Колонка.Имя, Новый ОписаниеТипов(Колонка.ТипЗначения.Типы()), ПутьКДаннымФормыКоллекция);
МассивДобавляемыхРеквизитов.Добавить(НоваяКолонка);
Иначе
Сообщить(«Колонка « + Строка(Колонка.Имя) + » с типом: не может быть выгружена»);
МассивИсключаемыхРеквизитов.Добавить(Колонка);
КонецЕсли;
КонецЦикла;
// Обновляем реквизиты формы
ИзменитьРеквизиты(МассивДобавляемыхРеквизитов, МассивУдаляемыхРеквизитов);
//Создаем элементы на форме для отображения колонок
ЭлементТЗ = Элементы[ИмяРеквизитаФормы];
// Добавляем колонку «Отметка»
Если ИспользованиеКолонкиОтметка Тогда
НовыйЭлементФормы = Элементы.Добавить(ИмяРеквизитаФормы + «Отметка», Тип(«ПолеФормы»), ЭлементТЗ);
НовыйЭлементФормы.Вид = ВидПоляФормы.ПолеФлажка;
НовыйЭлементФормы.ПутьКДанным = ПутьКДаннымФормыКоллекция + «.» + «Отметка»;
НовыйЭлементФормы.РежимРедактирования = РежимРедактированияКолонки.ВходПриВводе;
КонецЕсли;
// Добавляем колонки из таблицы
Для Каждого Колонка Из ТаблицаЗначенийДляВывода.Колонки Цикл
Если МассивИсключаемыхРеквизитов.Найти(Колонка) = Неопределено Тогда
НовыйЭлементФормы = Элементы.Добавить(ИмяРеквизитаФормы + Колонка.Имя, Тип(«ПолеФормы»), ЭлементТЗ);
НовыйЭлементФормы.Вид = ВидПоляФормы.ПолеВвода;
// Устанавливаем доступность кнопок
Если ТолькоКнопкаОткрытия Тогда
НовыйЭлементФормы.РедактированиеТекста = Ложь;
НовыйЭлементФормы.ВыбиратьТип = Ложь;
НовыйЭлементФормы.КнопкаВыбора = Ложь;
НовыйЭлементФормы.КнопкаВыпадающегоСписка = Ложь;
НовыйЭлементФормы.КнопкаОткрытия = Истина;
НовыйЭлементФормы.КнопкаОчистки = Ложь;
Иначе
НовыйЭлементФормы.РедактированиеТекста = Истина;
НовыйЭлементФормы.ВыбиратьТип = Истина;
НовыйЭлементФормы.КнопкаВыбора = Истина;
НовыйЭлементФормы.КнопкаВыпадающегоСписка = Истина;
НовыйЭлементФормы.КнопкаОткрытия = Истина;
НовыйЭлементФормы.КнопкаОчистки = Истина;
КонецЕсли;
НовыйЭлементФормы.КнопкаРегулирования = Ложь;
НовыйЭлементФормы.КнопкаСоздания = Ложь;
НовыйЭлементФормы.КнопкаСпискаВыбора = Ложь;
НовыйЭлементФормы.ИсторияВыбораПриВводе = ИсторияВыбораПриВводе.НеИспользовать;
НовыйЭлементФормы.БыстрыйВыбор = Ложь;
НовыйЭлементФормы.ПутьКДанным = ПутьКДаннымФормыКоллекция + «.» + Колонка.Имя;
КонецЕсли;
КонецЦикла;
// Загружаем таблицу значений в данные формы коллекцию
Если ЭтоРеквизитОбъекта Тогда
Объект[ИмяРеквизитаФормы].Загрузить(ТаблицаЗначенийДляВывода);
Иначе
ЭтаФорма[ИмяРеквизитаФормы].Загрузить(ТаблицаЗначенийДляВывода);
КонецЕсли;
Иначе
Сообщить(«Выводить можно только таблицу значений»);
КонецЕсли;
Исключение
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Copyright©, «Программист 1С в г.Минске», 19.04.2021
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник
Сегодня пол дня просидел над простой задачей проброса таблицы значений из модуля объекта в реквизит формы. Гугление толку не давало. Но в коде одной из обработок обнаружилось нужное решение) Оно оказалось настолько простым и логичным, что я не смог сдержать смех.
Суть — в модуле объекта формируем таблицу значений, загружаем таблицу значений в табличную часть объекта. Потом в модуле объекта создаем функцию которая возвращает таблицу значений выгруженную из реквизита объекта.
Для поиска решения я создал в тестовый пример для не типовой конфигурации.
Ниже представлены скриншоты рабочего примера. В своей базе вы должны самостоятельно сформировать ТЗ. Я привязался к конкретной конфигурации из-за необходимости проверить, что работа с ссылками ведется корректно.
Стоит обратить внимание, что на форме табличное поле связано с данными реквизита формы, а не реквизитом объекта.
Также, здесь мы видим как в 1С можно выполнить на клиенте в модуле формы обращение к функции Модуля объекта. Делаем функцию в модуле объекта Экспортной. Получаем Объект через РеквизитФормыВЗначение, вызываем экспортную функцию общего модуля.
это код на сервере или на клиенте?
Добавлено через 14 минут
я когда пишу
строка.реквизит1 =…..
говорит реквизит не найден.
/////
мож я не правильно объяснил.
кароч я хочу закинуть выгрузку запроса во вспомогательный реквизит упр. формы, имеющий тип «таблицазначений».
чтобы больше сервер не тягать, чтобы сразу всё вытащить на форму.
а так вроде не получается, когда преобразуем данные в реквизит и реквизит в данные, там вроде не все данные передаются..
в любом случае спасибо за совет
Добавлено через 39 минут
если вручную реквизиты писать как вы написали,
новстр.реквизит1 = «акрпакр»;
то поле объекта не обнаружено, выдает:
{Документ.ПриходнаяНакладная.Форма.ФормаДокумента. Форма(114)}: Поле объекта не обнаружено (реквизит1)
а если
1C | ||
|
то на форме в реквизите «таблица» недоступны те поля выборки которые были в ТЗ.
//////////////////////////////
на форме на клиенте даже нельзя добавить строку к Таблице значений.
Добавлено через 3 минуты
даже если просто так написать
1C | ||
|
то поля ТЗ недоступны в Таблице.
Выгрузка Таблицы значений 1с
Выгрузка Таблицы значений одна из типовых операций 1с. Выгрузка и загрузка Таблицы значений в Объект Таблица Значений позволяет быстро получать различные данные. Рассмотрим простой пример выгрузки данных в обработку при помощи ТаблицыЗначений.
Таблица значений-объект, позволяющий строить динамические наборы значений и работать с ними. Она заполняется значениями разных типов. Таблица значений может иметь любое количество колонок и быть связанным с элементом “Табличное поле”.
Создадим обработку(можно внешнюю) содержащую один Реквизит Результат. Тип реквизита Таблица Значений.
Для обработке сделаем Форму. На нее добавим одну команду Заполнить.Обработчик Команды на клиенте и процедура на сервере.
Перетащим кнопку на Форму. В результате получим форму следующего вида:
Модуль формы будет выглядеть так:
В Таблице Значений на Обработке мы планируем вывести данные выбранные из Регистра Накопления ОстаткиНоменклатуры. Примерный вид Таблицы Значений такой:
Изменяем Реквизит Результат. Добавляем в него Колонки Реквизита так, чтобы имена Колонок и Типы совпадали с данными представленными выше.
Перетаскиваем Реквизит Результат на Форму. Соглашаемся на добавление колонок в Таблицу Значений, нажав Да.
Наша форма примет вид:
Переходим в Модуль формы. В процедуре на Сервере вначале создаем Запрос.
Как выгрузить результат запроса 1с в таблицу значений
Ответом на вопрос представленный код ниже.
Выгружаем результат запроса в Таблицу Значений:
Связываем Таблицу Значений в которой сохранен результат запроса с Объектом на форме типа ТаблицаЗначений.
Полный код обработки выглядит так:
Результат работы обработки следующий:
Нами произведена выгрузка Таблицы значений 1с.
Выгрузка результат запроса в таблицу значений на форме 1с
Рассмотрим еще один пример.
Пример кода для выгрузки результат запроса в таблицу значений на форме:
Вывод: Нами создана обработка позволяющая из любого запроса передать данные на форму обработки в таблицу значений. Нами произведена выгрузка таблицы значений в элемент формы. При помощи обработки можно изменять данные находящиеся в таблице значений на форме.
В качестве примера
возьмем две таблицы значений на форме (которые могут быть также привязаны к
табличной части на форме).
Необходимо
скопировать данные из одной таблицы значений в другую.
Такие таблицы
значений (расположенные на форме как реквизиты формы/объекта) по факту имеют
тип — ДанныеФормыКоллекция.
Для них не работает/отсутствует типовой метод таблиц
значений — Скопировать().
В случае работы с ДанныеФормыКоллекция нужно использовать методы Выгрузить/Загрузить.
Пример: на форме две
ТЗ со схожим набором колонок:
Если нужно полностью
скопировать строки из одной ТЗ (Пользователи1ССлужебный) в другую
(Пользователи1С), то можно указать следующий код:
//&НаСервере
Объект.Пользователи1С.Очистить();
Объект.Пользователи1С.Загрузить(Объект.Пользователи1ССлужебный.Выгрузить());
Такой код работает
только на сервере.
Будут скопированы
только те колонки, которые в обеих таблицах совпадают.
При выгрузке можно
задать условия, что выгружать.
1) Выгрузить только
определенные колонки:
Выгрузить(, «Колонка1, Колонка2,
Колонка3»)
2) Выгрузить только
определенные строки:
Выгрузить(МассивВыгружаемыхСтрок, )
3) Выгрузить только
определенные колонки из определенных строк:
Выгрузить(МассивВыгружаемыхСтрок, «Колонка1, Колонка2,
Колонка3»)
4) Выгрузить только
строки по определенному отбору/фильтру:
Выгрузить(Новый Структура(«Колонка1», ЗначениеОтбораКолонки), )
5) Выгрузить только
определенные колонки из строк по определенному отбору/фильтру:
Выгрузить(Новый Структура(«Колонка1», ЗначениеОтбораКолонки), «Колонка1, Колонка2, Колонка3»)
Примечание: Если указан отбор, то только строки из
отбора будут выгружены. Если отбор не указан, то будут выгружены все строки
коллекции. Если указаны колонки, то только эти колонки будут выгружены. Иначе,
будут выгружены все колонки коллекции.
Если нужно скопировать только одну строку, то можно
использовать ЗаполнитьЗначенияСвойств
(работает как на
сервере, так и на клиенте):
Для Каждого СтрокаТЗ Из Объект.Пользователи1ССлужебный Цикл
// какой-нибудь код,
например
СтрокаТЗ.СостояниеВ1С = «Обработано»;
// копирование строки в
другую ТЗ
ЗаполнитьЗначенияСвойств(Объект.Пользователи1С.Добавить(), СтрокаТЗ);
КонецЦикла;
Если Вам понравилась статья, пожалуйста, поставьте лайк, сделайте репост или оставьте комментарий. Если у Вас есть какие-либо замечания, также пишите комментарии.