1с как обратиться к табличной части документа
Перейти к содержимому

1с как обратиться к табличной части документа

  • автор:

1с как обратиться к табличной части документа

:((( Как обратиться к строке табличной части документа, если имя табличной части содержится в некоторой переменной (переменная получилась из цикла, в котором перебирались все табличные части этого документа). Как-то же через [], блин. . Помогите, пожалста.

вот блин. с темой напутал.
ЭтотОбъект[Имя]ЕМое
что такое ЭтотОбъкет? — документ?!
что такое ЕМое?
ага. ЕМае — это строка.
А как цикл для всех строк сделать?

ЭтотОбъект, а не ЭтотОбъкет — это документ, ты же не написал, где ты вообще все это действуешь, поэтому я предположил, что в модуле документа или модуле формы документа.

ЕМое, а не ЕМае — это строка конечно, в данном случае это строка «неужелитысамнемогпосмотретьэтуфигнювкниге».

А вот строка табличной части — это ЭтотОбъект[Имя][Номер].

Иди почитай доку, раз уж таких вещей не знаешь, бывает полезно.

Насчет ЭтотОбъект[Имя][Номер] могу ошибаться, написал по памяти, может быть так и нельзя :o)

опустим грамматические ошибки))
действие происходит в модуле внешней обработки документа
доку я безусловно читал (не всю конечно, но и не одну)
как обращаться к строке понятно, спасибо(в доке это действительно есть), главным вопросом остается то как сделать цикл для перебора строк в табличной части, имя которой записано в переменную

(0) Не пойму. Зачем тебе еще че-то получать, если имя таблицы у тебя уже есть в переменной.
(7) Для Каждого строкаТЧ из ТвояТЧ Цикл .
(8) У него в переменной не табличная часть, а ИМЯ табличной части

(9) + Для А = 0 По ТвояТЧ.Количество() — 1 Цикл . вроде тоже работает.
Лень смотреть то, что человеку самому лень смотреть :-!

прошу прощения — записано не имя а сама табличная чать.
(9) не работает:

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

ошибка: Итератор для значения не определен
Для каждого Строка из ТабличнаяЧасть Цикл
З.Ы. (7) в переменной сама табличная часть, напутал((.

(12) «записано не имя а сама табличная чать»
Ноу комментс. Я пас. Человек вообще смотрю паталогически то ли ленив то ли не сильно способен программировать :o)

Программная обработка табличных частей объектов в 1С 8.3

В предыдущей статье мы узнали, как настраивать и конфигурировать табличные части объектов 1С 8.3. В этой статье мы изучим некоторые вопросы программной работы с табличными частями 1С.

Заполнение табличной части 1С 8.3

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

Табличная часть реквизита Объект

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

Команда 1С и размещение её на форме

Исполнение команды будет выполняться в серверном контексте, поскольку объект Запрос не работает в клиентском контексте на тонком клиенте.

&НаСервере Процедура ЗаполнитьТоварамиНаСервере() Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Товары.Ссылка КАК Товар, | 1 КАК Количество |ИЗ | Справочник.Товары КАК Товары |ГДЕ | НЕ Товары.ПометкаУдаления"; Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл НовСтр = Объект.СписокТоваров.Добавить(); ЗаполнитьЗначенияСвойств(НовСтр,Выборка); КонецЦикла; КонецПроцедуры &НаКлиенте Процедура ЗаполнитьТоварами(Команда) ЗаполнитьТоварамиНаСервере(); КонецПроцедуры 

При обходе запроса, я использую метод Добавить табличной части объекта (вообще это метод объекта, который имеет тип ДанныйФормыКоллекция, именно в этот тип преобразуется табличная часть документа-объекта, при создании на сервере). Данный метод является функцией, которая создаёт и возвращает новую строку.

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

Очистка табличной части документа 1С 8.3

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

Объект.СписокТоваров.Очистить(); 

После выполнения этого метода вся табличная часть будет очищена.

Текущая строка табличной части 1С 8.3

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

Текущая строка табличной части 1С 8.3

Например, может возникать ситуация, что мы редактируем какое-нибудь поле текущей строки таблицы на форме, и нам нужно, чтобы было пересчитано другое поле (или несколько полей) этой текущей строки. Например, мы изменяем цену (или количество) нашей табличной части, и необходимо, чтобы сумма автоматически была пересчитана.

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

Возврат полей свойством ТекущиеДанные

Для того, чтобы отработать изменение текущего поля цены, создадим обработчик события ПриИзменении этого поля.

Обработчик ПриИзменении поля таблицы формы

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

&НаКлиенте Процедура СписокТоваровЦенаПриИзменении(Элемент) ТекДанные = Элементы.СписокТоваров.ТекущиеДанные; Если ТекДанные = Неопределено Тогда Возврат; //если пустая таблица КонецЕсли; ТекДанные.Сумма = ТекДанные.Количество * ТекДанные.Цена; КонецПроцедуры 

Ещё пример: я создал команду, которая должна увеличивать количество в текущий строке табличной части в два раза и пересчитывать сумму. Эта команда размещена в командной панели таблицы и имеет следующий код:

&НаКлиенте Процедура УмножитьНа2(Команда) ТекДанные = Элементы.СписокТоваров.ТекущиеДанные; Если ТекДанные = Неопределено Тогда Возврат; //если пустая таблица КонецЕсли; ТекДанные.Количество = ТекДанные.Количество * 2; ТекДанные.Сумма = ТекДанные.Количество * ТекДанные.Цена; КонецПроцедуры 

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

Идентификтор = Элементы.СписокТоваров.ТекущаяСтрока; ИдентификторСлед = Идентификтор + 1; Если ИдентификторСлед  Объект.СписокТоваров.Количество() Тогда Элементы.СписокТоваров.ТекущаяСтрока = ИдентификторСлед; КонецЕсли; 

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

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

&НаКлиенте Процедура СписокТоваровКоличествоПриИзменении(Элемент) Идентификтор = Элементы.СписокТоваров.ТекущаяСтрока; Если Идентификтор = Неопределено Тогда Возврат; КонецЕсли; ТекСтрока = Объект.СписокТоваров.НайтиПоИдентификатору(Идентификтор); Если ТекСтрока = Неопределено Тогда Возврат; КонецЕсли; ТекСтрока.Сумма = ТекСтрока.Цена * ТекСтрока.Количество; КонецПроцедуры 

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

Обход табличной части 1С

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

&НаКлиенте Процедура УмножитьВсеНа2(Команда) ТабОбх = Объект.СписокТоваров; Для Каждого стрТабл из ТабОбх Цикл стрТабл.Количество = стрТабл.Количество * 2; стрТабл.Сумма = стрТабл.Цена * стрТабл.Количество; КонецЦикла; КонецПроцедуры 

Остальные статьи по теме конфигурирования в 1С:

Более подробно и основательно конфигурирование в 1С дается в моей книге:

Изучайте программирование в 1С в месте с моей книги «Программировать в 1С за 11 шагов»

  1. Книга написана понятным и простым языком — для новичка.
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Научитесь понимать архитектуру 1С;
  4. Станете писать код на языке 1С;
  5. Освоите основные приемы программирования;
  6. Закрепите полученные знания при помощи задачника;

О том как разрабатывать под управляемым приложением 1С, читайте в книге Книга «Основы разработки в 1С: Такси»

Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.

  1. Очень доступный и понятный язык изложения
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Поймете идеологию управляемого приложения 1С
  4. Узнаете, как разрабатывать управляемое приложение;
  5. Научитесь разрабатывать управляемые формы 1С;
  6. Сможете работать с основными и нужными элементами управляемых форм
  7. Программирование под управляемым приложением станет понятным

Промо-код на скидку в 15% — 48PVXHeYu

Вступайте в мои группы:

Как обратиться к табличной части обработки?

Добрый день.
Нужна помощь начинающему в области 1с предприятие.
Есть документ А, есть документ Б.
Нужно создать внутреннюю обработку, в которой будет табличная часть где можно добавлять ссылки на эти документы, рядом с каждым будет соответствующий чекбокс. Создать кнопку «записать» при нажатии на которую нужно будет создавать пары документов и затем заносить их в регистр сведений.

-проблема-
когда создаю запрос, который обращается к данным табличной части, он не может найти мою табличную часть то есть «не удалось найти таблицу и указывает на кусок кода с «ИЗ Обработка.Связь.Таблица». Как только путь к таблице не указывал уже.

-вопрос-
В чём собственно заключается ошибка в пути или просто неправильном подходе реализации кнопки?

  • Вопрос задан более трёх лет назад
  • 15537 просмотров

Комментировать
Решения вопроса 2
Ruby on rails, 1С разработчик

когда создаю запрос, который обращается к данным табличной части, он не может найти мою табличную часть то есть «не удалось найти таблицу и указывает на кусок кода с «ИЗ Обработка.Связь.Таблица». Как только путь к таблице не указывал уже.

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

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

Запрос.Текст = "Выбрать . бла-бла-бла. Из &ТаблицаЗначений;" Запрос.УстановитьПараметр("ТаблицаЗначений", Объект.МояТабличнаяЧасть.Выгрузить());

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

Ответ написан более трёх лет назад
Нравится 1 3 комментария
Amarg0 @Amarg0 Автор вопроса
Большое спасибо за подробный ответ!
Amarg0 @Amarg0 Автор вопроса

Пытаюсь обойти при помощи цикла, как Вы и советовали.
Не подскажите, как решить проблему с недоступностью данных на сервере ( видимо, неправильно работаю с ТекущимиДанными)?

Amarg0: Элементы — это объекты, отвечающие за отрисовку данные, а вам нужны сами данные. Это будет либо Для Каждого Строка Из Объект.МояТабличнаяЧасть , если табличная часть — реквизит обработки. Либо просто «МояТабличнаяЧасть», если табличная часть — реквизит формы.

На ютубе есть серия видео «разработка управляемого приложения» — очень советую, поможет навести порядок в понимании управляемых форм.

программист, архитектор, аналитик

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

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

В вашем примере существует обработка под названием «Связь», в которой есть табличная часть «Таблица». Запросы языка 1С указанным вами способом (путь по метаданным) могут получать выборки лишь из данных, которые сохранены в СУБД базы. Т.е. у вас ничего не выйдет. Но язык запросов позволяет делать запросы еще и к структурам в памяти, если их передавать в качестве параметров. Вы можете поступить следующим образом:

Запрос = Новый Запрос; Запрос.УстановитьПараметр("Таблица", Таблица); Запрос.Текст = "ВЫБРАТЬ Т.Документ, Т.Клиент, Т.Сумма |ПОМЕСТИТЬ втТаблица |ИЗ &Таблица КАК Т; | |ВЫБРАТЬ Клиент, СУММА(втТаблица.Сумма) |ИЗ втТаблица |СГРУППИРОВАТЬ ПО Клиент"; Итоги = Запрос.Выполнить().Выгрузить();

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  1. Юрий 13.06.2019 Приветствую!
    Только начал изучать 1С.
    Кое что уже знаю, но мало и опыта практически ноль.
    Создал свою конфигурацию, пока только для тестов.
    В данной конфигурации есть документ, назовем его «Заявка».
    В данной заявке, есть табличная часть, в которой есть реквизит «Стоимость».
    Получается, что таких документов много и мне нужно сложить все реквизиты «Стоимость» из всех документов «Заявка».
    Вопрос.
    Как мне это сделать?
    Предполагаю, что нужно использовать функцию с экспортом, в которой будет цикл «Для Каждого ……»
    Но как это оформить, пока не могу понять…
  1. Нестандартные решения в 1С Автор записи 14.06.2019 Добрый день. Сделать это можно по-разному. Цикл Для каждого, на мой взгляд, не очень подходящий вариант, т.к. будет работать слишком долго. Да и надо еще где-то список документов брать. Я бы порекомендовал сделать запрос к табличной части документа (именно к табличной части, а не к документу). Выбрать там ваш столбец Стоимость и другие столбцы, если нужно. И применить функцию СУММА к этому столбцу. Подробнее и с примерами смотрите в статье Группировки в запросах 1С http://chel1c.ru/querry_group/
  1. Юрий 14.06.2019 Спасибо!
    Буду пробовать.
  1. Нестандартные решения в 1С Автор записи 10.09.2019 Это подошло бы, если бы нужно было суммировать колонку в одном документе. А Юрию нужно суммировать колонку Стоимость всех документов.
  1. Нестандартные решения в 1С Автор записи 10.09.2019 Не совсем понял, о чем конкретно вопрос.
    Если о том, как получать и работать с текущей строкой табличной части, то в модуле менеджера ничего писать не нужно.
  1. Нестандартные решения в 1С Автор записи 18.01.2020 Добрый день. Информацию о выделенных строках вы можете получить только в модуле формы документа, причем, если мне не изменяет память, это должна быть клиентская процедура. По ссылке на документ выделенные строки получить нельзя.
  1. Нестандартные решения в 1С Автор записи 11.02.2020 Да, логика такая. Только учтите, что таблица значений не передается с клиента на сервер.
    Выделенный строки табличного поля на форме — это массив строк. Надо попробовать, передастся ли он. Если да, хорошо. Если нет — надо думать, как его передать.
  1. Александр 27.07.2022 Можно представить каждую строку как структуру и потом структуры поместить в массив. Получится массив структур и так передать. НУ если уж совсем извратиться то можно например сериализовать все с JSON …)))
  1. Автоматизация малого бизнеса Автор записи 15.12.2020 Добрый день.
    Попробуйте вот так: https://forum.infostart.ru/forum9/topic84727/

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

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

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

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