Как данныеформыколлекция перевести в таблицу значений 1с
Область применения: управляемое приложение, мобильное приложение.
1. В целях оптимизации объема данных, передаваемых между клиентом и сервером, платформа 1С:Предприятие по-особому организует передачу объектов формы типа ДанныеФормыКоллекция . Данные таких объектов передаются определенными порциями таким образом, что новые порции данных передаются с сервера на клиент только по мере обращения к этим данным на клиенте. Необходимо учитывать эту особенность при разработке форм, т.к. в противном случае, код формы может приводить к излишним неявным серверным вызовам, инициируемым платформой.
2. При работе с объектами типа ДанныеФормыКоллекция , если предполагается, что объект типа ДанныеФормыКоллекция может содержать большое количество строк (нужно ориентироваться на количество от 20 строк), необходимо придерживаться следующих рекомендаций:
- обход строк такой коллекции необходимо производить на сервере;
- функцию НайтиСтроки вызывать только на сервере.
Например, если решается задача по проверке в объекте строк, удовлетворяющих некоторому условию, то
неправильно:
правильно выполнять один явный вызов сервера:
Маленький IT блог с характером 1С.
Поиск по блогу
пятница, 9 октября 2015 г.
Передача таблицы значений с сервера на клиент
После разделения выполнения программного кода на два контекста (клиент и сервер), у разработчиков появилось множество проблем, при переводе конфигурации с обычных форм на управляемые. Одна из них – это отсутствие возможности передачи объекта типа ТаблицаЗначений с сервера на клиент. Объект этого типа имеет много полезных методов, которые упрощают жизнь разработчику, поэтому свою жизнь без таблицы значений я не представляю возможной. Вариантов решения два: конвертировать таблицу значений в другой тип (например, в массив структур), либо динамически создавать реквизит формы типа ТаблицаЗначений (на самом деле тип ДанныеФормыКоллекция) и заполнить его данными.
Вариант №1
Здесь все просто, обходим в цикле строки таблицы значений, данные каждой строки вставляем в структуру, а структуру добавляем в массив.
&НаСервере
Функция ПолучитьТЗКакМассивСтруктур()
МассивСтруктур = Новый Массив;
Для Каждого СтрокаТЗ Из МояТаблицаЗначений Цикл
СтрокаСтруктура = Новый Структура;
Для Каждого КолонкаТЗ Из МояТаблицаЗначений.Колонки Цикл
СтрокаСтруктура.Вставить(КолонкаТЗ.Имя, СтрокаТЗ[КолонкаТЗ.Имя]);
КонецЦикла;
МассивСтруктур.Добавить(СтрокаСтруктура);
КонецЦикла;
&НаКлиенте
Процедура ПолучитьДанные()
Минус данного решения – это отсутствие тех самых полезных методов таблицы значений.
Вариант №2
Этот вариант намного сложнее, но выполнив его, считайте что к одному из пунктов экзамена на знание платформы 1С 8.2 или 8.3 "Специалист" вы подготовились. Здесь используется динамическое создание реквизитов формы. Алгоритм, примерно, такой: создается реквизит формы с типом ТаблицаЗначений, для этого реквизита создаются подчиненные реквизиты (колонки таблицы) и производиться загрузка данных таблицы значений в новый реквизит формы.
Первым делом, необходимо у формы создать реквизит ИмяТаблицыЗначений с типом ТаблицаЗначений.
Рисунок 1. Реквизит формы типа ТаблицаЗначений |
А потом написать следующий код:
ДобавляемыеРеквизиты = Новый Массив;
УдаляемыеРеквизиты = Новый Массив;
МассивКолонок = Новый Массив;
ИмяТаблицыФормы = "ИмяТаблицыЗначений";
Для Каждого ТекКолонка из ТаблицаФормы.Колонки Цикл
УдаляемыеРеквизиты.Добавить(ИмяТаблицыФормы + "." + ТекКолонка.Имя);
КонецЦикла;
Для Каждого ТекКолонка из МояТаблицаЗначений.Колонки Цикл
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ТекКолонка.Имя, ТекКолонка.ТипЗначения, ИмяТаблицыФормы));
МассивКолонок.Добавить(ТекКолонка.Имя);
КонецЦикла;
// Добавим новые, удалим старые колонки
ИзменитьРеквизиты(ДобавляемыеРеквизиты, УдаляемыеРеквизиты);
// Поместим значение в реквизит формы
ЗначениеВРеквизитФормы(МояТаблицаЗначений, ИмяТаблицыФормы);
Далее на клиенте можно смело обращаться к свежеиспеченной таблице значений ЭтаФорма.ИмяТаблицыЗначений.
личный блог
С задачей вывода каких либо данных в Таблицу Значений (ТЗ) на форме сталкиваются наверное все программисты. Если раньше до выхода Управляемого Интерфейса все решалось довольно просто, то теперь все немного изменилось.
Для обычных форм.
Стоит отметить, что предварительно нужно создать соответствующие РезультатуЗапроса колонки таблицы значений. Делается это также просто. Добавить ТаблицуЗначений следует в реквизиты Формы. Еще раз акцентирую внимание — Названия колонок и типы данных колонок ТЗ должны совпадать и на форме и в запросе. Можно вообще не создавать ТЗ на форме, а описать ее программно, примерно как то так:
Для управляемых форм все ровно тоже самое кроме того что нужно на сервере получить значение данных ТЗ на форме, записать в них результат запроса и потом снова вернуть их на форму.
Ниже пример такого преобразования.
Во всей этой истории следует обратить внимание на 2 строчки.
Первая
Вторая
Первый из типа данных ДанныеФормыКоллекция преобразует данные в тип ТаблицаЗначений. Второй соответственно конвертирует в обратном направлении.
Функционал данного механизма служит для программного вывода "Таблицы значений" в реквизит управляемой формы с типом "ДанныеФормыКоллекция". Может быть полезен в задачах, где состав колонок выгружаемой таблицы значений может меняться.
Механизм предусматривает работу как с реквизитом объекта, так и с реквизитом формы.
И по сути является аналогом метода обычных форм:
Также реализована возможность быстрого добавления колонки «Отметка» и настройки доступности кнопок полей. Процедура должна быть размещена в модуле формы.
Специальные предложения
Использование метода "Сообщить" - нарушение стандартов и методик разработки.
(6) Ну. скажем так, они сами свои стандарты не очень-то соблюдают. Это не самое страшное из всей этой публикации.
Ну и по мелочам: "НЕ ЭлементКолонки = Неопределено" это два логических действия, лучше писать "ЭлементКолонки<>Неопределено".
Обработка, в модуле объекта присваиваю значение реквизиту (тип ТаблицаЗначений), хочу его использовать в модуле управляемой формы, а там уже ДанныеФормыКоллекция, и никакие методы нельзя применить, есть ли из данной ситуации какой либо выход?
(1) egorover, там на клиенте есть похожие методы.
Вам какого не хватило?
(2) ture, ооо приветствую Вас.
переделываю с 8.2 на 8.3, в модуле формы прописана расшифровка из таблицы, заполнение расшифровок этой таблицы в модуле объекта
РасшПериод = тт_пер.Скопировать(); //копирую ТаблицуЗначений тт_пер в РасшПериод
теперь в модуле формы хочу обратится к реквизиту объекта РасшПериод, но он уже ДанныеФормыКоллекция
и методы типа фф=РасшПериод.Найти(Отб.Период); уже не действуют
(10) Boneman, Да делаю так ТЗ = ДанныеФормыВЗначение("РасшПериод"), Несоответствие типов (параметр номер '1')
(12) egorover, не путай операторы.
Я же даже синтаксис привел.
РеквизитФормы в значение - там реквизит надо в кавычках, оно даже само выбирается.
А двнные формы в значение- там обязательно надо указывать тип.
и новый не надо, оно само заполнится.
(13) Boneman,
ТекущаяТаблица = Новый ТаблицаЗначений;
ТекущаяТаблица = РеквизитФормыВЗначение("Объект.Расш");
так то же пустая ТекущаяТаблица
(15) egorover, зачем лепишь ТекущаяТаблица = Новый ТаблицаЗначений;? Я же в(13) еще писал.
вообще не нужна эта строка!
У тебя в принципе
ТекущаяТаблица = РеквизитФормыВЗначение("Объект.Расш"); вернет ТЗ, со всеми колонками, как оно у тебя на форме.
(10) Boneman, ТекущаяТаблица = ДанныеФормыВЗначение(Объект.Расш, Тип("ТаблицаЗначений"));
ТекущаяТаблица получается пустая
(3) Meteorage, да я уже с клиента обращаюсь к реквизиту РасшПериод, 1С уходит в исключение
&НаСервере
Функция тт_расшНайтиСтроки(Знач СтруктураНайти)
потому что Найти() доступно: Сервер, толстый клиент, внешнее соединение.
Задача то какая стоит? тебе заполнить эту таблицу значений нужно или что?
ТаблицаЗначений РасшПериод заполняется при сформировать отчет, теперь я получил отчет, нажимаю на области ТабличногоДокумента и получаю расшифровку в виде другого отчета
(16) egorover, реквизит формы, типа "таблицаЗначений".
В УФ, на форме, это не есть натуральная таблица значений, а ее интерпретация.
Для того тебе и надо ее преобразовать в нормальную ТЗ, а дальше с ней и работать.
(19) Boneman, реквизит формы, типа "таблицаЗначений" - где путь к данным Объект.Расш?
ТекущаяТаблица = РеквизитФормыВЗначение("ОбъектРасш");// т.е. "ОбъектРасш" реквизит формы, который Объект.Расш
по причине:
Недопустимое значение параметра (параметр номер '1')
блин, как объяснить то.
Реквизит формы, это - то, что ты видишь на форме, на вкладке реквизита. А вот путь к данным у них может быть как к объекту, так и просто так.
Т.е. и "Объект.Реквизит", и просто добавленный на форму "реквизит" - оба они являются реквизитами формы.
А вот, если будешь программно к объекту обращатся, то там уже будут только реквизиты объекта и все.
(22) egorover, на твоем скрине я не вижу самого главного, расположения в дереве твоего реквизита.
Если в подчинении "Объект", то куда ты дел точку ?
Вообще не понимаю как можно с таким примитивным синтаксисом не разобраться, оно же все подсказывает, и помогает заполнять.
см.скрин
(23) Boneman, он в подчинении Объекту,
так тоже не работает РеквизитФормыВЗначение("Объект.Расш");
Вообще не понимаю как можно с таким примитивным синтаксисом не разобраться, оно же все подсказывает, и помогает заполнять - сам не понимаю, кстати да, - помогает.
в модуле объекта заполняет, а при
ТЗ = РеквизитФормыВЗначение("Объект.Расш"); получаем пустую таблицу значений
(25) egorover, странно.
Ты это делаешь в модуле формы, в процедуре с директивой &НаСервере, и нет никаких других переменных с таким же именем ?
(29) egorover, да при чем тут модуль объекта ?
Полное ощущение что мы на разных языках говорим.
тебе надо делать.
По пунктам
1. Получаем в модуле ФОРМЫ на СЕРВЕРЕ, таблицу значений, из данных формы в объект прикладного типа (таблицу значений), способом как уже разжевано выше.
2. Передаем эту таблицу значений, в процедуру модуля ОБЪЕКТА, и делаем с ней все что нужно
3. Возвращаем результат на ФОРМУ, и в ее модуле, НА СЕРВЕРЕ, передаем ТЗ обратно в данные формы.
в каком именно месте затык ?
(31) Boneman,
1. таблица значений Расш, реквизит Объекта, своего рода хранилище
2. из ФОРМЫ вызываем функцию модуля ОБЪЕКТА он возвращает (Таб) результатов отчета, и в ней же (функции модуля ОБЪЕКТА ) делаем заполнение таблица значений Расш
3. теперь получили данные (Таб) на ФОРМЕ, но не можем получить таблица значений Расш.
(32) egorover, ты хоть вчитайся что тебе пишут, и как нужно применять методы.
Иван в (30) уже тебе кодом написал, как сделать мои 3 пункта.
Данные формы, в модуле объекта, ты не получишь никогда, потому-что формы там просто нет и не может быть.
Туда ты должен передавать готовые для переваривания объекты.
Изучай мат.часть, чесн. говоря - все что можно было рассказать по этой теме, уже в топике изложено. Я даже затрудняюсь что-либо добавить,
осталось только взять и сделать.
(25) после заполнения в модуле обработки вы не использовали "обратный" метод "ЗначениеВРеквизитФормы(, )" для реквизита формы "Объект", поэтому "Объект" (коллекция формы) хранит старые значения (незаполненную коллекцию табличной части).
(25) egorover, если нет обратного преобразования, то надо использовать:
+ (28) точнее надо использовать название переменной объекта, с помощью которой вызывался метод модуля объекта: например,
Таблица значений часто применяется при программировании на 1С, потому что имеет множество полезных возможностей и работает очень быстро. Таблица значений создается в памяти и не сохраняется в базе данных, т.е. это временный набор данных.
//можно указать тип данных каждой колонки
//если тип данных колонки не указан, то можно хранить данные любого типа
Синтаксис: НоваяКолонка(, , , , , , , )
Добавление строк в таблицу значений
Перебор строк таблицы значений
Сортировка таблицы значений
Поиск в таблице значений
Синтаксис: НайтиЗначение(,,)
Возвращает число: 0 - значение не найдено; 1 - значение найдено
Если указан параметр , то поиск производится только по заданной строке
Если указан параметр , то поиск производится только по заданной колонке
Итоги и группировка таблицы значений
//часто требуется группировать строки и подсчитывать итоги по группам,
//в этом случае применяется метод Свернуть
Удаление строк и колонок из таблицы значений
ВНИМАНИЕ
Часто требуется удалить строки, удовлетворяющие определенному условию.
Так как при удалении строки из таблицы значений следующая строка становится текущей,
то указанная ниже программа может удалить НЕ ВСЕ необходимые строки.
В этом случае я рекомендую использовать следующий прием:
А вот еще один правильный алгоритм, предложенный Wlad:
Замечание(Туц). Предыдущий вариант не совсем правильный. Случай, когда последняя строка попадает под условие и в условии идёт обращение к строке таблицы, приводит к ошибке. Т.е. происходит попытка чтения для строки 0.
И ещё вариант, предложенный Туц:
Замечание (vligm). А я использую такой алгоритм (это, собственно говоря, шаблон):
Таблица значений как элемент диалога
Таблица значений может использоваться в экранных формах как элемент диалога с пользователем.
Методы УстановитьЗначение и ПолучитьЗначение
Эти методы позволяют обращаться к данным в таблице значений для чтения и записи.
Они могут пригодиться в особых случаях при написании универсальных программ (мастеры отчетов и т.д.).
Примеры взаимных преобразований Таблицы значения в Дерево значений или Табличный документ с использованием универсальных функций и макетов Системы компоновки данных. Примеры представлены в форме удобной для копирования в разработку.
Переход с обычного на управляемое приложение обязывает программиста изменить уже ставшие привычными приёмы написания программного кода.
В этой статье предложены шаблоны программного кода, которые позволяют выполнять различные операции с Таблицой Значений или Деревом Значений в управляемой форме.
В 1С:классификации Таблица Значений и Дерево Значений (ТЗ и ДЗ) представляют собой не сохраняемый в базе объект. В связи с этим, описание коллекций значений для программирования выполняется оперативно в момент обращения к ним.
Для сокращения трудозатрат программиста, в статье предложена универсальная процедура вывода ТаблицыЗначений или ДереваЗначений на экран. Эта процедура программно заполняет колонки реквизита управляемой формы, что весьма удобно при отладке.
На примерах показаны различия работы с КоллекциямиЗначений в толстом и тонком клиентах управляемой формы.
Из примеров следуют общие правила:
А) для толстого клиента ограничений нет. Примеры 1 и 4.
Б) для тонкого клиента – обработку коллекции необходимо выполнять на сервере, там же следует обеспечить вывод результата на экран.
Предложенная универсальная процедура СоздатьКолонкиУпр() программно добавляет колонки в реквизиты формы и преобразовывает коллекциюЗначений в ДанныеФормы.
Универсальную процедуру СоздатьКолонкиУпр() рекомендуется размещать в общем модуле конфигурации. Если это невозможно, то процедура успешно работает в модуле внешнего отчета.
В обычном приложение аналогом является процедура СоздатьКолонки(), которая удаляет старые колонки и загружает новые колонки из источника данных в табличное поле.
Примечание.
Разница между обычным и управляемым приложениями уже была изложена в аналогах.
Эта статья систематизирует методы работы с коллекциями значений и предлагает удобные для копирования варианты программного кода. Цель статьи – сократить трудозатраты программиста при выборе между толстым и тонким клиентами для использования таблицы (ТЗ) или дерева значений (ДЗ) в качестве источника данных для СистемыКомпоновкиДанных (СКД).
Блок-схема подготовки источника внешних данных для СКД на основании не сохраняемых в базе объектов приведена на прилагаемом рисунке.
Третья группа примеров на Видео демонстрирует реализацию всех веток блок – схемы.
Текст озвучки видео.
Сейчас будут показаны варианты программирования работы с таблицей и деревом значений в тонком и толстом клиентах управляемого приложения.
Откроем 1С:Предприятие в Тонком и Толстом клиентах.
Во всех примерах состав колонок Таблицы Значений или Дерева Значений произвольный, то есть заранее не известен. Программное заполнение реквизитов управляемой формы будет выполнено функцией СоздатьКолонкиУпр().
1) В толстом клиенте никаких ограничений нет. Пример №1 выводит на экран новую таблицу. Пример №4 редактирует существующую таблицу. Все операции можно выполнять на клиенте.
Толстый клиент закрываем.
Остальные примеры рассмотрим в тонком клиенте.
2) В тонком клиенте (пример №2) дерево создается на сервере. Пример №5 редактирует существующее дерево на сервере.
- Пример №6 преобразовывает ДеревоЗначений в таблицу. Это действие востребовано при передаче внешних данных в СКД.
3) Если программист вынужден передать в обработку КоллекциюЗначений через клиента, то это можно выполнить с помощью временного хранилища. Смотрим пример №3.
- Пример №7 показывает как таблицу преобразовать в дерево, используя макет ОсновнаяСхемаКомпоновкиДанных.
4) Заполним ТаблицуЗначений заново и в примере №8 преобразуем её в табличный документ. Теперь можно напечатать результат.
5) Далее отключим конфигуратор и демонстрируем, что ручной ввод с экрана новых строк не нарушает алгоритмов преобразования. (Примечание. Работа с добавлением колонок была показано ранее.)
- Создаём таблицу значений (Пример.3)
- и добавляем строку вручную.
- и добавляем строки в последний уровень и первый,
- Меняем значение первой колонки
6) Третья группа примеров посвящена применению Системы Компоновки Данных (СКД). Здесь будет продемонстрировано практическое использование ранее изложенных приемов для ввода данных в СКД.
- Примеры третьей группы полезны программисту в случаях, когда возникает необходимость применить методы обработки данных не доступные в СКД.
- Пример 10.1. Получаем табличный документ типовой работой СКД со справочником на основании макетаДЗ.Обращаем внимание, что макетДЗ не имеет настроек на ввод данных из внешнего набора, т.е макетДЗ можно построить конструктором.
- Пример 10.2. Получаем тоже самое в форме ДереваЗначений. Добавляем строку и меняем ей родителя на «Блузу».
- Пример 10.3. Возвращает изменённое ДеревоЗначений в формат ТабличногоДокумента по структуре, заданной в макетеДЗ. Такое преобразование востребовано, например, для печати результата типовыми методами.
- Видим, что в сложных для программиста случаях, данные табличного документа можно скорректировать либо вручную, либо программно, используя промежуточное дерево значений.
- Предварительно преобразуем ДЗ в ТЗ. (Пример.6)
- Пример 10.4. Повторяет то же самое для ТаблицыЗначений.
- Техническое решение примеров 10.3 и 10.4 обеспечивает функция ВернутьТабДокСервер(), которая:
- В пустой макет «СКДТонкийКлиент» программно устанавливает НаборДанныхОбъект, который заполняем внешними данными из отредактированной ТЗ.
- Настройки копируем из макетаДЗ.
- Результатом будет требуемый ТабличныйДокумент, учитывающий внесенные изменения в таблицу значений ТЗ.
7) Заключение. Демонстрация показала:
- Процедура СоздатьКолонкиУпр() выполняет такие же функции как процедура. СоздатьКолонки() обычного приложения.
- Если исходная коллекция и результат её преобразования размещены в одной управляемой форме, то необходимо очищать колонки источника во избежание дублирования наименований в приёмнике. (Процедура ОчиститьКоллекциюЗначенийНаСервере()).
- В тонком клиенте модули управления коллекцией значений обязательно следует размещать на сервере.
- Для преобразования коллекции значений в табличной документ с независимым макетомСКД можно применить функцию Скд_ВнешниеДанные().
- Независимый макетСКД можно создать на основании другого макета, например, макетДЗ. Для решения этой задачи можно применить функцию ВернутьТабДокСервер().
- Примечание. Программный код представлен способом, повышающим удобство копирования в разработку. Размеры базовых блоков программного кода, назначенных к копированию в разработку, не превышают четырёх строк.
Желаю успехов всем и каждому.
Описание Процедуры СоздатьКолонкиУпр()
Синтаксис:
Параметры:
Тип:УправляемаяФорма. Форма, в реквизите которой требуется программно определить состав колонок.
Тип:Строка. Имя реквизита как указано в управляемой форме. Этому реквизиту следует определить состав колонок. Тип реквизита должен быть либо ТаблицаЗначений, либо ДеревоЗначений.
Тип:ТаблицаЗначений, ДеревоЗначений, АдресВременногоХранилища. Источник данных, который следует вывести на экран. Тип источника данных должен быть либо ТаблицаЗначений, либо ДеревоЗначений. Причем, для этого реквизита состав колонок указанный в управляемой форме должен быть пустым.
Описание:
Для любого прикладного объекта типа таблицаЗначений или деревоЗначений, программно создаётся состав колонок реквизита управляемой формы. Затем прикладной объект преобразовывается в данные формы и выводится на экран.
Процедура применяется в случаях, когда состав колонок коллекцииЗначений заранее не определён.
Доступность:
Примечание:
Описание Функции ВернутьТабДокСервер()
Синтаксис:
Параметры:
Тип:ТаблицаЗначений. Источник данных для формирования результата СКД.
Тип:Строка. Адрес временного хранилища, в которое помещен макет схемы компоновки данных (Тип:СхемаКомпоновкиДанных).
Тип:НастройкиКомпоновкиДанных. Текущие настройки макета СКД.
Описание:
Возвращает ТабличныйДокумент с данными из ТаблицыЗначений (ТЗисточник) преобразованными по структуре МакетаСКД
Доступность:
Примечание:
Описание Функции скд_ВнешниеДанные ()
Синтаксис:
Параметры:
Тип:ТаблицаЗначений. ДанныеФормыКоллекция. Источник данных для формирования результата СКД.
Тип:Строка. Допустимые значения: «ТабДок», «ТабличныйДокумент», «ДЗ», «ДеревоЗначений», «ТЗ», «ТаблицаЗначений».
Тип:НастройкиКомпоновкиДанных. Текущие настройки макета СКД.
Описание:
Возвращает результат СКД заданного типа с данными из ТаблицыЗначений преобразованными по структуре МакетаСКД
Читайте также: