Получить таблицу значений из скд 1с

Обновлено: 04.07.2024

Переход с обычного на управляемое приложение обязывает программиста изменить уже ставшие привычными приёмы написания программного кода.

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

В 1С:классификации Таблица Значений и Дерево Значений (ТЗ и ДЗ) представляют собой не сохраняемый в базе объект. В связи с этим, описание коллекций значений для программирования выполняется оперативно в момент обращения к ним.

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

На примерах показаны различия работы с КоллекциямиЗначений в толстом и тонком клиентах управляемой формы.

Из примеров следуют общие правила:

А) для толстого клиента ограничений нет. Примеры 1 и 4.

Б) для тонкого клиента – обработку коллекции необходимо выполнять на сервере, там же следует обеспечить вывод результата на экран.

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

Универсальную процедуру СоздатьКолонкиУпр() рекомендуется размещать в общем модуле конфигурации. Если это невозможно, то процедура успешно работает в модуле внешнего отчета.

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

Примечание.

Разница между обычным и управляемым приложениями уже была изложена в аналогах.

Эта статья систематизирует методы работы с коллекциями значений и предлагает удобные для копирования варианты программного кода. Цель статьи – сократить трудозатраты программиста при выборе между толстым и тонким клиентами для использования таблицы (ТЗ) или дерева значений (ДЗ) в качестве источника данных для СистемыКомпоновкиДанных (СКД).

Блок-схема подготовки источника внешних данных для СКД на основании не сохраняемых в базе объектов приведена на прилагаемом рисунке.

Третья группа примеров на Видео демонстрирует реализацию всех веток блок – схемы.

Текст озвучки видео.

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

Откроем 1С:Предприятие в Тонком и Толстом клиентах.

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

1) В толстом клиенте никаких ограничений нет. Пример №1 выводит на экран новую таблицу. Пример №4 редактирует существующую таблицу. Все операции можно выполнять на клиенте.

Толстый клиент закрываем.

Остальные примеры рассмотрим в тонком клиенте.

2) В тонком клиенте (пример №2) дерево создается на сервере. Пример №5 редактирует существующее дерево на сервере.

  1. Пример №6 преобразовывает ДеревоЗначений в таблицу. Это действие востребовано при передаче внешних данных в СКД.

3) Если программист вынужден передать в обработку КоллекциюЗначений через клиента, то это можно выполнить с помощью временного хранилища. Смотрим пример №3.

  1. Пример №7 показывает как таблицу преобразовать в дерево, используя макет ОсновнаяСхемаКомпоновкиДанных.

4) Заполним ТаблицуЗначений заново и в примере №8 преобразуем её в табличный документ. Теперь можно напечатать результат.

5) Далее отключим конфигуратор и демонстрируем, что ручной ввод с экрана новых строк не нарушает алгоритмов преобразования. (Примечание. Работа с добавлением колонок была показано ранее.)

  1. Создаём таблицу значений (Пример.3)
    1. и добавляем строку вручную.
    1. и добавляем строки в последний уровень и первый,
    1. Меняем значение первой колонки

    6) Третья группа примеров посвящена применению Системы Компоновки Данных (СКД). Здесь будет продемонстрировано практическое использование ранее изложенных приемов для ввода данных в СКД.

    1. Примеры третьей группы полезны программисту в случаях, когда возникает необходимость применить методы обработки данных не доступные в СКД.
    2. Пример 10.1. Получаем табличный документ типовой работой СКД со справочником на основании макетаДЗ.Обращаем внимание, что макетДЗ не имеет настроек на ввод данных из внешнего набора, т.е макетДЗ можно построить конструктором.
    3. Пример 10.2. Получаем тоже самое в форме ДереваЗначений. Добавляем строку и меняем ей родителя на «Блузу».
    4. Пример 10.3. Возвращает изменённое ДеревоЗначений в формат ТабличногоДокумента по структуре, заданной в макетеДЗ. Такое преобразование востребовано, например, для печати результата типовыми методами.
    5. Видим, что в сложных для программиста случаях, данные табличного документа можно скорректировать либо вручную, либо программно, используя промежуточное дерево значений.
    6. Предварительно преобразуем ДЗ в ТЗ. (Пример.6)
    7. Пример 10.4. Повторяет то же самое для ТаблицыЗначений.
    8. Техническое решение примеров 10.3 и 10.4 обеспечивает функция ВернутьТабДокСервер(), которая:
      1. В пустой макет «СКДТонкийКлиент» программно устанавливает НаборДанныхОбъект, который заполняем внешними данными из отредактированной ТЗ.
      2. Настройки копируем из макетаДЗ.
      3. Результатом будет требуемый ТабличныйДокумент, учитывающий внесенные изменения в таблицу значений ТЗ.

      7) Заключение. Демонстрация показала:

      1. Процедура СоздатьКолонкиУпр() выполняет такие же функции как процедура. СоздатьКолонки() обычного приложения.
      2. Если исходная коллекция и результат её преобразования размещены в одной управляемой форме, то необходимо очищать колонки источника во избежание дублирования наименований в приёмнике. (Процедура ОчиститьКоллекциюЗначенийНаСервере()).
      3. В тонком клиенте модули управления коллекцией значений обязательно следует размещать на сервере.
      4. Для преобразования коллекции значений в табличной документ с независимым макетомСКД можно применить функцию Скд_ВнешниеДанные().
      5. Независимый макетСКД можно создать на основании другого макета, например, макетДЗ. Для решения этой задачи можно применить функцию ВернутьТабДокСервер().
      6. Примечание. Программный код представлен способом, повышающим удобство копирования в разработку. Размеры базовых блоков программного кода, назначенных к копированию в разработку, не превышают четырёх строк.

      Желаю успехов всем и каждому.

      Описание Процедуры СоздатьКолонкиУпр()

      Синтаксис:

      СоздатьКолонкиУпр(<ФормаЭта>, <ИмяРеквизита>, <КоллекцияЗначений>)

      Параметры:

      Тип:УправляемаяФорма. Форма, в реквизите которой требуется программно определить состав колонок.

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

      Тип:ТаблицаЗначений, ДеревоЗначений, АдресВременногоХранилища. Источник данных, который следует вывести на экран. Тип источника данных должен быть либо ТаблицаЗначений, либо ДеревоЗначений. Причем, для этого реквизита состав колонок указанный в управляемой форме должен быть пустым.

      Описание:

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

      Процедура применяется в случаях, когда состав колонок коллекцииЗначений заранее не определён.

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

      Примечание:

      Описание Функции ВернутьТабДокСервер()

      Синтаксис:

      ВернутьТабДокСервер (<ТЗисточник >, < АдресМакетаСКД >, < НастройкиСКД_1>)

      Параметры:

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

      Тип:Строка. Адрес временного хранилища, в которое помещен макет схемы компоновки данных (Тип:СхемаКомпоновкиДанных).

      < НастройкиСКД _1> (обязательный)

      Тип:НастройкиКомпоновкиДанных. Текущие настройки макета СКД.

      Описание:

      Возвращает ТабличныйДокумент с данными из ТаблицыЗначений (ТЗисточник) преобразованными по структуре МакетаСКД

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

      Примечание:

      Описание Функции скд_ВнешниеДанные ()

      Синтаксис:

      Скд_ВнешниеДанные (<ТЗ_внешниеДанные>, <ТипРезультата="ТабДок">, <АдресМакетаСКД="">, <НастройкиСКД=Неопределено>)

      Параметры:

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

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

      Тип:Строка. Допустимые значения: «ТабДок», «ТабличныйДокумент», «ДЗ», «ДеревоЗначений», «ТЗ», «ТаблицаЗначений».

      < АдресМакетаСКД > (не обязательный)

      < НастройкиСКД > (не обязательный)

      Тип:НастройкиКомпоновкиДанных. Текущие настройки макета СКД.

      Описание:

      Возвращает результат СКД заданного типа с данными из ТаблицыЗначений преобразованными по структуре МакетаСКД

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

      ТабличныйДокумент выглядит так:


      Загрузку решено было сделать с использованием СКД. Был создан следующий макет:


      В объекте "Область" передается ОбластьЯчеекТабличногоДокумента содержащая исходные данные.



      Для получения ТаблицыЗначений использовалась следующая функция:

      Полученная ТаблицаЗначений далее использовалась в запросе:

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



      Настройки макета компоновки при этом не изменились.

      Однако, при использовании полученной ТаблицыЗначений в запросе, стала появляться ошибка:


      Причиной был тип колонки "КодERP", вернее его отсутствие. Напомню, что данная колонка была получена из вычисляемого поля.

      Так выглядит колонка "КодERP" до использования ВычисляемогоПоля:


      Так выглядит колонка "КодERP" после использования ВычисляемогоПоля:


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

      Процедура получения таблицы значений была переделана:

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

      А так выглядит колонка КодERP после использования ВычисляемогоПоля и вызова метода УстановитьОбъект():

      В одном документе для расчета потребовалось получать данные из отчета на СКД, реализовал следующим образом:

      Разместил: all4cf  Версии: | 8.x |  Дата: 17.02.2016   Прочитано: 31427

      Распечатать

      Похожие FAQ

      17 правил для составления оптимального ЗАПРОСа к данным базы 1С  42
      Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ COM-подключение к базе 7.7 из 8.2 1С  6
      Если код выполняется на стороне клиента, то необходимо наличие базы 7.7 на локальной машине. Пример (На форме объекта присутствует реквизит Таблица(ТаблицаЗначений)): НаКлиенте Процедура Загрузки() ПутьКБазе=" D:ВашаБаза1с77" ; Пользователь= Microsoft SQL Server Native Client Добавление значения в столбец "datetime" привело к переполнению  1
      При формировании отчета на СКД получили ошибку: Microsoft SQL Server Native Client 11.0: Добавление значения в столбец "datetime" привело к переполнению Подробнее текст такой: . по причине: Ошибка компоновки данных по причине: Ошибка получени Быстрая функция чтения данных с листа Excel  9
      При чтении файла Excel я использую вариантный массив. Он позволяет быстро получить ВСЮ таблицу листа в память, а также получать данные массива целыми колонками. Тем самым время на чтение области файла Excel в таблицу значений сокращается в десятки ра Вертикальная автофиксация для СКД  0
      В СКД очень не хватает возможности автофиксации строк. Обусловлено это невозможностью однозначно определить их количество в общем случае. Однако в большинстве случаев это можно сделать Обращаю ваше внимание, что приведенная процедура работает не все Посмотреть все результаты поиска похожих

      Создание нового внешнего отчета

      Открываем модуль объекта и создаем предопределенную процедуру ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

      Создание предопределенной процедуры

      Внутри этой процедуры будем собирать данные и формировать отчет.
      В процедуре ПриКомпоновкеРезультата отключаем стандартную обработку. СтандартнаяОбработка = Ложь;
      Затем формируем таблицу значений произвольным образом. Имена колонок таблицы значений должны совпадать с будущими полями набора данных в СКД.:


      Для примера добавим три строки данных. Далее по шагам создаем вывод отчета.

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

      Добавление нового макета СКД

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

      Создание набора данных и полей отчета СКД

      Добавляем ресурсы, если это необходимо. По ним будут считаться итоги. В нашем случае это поля Количество и Сумма.

      Добавление ресурсов набора данных СКД

      В закладке Настройки с помощью конструктора настроек формируем вариант отчета по умолчанию

      Настройка варианта отчета СКД

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

      Пример отчета СКД с данными из таблицы значений


      Вот и все. Достаточно просто, не правда ли?

      Читайте также: