Как получить значение реквизита формы табличной части? |
Я |
24.08.22 — 15:40
Добрый день! управляемые формы, в табличноый части документа есть реквизит Номенклатура, и на форме в ТЧ из номенклатуры выведен реквизит ЕденицаИзмерения , самого реквизита ЕденицаИзмерения в табличной части объекта нет, но его вывели на форму, и надо его проверять на заполненность, если не заполнен, то выдавать сообщение и отказываться от проведения. как программно добраться до значения реквизита табличной части формы?
1 — 24.08.22 — 15:42
через точку
2 — 24.08.22 — 15:42
(0) Никак
Проведение вообще в душе не подозревает ни про какие твои формы
3 — 24.08.22 — 15:51
(2) ПередЗаписьюНаСервере() же , но автору это все равно не поможет
4 — 24.08.22 — 15:54
(3) Ты решил мне рассказать, как немного наговнокодить?
Все просто
ТС говорит про проведение, значит забывает про форму
Точка
5 — 24.08.22 — 15:58
(0)
Если Не ЗначениеЗаполнено(Номенклатура.ЕдиницаИзмерения) Тогда
// Отказ и точка!
КонецЕсли;
6 — 24.08.22 — 15:58
(4) Код из типовой бухии:
ТиповаяОперация = Форма[БухгалтерскиеОперацииКлиентСервер.ИмяРеквизитаФормыТиповаяОперация()];
Если ЗначениеЗаполнено(ТиповаяОперация)
И (ПараметрыЗаписи.РежимЗаписи = РежимЗаписиДокумента.Запись
ИЛИ ПараметрыЗаписи.РежимЗаписи = РежимЗаписиДокумента.Проведение)
И НЕ ТиповаяОперацияСоответствуетДокументу(ТекущийОбъект, ТиповаяОперация) Тогда
СообщитьТиповаяОперацияНеСоответствуетДокументу(ТекущийОбъект, Форма);
Если ПараметрыЗаписи.РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда
Отказ = Истина;
Возврат;
КонецЕсли;
КонецЕсли;
не то чтобы я считал бухию эталоном, но встречается вообще часто
7 — 24.08.22 — 15:59
(0) «как программно добраться до значения реквизита табличной» — СтрокаТаблицы.Номенклатура.ЕдиницаИзмерения
8 — 24.08.22 — 16:01
(6) И что будет, если документ тупо провести без открытия формы?
9 — 24.08.22 — 16:06
Есть же специальная процедура, называется ОбработкаПроверкиЗаполнения, https://its.1c.ru/db/v8std#content:463:hdoc
10 — 24.08.22 — 16:13
(8) ну что будет — пропустит оно проверку, понятное дело, если она там в модуле не задублирована. Я не предлагал проверять в форме — просто упомянул, что в частном случае проведения из формы в начале выловить можно, что документ проводится и контекст формы иметь.
11 — 24.08.22 — 17:28
(7) но ведь это не реквизт формы, а как получить зачение реквизита формы?
12 — 24.08.22 — 17:31
(11) Вы же сами сказали, что данный реквизит формы тянется из номенклатуры. Смысл вам ковырять элементы формы и получать, что там заполнено, если у вас есть данные объекта?
13 — 24.08.22 — 18:03
(12) ну он же на форме может быть и не заполнен, поэтому и нужно его значение проверить заполнен он или нет
14 — 24.08.22 — 18:30
(13) Заполнен или не заполнен он только в элементе справочника Номенклатура. На форме от только отображается.
Если конфа типовая, смотри механизм проведения, найди место, где проверяется заполненность, и вставляй туда свою проверку.
15 — 25.08.22 — 03:01
(0)
// В форме документа:
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
ТЧИзФормы = ЭтаФорма.Объект.Товары.Выгрузить(, «НомерСтроки, Номенклатура, Артикул»);
ТекущийОбъект.ДополнительныеСвойства.Вставить(«ТЧИзФормы», ТЧИзФормы);
КонецПроцедуры
// В модуле документа
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
ТЧИзФормы = Неопределено;
ЭтотОбъект.ДополнительныеСвойства.Свойство(«ТЧИзФормы», ТЧИзФормы);
Если ТЧИзФормы <> Неопределено Тогда
//…
КонецЕсли;
КонецПроцедуры
Правда без открытия формы ТЧИзФормы всегда будет Неопределено
Kassern
16 — 25.08.22 — 09:10
(13) «ну он же на форме может быть и не заполнен» — назовите мне случай, когда значение в реквизите табличной части формы может отличаться от значения в реквизите номенклатуры. При условии, что в пути данных реквизита формы стоит «Объект.Товары.Номенклатура.ЕдиницаИзмерения». Я понимаю обычные формы, где приходилось оформлять заполнение ячеек и устанавливать туда текст, но вы же пишите про управляемые формы.
-
09.06.2019, 15:59
#1
Гость форума
Получение значения реквизита табличной части. 1С:Предприятие 8.3
Здравствуйте! Подскажите, пожалуйста, как получить значение реквизита табличной части (в справочнике)? У меня есть таб.часть «Образование», в ней есть реквизит «ВидОбразования» (ссылается на перечисление видов образования). Как получить значение данного реквизита?
-
06.07.2019, 20:53
#2
Гость форума
Re: Получение значения реквизита табличной части. 1С:Предприятие 8.3
Не силен в 1С, но вижу, что за месяц не ответил никто. Если правильно понял, то:
Получить табличную часть можно так:// Пусть СсылкаНаТЗ это ссылка на владельца ТЧ Образование
ТаблОбразование = СсылкаНаТЗ.Образование.Выг рузить(); // это таблица значений
Для Каждого Обр из ТаблОбразование Цикл
Сообщить(Обр.ВидОбразовани я);
КонецЦикла;// Или
Номер = 0;
Пока Номер < ТаблОбразование.Количеств� �() Цикл
Сообщить(ТаблОбразование[Номер].ВидОбразования);
Номер = Номер + 1;
КонецЦикла;
-
06.07.2019, 20:59
#3
Гость форума
Re: Получение значения реквизита табличной части. 1С:Предприятие 8.3
Какая-то ерунда с сообщением — половина стерлась через несколько минут.
И как отредактировать не понимаю…Не силен в 1С, но вижу, что за месяц не ответил никто. Если правильно понял, то:
Получить табличную часть можно так:// Пусть СсылкаНаТЗ это ссылка на владельца ТЧ Образование
ТаблОбразование = СсылкаНаТЗ.Образование.Выр узить(); // это таблица значений
Для Каждого Обр из ТаблОбразование Цикл
Сообщить(Обр.ВидОбразовани я);
КонецЦикла;// Или
Номер = 0;
Пока Номер < ТаблОбразование.Количеств� �() Цикл
Сообщить(ТаблОбразование[Номер].ВидОбразования);
Номер = Номер + 1;
КонецЦикла;
-
06.07.2019, 21:02
#4
Гость форума
Re: Получение значения реквизита табличной части. 1С:Предприятие 8.3
Попытка 3. Расширенный режим. Почему сообщения так корежит?
Какая-то ерунда с сообщением — половина стерлась через несколько минут.
И как отредактировать не понимаю…Не силен в 1С, но вижу, что за месяц не ответил никто. Если правильно понял, то:
Получить табличную часть можно так:// Пусть СсылкаНаТЗ это ссылка на владельца ТЧ Образование
ТаблОбразование = СсылкаНаТЗ.Образование.Выг рузить(); // это таблица значений
Для Каждого Обр из ТаблОбразование Цикл
Сообщить(Обр.ВидОбразовани я);
КонецЦикла;// Или
Номер = 0;
Пока Номер < ТаблОбразование.Количеств� �() Цикл
Сообщить(ТаблОбразование[Номер].ВидОбразования);
Номер = Номер + 1;
КонецЦикла;
-
06.07.2019, 21:05
#5
Гость форума
Re: Получение значения реквизита табличной части. 1С:Предприятие 8.3
Попробую картинкой
Screenshot_1.jpg
-
09.07.2019, 11:44
#6
Гордость форума PRO
Re: Получение значения реквизита табличной части. 1С:Предприятие 8.3
Сообщение от iLex
Не силен в 1С, но вижу, что за месяц не ответил никто. Если правильно понял, то:
Получить табличную часть можно так:Никто не ответил потому как вопрос дурацкий.
табличная часть она потому и табличная, что в ней (по умолчанию) много в строк и в каждой строке значение данного реквизита возможно разное.
если знаешь номер строки (например первая) то обращение будет Образование[0].ВидОбразования
Как получить доступ к реквизитам формы?
Если реквизит объекта «вытащен» на форму, то реквизит формы можно получить через объект ЭлементыФормы, который содержит коллекцию элементов формы, сканируя ее в цикле:
ДокСсылка = СсылкаНаДокумент(ТипДокумента, НомерДок); ДокОбъект = ДокСсылка.ПолучитьОбъект(); ФормаОбъекта = ДокОбъект.ПолучитьФорму(); Для Каждого Элемент Из ФормаОбъекта.ЭлементыФормы Цикл Сообщить(Элемент); КонецЦикла;
Этот цикл позволяет просмотреть имена а так же типы всех реквизитов формы, в том числе такие реквизиты как надписи, командные панели и тд.
Реквизиты формы могут быть различных типов. Поставив фильтр в виде типа реквизита мы можем просмотреть реквизиты определенного типа.
Если реквизит формы имеет тип «ТабличноеПоле», то можно такой элемент просканировать во вложенном цикле и узнать имена колонок таблицы:
Для Каждого Элемент Из ФормаОбъекта.ЭлементыФормы Цикл Сообщить(Элемент.Имя); Если Тип(Элемент) = Тип("ТабличноеПоле") Тогда Сообщить(" Это табличное поле! " + Элемент.Имя ); Для Каждого Колонка Из Элемент.Колонки Цикл ИмяКолонки = Колонка.Имя; Сообщить(ИмяКолонки); КонецЦикла; КонецЕсли; КонецЦикла;
Как получить значение отдельного реквизита формы?
Чаще требуется получать не массив реквизитов формы, а значение отдельных конкретных реквизитов формы. Например реквизиты «Шапки» или «Подвала» формы документа.
Пример:
ФормаОбъекта = ДокОбъект.ПолучитьФорму("ФормаДокумента"); Поставщик = ФормаОбъекта.ЭлементыФормы.Поставщик; Поставщик = ФормаОбъекта.ЭлементыФормы.Получатель; Сообщить(ФормаОбъекта.ЭлементыФормы.ТаблПоле.Колонки.Количество());
Реквизиты шапки могут иметь различные типы: Дата, СправочникСсылка, ЧекБокс, элемент раскрывающегося списка и др.
Как получить значение элементов табличной части формы?
Доступ к табличной части формы через объект
Доступ к табличной части формы (например: Товары) можно получить через объект:
ДокОбъект = Док.ПолучитьОбъект(); //здесь Док - ссылка на объект //просканируем построчно таб часть документа Для Каждого Стр из ДокОбъект.Товары Цикл Номенклатура = Стр.Номенклатура; Стр.Коэффициент = 1; КонецЦикла;
Здесь ДокОбъект.Товары — это табличная часть «Товары» объекта. Далее в цикле табличная часть построчно сканируется!
В каждой итерации цикла можно получить доступ к любому полю строки указав через точку имя этого поля:
Номенклатура = Стр.Номенклатура;
Доступ к табличной части формы через ЭлементыФормы
Табличная часть объекта и табличная часть формы объекта — это не одно и то же!
Для того, чтобы код работал правильно, надо чтобы колонка формы табчасти объекта в свойстве данные ссылалась на реквизит табличной части объекта. Этим определяется тип колонки таб части формы.
То есть должна быть установлена связь между реквизитом табчасти объекта и реквизитом табчасти формы. Форм у объекта метаданных может быть много мы знаем. Табличную часть формы объекта можно получить через объект ЭлементыФормы:
Объект ЭлементыФормы используется для доступа к элементам управления, расположенным на форме, в частности к таб части документа.
ДокСсылка = СсылкаНаДокумент(ТипДокумента, НомерДок); ДокОбъект = ДокСсылка.ПолучитьОбъект(); ФормаОбъекта = ДокОбъект.ПолучитьФорму(); Для Каждого Элемент Из ФормаОбъекта.ЭлементыФормы Цикл Если Тип(Элемент) = Тип("ТабличноеПоле") Тогда //элемент формы - табличное поле Если Элемент.Имя = "Товары" Тогда Сообщить("Это табличное поле!! " + Элемент.Имя ); //ТабПоле = ФормаОбъекта.ЭлементыФормы.Товары.Значение; ТабПоле = Элемент.Значение; Колво = ТабПоле.Количество(); Сообщить("Количество строк: " + Колво); Для Каждого ТекущаяСтрока Из ТабПоле Цикл Имя = ТекущаяСтрока.Номенклатура; Сообщить(Имя); КонецЦикла; КонецЕсли; КонецЕсли; КонецЦикла;
Результат для документа Авансовый отчет:
Это табличное поле!! Товары
Количество строк: 4
Женские ботфорты коричневые
Ботинки женские демисезонные
Ботинки женские натуральная кожа
Женские босоножки
Если надо получить значение всех колонок всех строк, то организуем дважды вложенный цикл:
Во внешнем цикле сканируются строки, во внутреннем — колонки:
ДокСсылка = СсылкаНаДокумент(ТипДокумента, НомерДок); ДокОбъект = ДокСсылка.ПолучитьОбъект(); ФормаОбъекта = ДокОбъект.ПолучитьФорму("ФормаДокумента"); Для Каждого Элемент Из ФормаОбъекта.ЭлементыФормы Цикл Если Тип(Элемент) = Тип("ТабличноеПоле") Тогда Если Элемент.Имя = "ВыданныеАвансы" Тогда //таб часть объекта Сообщить(" Это табличное поле!! " + Элемент.Имя ); ТабПоле = Элемент.Значение; Индекс = 0; Для Каждого ТекущаяСтрока Из ТабПоле Цикл Сообщить("======================="); Для Каждого Колонка Из Элемент.Колонки Цикл ИмяКолонки = Строка(Колонка.Имя); Сообщить(ИмяКолонки); Имя = ТекущаяСтрока[ИмяКолонки];//сработает только если есть такое поле таб части объекта Сообщить("=== " + Имя); КонецЦикла; Индекс = Индекс + 1; Если Индекс > 0 Тогда break КонецЕсли; //только первая строка КонецЦикла; КонецЕсли; КонецЕсли; КонецЦикла;
Результат для документа Авансовый отчет:
Это табличное поле!! ВыданныеАвансы
=======================
НомерСтроки 1
ДокументАванса Расходный кассовый ордер ТК000000004 от 15.02.2007 19:24:03
СуммаДокументаАванса 300
ВалютаДокументаАванса USD
Выдано 300
Сумма 174
Такое двойное сканирование удобно использовать для быстрой проверки того, что все колонки таб части формы имеют связь с реквизитами таб части объекта. Если такой связи у какой-либо колонки нет, система сгенерирует ошибку.
Granfury 9 / 9 / 5 Регистрация: 22.04.2015 Сообщений: 305 |
||||
1 |
||||
Получить данные из табличной части документа, как?10.05.2016, 10:24. Показов 44188. Ответов 10 Метки нет (Все метки)
Доброго времени суток!
0 |
SpiRUS 11 / 11 / 5 Регистрация: 23.06.2015 Сообщений: 74 |
||||||||
10.05.2016, 10:44 |
2 |
|||||||
Если имеется в виду получить количество позиций в табличной части «Товары», то
А если сообщить значение каждой строки из колонки «количество» то
1 |
Granfury 9 / 9 / 5 Регистрация: 22.04.2015 Сообщений: 305 |
||||
10.05.2016, 11:47 [ТС] |
3 |
|||
Ссылка на документ — как правильно получить?
Товары — это табличная часть бокумента, может я как то не так ссылаюсь на эту таб. часть?
0 |
SpiRUS 11 / 11 / 5 Регистрация: 23.06.2015 Сообщений: 74 |
||||
10.05.2016, 12:01 |
4 |
|||
Ссылка на документ — как правильно получить? Способов то много. Можно запросом, можно на форму вынести поле ввода. Можно просто:
0 |
Granfury 9 / 9 / 5 Регистрация: 22.04.2015 Сообщений: 305 |
||||||||
10.05.2016, 13:51 [ТС] |
5 |
|||||||
нет как мне обратиться к табличной части документа?
так получается.//сделал для проверки.
— не получается!
0 |
GreenkA 3051 / 1998 / 524 Регистрация: 25.06.2009 Сообщений: 6,964 |
||||
10.05.2016, 14:24 |
6 |
|||
Сообщение было отмечено Granfury как решение РешениеGranfury, Количество — это реквизит табличной части Товары? Надо получать конкретную строку тогда: обходить циклом, по индексу(если заранее знаете количество строк ТЧ):
2 |
Granfury 9 / 9 / 5 Регистрация: 22.04.2015 Сообщений: 305 |
||||
10.05.2016, 15:32 [ТС] |
7 |
|||
GreenkA, Спасибо! Добавлено через 56 минут
Результат:
0 |
GreenkA 3051 / 1998 / 524 Регистрация: 25.06.2009 Сообщений: 6,964 |
||||||||
10.05.2016, 15:38 |
8 |
|||||||
Granfury, можно конечно обойти табличную часть и
или сразу:
0 |
Granfury 9 / 9 / 5 Регистрация: 22.04.2015 Сообщений: 305 |
||||
10.05.2016, 18:38 [ТС] |
9 |
|||
GreenkA, «Поле обьекта не обнаружено «ПриказНаОтгрузку»»
Что не так?
0 |
3051 / 1998 / 524 Регистрация: 25.06.2009 Сообщений: 6,964 |
|
10.05.2016, 18:40 |
10 |
Granfury, а что содержится в Ссылка? Вы же уже делали вывод Количества и все было нормально, что изменили?
1 |
9 / 9 / 5 Регистрация: 22.04.2015 Сообщений: 305 |
|
11.05.2016, 13:03 [ТС] |
11 |
пытаюсь разобраться Добавлено через 18 часов 7 минут
0 |
Табличные части существуют у многих объектов в 1С:
- Справочники
- Документы
- Отчеты и обработки
- Планы счетов
- Планы видов характеристик
- Планы видов расчета
- Бизнес-процессы и задачи
Табличные части позволяют хранить неограниченное количество структурированной информации, принадлежащей одному объекту.
Рассмотрим некоторые приемы работы с табличными частями.
Как обойти табличную часть
Для обхода табличной части можно использовать цикл Для каждого
Для каждого Строка из ТабличнаяЧасть Цикл
Сообщить(Строка.РеквизитТабличнойЧасти);
КонецЦикла;
На каждой итерации в переменную Строка передается очередная строка табличной части. Значения реквизитов строки можно получить выражением Строка.ИмяРеквизита.
Как получить и обойти выделенные строки табличной части
Для вывода информации из табличной части объекта служит элемент формы Табличное поле. Для включения возможности выделения нескольких строк на табличном поле нужно установить значение Множественный у его свойства Режим выделения.
Для получения перечня выделенных строк используется следующий код:
ВыделенныеСтроки=ЭлементыФормы.ИмяТабличногоПоля.ВыделенныеСтроки;
Для того чтобы обойти выделенные строки используется цикл Для каждого:
ВыделенныеСтроки=ЭлементыФормы.ИмяТабличногоПоля.ВыделенныеСтроки;
Для каждого Строка из ВыделенныеСтроки Цикл
//содержимое цикла
КонецЦикла;
Как программно выделить строки табличной части (табличного поля) и снять выделение
Чтобы программно снять выделение строк табличного поля:
ЭлементыФормы.ИмяТабличногоПоля.ВыделенныйСтроки.Очистить();
Чтобы программно выделить все строки табличного поля:
Для каждого ТекущаяСтрока Из ТабличнаяЧасть Цикл
ЭлементыФормы.ИмяТабличногоПоля.ВыделенныеСтроки.Добавить(ТекущаяСтрока);
КонецЦикла;
Как очистить табличную часть
ТабличнаяЧасть.Очистить();
Как получить текущую строку табличной части
Текущая строка — это срока, в которой у пользователя в данный момент находится курсор. Чтобы ее получить, нужно обратиться к элементу управления на форме, который связан с табличной частью.
Для обычных форм код будет выглядеть так:
ЭлементыФормы.ИмяТабличногоПоля.ТекущиеДанные;
Для управляемых форм:
Элементы.ИмяТабличногоПоля.ТекущиеДанные;
Как добавить новую строку в табличную часть
Добавление новой строки в конец табличной части:
НоваяСтрока=ТабличнаяЧасть.Добавить();
НоваяСтрока.Реквизит1=«Значение»;
Добавление новой строки в любое место табличной части (последующие строки будут сдвинуты):
НоваяСтрока=ТабличнаяЧасть.Вставить(Индекс)
//Индекс — номер добавляемой строки. Нумерация строк начинается с нуля.
НоваяСтрока.Реквизит1=«Значение»;
Как программно заполнить реквизиты строки табличной части
Если нужно программно заполнить реквизиты строки табличной части, которую добавляет пользователь, необходимо использовать обработчик события табличной части ПриНачалеРедактирования.
Создаваемая обработчиком процедура имеет три параметра:
- Элемент — содержит элемент управления ТабличноеПоле.
- НоваяСтрока — булево. Содержит значение Истина, если добавляется новая строка табличной части, и Ложь, если пользователь начал редактировать уже существующую строку.
- Копирование — булево. Содержит значение Истина, если пользователь копирует строку, и Ложь в остальных случаях.
Рассмотрим пример. Допустим, нам нужно заполнить реквизит табличной части СчетУчета, в случае, когда добавляется новая строка. При редактировании существующей строки изменять счет учета не нужно.
Процедура ТабличнаяЧастьПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
//Если пользователь редактирует существующую строку, то ничего не делаем
Если НЕ НоваяСтрока Тогда
Возврат;
КонецЕсли;
//Если же строка новая, устанавливаем счет учета
ТекСтрока = Элемент.ТекущиеДанные; //Получили текущую строку табличной части
ТекСтрока.СчетУчета = ПланыСчетов.Хозрасчетый.НужныйСчетУчета;
КонецПроцедуры
Для примера, рассмотрим ситуацию, когда требуется получить все номенклатурные позиции, указанные в табличной части Товары документов РеализацияТоваровУслуг.
Для этого можно воспользоваться запросом со следующим текстом:
ВЫБРАТЬ РАЗЛИЧНЫЕ РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура ИЗ Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
В качестве источника указываем табличную часть документов — таблицу Документ.РеализацияТоваровУслуг.Товары. Выходным полем объявляем поле Номенклатура, входящее в состав таблицы источника. Кроме этого, поскольку одна и та же товарная позиция, естественно, могла присутствовать и не один раз в документах, применяем РАЗЛИЧНЫЕ для получения только различных строк в выходной таблице запроса.
Для примера создадим обработку СписокТоваров, где выбирается документ РеализацияТоваровУслуг, и нажатием на соответствующую кнопку в окно сообщений выводится список неповторяющихся позиций номенклатуры, содержащейся в табличной части этого документа.
Для того, чтобы ограничить выборку номеклатуры только номенклатурой из табличной части конкретного документа используем параметр Ссылка в условии в запросе (ГДЕ …):
ВЫБРАТЬ РАЗЛИЧНЫЕ РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура ИЗ Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары ГДЕ РеализацияТоваровУслугТовары.Ссылка = &Ссылка
0
Как определить какие реквизиты имеются в табличной части документа
ПоступлениеТовара = Метаданные.Документы.ПоступлениеТовара;
Реквизиты = ПоступлениеТовара.ТабличныеЧасти.Товары.Реквизиты;
Для каждого наим из Реквизиты Цикл
Сообщить("Имя реквизита " + наим.Имя +
"; тип реквизита " + наим.Тип);
КонецЦикла;
// Результат:
// Имя реквизита Наименование; тип реквизита Справочник ссылка: Номенклатура
// Имя реквизита Количество; тип реквизита Число
// Имя реквизита Цена; тип реквизита Число
// Имя реквизита Сумма; тип реквизита Число