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

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

Я
   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С. Это неизбежно

  1. 09.06.2019, 15:59


    #1

    MasterLoma вне форума


    Гость форума


    Question Получение значения реквизита табличной части. 1С:Предприятие 8.3

    Здравствуйте! Подскажите, пожалуйста, как получить значение реквизита табличной части (в справочнике)? У меня есть таб.часть «Образование», в ней есть реквизит «ВидОбразования» (ссылается на перечисление видов образования). Как получить значение данного реквизита?


  2. 06.07.2019, 20:53


    #2

    iLex вне форума


    Гость форума


    По умолчанию Re: Получение значения реквизита табличной части. 1С:Предприятие 8.3

    Не силен в 1С, но вижу, что за месяц не ответил никто. Если правильно понял, то:
    Получить табличную часть можно так:

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

    // Или
    Номер = 0;
    Пока Номер < ТаблОбразование.Количеств� �() Цикл
    Сообщить(ТаблОбразование[Номер].ВидОбразования);
    Номер = Номер + 1;
    КонецЦикла;


  3. 06.07.2019, 20:59


    #3

    iLex вне форума


    Гость форума


    По умолчанию Re: Получение значения реквизита табличной части. 1С:Предприятие 8.3

    Какая-то ерунда с сообщением — половина стерлась через несколько минут.
    И как отредактировать не понимаю…

    Не силен в 1С, но вижу, что за месяц не ответил никто. Если правильно понял, то:
    Получить табличную часть можно так:

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

    // Или
    Номер = 0;
    Пока Номер < ТаблОбразование.Количеств� �() Цикл
    Сообщить(ТаблОбразование[Номер].ВидОбразования);
    Номер = Номер + 1;
    КонецЦикла;


  4. 06.07.2019, 21:02


    #4

    iLex вне форума


    Гость форума


    По умолчанию Re: Получение значения реквизита табличной части. 1С:Предприятие 8.3

    Попытка 3. Расширенный режим. Почему сообщения так корежит?

    Какая-то ерунда с сообщением — половина стерлась через несколько минут.
    И как отредактировать не понимаю…

    Не силен в 1С, но вижу, что за месяц не ответил никто. Если правильно понял, то:
    Получить табличную часть можно так:

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

    // Или
    Номер = 0;
    Пока Номер < ТаблОбразование.Количеств� �() Цикл
    Сообщить(ТаблОбразование[Номер].ВидОбразования);
    Номер = Номер + 1;
    КонецЦикла;


  5. 06.07.2019, 21:05


    #5

    iLex вне форума


    Гость форума


    По умолчанию Re: Получение значения реквизита табличной части. 1С:Предприятие 8.3

    Попробую картинкой

    Screenshot_1.jpg


  6. 09.07.2019, 11:44


    #6

    avm3110 вне форума


    Гордость форума 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. Показов 44181. Ответов 10

Метки нет (Все метки)


Доброго времени суток!
Есть обработка в которой надо взять значение из табличной части документа конфигурации «ПриказНаОтгрузку»
Табличная часть «Товары» обьект «Количество»
как получить в обработке «Количество» ???
//Как вывести «Количество» в сообщение?

1C
1
2
Количество1 = Документы.Ссылка.ПриказНаОтгрузку.ТабличнаяЧасть.Количество;
сообщить(количество1)



0



SpiRUS

11 / 11 / 5

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

Сообщений: 74

10.05.2016, 10:44

2

Если имеется в виду получить количество позиций в табличной части «Товары», то

1C
1
2
Количество = "СсылкаНаДокумент".Товары.Количество();
Сообщить(Количество)

А если сообщить значение каждой строки из колонки «количество» то

1C
1
2
3
4
Товары = "СсылкаНаДокумент".Товары;
Для Каждого СтрокаТЗ Из Товары Цикл
   Сообщить(СтрокаТЗ.Количество);
КонецЦикла;



1



Granfury

9 / 9 / 5

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

Сообщений: 305

10.05.2016, 11:47

 [ТС]

3

Ссылка на документ — как правильно получить?

1C
1
2
3
4
Товары = Документы.ПриказНаОтгрузку.Товары; //Ошибка: Поле обьекта не обнаружено "Товары"
Для Каждого СтрокаТЗ Из Товары Цикл
   Сообщить(СтрокаТЗ.Количество);
КонецЦикла;

Товары — это табличная часть бокумента, может я как то не так ссылаюсь на эту таб. часть?



0



SpiRUS

11 / 11 / 5

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

Сообщений: 74

10.05.2016, 12:01

4

Цитата
Сообщение от Granfury
Посмотреть сообщение

Ссылка на документ — как правильно получить?

Способов то много. Можно запросом, можно на форму вынести поле ввода. Можно просто:

1C
1
Ссылка = Документы.ПриказНаОтгрузку.НайтиПоНомеру(<НомерДокумента>, <ДатаИнтервала>).Ссылка;



0



Granfury

9 / 9 / 5

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

Сообщений: 305

10.05.2016, 13:51

 [ТС]

5

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

1C
1
2
орг1 = ДанныеПечати.Ссылка.ПриказНаОтгрузку.Организация;
        Сообщить(орг1);

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

1C
1
2
орг1 = ДанныеПечати.Ссылка.ПриказНаОтгрузку.ТабличныеЧасти.Товары.Количество //Не работает;
        Сообщить(орг1);

— не получается!



0



GreenkA

Эксперт 1С

3051 / 1998 / 524

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

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

10.05.2016, 14:24

6

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

Решение

Granfury, Количество — это реквизит табличной части Товары? Надо получать конкретную строку тогда: обходить циклом, по индексу(если заранее знаете количество строк ТЧ):

1C
1
2
3
Для Каждого ТекСтр Из ДанныеПечати.Ссылка.ПриказНаОтгрузку.Товары Цикл
   Сообщить(ТекСтр.Количество);
КонецЦикла;



2



Granfury

9 / 9 / 5

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

Сообщений: 305

10.05.2016, 15:32

 [ТС]

7

GreenkA, Спасибо!

Добавлено через 56 минут
GreenkA, А как суммировать полученные данные

1C
1
2
3
Для Каждого ТекСтр Из ДанныеПечати.Ссылка.ПриказНаОтгрузку.Товары Цикл
   Сообщить(ТекСтр.Количество);
КонецЦикла;

Результат:
2
2
2
2
Е=8;
Как получить результат Сумма(Количество)?



0



GreenkA

Эксперт 1С

3051 / 1998 / 524

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

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

10.05.2016, 15:38

8

Granfury, можно конечно обойти табличную часть и

1C
1
2
3
4
КоличествоИтог = 0;
Для Каждого ТекСтр Из ДанныеПечати.Ссылка.ПриказНаОтгрузку.Товары Цикл
   КоличествоИтог  = КоличествоИтог  + ТекСтр.Количество;
КонецЦикла;

или сразу:

1C
1
КоличествоИтог  = ДанныеПечати.Ссылка.ПриказНаОтгрузку.Товары.Итог("Количество");



0



Granfury

9 / 9 / 5

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

Сообщений: 305

10.05.2016, 18:38

 [ТС]

9

GreenkA, «Поле обьекта не обнаружено «ПриказНаОтгрузку»»

1C
1
2
{ВнешняяОбработка.ПечатьТранспортнойНакладной.МодульОбъекта(221)}: Поле объекта не обнаружено (ПриказНаОтгрузку)
        Для Каждого ТекСтр Из ДанныеПечати.Ссылка.ПриказНаОтгрузку.Товары Цикл

Что не так?



0



Эксперт 1С

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



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

Для этого можно воспользоваться запросом со следующим текстом:

ВЫБРАТЬ РАЗЛИЧНЫЕ
   РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура
ИЗ
   Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары

В качестве источника указываем табличную часть документов — таблицу  Документ.РеализацияТоваровУслуг.Товары. Выходным полем объявляем поле Номенклатура, входящее в состав таблицы источника. Кроме этого, поскольку одна и та же товарная позиция, естественно, могла присутствовать и не один раз в документах, применяем РАЗЛИЧНЫЕ для получения только различных строк в выходной таблице запроса.

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

Для того, чтобы ограничить выборку номеклатуры только номенклатурой из табличной части конкретного документа используем параметр Ссылка в условии в запросе (ГДЕ …):

ВЫБРАТЬ РАЗЛИЧНЫЕ
   РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура
ИЗ
   Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
ГДЕ
   РеализацияТоваровУслугТовары.Ссылка = &Ссылка

Почему я просил подсказать метод. через который следует решаить это дело, потому как опыту — пару книжек … и всё, а как дело дошло до боевой эксплуатации — …(

Первый вариант:

&НаСервереБезКонтекста
Функция ПолучитьРеквизитВыбранногоЗначения(ВыбранноеЗначение)

Возврат ВыбранноеЗначение.Изделия;

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

&НаКлиенте
Процедура ИзделиеОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)

Изделия = ПолучитьРеквизитВыбранногоЗначения(ВыбранноеЗначение);

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

И получил сообщение следуюющего содержания:

{Документ.Акт.Форма.ФормаАкта.Форма(43)}: Ошибка при вызове метода контекста (ПолучитьРеквизитВыбранногоЗначения)
      Изделия = ПолучитьРеквизитВыбранногоЗначения(ВыбранноеЗначение);
по причине:
Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства ‘ret’:
   форма: Элемент
   имя: {http://v8.1c.ru/8.2/managed-application/modules}ret
по причине:
Ошибка отображения типов:
Отсутствует отображение для типа ‘СправочникТабличнаяЧасть.ПроизводственныеЗаказы.Изделия’

По этой ошибке ничего найти не смог, хотя пти все верные

За тем попытался через запрос:

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

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

&НаКлиенте
Процедура ИзделиеПриИзменении(Элемент)
ОбознИзд = ОпределитьНаименованиеИзделия(ОбознИзд)
КонецПроцедуры

И получил ошибку

{Документ.Акт.Форма.ФормаАкта.Форма(57)}: Ошибка при вызове метода контекста (Выполнить): {(6, 1)}: Синтаксическая ошибка «ИЗ»
<<?>>ИЗ
Выборка=Запрос.Выполнить().Выбрать();
по причине:
{(6, 1)}: Синтаксическая ошибка «ИЗ»
<<?>>ИЗ

Ещё пытался через динамический Список — и там не смог получить доступа до табличной части справочника.

В аттачах — form.png — форма документа АКТ. form_pr_zak.png — форма справочника «ПроизводственныеЗаказы» — основа для получения значений Полей «Номер производственного заказа» заполняется из справочника производственных заказов реквизит «Наименование», а поле изделие … по идее должно получаться из справочника «ПроизводственныеЗаказы», но из табличного поля (изделия) колонки «Обозначение Изделия» (ОбознИзд). Вот в почледний пункт — мне его и не получить.

Часть2. Универсальные коллекции

Массив

Как создать массив?

СозданныйМассив = Новый Массив ();

СозданныйМассив = Новый Массив (10);

Как создать многомерный массив?

ДвумерныйМассив = Новый Массив (2, 8);

ДвумерныйМассив = Новый Массив;
МассивВторогоПорядка = Новый Массив(8);
ДвумерныйМассив.Добавить(МассивВторогоПорядка);
ДвумерныйМассив.Добавить(МассивВторогоПорядка);

Значение = ДвумерныйМассив[2][5];
Значение = ДвумерныйМассив.Получить(2).Получить(5);

Как добавить элементы в массив?

НашМассив.Добавить(НовоеЗначение);

Массив = Новый Массив;
Массив.Вставить(5, "ООО ""Лабан""");

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

Размер = НашМассив.Количество();

Как обратиться к элементу массива?

ПервоеЗначение = НашМассив[0];
НашМассив[9] = ДесятоеЗначение;

ПервоеЗначение = НашМассив.Получить(0);
НашМассив.Установить(9, ДесятоеЗначение);

Как перебрать элементы массива?

Для Каждого ЭлементМассива Из МассивЭлементов Цикл
Если ТипЗнч(ЭлементМассива) = Тип("Число") Тогда
Сообщить(ЭлементМассива);
КонецЕсли;
КонецЦикла;

Для Сч = 0 по МассивЭлементов.ВГраница() Цикл
Если ТипЗнч(МассивЭлементов[Сч]) = Тип("Число") Тогда
МассивЭлементов[Сч] = 0;
КонецЕсли;
КонецЦикла;

Как удалить элемент массива?

МассивЭлементов.Удалить(0);

Индекс = МассивЭлементов.ВГраница();
Пока Индекс >= 0 Цикл
Если ТипЗнч(МассивЭлементов[Индекс]) = Тип("Число") Тогда
МассивЭлементов.Удалить(Индекс);
КонецЕсли;
Индекс = Индекс - 1;
КонецЦикла;

Как удалить все элементы массива?

Массив.Очистить();

Как удалить повторяющиеся элементы массива?

Процедура УдалитьПовторяющиесяЭлементы(Массив)

ТекущийИндекс = 0;
ВсегоЭлементов = Массив.Количество();
Пока ТекущийИндекс < ВсегоЭлементов Цикл
Индекс2 = ТекущийИндекс + 1;
Пока Индекс2 < ВсегоЭлементов Цикл
Если Массив[Индекс2] = Массив[ТекущийИндекс] Тогда
Массив.Удалить(Индекс2);
ВсегоЭлементов = ВсегоЭлементов - 1;
Иначе
Индекс2 = Индекс2 + 1;
КонецЕсли;
КонецЦикла;
ТекущийИндекс = ТекущийИндекс + 1;
КонецЦикла;

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

Как скопировать массив?

Функция СкопироватьМассив(ИсходныйМассив)

МассивКопия = Новый Массив;
Для Каждого Элемент Из ИсходныйМассив Цикл
МассивКопия.Добавить(Элемент);
КонецЦикла;

Возврат МассивКопия;

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

Как проверить, что два массива идентичны?

Функция ПроверитьИдентичностьМассивов(ПервыйМассив, ВторойМассив)

НаибольшийИндекс = ПервыйМассив.ВГраница();
Если НаибольшийИндекс > ВторойМассив.ВГраница () Тогда
Возврат Ложь;
КонецЕсли;

Для Счетчик = 0 По НаибольшийИндекс Цикл
Если ПервыйМассив[Счетчик] <> ВторойМассив[Счетчик] Тогда
Возврат Ложь;
КонецЕсли;
КонецЦикла;

Возврат Истина;

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

В массив выгружены данные, содержащие наименования контрагентов. Как их отсортировать?

СписокЗначений = Новый СписокЗначений;
СписокЗначений.ЗагрузитьЗначения(МассивНаименований);
СписокЗначений.СортироватьПоЗначению();
МассивНаименований = СписокЗначений.ВыгрузитьЗначения();

СписокЗначений.СортироватьПоЗначению(НаправлениеСортировки.Убыв);

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

Процедура УдалитьПустыеЭлементы(МассивНоменклатуры)

Счетчик = 0;
КоличествоЭлементов = МассивНоменклатуры.Количество();
Пока Счетчик < КоличествоЭлементов Цикл
Если МассивНоменклатуры [Счетчик].Пустая() Тогда
МассивНоменклатуры.Удалить(Счетчик);
КоличествоЭлементов = КоличествоЭлементов - 1;
Иначе
Счетчик = Счетчик + 1;
КонецЕсли;
КонецЦикла;

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

Как получить массив номенклатурных позиций, использованных в табличных частях «Номенклатура» и «Тара» накладной?

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

Есть две таблицы значений. Как получить массив совпадающих имен колонок?

МассивСовпадающихКолонок = Новый Массив();
Для Каждого Колонка Из ТаблицаПриемник.Колонки Цикл
ИмяКолонкиПриемника = Колонка.Имя;
Если ТаблицаИсточник.Колонки.Найти(ИмяКолонкиПриемника) <> Неопределено Тогда
МассивСовпадающихКолонок.Добавить(ИмяКолонкиПриемника);
КонецЕсли;
КонецЦикла;

Как в запросе сделать отбор по нескольким вариантам заполнения реквизита типа «ПеречислениеСсылка»?

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

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

Как из регистра сведений «РасчетчикиЗарплатыОрганизации» получить в виде массива всех расчетчиков зарплаты определенного подразделения организации?

Функция ПолучитьМассивРасчетчиков(Подразделение)

НаборЗаписей = РегистрыСведений.РасчетчикиЗарплатыОрганизации.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.ПодразделениеОрганизации.Установить(Подразделение);
НаборЗаписей.Прочитать();
МассивРасчетчиков = НаборЗаписей.ВыгрузитьКолонку("Пользователь");

Возврат МассивРасчетчиков;

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

Функция ПолучитьМассивРасчетчиков(Подразделение)

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

Запрос.УстановитьПараметр("Подразделение", Подразделение);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();

МассивРасчетчиков = Новый Массив;
Пока Выборка.Следующий() Цикл
МассивРасчетчиков.Добавить(Выборка.Расчетчик);
КонецЦикла;

Возврат МассивРасчетчиков;

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

Структура

Как создать структуру?

СозданнаяСтруктура = Новый Структура;

Оппонент = Новый Структура ("Фамилия, Имя, Отчество, Возраст"
, "Иванов"
, "Иван"
, "Иванович"
, 7);

Как добавить элементы в структуру?

Оппонент = Новый Структура ("Фамилия, Имя, Отчество, Возраст",

"Иванов", "Иван", "Иванович", 30);
Оппонент.Вставить("Обращение", "Господин");
Оппонент.Вставить("Возраст", 32);

Как обратиться к элементу структуры?

ТекущийВозраст = Оппонет.Возраст;

КлючСтруктуры = "Возраст";
ТекущийВозраст = Оппонет[КлючСтруктуры];

ТекущийВозраст = Неопределено;
Оппонет.Свойство("Возраст", ТекущийВозраст);

Оппонет.Возраст = 32;

Оппонет["Возраст"] = 32;

Оппонент.Вставить("Возраст", 32);

Как перебрать элементы структуры?

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

Как удалить элемент структуры?

СтруктураПараметров.Удалить("Номенклатура");

СтруктураПараметров. Очистить();

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

Структура = Новый Структура;

// Добавить новый элемент.
Структура.Вставить("Цвет", WebЦвета.Белый);

// Установить значение для элемента с ключом "Цвет".
Структура.Вставить("Цвет", WebЦвета.Синий);

Как получить в структуру многомерные данные? Как собрать информацию по установленным в форме журнала отборам?

СтруктураОтборов = Новый Структура;
СтруктураПараметровОтбора = Новый Структура;

Для Каждого ЭлементОтбора из ЖурналДокументовСписок.Отбор Цикл
Если ЭлементОтбора.Использование Тогда
СтруктураПараметровОтбора.Очистить();
СтруктураПараметровОтбора.Вставить("Имя", ЭлементОтбора.Имя);
СтруктураПараметровОтбора.Вставить("ВидСравнения",

ЭлементОтбора.ВидСравнения);
СтруктураПараметровОтбора.Вставить("Значение",

ЭлементОтбора.Значение);
СтруктураПараметровОтбора.Вставить("ЗначениеПо",

ЭлементОтбора.ЗначениеПо);
СтруктураПараметровОтбора.Вставить("ЗначениеС",

ЭлементОтбора.ЗначениеС);
СтруктураПараметровОтбора.Вставить("Представление",

ЭлементОтбора.Представление);
СтруктураПараметровОтбора.Вставить("ПутьКДанным",

ЭлементОтбора.ПутьКДанным);
СтруктураПараметровОтбора.Вставить("ТипЗначения",

ЭлементОтбора.ТипЗначения);

СтруктураОтборов.Вставить(ЭлементОтбора.Имя, СтруктураПараметровОтбора);
КонецЕсли;
КонецЦикла;

Как определить, есть ли в структуре элемент с ключом «Контрагент», и если есть, но содержит пустое значение справочника или Неопределено — удалить этот элемент?

Если Структура.Свойство("Контрагент", ЗначениеЭлемента) Тогда
Если ЗначениеЭлемента = Неопределено ИЛИ ЗначениеЭлемента.Пустая() Тогда
Структура.Удалить("Контрагент");
КонецЕсли;
КонецЕсли;

Структура.Контрагент

Структура["Контрагент"]

Как из табличной части «Товары» документа получить все строки, где значение реквизита «Цена» равно нулю, а значение реквизита «СтавкаНДС» равно значению «НДС18» перечисления «СтавкиНДС»?

СтруктураДляПоиска = Новый Структура("Цена, СтавкаНДС", 0,

Перечисления.СтавкиНДС.НДС18);
МассивСтрок = Товары.НайтиСтроки(СтруктураДляПоиска);

Как получить данные о текущей учетной политике бухгалтерского учета организации из периодического регистра сведений на заданную дату?

// Подготовить отбор по измерению "Организация".
СтруктураОтбора = Новый Структура("Организация", ЮрЛицо);

// Получить данные, актуальные на указанную дату.
СтруктураДанных =

РегистрыСведений.УчетнаяПолитикаБухгалтерскийУчет.ПолучитьПоследнее(ДатаПолучения,

СтруктураОтбора);

// Прочитать данные из структуры данных.
СпособОценкиМпзЮрЛица = СтруктураДанных.СпособОценкиМПЗ;
ДиректКостингЮрЛица = СтруктураДанных.ДиректКостинг;

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

Функция СформироватьСтруктуруТабличнойЧастиДокумента(Документ, ИмяТабличнойЧасти)

СтруктураТабличнойЧастиДокумента = Новый Структура;
Для Каждого Реквизит из

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

Возврат СтруктураТабличнойЧастиДокумента;

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

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

Функция СформироватьЗапросПоТабличнойЧасти(Документ, ИмяТабличнойЧасти, СтруктураПолей) Экспорт

ПоляРеквизитов = "";
Для Каждого Реквизит Из СтруктураПолей Цикл
ПоляРеквизитов = ПоляРеквизитов + ", Док." + Реквизит.Значение + ?(ЗначениеНеЗаполнено(Реквизит.Ключ), "", " КАК " + СокрЛП(Реквизит.Ключ));
КонецЦикла;

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

// Установить параметры запроса.
Запрос.УстановитьПараметр("ДокументСсылка", Документ.Ссылка);

Возврат Запрос.Выполнить();

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

Соответствие

Как создать соответствие?

СозданноеСоответствие = Новый Соответствие();

Как добавить элементы в соответствие?

ВозрастСотрудников.Вставить(Сотрудник, ВозрастСотрудника);

ВозрастСотрудников[Сотрудник] = ВозрастСотрудника;

Как обратиться к элементу соответствия?

ВозрастСотрудника = ВозрастСотрудников.Получить(Сотрудник);

ВозрастСотрудника = ВозрастСотрудников [Сотрудник];

Как перебрать элементы соответствия?

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

Как удалить элемент соответствия?

Замены.Удалить(УдаляемыйТовар);

Замены.Очистить();

Как получить данные из соответствия?

Значение = КурсыВалютДокумента.Получить(УправленческаяВалюта);

Если Значение = Неопределено Тогда
Сообщить("Данная валюта в соответствии отсутствует");

Иначе
Курс = Значение["Курс"];
Кратность = Значение["Кратность"];
КонецЕсли;

Как получить многоуровневое соответствие видов расчетов, обладающих базовыми видами расчетов?

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ОсновныеНачисленияОрганизацииБазовыеВидыРасчета.Ссылка КАК Ссылка,
| ОсновныеНачисленияОрганизацииБазовыеВидыРасчета.ВидРасчета,
| ОсновныеНачисленияОрганизацииБазовыеВидыРасчета.ВидРасчета.Наименование,
| ОсновныеНачисленияОрганизацииБазовыеВидыРасчета.Предопределенный
|ИЗ
| ПланВидовРасчета.ОсновныеНачисленияОрганизации.БазовыеВидыРасчета КАК ОсновныеНачисленияОрганизацииБазовыеВидыРасчета
|ИТОГИ ПО
| Ссылка";

Результат = Запрос.Выполнить();
ВыборкаВидовРасчета = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

ВидыРасчета = Новый Соответствие;
БазовыеВидаРасчета = Новый Соответствие;
СвойстваВидаРасчета = Новый Структура("Наименование, Предопределенный");

// Цикл по видам расчета, обладающим базовыми.
Пока ВыборкаВидовРасчета.Следующий() Цикл
БазовыеВидаРасчета.Очистить();
ВыборкаБазовых = ВыборкаВидовРасчета.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

// Цикл по базовым видам расчета.
Пока ВыборкаБазовых.Следующий() Цикл

// Заполненить значения структуры "СвойстваВидаРасчета".
СвойстваВидаРасчета.Наименование = ВыборкаБазовых.Наименование;
СвойстваВидаРасчета.Предопределенный = ВыборкаБазовых.Предопределенный;

// Заполненить соответствие "БазовыеВидАРасчета".
БазовыеВидаРасчета.Вставить(ВыборкаБазовых.ВидРасчета, СвойстваВидаРасчета);
КонецЦикла;

// Заполнить соответствие "ВидыРасчета".
ВидыРасчета.Вставить(ВыборкаВидовРасчета.Ссылка, БазовыеВидаРасчета);

КонецЦикла;

You have no rights to post comments

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