Работа с табличной частью объектов в 1С

Табличные части существуют у многих объектов в 1С:

  • Справочники
  • Документы
  • Отчеты и обработки
  • Планы счетов
  • Планы видов характеристик
  • Планы видов расчета
  • Бизнес-процессы и задачи

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

Рассмотрим некоторые приемы работы с табличными частями.

Как обойти табличную часть

Для обхода табличной части можно использовать цикл Для каждого

Для каждого Строка из ТабличнаяЧасть Цикл

Сообщить(Строка.РеквизитТабличнойЧасти);

КонецЦикла;

На каждой итерации в переменную Строка передается очередная строка табличной части. Значения реквизитов строки можно получить выражением Строка.ИмяРеквизита.

Как получить и обойти выделенные строки табличной части

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

Работа с табличной частью объектов в 1СДля получения перечня выделенных строк используется следующий код:

ВыделенныеСтроки=ЭлементыФормы.ИмяТабличногоПоля.ВыделенныеСтроки;

Для того чтобы обойти выделенные строки используется цикл Для каждого:

ВыделенныеСтроки=ЭлементыФормы.ИмяТабличногоПоля.ВыделенныеСтроки;

Для каждого Строка из ВыделенныеСтроки Цикл

//содержимое цикла

КонецЦикла;

Как программно выделить строки табличной части (табличного поля) и снять выделение

Чтобы программно снять выделение строк табличного поля:

ЭлементыФормы.ИмяТабличногоПоля.ВыделенныйСтроки.Очистить();

Чтобы программно выделить все строки табличного поля:

 Для каждого ТекущаяСтрока Из ТабличнаяЧасть Цикл
ЭлементыФормы.ИмяТабличногоПоля.ВыделенныеСтроки.Добавить(ТекущаяСтрока);
КонецЦикла;

Как очистить табличную часть

ТабличнаяЧасть.Очистить();

Как получить текущую строку табличной части

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

Для обычных форм код будет выглядеть так:

ЭлементыФормы.ИмяТабличногоПоля.ТекущиеДанные;

Для управляемых форм:

Элементы.ИмяТабличногоПоля.ТекущиеДанные;

Как добавить новую строку в табличную часть

Добавление новой строки в конец табличной части:

НоваяСтрока=ТабличнаяЧасть.Добавить();
НоваяСтрока.Реквизит1="Значение";

Добавление новой строки в любое место табличной части (последующие строки будут сдвинуты):

НоваяСтрока=ТабличнаяЧасть.Вставить(Индекс)
//Индекс - номер добавляемой строки. Нумерация строк начинается с нуля.

НоваяСтрока.Реквизит1="Значение";

Как программно заполнить реквизиты строки табличной части

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

Создаваемая обработчиком процедура имеет три параметра:

  • Элемент — содержит элемент управления ТабличноеПоле.
  • НоваяСтрока — булево. Содержит значение Истина, если добавляется новая строка табличной части, и Ложь, если пользователь начал редактировать уже существующую строку.
  • Копирование — булево. Содержит значение Истина, если пользователь копирует строку, и Ложь в остальных случаях.

Рассмотрим пример. Допустим, нам нужно заполнить реквизит табличной части СчетУчета, в случае, когда добавляется новая строка. При редактировании существующей строки изменять счет учета не нужно.

Процедура ТабличнаяЧастьПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)

//Если пользователь редактирует существующую строку, то ничего не делаем
Если НЕ НоваяСтрока Тогда
Возврат;
КонецЕсли;

//Если же строка новая, устанавливаем счет учета
ТекСтрока = Элемент.ТекущиеДанные; //Получили текущую строку табличной части
ТекСтрока.СчетУчета = ПланыСчетов.Хозрасчетый.НужныйСчетУчета;
КонецПроцедуры

 

Работа с табличной частью объектов в 1С: 14 комментариев

  1. Юрий

    Приветствую!
    Только начал изучать 1С.
    Кое что уже знаю, но мало и опыта практически ноль.
    Создал свою конфигурацию, пока только для тестов.
    В данной конфигурации есть документ, назовем его «Заявка».
    В данной заявке, есть табличная часть, в которой есть реквизит «Стоимость».
    Получается, что таких документов много и мне нужно сложить все реквизиты «Стоимость» из всех документов «Заявка».
    Вопрос.
    Как мне это сделать?
    Предполагаю, что нужно использовать функцию с экспортом, в которой будет цикл «Для Каждого ……»
    Но как это оформить, пока не могу понять…

    1. Нестандартные решения в 1С Автор записи

      Добрый день.

      Сделать это можно по-разному. Цикл Для каждого, на мой взгляд, не очень подходящий вариант, т.к. будет работать слишком долго. Да и надо еще где-то список документов брать.

      Я бы порекомендовал сделать запрос к табличной части документа (именно к табличной части, а не к документу). Выбрать там ваш столбец Стоимость и другие столбцы, если нужно. И применить функцию СУММА к этому столбцу. Подробнее и с примерами смотрите в статье Группировки в запросах 1С http://chel1c.ru/querry_group/

  2. Эдуард

    А может это подойдет?

    Табличная часть (Tabular section)
    Итог (Total)
    Синтаксис:

    Итог()
    Параметры:

    (обязательный)

    Тип: Число; Строка.
    Индекс либо имя колонки, по которой подсчитывается итог.
    Возвращаемое значение:

    Тип: Число; Неопределено.

    Описание:

    Суммирует значения всех строк в указанной колонке.
    Если в колонке установлен тип и он единственный, то при суммировании будет предприниматься попытка преобразования значения к типу Число.
    Если колонке не присвоены типы, то в процессе суммирования будут принимать участие только значения, имеющие тип Число, значения других типов будут игнорироваться.
    Если в колонке несколько типов и среди них есть тип Число, то в процессе суммирования будут принимать участие только значения, имеющие тип Число, значения других типов будут игнорироваться.
    Если в колонке несколько типов и среди них нет типа Число, то результатом будет значение Неопределено.

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

    Сервер, толстый клиент, внешнее соединение.
    Пример:

    ВсегоПоДокументу = Состав.Итог(«Всего»);

    1. Нестандартные решения в 1С Автор записи

      Это подошло бы, если бы нужно было суммировать колонку в одном документе. А Юрию нужно суммировать колонку Стоимость всех документов.

  3. Роман

    Добрый день!
    Достаточно ли будет обратиться в модуле формы к текущей строке табличной части или в модуле менеджера тоже нужно будет что-то прописать?

    1. Нестандартные решения в 1С Автор записи

      Не совсем понял, о чем конкретно вопрос.
      Если о том, как получать и работать с текущей строкой табличной части, то в модуле менеджера ничего писать не нужно.

  4. Александр Юсупов

    Здравствуйте!
    Опишу вкратце ситуацию:
    Из документа вызывается команда печати штрихкодов и в обработку печати передается, как я понимаю, весь контекст документа и печатаются этикетки для всех строк документа. Возможно ли в обработке печати получить информацию только о выделенных строках из этого контекста ? Прилагаю код модуля команды ПечатьЭтикеток.
    &НаКлиенте
    Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)

    ТабДокумент = Заполнялка(ПараметрКоманды);

    //Создаём новую коллекцию печатных форм
    КоллекцияПечатныхФорм = УправлениеПечатьюКлиент.НоваяКоллекцияПечатныхФорм(«ПечатьЭтикеток»);
    //Добавляем в коллекцию сформированный табличный документ
    КоллекцияПечатныхФорм[0].ТабличныйДокумент = ТабДокумент;
    //Устанавливаем параметры печати (при необходимости)
    КоллекцияПечатныхФорм[0].Экземпляров = 1;
    КоллекцияПечатныхФорм[0].СинонимМакета = «ПечатьЭтикеток»; //Так будет выглядеть имя файла при сохранении в файл из формы «Печать документов»
    //Вывод через стандартную процедуру БСП
    УправлениеПечатьюКлиент.ПечатьДокументов(КоллекцияПечатныхФорм, Неопределено, Неопределено);КонецПроцедуры

    &НаСервере
    Функция Заполнялка(ДокСсылка) Экспорт
    ТабДокумент = Новый ТабличныйДокумент;

    ТабДокумент.АвтоМасштаб = истина ;
    ТабДокумент.ОтображатьСетку = Ложь;
    ТабДокумент.ТолькоПросмотр = Истина;
    ТабДокумент.ОтображатьЗаголовки = Ложь;

    ТабДокумент.ИмяПараметровПечати = «КВБ1» ;

    ВнешняяКомпонента = ПервыйМодуль.ПодключитьВнешнююКомпонентуПечатиШтрихкода();

    Макет = ДокСсылка.ПолучитьОбъект().ПолучитьМакет(«Этикетка»);
    Для каждого Стр Из ДокСсылка.Картриджи Цикл
    //Если Лев(Стр.СерийныйНомер,2) «30» Тогда
    // Продолжить;
    //КонецЕсли;
    ОбластьМакета = Макет.ПолучитьОбласть(«ШПК»);

    ЧтоТо = Стр.СерийныйНомер;
    ПервыйМодуль.ВывестиШтрихкодДокументаВОбластьМакета(ВнешняяКомпонента,ОбластьМакета,ЧтоТо) ;

    ОбластьМакета.Параметры.Клиент = ДокСсылка.Партнер;
    ОбластьМакета.Параметры.Орг = «СК ПОТОК тел.78-06-78»;//Константы.пмОрганизацияДляСервиса.Получить();
    ОбластьМакета.Параметры.КЖ = СокрЛП(Стр.Картридж.Артикул);
    ОбластьМакета.Параметры.СерийныйНомер = Стр.СерийныйНомер;

    ТабДокумент.Вывести(ОбластьМакета);
    ТабДокумент.ВывестиГоризонтальныйРазделительСтраниц();
    КонецЦикла;

    1. Нестандартные решения в 1С Автор записи

      Добрый день.

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

  5. Александр Юсупов

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

    1. Нестандартные решения в 1С Автор записи

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

      1. Александр

        Можно представить каждую строку как структуру и потом структуры поместить в массив. Получится массив структур и так передать. НУ если уж совсем извратиться то можно например сериализовать все с JSON …)))

  6. Олег

    Доброго времени суток!
    Создаю обработку на обычных формах, в которой имеется несколько Табличных частей. Они в свою очередь находят отображение в Форме обработки. И если данные первых 3, меня после закрытия Формы, не интересуют, то данные последней хотелось-бы использовать в дальнейшем, пока открыта обработка. В настоящее время при закрытии Формы Табличные части очищаются. В дальнейшем, в новом сеансе работы с обработкой эти данные не нужны. Насколько я понимаю Функции сохранения Данных Табличной части обработки не существует. Табличную часть в обработке решил использовать из-за возможности сохранить структуру Данных. Как мне сохранить эти данные для использования в других окнах?
    Может у Вас есть видео по данному вопросу?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *