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