1с реквизит формы в значение таблица значений

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

Я
   luter-89

12.01.17 — 17:55

Кто знает почему такая конструкция

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

Возвращает ДанныеФормыКоллекция а не ТаблицаЗначений?

Глобальный контекст (Global context)

ДанныеФормыВЗначение (FormDataToValue)

Синтаксис:

ДанныеФормыВЗначение(<Объект>, <Тип>)

Параметры:

<Объект> (обязательный)

Тип: ДанныеФормыСтруктураСКоллекцией; ДанныеФормыКоллекция; ДанныеФормыСтруктура; ДанныеФормыДерево.

Данные формы.

<Тип> (обязательный)

Тип: Тип.

Тип значения, получаемого из данных формы.

Возвращаемое значение:

Тип: Произвольный.

Описание:

Преобразует данные формы в объект прикладного типа.

Доступность:

Сервер, толстый клиент, мобильное приложение(сервер).

Примечание:

Нельзя преобразовать в объект типа Табличная часть.

Как бы по входным параметрам норм.

  

Партнерская программа EFSOL Oblako

   luter-89

1 — 12.01.17 — 17:56

Не то скопировал

   luter-89

2 — 12.01.17 — 17:56

УправляемаяФорма.РеквизитФормыВЗначение (ManagedForm.FormAttributeToValue)

УправляемаяФорма (ManagedForm)

РеквизитФормыВЗначение (FormAttributeToValue)

Синтаксис:

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

Параметры:

<ИмяРеквизита> (обязательный)

Тип: Строка.

Имя реквизита формы, который необходимо преобразовать.

Может быть указан реквизит данных формы (см. описание параметра <Объект> метода ДанныеФормыВЗначение).

<Тип> (необязательный)

Тип: Тип.

Тип значения, получаемого из реквизита формы (данных формы). Если данный параметр не указан, то он также получается из реквизита формы. Если реквизит является составным типом и значение параметра не указано, генерируется исключение времени выполнения.

Возвращаемое значение:

Тип: Произвольный.

Описание:

Преобразует указанный реквизит формы в объект прикладного типа.

Доступность:

Сервер, мобильное приложение(сервер).

   Nuobu

3 — 12.01.17 — 17:56

ЭтаФорма.Таблица — уже таблица значений.

   luter-89

4 — 12.01.17 — 17:57

Управляемый интерфейс

   luter-89

5 — 12.01.17 — 17:58

Имя реквизита формы, который необходимо преобразовать.

Может быть указан реквизит данных формы (см. описание параметра <Объект> метода ДанныеФормыВЗначение).

Это что — то здесь

   luter-89

6 — 12.01.17 — 17:58

Видимо можно указать только Объект, дальше через точку нельзя

   luter-89

7 — 13.01.17 — 09:05

Есть еще предположения?)

   h-sp

8 — 13.01.17 — 09:19

(6) делайте РеквизитФормыВЗначение(«Объект»)

   luter-89

9 — 13.01.17 — 09:26

(8) Так и делаю, но все же интересно. Косяк что ли

   FIXXXL

10 — 13.01.17 — 09:34

(9) Тип укажи

или сделай .Выгрузить() и не выпендривайся :)

   FIXXXL

11 — 13.01.17 — 09:37

(10) или Скопировать()

   igork1966

12 — 13.01.17 — 09:37

(9) (0) Как бы название функции намекает на неправильность такого использования.  Объект.Таблица как бы не реквизит формы ни разу

   luter-89

13 — 13.01.17 — 09:39

(12) Но тип то ДанныеФормыКоллекция

   luter-89

14 — 13.01.17 — 09:40

(10) Указание типа не поможет

   craxx

15 — 13.01.17 — 10:49

(0) Таблица значений на клиенте не доступна

   igork1966

16 — 13.01.17 — 10:51

(13) Объект.Таблица это ТЧ?

   luter-89

17 — 13.01.17 — 17:45

(15) Я это делаю на сервере

   luter-89

18 — 13.01.17 — 17:45

(16) Да, ТЧ

   AvRm

19 — 13.01.17 — 17:53

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

должно работать

   igork1966

20 — 13.01.17 — 18:00

(18) Из твоего же (0):

Примечание:

Нельзя преобразовать в объект типа Табличная часть.

   luter-89

21 — 13.01.17 — 18:00

Если Объект.Таблица, то не работает

   luter-89

22 — 13.01.17 — 18:01

Так я пытаюсь преобразовать в таблицу значений

   singlych

23 — 13.01.17 — 18:12

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

Так что пиши Выгрузить().

   Вафель

24 — 13.01.17 — 18:16

ну так Объект.Таблица на сервере и не имеет тип ТаблицаЗначений, а имеет ТабличнаяЧасть

  

AvRm

25 — 13.01.17 — 20:16

(21) Ты должен данные формы преобразовать, а не объекта.

То есть в 1 параметр подставить имя таблицы на форме.

А если у тебя табличная часть, то зачем ее преобразовывать. Выгрузи

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

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

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

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

    // Получаем случайную таблицу значений
    НоваяТаблицаЗначений = СоздатьСлучайнуюТаблицуЗначений();
    
    // Чтобы воспользоваться методом управляемой формы
    // ИзменитьРеквизиты(ДобавляемыеРеквизиты, УдаляемыеРеквизиты)
    // надо сформировать два массива: ДобавляемыеРеквизиты и
    // УдаляемыеРеквизиты
    
    // Удаляемые реквизиты: колонки старой таблицы значений
    РеквизитДанныеТаблицы = РеквизитФормыВЗначение("ДанныеТаблицы");
    УдаляемыеРеквизиты = Новый Массив();
    Для Каждого Колонка Из РеквизитДанныеТаблицы.Колонки Цикл
        УдаляемыеРеквизиты.Добавить("ДанныеТаблицы." + Колонка.Имя);       
    КонецЦикла;
    
    // Добавляемые реквизиты: колонки новой таблицы значений
    ДобавляемыеРеквизиты = Новый Массив();
    Для Каждого Колонка Из НоваяТаблицаЗначений.Колонки Цикл
        МассивТипов = Новый Массив();
        МассивТипов.Добавить(Колонка.ТипЗначения);
        НоваяКолонка = Новый РеквизитФормы(
            Колонка.Имя,
            Новый ОписаниеТипов(МассивТипов),
            "ДанныеТаблицы"
        );
        ДобавляемыеРеквизиты.Добавить(НоваяКолонка);
    КонецЦикла;
    
    // Удаляем старые реквизиты и добавляем новые
    ИзменитьРеквизиты(ДобавляемыеРеквизиты, УдаляемыеРеквизиты);
    
    // Присваиваем новое значение реквизиту формы
    ЗначениеВРеквизитФормы(НоваяТаблицаЗначений, "ДанныеТаблицы");
    
    // Теперь удаляем таблицу с формы и добавляем ее заново.
    // После этого в цикле добавляем колонки таблицы и для
    // каждой указываем наименование, тип, родителя и путь
    // к данным
    
    // Удаляем таблицу с формы
    ЭлементТаблица = Элементы.Найти("МояТаблицаФормы");
    Если ЭлементТаблица <> Неопределено Тогда
        Элементы.Удалить(ЭлементТаблица);       
    КонецЕсли;    
    // И добавляем ее заново
    ЭлементТаблица = Элементы.Добавить("МояТаблицаФормы", Тип("ТаблицаФормы"));
    ЭлементТаблица.ПутьКДанным = "ДанныеТаблицы";
    ЭлементТаблица.Отображение = ОтображениеТаблицы.Список;
    
    // Выводим на форму колонки таблицы
    ЭлементТаблица = Элементы.МояТаблицаФормы;
    Для Каждого Колонка Из НоваяТаблицаЗначений.Колонки Цикл
        НовыйЭлементФормы = Элементы.Добавить(
            "ДанныеТаблицы" + Колонка.Имя,
            Тип("ПолеФормы"),
            ЭлементТаблица
        );
        НовыйЭлементФормы.Вид = ВидПоляФормы.ПолеВвода;
        НовыйЭлементФормы.ПутьКДанным = "ДанныеТаблицы." + Колонка.Имя;
    КонецЦикла;
        
КонецПроцедуры

&НаСервере
Функция СоздатьСлучайнуюТаблицуЗначений()

    Если НомерТаблицы = 0 Тогда

        ТаблицаЗначений = Новый ТаблицаЗначений();
        ТаблицаЗначений.Колонки.Добавить("Код");
        ТаблицаЗначений.Колонки.Добавить("Наименование");
        ТаблицаЗначений.Колонки.Добавить("Количество");

        // делаем выборку
        Выборка = Справочники.Номенклатура.Выбрать();
        Пока Выборка.Следующий() Цикл
            // добавляем новуй строку в таблицу значений
            НоваяСтрока = ТаблицаЗначений.Добавить();
            НоваяСтрока.Код = Выборка.Код;
            НоваяСтрока.Наименование = Выборка.Наименование;
            НоваяСтрока.Количество = 1;
        КонецЦикла;
        
        НомерТаблицы = 1

    Иначе

        ТаблицаЗначений = Новый ТаблицаЗначений();
        ТаблицаЗначений.Колонки.Добавить("Код");
        ТаблицаЗначений.Колонки.Добавить("Фамилия");

        // делаем выборку
        Выборка = Справочники.Сотрудники.Выбрать();
        Пока Выборка.Следующий() Цикл
            // добавляем новуй строку в таблицу значений
            НоваяСтрока = ТаблицаЗначений.Добавить();
            НоваяСтрока.Код = Выборка.Код;
            НоваяСтрока.Фамилия = Выборка.Наименование;
        КонецЦикла;
        
        НомерТаблицы = 0

    КонецЕсли;
    
    Возврат ТаблицаЗначений;

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

Реквизит НомерТаблицы поочередно принимает значение нуля или единицы и нужен лишь для того, чтобы каждый раз получать другую таблицу значений.

Справка

УправляемаяФорма.ИзменитьРеквизиты()

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

Параметры:

  • ДобавляемыеРеквизиты (необязательный, тип Массив). Массив, содержащий объекты типа РеквизитФормы. Добавлять можно реквизиты верхнего уровня и вложенные реквизиты, являющиеся колонками. К добавленным реквизитам верхнего уровня из модуля можно обращаться только с помощью конструкции ЭтотОбъект.
  • УдаляемыеРеквизиты (необязательный, тип Массив). Массив, содержащий строки, описывающие пути к удаляемым реквизитам. Удалять можно только ранее программно добавленные реквизиты.

Описание:

  • Изменяет структуру реквизитов формы. Сначала выполняется удаление реквизитов. Таким образом массивы добавляемых и удаляемых реквизитов могут содержать реквизиты с одинаковым путём.
  • Внимание! Действия добавления и удаления выполняются за один вызов. Следует учитывать, что операция изменения состава реквизитов является ресуркоемкой, поэтому операции изменения состава реквизитов формы выполняются пакетным образом.

Доступность:

  • Сервер, мобильное приложение (сервер).

ВсеЭлементыФормы.Добавить()

ВсеЭлементыФормы.Добавить(Имя, ТипЭлемента, Родитель) 

Параметры:

  • Имя (обязательный, тип Строка). Уникальное имя добавляемого элемента.
  • ТипЭлемента (обязательный, тип Тип). Тип добавляемого элемента.
  • Родитель (необязательный, тип: ГруппаФормы; ТаблицаФормы; УправляемаяФорма). Родитель для добавляемого элемента. Если не указан, то добавляется на верхний уровень.

Возвращаемое значение:

  • Тип: ДекорацияФормы; ГруппаФормы; КнопкаФормы; ТаблицаФормы; ПолеФормы.

Описание:

  • Добавляет элемент в коллекцию.

Доступность:

  • Сервер, мобильное приложение (сервер).

Поиск:
1С:Предприятие • Значение в реквизит формы • Изменить реквизиты • Реквизит формы в значение • Таблица значений • Управляемая форма • Элемент формы

Преобразование данных прикладных объектов в данные формы и обратно

Для конвертирования прикладных объектов в данные формы и обратно существует набор глобальных методов:

  • ЗначениеВДанныеФормы(),
  • ДанныеФормыВЗначение(),
  • КопироватьДанныеФормы().

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

Во время конвертирования данных формы в прикладной объект нужно учитывать их совместимость.

  • ЗначениеВДанныеФормы() ‑ преобразует объект прикладного типа в данные формы.
  • ДанныеФормыВЗначение() ‑ преобразует данные формы в объект прикладного типа.
  • КопироватьДанныеФормы() ‑ производит копирование данных формы, обладающих совместимой структурой. Возвращает значение Истина, если копирование произведено, или Ложь, если структура объектов несовместима.

При преобразовании данных формы в прикладные объекты и обратно используется кеширование объектов, но при этом выполняется проверка актуальности версии объекта в кеше.

ПРИМЕЧАНИЕ. При выполнении стандартных действий (открытие формы, выполнение стандартной команды Записать и т. д.) в форме с основным реквизитом преобразование выполняется автоматически.

Приведем пример, как использовать преобразование данных в собственных алгоритмах.

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ОбъектТовар = Товары.НайтиПоНаименованию("Кофейник").ПолучитьОбъект(); ЗначениеВДанныеФормы(ОбъектТовар, Объект);
КонецПроцедуры
&НаКлиенте
Процедура Записать()
ЗаписатьНаСервере();
КонецПроцедуры
&НаСервере
Процедура ЗаписатьНаСервере()
ОбъектТовар = ДанныеФормыВЗначение(Объект,Тип("СправочникОбъект.Товары"));
ОбъектТовар.Записать();
КонецПроцедуры

Также у объекта ФормаКлиентскогоПриложения существуют методы, доступные на сервере:

  • ЗначениеВРеквизитФормы() ‑ выполняет преобразование объекта прикладного типа в заданный реквизит формы.
  • РеквизитФормыВЗначение() ‑ преобразует реквизит данных формы в объект прикладного типа.

Использование данных методов обычно удобнее, так как они имеют, например, информацию о типе реквизита формы. Кроме того, метод РеквизитФормыВЗначение() выполняет установку соответствия данных формы и объекта, которая используется при формировании сообщений .

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

ВНИМАНИЕ! Колонки реквизитов, не связанные с данными , не участвуют в преобразовании значений между данными формы и объектами информационной базы и обратно. Колонки, отсутствующие в данных объекта, очищаются при преобразовании в данные формы.

При переносе объекта в данные формы платформой, или при вызове методов ЗначениеВДанныеФормы(), ЗначениеВРеквизитФормы(), переносятся только данные объекта. Внутренние состояние объекта в данные формы не переносится. Например, значение ссылки нового, которая установлена в объект методом УстановитьСсылкуНового(), будет утеряна в процессе преобразования объекта в данные формы и обратно.

В качестве первого параметра методов РеквизитФормыВЗначение() и ДанныеФормыВЗначение() могут выступать только реквизиты формы следующих типов:

  •  ДанныеФормыСтруктура, 
  • ДанныеФормыКоллекция,
  •  ДанныеФормыСтруктураСКоллекцией, 
  • ДанныеФормыДерево.

Приведем пример использования этих методов.

&НаСервере
Процедура ПересчитатьНаСервере()
// Преобразует реквизит Объект в прикладной объект. Документ = РеквизитФормыВЗначение("Объект");
// Выполняет пересчет методом, определенным в модуле документа. Документ.Пересчитать();
// Преобразует прикладной объект обратно в реквизит. ЗначениеВРеквизитФормы(Документ, "Объект");
КонецПроцедуры

Первые проблемы

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

Вызов процедуры модуля в толстом клиенте обычное приложение

Времена меняются, платформу 1С оптимизируют и совершенствуют, толстый клиент забывают, всем подавай тонкий или web-клиент. Разработчики начинают переводить обычные формы на управляемые, но не все так просто, появляются некоторые сложности в связи с разделением выполнения программного кода на два контекста: сервер и клиент. Поэтому выше приведенный пример кода работать не будет в тонком клиенте.

Новые типы данных

Так же из-за управляемых форм появились новые типы данных. Имеется форма:

Управляемая форма

Запоминаем типы реквизитов и смотрим какие типы в отладке для этих реквизитов:

Новые типы данных формы

Делаем вывод, для отображения данных самого объекта используется тип ДанныеФормыСтруктура, для отображения дерева значений — ДанныеФормыДерево, для табличной части — ДанныеФормыКоллекция и т.д. То есть  в модуле формы на клиенте мы работаем не с самим объектом а с его представлением! Поэтому, методы, которые доступны, например, для табличной части в модуле объекта НЕ ДОСТУПНЫ в модуле формы.

Борьба с новыми типами

Разработчики платформы 1С предоставили две функции:

  1. РеквизитФормыВЗначение — преобразует указанный реквизит формы в объект прикладного типа.
  2. ДанныеФормыВЗначение — преобразует данные формы в объект прикладного типа.

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

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

СпрОбъект1 = РеквизитФормыВЗначение("Объект");
СпрОбъект1.ВывестиСообщение(Объект.Реквизит1);

СпрОбъект2 = ДанныеФормыВЗначение(Объект, Тип("СправочникОбъект.Справочник1"));
СпрОбъект2.ВывестиСообщение(Объект.Реквизит1);

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

Работает и с помощью одной функции и с помощью другой О_о. Напишем код по преобразованию ДанныеФормыДерево в объект прикладного типа:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

ДеревоЗначений1 = РеквизитФормыВЗначение("Реквизит1");
ДеревоЗначений2 = ДанныеФормыВЗначение(ЭтаФорма.Реквизит1, Тип("ДеревоЗначений"));

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

ДеревоЗначений1 и ДеревоЗначений2 имеют одинаковый тип — ДеревоЗначений. Так в чем же разница этих функций???

ДанныеФормыВЗначение — функция глобального контекста. Производит преобразование типа объекта поддерживаемого формой в тип объекта базы данных: ДанныеФормыСтруктура —> СправочникОбъект.Справочник1.

РеквизитФормыВЗначение — функция модуля формы, то есть вызывается на сервере в контексте формы (&НаСервере). Если вы попытаетесь вызвать данную функцию вне контексте формы, то платформа сгенерирует исключительную ошибку:

&НаСервереБезКонтекста
Процедура ПреобразованиеТипа()

// Этот код неправильный, контекст формы не доступен, будет ошибка!
СпрОбъект2 = РеквизитФормыВЗначение(Объект, Тип("СправочникОбъект.Справочник1"));
СпрОбъект2.ВывестиСообщение(Объект.Реквизит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. Страницы
  2. Поиск по блогу
  3. пятница, 9 октября 2015 г.
  4. Передача таблицы значений с сервера на клиент
  5. Вариант №1
  6. Вариант №2
  7. личный блог

Область применения: управляемое приложение, мобильное приложение.

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

2. При работе с объектами типа ДанныеФормыКоллекция , если предполагается, что объект типа ДанныеФормыКоллекция может содержать большое количество строк (нужно ориентироваться на количество от 20 строк), необходимо придерживаться следующих рекомендаций:

  • обход строк такой коллекции необходимо производить на сервере;
  • функцию НайтиСтроки вызывать только на сервере.

Например, если решается задача по проверке в объекте строк, удовлетворяющих некоторому условию, то
неправильно:

правильно выполнять один явный вызов сервера:

Маленький IT блог с характером 1С.

Страницы

Поиск по блогу

пятница, 9 октября 2015 г.

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

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

Вариант №1

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

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

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

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

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

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

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

Вариант №2

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

личный блог

С задачей вывода каких либо данных в Таблицу Значений (ТЗ) на форме сталкиваются наверное все программисты. Если раньше до выхода Управляемого Интерфейса все решалось довольно просто, то теперь все немного изменилось.

Для обычных форм.

Стоит отметить, что предварительно нужно создать соответствующие РезультатуЗапроса колонки таблицы значений. Делается это также просто. Добавить ТаблицуЗначений следует в реквизиты Формы. Еще раз акцентирую внимание — Названия колонок и типы данных колонок ТЗ должны совпадать и на форме и в запросе. Можно вообще не создавать ТЗ на форме, а описать ее программно, примерно как то так:

Для управляемых форм все ровно тоже самое кроме того что нужно на сервере получить значение данных ТЗ на форме, записать в них результат запроса и потом снова вернуть их на форму.

Ниже пример такого преобразования.

Во всей этой истории следует обратить внимание на 2 строчки.

Первая

Вторая

Первый из типа данных ДанныеФормыКоллекция преобразует данные в тип ТаблицаЗначений. Второй соответственно конвертирует в обратном направлении.

  • Распечатать

Оцените статью:

  1. 5
  2. 4
  3. 3
  4. 2
  5. 1

(0 голосов, среднее: 0 из 5)

Поделитесь с друзьями!

это код на сервере или на клиенте?

Добавлено через 14 минут
я когда пишу
строка.реквизит1 =…..
говорит реквизит не найден.
/////
мож я не правильно объяснил.
кароч я хочу закинуть выгрузку запроса во вспомогательный реквизит упр. формы, имеющий тип «таблицазначений».
чтобы больше сервер не тягать, чтобы сразу всё вытащить на форму.
а так вроде не получается, когда преобразуем данные в реквизит и реквизит в данные, там вроде не все данные передаются..
в любом случае спасибо за совет

Добавлено через 39 минут
если вручную реквизиты писать как вы написали,
новстр.реквизит1 = «акрпакр»;
то поле объекта не обнаружено, выдает:
{Документ.ПриходнаяНакладная.Форма.ФормаДокумента. Форма(114)}: Поле объекта не обнаружено (реквизит1)

а если

1C
1
2
3
4
5
6
тз = запрос.выполнить().выгрузить();
 
Таб = РеквизитФормыВЗначение("Таблица",Тип("ТаблицаЗначений"));
Таб.Очистить();
таб = тз;
ЗначениеВРеквизитФормы(Таб,"Таблица");

то на форме в реквизите «таблица» недоступны те поля выборки которые были в ТЗ.
//////////////////////////////
на форме на клиенте даже нельзя добавить строку к Таблице значений.

Добавлено через 3 минуты
даже если просто так написать

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

то поля ТЗ недоступны в Таблице.

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