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

Получить значение реквизита из табличной части документа

Я
   theblockhead

05.06.18 — 01:37

Доброй ночи, подскажите пожалуйста.

Получить значение не из табличной части Документ[реквизит.имя], а как например, если есть табличная часть «тест» со своими реквизитами ?

  

Партнерская программа EFSOL Oblako

   hhhh

1 — 05.06.18 — 03:18

(0) Документ[табличнаячасть.имя][0][реквизит.имя]

это если из первой строки табличной части

Если например 100-я строка табличной части, то

Документ[табличнаячасть.имя][99][реквизит.имя]

   theblockhead

2 — 05.06.18 — 12:25

(1) А можно еще вопрос, получается если хочу обойти все данные из документа, мне надо обойти все его реквизиты, а также все реквизиты табличной части и получается все её строки ?

Немного не понимаю этих моментов. Задача была вывести документ в текстовый формат(csv, txt) с помощью метаданных (только вот документ любой).

   hhhh

3 — 05.06.18 — 12:28

(2) ну конечно в текстовый файл ты все строки должен добавить. Это не обсуждается.

   1Сергей

4 — 05.06.18 — 12:29

(2) используй Для Каждого…

   theblockhead

5 — 05.06.18 — 12:31

(3) (4) ДокументДляВыгрузкиСсылка = ЭтаФорма.ЭлементыФормы.ДокументСсылка.Значение.Ссылка;

    РеквизитыДокумента = ДокументДляВыгрузкиСсылка.Метаданные().Реквизиты;

    Текст = Новый ТекстовыйДокумент;

      Для Каждого РеквизитДокумента Из РеквизитыДокумента Цикл

        Текст.ДобавитьСтроку(«» + РеквизитДокумента.Имя + «:» + ДокументДляВыгрузкиСсылка[РеквизитДокумента.Имя] );

    КонецЦикла;  

    ТЧДокумента = ДокументДляВыгрузкиСсылка.Метаданные().ТабличныеЧасти;

    Для Каждого ТекТЧДокумента Из ТЧДокумента Цикл

    СсылкаТЧ = ДокументДляВыгрузкиСсылка[ТекТЧДокумента.Имя];

        Для каждого строкаТЧ Из ТекТЧДокумента.Реквизиты цикл

          Текст.ДобавитьСтроку(«» + строкаТЧ.Имя + «:» + ???СсылкаТЧ[0].[строкаТЧ.Имя]??????);

        КонецЦикла;

      КонецЦикла;

    Текст.Записать(ИмяФайла);

Я это сделал, вот теперь вопрос как проверить сколько строк в табличной части или я что-то не поянл

   VitShvets

6 — 05.06.18 — 12:37

:) См (4):

Для каждого ТекСтрока Из ДокументДляВыгрузкиСсылка[ТекТЧДокумента.Имя] Цикл

   1Сергей

7 — 05.06.18 — 12:38

(5)

Для каждого строкаТЧ Из ТекТЧДокумента.Реквизиты цикл

    Для Каждого СтрокаТЧ ИЗ СсылкаТЧ Цикл

         Текст.ДобавитьСтроку(«» + строкаТЧ.Имя + «:» + СтрокаТЧ[строкаТЧ.Имя]);

Как-то так

   hhhh

8 — 05.06.18 — 12:38

Для каждого стр Из СсылкаТЧ цикл

        Для каждого строкаТЧ Из ТекТЧДокумента.Реквизиты цикл

          Текст.ДобавитьСтроку(«» + строкаТЧ.Имя + «:» + стр[строкаТЧ.Имя]);

        КонецЦикла;

         КонецЦикла;

   1Сергей

9 — 05.06.18 — 12:38

(7) ох, блин. Не читай (7)

   hhhh

10 — 05.06.18 — 12:38

еще номер строки тч надо по идее

   theblockhead

11 — 05.06.18 — 12:42

(10) (6) (9) Спасибо большое, постараюсь разобраться. Меньше недели в 1С, до этого опыт был с другими языками. Уже и 1С разонравился, но просто «спортивный интерес» закончить начатое.

   theblockhead

12 — 05.06.18 — 12:53

(10) ТЧДокумента = ДокументДляВыгрузкиСсылка.Метаданные().ТабличныеЧасти;

    Для Каждого ТекТЧДокумента Из ТЧДокумента Цикл

     СсылкаТЧ = ДокументДляВыгрузкиСсылка[ТекТЧДокумента.Имя];

        Для каждого стр Из СсылкаТЧ цикл

          Для каждого строкаТЧ Из ТекТЧДокумента.Реквизиты цикл

           Текст.ДобавитьСтроку(«» + строкаТЧ.Имя + «:» + стр[строкаТЧ.Имя]);

          КонецЦикла;

        КонецЦикла;

    КонецЦикла;

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

Что — то не так пошло :(

   Гипервизор

13 — 05.06.18 — 12:56

(11) «1С разонравился»

Зря вы это написали )

   theblockhead

14 — 05.06.18 — 13:03

(13) Да не привычно все как-то, задание дали сразу такое, поэтому кроме негатива пока ничего нет, может когда результат будет изменю свое мнение

   1Сергей

15 — 05.06.18 — 13:48

(14) Кроме 1С есть опыт с языками программирования?

   theblockhead

16 — 05.06.18 — 13:52

(15) C#, js, C++

  

1Сергей

17 — 05.06.18 — 14:09

(16) тогда будешь плеваться на 1С. Это неизбежно

Как получить имя реквизита табличной части?

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

UPD #1 — Перефразировал
Как получить ИМЯ реквизита колонки ТЧ находясь в ячейке ТЧ.


  • Вопрос задан

    более трёх лет назад

  • 2067 просмотров

Пригласить эксперта

Ответ зависит от варианта разрабатываемого интерфейса.

Обычный интерфейс:
Элемент формы связанный с табличной частью «ТаблицаДанных» — ЭлементыФормы.ТаблицаДанных
Текущая колонка — ЭлементыФормы.ТаблицаДанных.ТекущаяКолонка
Имя реквизита формы для колонки — ЭлементыФормы.ТаблицаДанных.ТекущаяКолонка.Имя
Имя реквизита табличной части, который связан с колонкой — ЭлементыФормы.ТаблицаДанных.ТекущаяКолонка.Данные

Управляемый интерфейс
Элемент формы связанный с табличной частью «ТаблицаДанных» — Элементы.ТаблицаДанных
Текущая колонка — Элементы.ТаблицаДанных.ТекущийЭлемент
Имя реквизита формы для колонки — Элементы.ТаблицаДанных.ТекущийЭлемент.Имя
Имя реквизита табличной части, который связан с колонкой — Элементы.ТаблицаДанных.ТекущийЭлемент.ПутьКДанным (доступно только на сервере)

Это можно сделать запросом. Другой вариант — обойти в цикле.


  • Показать ещё
    Загружается…

24 мар. 2023, в 07:38

20000 руб./за проект

24 мар. 2023, в 07:23

100000 руб./за проект

24 мар. 2023, в 07:11

100000 руб./за проект

Минуточку внимания

  Как получить доступ к реквизитам объекта?

Статья носит справочный характер. Предназначена для начинающих программистов.

Получить массив реквизитов объекта можно при помощи самого объекта:

                ДокСсылка = СсылкаНаДокумент(ТипДокумента, НомерДок);
                ДокОбъект = ДокСсылка.ПолучитьОбъект();
                МассивРеквизитовОбъекта = ДокОбъект.Метаданные().Реквизиты;

  Получив массив реквизитов, можно организовать Цикл для просмотра имен реквизитов:

 Для каждого Реквизит Из ДокОбъект.Метаданные().Реквизиты Цикл
                        Сообщить(Реквизит.Имя + " :" + Реквизит.Представление());
КонецЦикла;

Для того, чтобы получить значения реквизитов объекта вообще говоря надо обратиться с запросом к БД, типа:

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

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

Удобнее конечно для поиска значений реквизитов воспользоваться готовыми решениями, например фунцией ПолучитьЗначенияРеквизитов() общего модуля ОбщегоНазначения.

 
// Возвращает структуру, содержащую значения реквизитов прочитанные из информационной базы
// по ссылке на объект.
//
//  Если доступа к одному из реквизитов нет, возникнет исключение прав доступа.
//  Если необходимо зачитать реквизит независимо от прав текущего пользователя,
//  то следует использовать предварительный переход в привилегированный режим.
//
// Параметры:
//  Ссылка       - ссылка на объект, - элемент справочника, документ, ...
//  ИменаРеквизитов - Строка или Структура - Если Строка, то имена реквизитов,
//               перечисленные через запятую, в формате требований к свойствам структуры.
//               Например, "Код, Наименование, Родитель".
//               Если Структура, то в качестве ключа передается псевдоним поля для
//               возвращаемой структуры с результатом, а в качестве значения (опционально)
//               - фактическое имя поля в таблице.
//               Если значение не определено, то имя поля берется из ключа.
//
// Возвращаемое значение:
//  Структура    - содержит список свойств, как список имен в строке
//                 ИменаРеквизитов, со значениям реквизитов, прочитанных
//                 из информационной базы.
//
Функция ПолучитьЗначенияРеквизитов(Ссылка, ИменаРеквизитов) Экспорт
        Если ТипЗнч(ИменаРеквизитов) = Тип("Структура") Тогда
                СтруктураРеквизитов = ИменаРеквизитов;
        ИначеЕсли ТипЗнч(ИменаРеквизитов) = Тип("Строка") Тогда
                СтруктураРеквизитов = Новый Структура(ИменаРеквизитов);;
        Иначе
                ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
                        НСтр("ru = 'Неверный тип второго параметра ИменаИлиСтруктураРеквизитов: %1'"),
                        Строка(ТипЗнч(ИменаРеквизитов)));
        КонецЕсли;
        ТекстПолей = "";
        Для каждого КлючИЗначение Из СтруктураРеквизитов Цикл
                ИмяПоля   = ?(ЗначениеЗаполнено(КлючИЗначение.Значение), СокрЛП(КлючИЗначение.Значение), СокрЛП(КлючИЗначение.Ключ));
                Псевдоним = СокрЛП(КлючИЗначение.Ключ);
                ТекстПолей  = ТекстПолей + ?(ПустаяСтрока(ТекстПолей), "", ",") + "
                        |       " + ИмяПоля + " КАК " + Псевдоним;
        КонецЦикла;
        Запрос = Новый Запрос(
                "ВЫБРАТЬ
                |" + ТекстПолей + "
                |ИЗ
                |       " + Ссылка.Метаданные().ПолноеИмя() + " КАК ПсевдонимЗаданнойТаблицы
                |ГДЕ
                |       ПсевдонимЗаданнойТаблицы.Ссылка = &Ссылка
                |");
        Запрос.УстановитьПараметр("Ссылка", Ссылка);
        Выборка = Запрос.Выполнить().Выбрать();
        Выборка.Следующий();
        Результат = Новый Структура;
        Для каждого КлючИЗначение Из СтруктураРеквизитов Цикл
                Результат.Вставить(КлючИЗначение.Ключ);
        КонецЦикла;
        ЗаполнитьЗначенияСвойств(Результат, Выборка);
        Возврат Результат;
КонецФункции

Значение реквизитов в этой функции получено через запрос к БД. Возвращаемое значение — структура (ключ-значение). Пример использования:

         ДокСсылка = СсылкаНаДокумент(ТипДокумента, НомерДок);
        СтруктураНастроек = Новый Структура;
         //инициируем структуру настроек именами реквизитов
        Для каждого Реквизит Из ДокОбъект.Метаданные().Реквизиты Цикл
                СтруктураНастроек.Вставить(Реквизит.Имя, Реквизит.Имя);
        КонецЦикла;      
                
        ЗначенияРеквизитов = ПолучитьЗначенияРеквизитов(ДокСсылка , СтруктураНастроек);
        СканПростойСтруктуры(ЗначенияРеквизитов); //вывести структуру для просмотра
 

Поскольку в функцию ПолучитьЗначенияРеквизитов() во второй параметр надо передать структуру, то мы создали структуру и организовали Цикл ее инициализации данными из массива имен реквизитов объекта. Возвращает функция так же структуру (ключ-значение), с которой удобно работать. Для просмотра этой структуры можно воспользоваться циклом, либо вызвать функцию СканПростойСтруктуры(), которой передать структуру для просмотра.

 
Функция СканПростойСтруктуры(Структура)
        Для каждого Элемент из Структура Цикл
                Сообщить(Элемент.Ключ + ": " + Элемент.Значение);
        КонецЦикла;
КонецФункции

Если исследуемый объект использует так же еще и общие реквизиты, и их необходимо найти, то можно воспользоваться функцией МассивИменРеквизитовОбъекта(), которая находит не только реквизиты объекта но и общие и даже стандартные реквизиты, которые использует объект:

 
// Возвращает массив имен всех реквизитов переданного объекта
//
Функция МассивИменРеквизитовОбъекта(Объект) Экспорт
    МассивИменРеквизитов = Новый Массив;
    Если ТипЗнч(Объект) = Тип("ОбъектМетаданных") Тогда
        МетаданныеОбъекта = Объект;
    Иначе
        МетаданныеОбъекта = Метаданные.НайтиПоТипу(ТипЗнч(Объект));
        Если МетаданныеОбъекта = Неопределено Тогда
            Возврат МассивИменРеквизитов;
        КонецЕсли;
    КонецЕсли;
    Для индекс = 0 по 1 Цикл
//        КоллекцияРеквизитов = ?(индекс = 0, МетаданныеОбъекта.СтандартныеРеквизиты, МетаданныеОбъекта.Реквизиты);
        КоллекцияРеквизитов = МетаданныеОбъекта.Реквизиты;
        Для каждого Реквизит Из КоллекцияРеквизитов Цикл
            МассивИменРеквизитов.Добавить(Реквизит.Имя);
        КонецЦикла;
    КонецЦикла;
    Для каждого ОбщийРеквизит Из Метаданные.ОбщиеРеквизиты Цикл
        Если ИспользуетсяОбщийРеквизит(ОбщийРеквизит, МетаданныеОбъекта) Тогда
            МассивИменРеквизитов.Добавить(ОбщийРеквизит.Имя);
        КонецЕсли;
    КонецЦикла;
    Возврат МассивИменРеквизитов;
КонецФункции

Тогда программа будет выглядеть так:

 
                ДокСсылка = СсылкаНаДокумент(ТипДокумента, НомерДок);
                ДокОбъект = ДокСсылка.ПолучитьОбъект();
                                
                мМассивИмен =  МассивИменРеквизитовОбъекта(ДокОбъект);
                СтруктураНастроек = Новый Структура;
                Для каждого эл Из мМассивИмен Цикл
                        СтруктураНастроек.Вставить(эл, эл);
                КонецЦикла;
                ЗначенияРеквизитов = ОбщегоНазначения.ПолучитьЗначенияРеквизитов(ДокСсылка , СтруктураНастроек);
                СканПростойСтруктуры(ЗначенияРеквизитов);

Вспомогательная функция:

 
// Проверяет используется ли в Объекте указанный общий реквизит
//
Функция ИспользуетсяОбщийРеквизит(ОбщийРеквизит, Объект) Экспорт
    Если ТипЗнч(Объект) = Тип("ОбъектМетаданных") Тогда
        МетаданныеОбъекта = Объект;
    Иначе
        МетаданныеОбъекта = Метаданные.НайтиПоТипу(ТипЗнч(Объект));
        Если МетаданныеОбъекта = Неопределено Тогда
            Возврат Ложь;
        КонецЕсли;
    КонецЕсли;
    Если ТипЗнч(ОбщийРеквизит) = Тип("ОбъектМетаданных") Тогда
        МетаданныеОбщегоРеквизита = ОбщийРеквизит;
    Иначе
        МетаданныеОбщегоРеквизита = Метаданные.ОбщиеРеквизиты.Найти(ОбщийРеквизит);
        Если МетаданныеОбщегоРеквизита = Неопределено Тогда
            Возврат Ложь;
        КонецЕсли;
    КонецЕсли;
    ЭлементСостава = МетаданныеОбщегоРеквизита.Состав.Найти(МетаданныеОбъекта);
    Если ЭлементСостава = Неопределено Тогда
        Возврат Ложь;
    КонецЕсли;
    пИспользованиеОбщегоРеквизита = Метаданные.СвойстваОбъектов.ИспользованиеОбщегоРеквизита;
    Если ЭлементСостава.Использование = пИспользованиеОбщегоРеквизита.Использовать Тогда
        Возврат Истина;
    ИначеЕсли ЭлементСостава.Использование = пИспользованиеОбщегоРеквизита.НеИспользовать Тогда
        Возврат Ложь;
    Иначе
        пАвтоИспользованиеОбщегоРеквизита = Метаданные.СвойстваОбъектов.АвтоИспользованиеОбщегоРеквизита;
        Если МетаданныеОбщегоРеквизита.АвтоИспользование = пАвтоИспользованиеОбщегоРеквизита.Использовать Тогда
            Возврат Истина;
        Иначе
            Возврат Ложь;
        КонецЕсли;
    КонецЕсли;
КонецФункции

Как получить значение отдельного реквизита объекта?

Иногда необязательно получать значения всего массива реквизитов. Программист как правило знает имя реквизита, значение которого необходимо получить. К отдельному реквизиту объекта можно обратиться просто по его имени:

Поставщик = ДокОбъект.Метаданные().Реквизиты.Поставщик;

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

 
                ДокСсылка = СсылкаНаДокумент(ТипДокумента, НомерДок);
                ДокОбъект = ДокСсылка.ПолучитьОбъект();
                                
                Организация = Строка(ДокОбъект.Метаданные().Реквизиты.Организация);
                СтруктураНастроек = Новый Структура;
                СтруктураНастроек.Вставить(Организация, Организация);
 
                ЗначенияРеквизитов = ОбщегоНазначения.ПолучитьЗначенияРеквизитов(ДокСсылка , СтруктураНастроек);
                СканПростойСтруктуры(ЗначенияРеквизитов);

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

Как найти имена реквизитов в таб части объекта?

Функция определяет есть ли реквизит в таб части документа:

// Позволяет определить есть ли среди реквизитов табличной части документа
// реквизит с переданным именем.
//
// Параметры:
//  ИмяРеквизита - строковое имя искомого реквизита,
//  МетаданныеДокумента - объект описания метаданных документа, среди реквизитов которого производится поиск.
//  ИмяТабЧасти  - строковое имя табличной части документа, среди реквизитов которого производится поиск
//
// Возвращаемое значение:
//  Истина - нашли реквизит с таким именем, Ложь - не нашли.
//
 
Функция ЕстьРеквизитТабЧастиДокумента(ИмяРеквизита, МетаданныеДокумента, ИмяТабЧасти) Экспорт
    ТабЧасть = МетаданныеДокумента.ТабличныеЧасти.Найти(ИмяТабЧасти);
    Если ТабЧасть = Неопределено Тогда // Нет такой таб. части в документе
        Возврат Ложь;
    Иначе
        Возврат НЕ (ТабЧасть.Реквизиты.Найти(ИмяРеквизита) = Неопределено);
    КонецЕсли;
КонецФункции

Пример использования:

 

        ИмяРеквизита = "Номенклатура";
        МетаданныеДокумента = ДокОбъект.Метаданные();
        ИмяТабЧасти = "Товары";
        
         Если ЕстьРеквизитТабЧастиДокумента(ИмяРеквизита, МетаданныеДокумента, ИмяТабЧасти) Тогда
            Сообщить("Реквизит есть!");
         Иначе
            Сообщить("Реквизита нет");
         КонецЕсли;
 

Сообщить имя реквизитов таб части:

 
Для каждого Реквизит Из ДокОбъект.Метаданные().ТабличныеЧасти.Найти("Товары").Реквизиты Цикл
        Собщить(Реквизит.Имя);
КонецЦикла; 

Как найти значение всех реквизитов всех таб частей документа через запрос

Чтобы найти значения всех реквизитов всех табличных частей объекта через запрос воспользуемся функцией

ПолучитьЗначенияРеквизитовТабЧасти().

Функция ПолучитьЗначенияРеквизитовТабчасти(Ссылка, ИменаРеквизитов, ИмяТабЧасти) Экспорт
        
        ИмяТЧ = ИмяТабЧасти;
        ПолноеИмя = Ссылка.Метаданные().ПолноеИмя();
           
        Если ТипЗнч(ИменаРеквизитов) = Тип("Структура") Тогда
                СтруктураРеквизитов = ИменаРеквизитов;
        ИначеЕсли ТипЗнч(ИменаРеквизитов) = Тип("Строка") Тогда
                СтруктураРеквизитов = Новый Структура(ИменаРеквизитов);;
        Иначе
                ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
                        НСтр("ru = 'Неверный тип второго параметра ИменаИлиСтруктураРеквизитов: %1'"), 
                        Строка(ТипЗнч(ИменаРеквизитов)));
        КонецЕсли;
        ТекстПолей = "";
        Для Каждого КлючИЗначение Из СтруктураРеквизитов Цикл
                ИмяПоля   = ?(ЗначениеЗаполнено(КлючИЗначение.Значение), СокрЛП(КлючИЗначение.Значение), СокрЛП(КлючИЗначение.Ключ));
                Псевдоним = СокрЛП(КлючИЗначение.Ключ);
                ТекстПолей  = ТекстПолей + ?(ПустаяСтрока(ТекстПолей), "", ",") + "
                        |       " + ИмяПоля + " КАК " + Псевдоним;
        КонецЦикла;
        Запрос = Новый Запрос(
                "ВЫБРАТЬ
                |" + ТекстПолей + "
                |ИЗ
                |       " + ПолноеИмя + "." + ИмяТЧ + " КАК ПсевдонимЗаданнойТаблицы
                |ГДЕ
                |       ПсевдонимЗаданнойТаблицы.Ссылка = &Ссылка
                |");
                                
        Запрос.УстановитьПараметр("Ссылка", Ссылка);
        Результат = Запрос.Выполнить().Выгрузить();
                
        Возврат Результат;
КонецФункции

 Пример использования:

 
        ДокСсылка = СсылкаНаДокумент(ТипДокумента, НомерДок);
        ДокОбъект = ДокСсылка.ПолучитьОбъект();
                                
        
        МассивТабЧастей = Новый Массив;
        Для каждого ТабЧасть Из ДокОбъект.Метаданные().ТабличныеЧасти Цикл
                МассивТабЧастей.Добавить(ТабЧасть.Имя);                 
        КонецЦикла;                                             
                
        Для Каждого ТабЧасть Из МассивТабЧастей Цикл
                        
                СтруктураНастроек = Новый Структура;
                Для каждого Реквизит Из ДокОбъект.Метаданные().ТабличныеЧасти.Найти(ТабЧасть).Реквизиты Цикл
                        СтруктураНастроек.Вставить(Реквизит.Имя, Реквизит.Имя);
                КонецЦикла;                                             
                        
                Сообщить("Имя таб части: " + ТабЧасть);
                ТабЗнач = ПолучитьЗначенияРеквизитовТабЧасти(ДокСсылка , СтруктураНастроек, ТабЧасть);
                                
                ПоказатьТаблицу(ТабЗнач);
                                
        КонецЦикла;
 

Вспомогательная функция:

 
функция ПоказатьТаблицу(Табл)
        
        Сообщить("///Функция ПоказатьТаблицу///");
        
        Количество = Табл.Колонки.Количество();
        
        Для каждого Строка из Табл Цикл
                Для Индекс = 0 По Количество-1 Цикл 
                        Сообщить(СокрЛП(Индекс)+" "+СокрЛП(Табл.Колонки[Индекс].Имя)+ ": " + Строка[СокрЛП(Табл.Колонки[Индекс].Имя)]);
                КонецЦикла;
        КонецЦикла;
        Сообщить("///Конец Функция ПоказатьТаблицу///");
КонецФункции  

Результат для документа «Реализация товаров услуг»:

Имя таб части: Товары
///Функция ПоказатьТаблицу///
0 ЕдиницаИзмерения: шт
1 ЕдиницаИзмеренияМест:
2 Качество: Новый
3 Количество: 1
4 КоличествоМест: 0
5 Коэффициент: 1
6 Номенклатура: Вентилятор настольный
7 ПроцентСкидкиНаценки: 0
8 СерияНоменклатуры: Н-908, С-890 от 01.01.2003
9 СпособСписанияОстаткаТоваров: Со склада
10 СтавкаНДС: Без НДС
11 Сумма: 445,5
12 СуммаНДС: 0
13 ХарактеристикаНоменклатуры:
14 Цена: 450
15 Склад: Магазин «Бытовая техника»
16 ПроцентАвтоматическихСкидок: 1
17 УсловиеАвтоматическойСкидки: По виду дисконтных карт
18 ЗначениеУсловияАвтоматическойСкидки: Серебряная карта
19 КлючСтроки: 3
20 КлючСвязи: 0
21 ЗаказПокупателя: Заказ покупателя ТД000000001 от 08.06.2008 12:00:00
0 ЕдиницаИзмерения: шт
1 ЕдиницаИзмеренияМест:
2 Качество: Новый
3 Количество: 1
4 КоличествоМест: 0
5 Коэффициент: 1
6 Номенклатура: Набор вентиляторов
7 ПроцентСкидкиНаценки: 0
8 СерияНоменклатуры:
9 СпособСписанияОстаткаТоваров: Со склада
10 СтавкаНДС: Без НДС
11 Сумма: 1948,32
12 СуммаНДС: 0
13 ХарактеристикаНоменклатуры:
14 Цена: 1968
15 Склад: Магазин «Бытовая техника»
16 ПроцентАвтоматическихСкидок: 1
17 УсловиеАвтоматическойСкидки: По виду дисконтных карт
18 ЗначениеУсловияАвтоматическойСкидки: Серебряная карта
19 КлючСтроки: 4
20 КлючСвязи: 0
21 ЗаказПокупателя: Заказ покупателя ТД000000001 от 08.06.2008 12:00:00
///Конец Функция ПоказатьТаблицу///

Имя таб части: ВозвратнаяТара
///Функция ПоказатьТаблицу///
///Конец Функция ПоказатьТаблицу///

Имя таб части: Услуги
///Функция ПоказатьТаблицу///
///Конец Функция ПоказатьТаблицу///

Имя таб части: СоставНабора
///Функция ПоказатьТаблицу///
0 Номенклатура: Вентилятор BINATONE ALPINE 160вт, напольный ,
1 ХарактеристикаНоменклатуры:
2 СерияНоменклатуры: 01234/11020/7654321, БОЛГАРИЯ
3 Количество: 1
4 ЕдиницаИзмерения: шт
5 Склад: Магазин «Бытовая техника»
6 Качество: Новый
7 СпособСписанияОстаткаТоваров: Со склада
8 КлючСтроки: 4
9 Цена: 1068
10 КлючСвязи: 0
0 Номенклатура: Вентилятор JIPONIC (Тайв.),
1 ХарактеристикаНоменклатуры:
2 СерияНоменклатуры: 11234/11020/7654321, ТАЙВАНЬ (КИТАЙ)
3 Количество: 1
4 ЕдиницаИзмерения: шт
5 Склад: Магазин «Бытовая техника»
6 Качество: Новый
7 СпособСписанияОстаткаТоваров: Со склада
8 КлючСтроки: 4
9 Цена: 900
10 КлючСвязи: 0
///Конец Функция ПоказатьТаблицу///

Имя таб части: СерийныеНомера

///Функция ПоказатьТаблицу///
///Конец Функция ПоказатьТаблицу///

Имя таб части: СерийныеНомераСоставНабора

///Функция ПоказатьТаблицу///
///Конец Функция ПоказатьТаблицу///

Имя таб части: ДокументыРасчетовСКонтрагентом

 ///Функция ПоказатьТаблицу///
///Конец Функция ПоказатьТаблицу///

Прикинул примерный запрос, а как вернуть значение РасходТоплива из запроса???:dfbsdfbsdf: И может ошибки есть?

Функция ПолучитьРасход (Транспорт, Сезон, ОборудованиеИлиОперация)

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

Запрос1.УстановитьПараметр("Транспорт",Транспорт);
Запрос1.УстановитьПараметр("Сезон",Сезон);
Запрос1.УстановитьПараметр("ОборудованиеИлиОперация",ОборудованиеИлиОперация);

//а как вернуть значение поля РасходТоплива???

КонецФункции

Добавлено: 28 мая 2016, 18:36


Есть кто живой? Очень нужна помощь, я в тупике

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

&НаКлиенте
Процедура Рассчитать(Команда)

Транспорт1=ЭтаФорма.Объект.Транспорт;
Сезон1=ПредопределенноеЗначение("Перечисление.Сезон.Лето");
Операция1=ПредопределенноеЗначение("Перечисление.ОборудованиеИлиОперация.Нет");
Сообщить(ПолучитьРасход(Транспорт1,Сезон1,Операция1));

КонецПроцедуры

Есть функция

Функция ПолучитьРасход (Транспорт, Сезон, ОборудованиеИлиОперация)

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

Запрос1.УстановитьПараметр("Транспорт",Транспорт);
Запрос1.УстановитьПараметр("Сезон",Сезон);
Запрос1.УстановитьПараметр("ОборудованиеИлиОперация",ОборудованиеИлиОперация);

РезультатЗапроса = Запрос1.Выполнить();
Выборка = РезультатЗапроса.Выбрать();

Пока Выборка.Следующий() Цикл

РасходТоплива = Выборка

КонецЦикла;

Возврат РасходТоплива;

КонецФункции

В итоге сообщается пустое значение, вместо указания расхода топлива

Котовчанин

942 / 482 / 200

Регистрация: 16.02.2010

Сообщений: 3,338

Записей в блоге: 37

1

Обращение к реквизиту ТЧ

23.03.2016, 14:46. Показов 25758. Ответов 8


Плаваю ещё в 1С программировании…
Как в модуле формы документа обратиться к реквизиту табличной части этого документа?



0



286 / 186 / 18

Регистрация: 20.02.2012

Сообщений: 925

23.03.2016, 14:57

2

для чего это необходимо? что делать будете с реквизитом тч?



1



GreenkA

Эксперт 1С

3051 / 1998 / 524

Регистрация: 25.06.2009

Сообщений: 6,964

23.03.2016, 16:17

3

Тамика, для изменения текущей строки

1C
1
2
ТекСтрока = Элементы[ИмяТабличнойЧасти].ТекущиеДанные;
ТекСтрока.Количество = 5;//где Количество - реквизит табличной части

для прохождения по всем строкам используйте цикл:

1C
1
2
3
Для Каждого ТекСтрока из Объект[ИмяТабличнойЧасти] Цикл
 ТекСтрока.Количество =5;
КонецЦикла;

для добавления новой строки:

1C
1
2
НовСтрока = Объект[ИмяТабличнойЧасти].Добавить();
НовСтрока.Количество =5;



1



Котовчанин

942 / 482 / 200

Регистрация: 16.02.2010

Сообщений: 3,338

Записей в блоге: 37

23.03.2016, 17:38

 [ТС]

4

GreenkO, прошу прощения, но у меня снова ступор. Сбросила конфигурацию(не знаю верно ли выгрузила…). Проблема с документом НачисленияЗарплат. В модуле объекта я сделала автоподстановку оклада по фамилии… То есть, при выборе фамилии поле СтавкаЗаМесяц должно заполнится само. А оно мало того, что не заполняется, так ещё отладчик показал, что даже не заходит в функцию ПриИзменении… Тестовая База 1.rar



0



Эксперт 1С

3051 / 1998 / 524

Регистрация: 25.06.2009

Сообщений: 6,964

23.03.2016, 18:43

5

Тамика, у меня проблемы при загрузке конфигурации из файлов. На Configuration.xml выдает несоответствие XDTO.
Можете выгрузить конфигурацию одним файлом(Конфигурация — Сохранить конфигурацию в файл)? Или базу(Администрирование — Выгрузить информационную базу).



0



Котовчанин

942 / 482 / 200

Регистрация: 16.02.2010

Сообщений: 3,338

Записей в блоге: 37

23.03.2016, 18:51

 [ТС]

6



0



Эксперт 1С

3051 / 1998 / 524

Регистрация: 25.06.2009

Сообщений: 6,964

23.03.2016, 18:57

7

Тамика, а можете перед выгрузкой установить режим совместимости? У вас платформа 8.3.7, у меня 8.3.6, не открывает. После выгрузки можно будет все вернуть.

Миниатюры

Обращение к реквизиту ТЧ
 



0



Котовчанин

942 / 482 / 200

Регистрация: 16.02.2010

Сообщений: 3,338

Записей в блоге: 37

23.03.2016, 19:52

 [ТС]

8

Поставила режим совместимости с 8.3.6. Или всё-таки лучше поставить с 8.3.4?



0



GreenkA

Эксперт 1С

3051 / 1998 / 524

Регистрация: 25.06.2009

Сообщений: 6,964

23.03.2016, 20:12

9

Лучший ответ Сообщение было отмечено Тамика как решение

Решение

Тамика, события элементов формы описываются &НаКлиенте(так было и по умолчанию, вы видимо изменили). Обращение к данным регистра сведений происходит &НаСервере, т.е. вам надо было вызвать функцию на сервере для получения ставки.
По работе с регистром сведений — есть такая функция ПолучитьПоследнее(…) — она сразу дает вам последнюю запись по регистру по заданному отбору.
Пользуйтесь синтакс-помощником, там так же описано, где можно вызывать определенные методы и получать свойства.

Измененный код:

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
&НаКлиенте
Процедура НачислениеЗарплатФИОПриИзменении(Элемент)
    ТекСтрока = Элемент.Родитель.ТекущиеДанные; //Элемент.Родитель = Табличная часть документа, получаем текущую строку 
    ТекСтрока.СтавкаЗаМесяц = ПолучитьСтавкуЗаМесяцНаСервере(ТекСтрока.ФИО);
КонецПроцедуры
 
&НаСервере
Функция  ПолучитьСтавкуЗаМесяцНаСервере(ФИО)
    Отбор = Новый Структура;
    Отбор.Вставить("Сотрудник", ФИО);
    ОкладыСотрудника = РегистрыСведений.ДанныеОСотрудниках.ПолучитьПоследнее(Объект.Дата, Отбор); 
    
    Если ОкладыСотрудника.Количество() = 0 Тогда
        Сообщить("Нет записей");
        Возврат 0;
    Иначе  
        Возврат ОкладыСотрудника.Оклад;
    КонецЕсли;
КонецФункции



1



 0 

   

Распечатать

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

Код 1C v 8.х

 ПоступлениеТовара = Метаданные.Документы.ПоступлениеТовара;
Реквизиты = ПоступлениеТовара.ТабличныеЧасти.Товары.Реквизиты;
Для каждого наим из Реквизиты Цикл
Сообщить("Имя реквизита " + наим.Имя +
"; тип реквизита " + наим.Тип);
КонецЦикла;
// Результат:
// Имя реквизита Наименование; тип реквизита Справочник ссылка: Номенклатура
// Имя реквизита Количество; тип реквизита Число
// Имя реквизита Цена; тип реквизита Число
// Имя реквизита Сумма; тип реквизита Число

На чтение 7 мин Просмотров 1.1к. Опубликовано 02.11.2021

Содержание

  1. Как называются дополнительные реквизиты на форме и в какой момент они появляются на форме?
  2. Как получить значение отдельного реквизита формы?
  3. Доступ к табличной части формы через объект
  4. Доступ к табличной части формы через ЭлементыФормы

Найти элемент справочника в 1С 8 можно тремя способами:

1) Поиск по коду

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

Описание параметров метода НайтиПоКоду:

  • (обязательный). Тип: Число, Строка. Описание: искомый код, строка или число в зависимости от настроек справочника в конфигураторе.
  • (необязательный). Тип: Булево. Описание: определяет режим поиска по полному коду, истина — искомый код следует задавать в виде строки, состоящей из последовательности кодов по уровням справочника, разделенных символом “/”. Значение по умолчанию: Ложь.
  • (необязательный). Тип: СправочникСсылка. Описание: родитель, в пределах которого нужно выполнять поиск, если не указан, то поиск будет проводиться во всем справочнике.
  • (необязательный). Тип: СправочникСсылка. Описание: владелец, в пределах которого нужно выполнять поиск, если не указан, то поиск будет проводиться во всем справочнике.

2) Поиск по наименованию

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

Описание параметров метода НайтиПоНаименованию:

  • (обязательный). Тип: Строка. Описание: строка, содержащая искомое наименование.
  • ТочноеСоответствие> (необязательный). Тип: Булево. Описание: определяет режим поиска по полному соответствию, поиск будет успешным, если строка поиска: в случае значения параметра Ложь — будет соответствовать левой части наименования, в случае значения параметра Истина — будет полностью совпадать с наименованием (за исключением “хвостовых” пробелов в наименовании). Значение по умолчанию: Ложь.
  • (необязательный). Тип: СправочникСсылка. Описание: родитель, в пределах которого нужно выполнять поиск, если не указан, то поиск будет проводиться во всем справочнике.
  • (необязательный). Тип: СправочникСсылка. Описание: владелец, в пределах которого нужно выполнять поиск, если не указан, то поиск будет проводиться во всем справочнике.

3) Поиск по произвольному реквизиту

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

Описание параметров метода НайтиПоРеквизит:

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

Как называются дополнительные реквизиты на форме и в какой момент они появляются на форме?

Далее привожу решение этих задач — поковыряться с отладчиком пришлось изрядно…

Итак, вот решение:

  1. Для начала смотрим с отладчиком, появились ли Допреквизиты на форме после ПриСозданииНаСервере? Нет. А после ПриОткрытии? Тоже нет. А вот после активизации закладки «Дополнительно» — появились со страшными именами как на скриншоте. Это было создано типовой процедурой УправлениеСвойствами.ЗаполнитьДополнительныеРеквизитыВФорме(ЭтотОбъект), которая создала реквизиты на форме

После чего Система располагает реквизиты на форме

Добавление /изменение реквизитов на форме возможно благодаря следующей интересной конструкции.

Реквизит = Новый РеквизитФормы(ОписаниеСвойства.ИмяСсылочногоРеквизитаЗначение, ФорматированнаяСтрока, , ОписаниеСвойства.Наименование, Истина);
ДобавляемыеРеквизиты.Добавить(Реквизит);

Но это нам сейчас все не нужно, так, для любопытства.

А вот чтобы работать с реквизитами нужно научиться получать их имена на форме по имени дополнительного реквизита. На радость разработчикам при работе с допреквизитами на форме Система создает служебный реквизит «Свойства_ОписаниеДополнительныхРеквизитов» который содержит на форме коллекцию данных, где есть все необходимы нам данные, можно найти и по имени, и найти соответствующее свойство ПланаВидаХарактеристик

Далее дело техники. По имени дополнительного реквизита получаем Поле дополнительного реквизита, и делаем с ним что хотим

  1. Используя функцию из п1 — нужно проверить значение поля дополнительного реквизита на форме

3. Используя функцию из п1 — нужно установить значение поля дополнительного реквизита на форме

4. Используя функцию из п1 – нужно выполнить волшебную процедуру «Переместить» для коллекции Элементов формы

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

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

Проверено на КА 2.4.2.132, но вполне универсально для всех БСП неустановленной версии

Вот собственно и все, чем хотел поделиться, ставим лайк, если полезно

Если реквизит объекта «вытащен» на форму, то реквизит формы можно получить через объект ЭлементыФормы , который содержит коллекцию элементов формы, сканируя ее в цикле:

Этот цикл позволяет просмотреть имена а так же типы всех реквизитов формы, в том числе такие реквизиты как надписи, командные панели и тд.

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

Если реквизит формы имеет тип «ТабличноеПоле», то можно такой элемент просканировать во вложенном цикле и узнать имена колонок таблицы:

Как получить значение отдельного реквизита формы?

Чаще требуется получать не массив реквизитов формы, а значение отдельных конкретных реквизитов формы. Например реквизиты «Шапки» или «Подвала» формы документа.

Реквизиты шапки могут иметь различные типы: Дата, СправочникСсылка, ЧекБокс, элемент раскрывающегося списка и др.

Доступ к табличной части формы через объект

Доступ к табличной части формы (например: Товары) можно получить через объект:

Здесь ДокОбъект.Товары — это табличная часть «Товары» объекта. Далее в цикле табличная часть построчно сканируется!
В каждой итерации цикла можно получить доступ к любому полю строки указав через точку имя этого поля:

Доступ к табличной части формы через ЭлементыФормы

Табличная часть объекта и табличная часть формы объекта — это не одно и то же!

Для того, чтобы код работал правильно, надо чтобы колонка формы табчасти объекта в свойстве данные ссылалась на реквизит табличной части объекта. Этим определяется тип колонки таб части формы.

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

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

Результат для документа Авансовый отчет:

Это табличное поле!! Товары
Количество строк: 4
Женские ботфорты коричневые
Ботинки женские демисезонные
Ботинки женские натуральная кожа
Женские босоножки

Если надо получить значение всех колонок всех строк, то организуем дважды вложенный цикл:
Во внешнем цикле сканируются строки, во внутреннем — колонки:

Результат для документа Авансовый отчет:

Это табличное поле!! ВыданныеАвансы
=======================
НомерСтроки 1
ДокументАванса Расходный кассовый ордер ТК000000004 от 15.02.2007 19:24:03
СуммаДокументаАванса 300
ВалютаДокументаАванса USD
Выдано 300
Сумма 174

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

  • Распечатать

Оцените статью:

  1. 5
  2. 4
  3. 3
  4. 2
  5. 1

(0 голосов, среднее: 0 из 5)

Поделитесь с друзьями!

Понравилась статья? Поделить с друзьями:
  • Как оплатить штраф в пенсионный фонд реквизиты
  • Как получить реквизиты банка втб через телефон
  • Как оплатить штраф гибдд организации реквизиты
  • Как получить реквизиты банка через онлайн банк
  • Как оплатить штраф за утерю паспорта реквизиты