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

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

  • автор:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

v8: Хитрый прием работы с табличными частями в запросе

Мы всегда на связи

Как то мне довелось править отчет, написанный не мной. Там выдался список всех сотрудников у которых есть дети, родившиеся после указанного года.

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

Исходный запрос был таким:

ВЫБРАТЬ Сотрудники.Ссылка КАК Сотрудник, Сотрудники.Дети.( Пол, ГодРождения ) КАК Дети ИЗ Справочник.Сотрудники КАК Сотрудники ГДЕ Сотрудники.Дети.ГодРождения > &ГодРождения И Сотрудники.Ссылка В &Список

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

В результате я изменил условие на противоположное и добился нужного:

ВЫБРАТЬ Сотрудники.Ссылка КАК Сотрудник, Сотрудники.Дети.( Пол, ГодРождения ) КАК Дети ИЗ Справочник.Сотрудники КАК Сотрудники ГДЕ НЕ (Сотрудники.Дети.ГодРождения 

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

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

Идем дальше

Но лучше всего и надежнее использовать другой подход. Если уж вам хочется таблиц значений, нужно написать этот запрос так:

ВЫБРАТЬ Сотрудники.Сотрудник КАК Сотрудник, Дети.(Пол,ГодРождения) КАК Дети ИЗ Справочник.Сотрудники КАК Сотрудники ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ СотрудникиСрезПоследних.Сотрудник КАК Сотрудник, СотрудникиСрезПоследних.Сотрудник.Дети.(Пол,ГодРождения) КАК Дети ИЗ Справочник.Сотрудники ГДЕ Сотрудники.Дети.ГодРождения > &ГодРождения И Сотрудники.Ссылка В &Список) КАК Сотрудники1 ПО Сотрудники.Сотрудник = Сотрудники1.Сотрудник ГДЕ Сотрудники.Дети.ГодРождения > &ГодРождения И Сотрудники.Ссылка В &Список

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

Обращение к реквизиту табличной части документа 1С.

Добрый день. Столкнулся с проблемой: необходимо обратиться к реквизиту табличной части из модуля формы для записи в этот реквизит некоторых данных. Пытался сделать через "ПОКА Объект. ИмяТабличнойЧасти. ИмяРеквизита Цикл", но, как я выяснил, вариант неверен. Соответственно, вопрос: как же можно это сделать?

Лучший ответ

Если знаешь индекс строки, то

Объект. ИмяТЧ [Индекс]. ИмяРеквизита =Чтото

Если надо перебрать, то перебираешь строки как любую коллекцию

Для Каждого Стр Из Объект. ИмяТЧ Цикл
Стр. ИмяРеквизита=Чтото;
КонецЦикла;

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

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