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

  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].ВидОбразования


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

Я
   Карась

13.08.12 — 09:49

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

Запрос = Новый Запрос;

   Запрос.Текст =

       «ВЫБРАТЬ

       |    ДоговорыКонтрагентов.а_ВЛице,

       |    КонтактныеЛицаПартнеров.РолиКонтактногоЛица.(

       |        РольКонтактногоЛица

       |    )

       |ИЗ

       |    Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов

       |        ПОЛНОЕ СОЕДИНЕНИЕ Справочник.КонтактныеЛицаПартнеров КАК КонтактныеЛицаПартнеров

       |        ПО ДоговорыКонтрагентов.а_ВЛице = КонтактныеЛицаПартнеров.Ссылка»;

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

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

   Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

       // Вставить обработку выборки ВыборкаДетальныеЗаписи

   КонецЦикла;

По сути я пытаюсь при выборе контактного лица достать его должность и передать ее в реквизит формы,подскажите пожалуйста как мне обработать результат запроса, и правильно ли я его описала?

  

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

   Карась

1 — 13.08.12 — 09:53

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

   Карась

2 — 13.08.12 — 10:05

Или есть второй вариант сделать пока так

Спр=Справочники.КонтактныеЛицаПартнеров.Выбрать(Объект.Лицо.РолиКонтактногоЛица);

ТП=Спр.РолиКонтактногоЛица.Выгрузить();

спис=Новый СписокЗначений;

Для Каждого ТП Из Спр.РолиКонтактногоЛица Цикл

спис.Добавить(ТП.РольКонтактногоЛица);

КонецЦикла;

   Карась

3 — 13.08.12 — 10:05

Но он пока выдает ошибку

   andrewks

4 — 13.08.12 — 10:10

(0) используй соединение для выборки ТЧ  (по Спр.Ссылка=ТЧ.Ссылка)

используй в выборке сразу нужное тебе поле — должность, чтобы не тянуть потом объект снова из БД.

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

   Карась

5 — 13.08.12 — 10:36

А если я все же решила иным способом, почему он у меня ругается на строку

ТП=Спр.РолиКонтактногоЛица.Выгрузить();

пишет

{Форма.Форма.Форма(19)}: Значение не является значением объектного типа (Выгрузить)

ТП=Спр.РолиКонтактногоЛица.Выгрузить();

   andrewks

6 — 13.08.12 — 10:40

слово «решила» подразумевает собой некое законченное действие. а у тебя ошибки

   Карась

7 — 13.08.12 — 10:41

(6)Перефразирую, если я хочу попробовать

   Карась

8 — 13.08.12 — 10:42

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

   Карась

9 — 13.08.12 — 10:44

Я еще совсем в 1 с новичок, месяц всего лишь

   Карась

10 — 13.08.12 — 10:58

   andrewks

11 — 13.08.12 — 11:19

(8) лучше сразу учиться по-нормальному, а то потом переделывать и переделываться будет очень сложно.

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

и только потом можно приступать к кодингу

   Карась

12 — 13.08.12 — 11:37

(11)Сделала

Вот так выполняет как надо, находит контактному лицу должность

ВЫБРАТЬ

   ДоговорыКонтрагентов.Контрагент,

   КонтактныеЛицаПартнеровРолиКонтактногоЛица.Ссылка,

   КонтактныеЛицаПартнеровРолиКонтактногоЛица.НомерСтроки,

   КонтактныеЛицаПартнеровРолиКонтактногоЛица.РольКонтактногоЛица,

   КонтактныеЛицаПартнеров.ФизЛицо

ИЗ

   Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов

       ЛЕВОЕ СОЕДИНЕНИЕ Справочник.КонтактныеЛицаПартнеров КАК КонтактныеЛицаПартнеров

       ПО ДоговорыКонтрагентов.а_ВЛице = КонтактныеЛицаПартнеров.Ссылка,

   Справочник.КонтактныеЛицаПартнеров.РолиКонтактногоЛица КАК КонтактныеЛицаПартнеровРолиКонтактногоЛица

   Карась

13 — 13.08.12 — 11:42

Как мне теперь сделать обход результата?

   Карась

14 — 13.08.12 — 11:48

Пока он тянет всех контактных лиц из запроса, где мне лучше установить отбор по конктретному контактному лицу, там же?

   Rovan

15 — 13.08.12 — 11:49

(0) «для реквизита формы справочника, получить значение должности»

т.е. сам контрагент (ссылка) известен заранее ?

   Карась

16 — 13.08.12 — 11:53

Ну да, я это значение записываю в реквизит а_ВЛице

   Карась

17 — 13.08.12 — 11:54

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

   Rovan

18 — 13.08.12 — 11:56

(16) ну пиши вручную в запросе

ИЗ

   Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов



ГДЕ

  ДоговорыКонтрагентов.Контрагент = &Контрагент

   Карась

19 — 13.08.12 — 12:00

задала, так ничего не выдает

   Карась

20 — 13.08.12 — 12:15

а все вышло, теперь буду адаптировать под свой случай)

   Карась

21 — 13.08.12 — 13:11

А вот такой вопрос, если я в реквизите Лицо указываю собственно ФИО лица и по нему у меня должна проставляться должность, я описала запрос

Запрос = Новый Запрос;

   Запрос.Текст =

       «ВЫБРАТЬ

       |    ДоговорыКонтрагентов.Контрагент,

       |    КонтактныеЛицаПартнеровРолиКонтактногоЛица.Ссылка,

       |    КонтактныеЛицаПартнеровРолиКонтактногоЛица.РольКонтактногоЛица

       |ИЗ

       |    Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов

       |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.КонтактныеЛицаПартнеров КАК КонтактныеЛицаПартнеров

       |        ПО ДоговорыКонтрагентов.а_ВЛице = КонтактныеЛицаПартнеров.Ссылка,

       |    Справочник.КонтактныеЛицаПартнеров.РолиКонтактногоЛица КАК КонтактныеЛицаПартнеровРолиКонтактногоЛица

       |ГДЕ

       |    ДоговорыКонтрагентов.Ссылка = &Ссылка

       |

       |СГРУППИРОВАТЬ ПО

       |    ДоговорыКонтрагентов.Контрагент,

       |    КонтактныеЛицаПартнеровРолиКонтактногоЛица.Ссылка,

       |    КонтактныеЛицаПартнеровРолиКонтактногоЛица.РольКонтактногоЛица»;

   Запрос.УстановитьПараметр(«Ссылка», Объект.Лицо);

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

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

   Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

       // Вставить обработку выборки ВыборкаДетальныеЗаписи

   КонецЦикла;

   //}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА

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

Но пока естественно при вводе лица у меня ничего не выходит

   rasswet

22 — 13.08.12 — 13:17

наверное не фио, а ссылку?

   rasswet

23 — 13.08.12 — 13:18

должность это роль контактного лица?

   Карась

24 — 13.08.12 — 13:22

да

   Карась

25 — 13.08.12 — 14:20

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

Запрос = Новый Запрос;

   Запрос.Текст =

       «ВЫБРАТЬ

       |    КонтактныеЛицаПартнеровРолиКонтактногоЛица.Ссылка,

       |    КонтактныеЛицаПартнеровРолиКонтактногоЛица.РольКонтактногоЛица КАК Должность

       |ИЗ

       |    Справочник.КонтактныеЛицаПартнеров.РолиКонтактногоЛица КАК КонтактныеЛицаПартнеровРолиКонтактногоЛица,

       |    Справочник.КонтактныеЛицаПартнеров КАК КонтактныеЛицаПартнеров

       |ГДЕ

       |    КонтактныеЛицаПартнеров.Ссылка = &Ссылка»;

   Запрос.УстановитьПараметр(«Ссылка», Объект.Лицо);

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

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

   Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

       Должность=ВыборкаДетальныеЗаписи.Должность;

   КонецЦикла;

   //}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА

   Возврат Должность;

   Карась

26 — 13.08.12 — 14:33

Может мне надо именно после запроса устанавливать условия?

  

Карась

27 — 13.08.12 — 15:30

Заработало, вот так

Запрос = Новый Запрос;

   Запрос.Текст =

       «ВЫБРАТЬ

       |    КонтактныеЛицаПартнеровРолиКонтактногоЛица.РольКонтактногоЛица КАК Должность

       |ИЗ

       |    Справочник.КонтактныеЛицаПартнеров.РолиКонтактногоЛица КАК КонтактныеЛицаПартнеровРолиКонтактногоЛица

       |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.КонтактныеЛицаПартнеров КАК КонтактныеЛицаПартнеров

       |            ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Партнеры КАК Партнеры

       |            ПО КонтактныеЛицаПартнеров.Владелец = Партнеры.Ссылка

       |        ПО КонтактныеЛицаПартнеровРолиКонтактногоЛица.Ссылка = КонтактныеЛицаПартнеров.Ссылка

       |ГДЕ

       |    КонтактныеЛицаПартнеровРолиКонтактногоЛица.Ссылка = &КонтактноеЛицо»;

   Запрос.УстановитьПараметр(«КонтактноеЛицо», Объект.Лицо);

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

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

   Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

       Должность=ВыборкаДетальныеЗаписи.Должность;

   КонецЦикла;

   //}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА

   Возврат Должность;

Иногда возникает необходимость вывода в табличное поле документа (или любого другого объекта, имеющего табличную часть) дополнительных колонок с данными, которые не содержатся непосредственно в табличной части. Реализовать это на платформе 1С: Предприятие 8.1 или 8.2 в режиме обычного приложения (без использования управляемых форм) было достаточно просто, чего не скажешь об управляемых формах в 1С 8.2.

Реализация на платформе 1С: Предприятие 8.1 (или в обычном приложении)

В начале коротко о том, как добавить дополнительную колонку в табличное поле на платформе 1С 8.1.

Предположим, что у нас есть некий документ с табличной частью «Товары» (с колонками «Номенклатура» и «Количество») и нам нужно вывести дополнительную колонку «Цена», которая бы содержала данные реквизита «Цена» элементов справочника «Номенклатура», выбранных в строках табличной части.

Для этого нам достаточно добавить в форме документа новую колонку «Цена» в табличное поле, содержащее данные табличной части документа и написать следующий код в обработчике события «ПриПолученииДанных» этого табличного поля:

// обработчик события «ПриПолученииДанных» табличного поля «Товары»
Процедура ТоварыПриПолученииДанных(Элемент, ОформленияСтрок)
Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл
Номенклатура = ОформлениеСтроки.ДанныеСтроки.Номенклатура;
Если ЗначениеЗаполнено(Номенклатура) Тогда
ОформлениеСтроки.Ячейки.Цена.ОтображатьТекст = Истина;
ОформлениеСтроки.Ячейки.Цена.Текст = Формат(Номенклатура.Цена,«ЧЦ=15; ЧДЦ=2»);
КонецЕсли;
КонецЦикла;
КонецПроцедуры

Хочу обратить внимание на то, что строки табличного поля обрабатываются порциями, по мере прокрутки списка.

Реализация на платформе 1С: Предприятие 8.2 (8.3 управляемое приложение)

На платформе 8.2 с использованием управляемых форм решение данной задачи потребует бóльших усилий. Это связано с тем, что за счет своей клиент-серверной ориентированности в платформе 8.2 в управляемом режиме отсутствуют некоторые привычные возможности — например, у табличного поля отсутствуют обработчики событий «ПриПолученииДанных» и «ПриВыводеСтроки», которые мы могли бы использовать для этих целей в 1С 8.1 или 8.2 в обычных формах.

Пусть в нашей конфигурации есть документ «ВводОстатковДолга» с табличной частью «Контрагенты» (с колонками «Контрагент» и «Сумма»). В свою очередь у справочника «Контрагенты» есть реквизит «ИНН», значение которого необходимо выводить в строках табличного поля.

[qu_spoiler title=»Примечание от ‘Капитально:» open=»yes» icon=»chevron-circle»]в статье взят неудачный пример т.к. реквизиты вынести можно получить гораздо проще, но тем не менее статья полезна для рассмотрения в учебных целях[/qu_spoiler]

Откроем управляемую форму документа, добавим новую колонку «ИНН» реквизита «Контрагенты» и перенесём её на закладку «Элементы» (для отображения в форме).

kontargentinn-dobalvenie-v-polya-tablitsy

Откроем палитру свойств поля «КонтрагентыКонтрагент» и добавим обработчик события «ПриИзменении»

// служебная функция получения значения реквизита объекта (выполняется на сервере)
&НаСервере
Функция ЗначениеРеквизита(Объект,ИмяРеквизита);
Возврат Объект[ИмяРеквизита];
КонецФункции

// обработчик события «ПриИзменении» поля «Контрагент» в табличном поле «Контрагенты»
&НаКлиенте
Процедура КонтрагентыКонтрагентПриИзменении(Элемент)
ТекДанные = Элементы.Контрагенты.ТекущиеДанные;
ТекДанные.ИНН = ЗначениеРеквизита(ТекДанные.Контрагент,«ИНН»);
КонецПроцедуры

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

Обновление данных после записи и при чтении на сервере необходимо в связи с тем, что иначе значения колонки «ИНН» будут очищаться каждый раз при возникновении этих событий. Для заполнения колонки «ИНН» опишем в модуле формы служебную серверную процедуру:

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

Затем добавим в модуль формы документа обработчики событий «ПриОткрытии», «ПриЧтенииНаСервере» и «ПослеЗаписиНаСервере», в каждой из которых будем вызвать описанную ранее служебную процедуру «ОбновитьДанныеКолонкиИНН»

&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
ОбновитьДанныеКолонкиИНН();
КонецПроцедуры

&НаСервере
Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)
ОбновитьДанныеКолонкиИНН();
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
ОбновитьДанныеКолонкиИНН();
КонецПроцедуры

Всё готово. Можно посмотреть на результат.

primer-dopolnitelnoj-kolonki-v-spiske

Статья найдена на просторах интернета

Как добавить реквизит объекта в таблицу формы

dobavit-rekvizit-obekta-v-spisok-tablitsy-formy

Любые издержки на рекламную кампанию:
— больше, чем может позволить себе клиент;
— меньше, чем ожидали люди из творческого отдела;
— примерно такие, которых с ужасом опасались бухгалтеры.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

0 / 0 / 0

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

Сообщений: 3

1

1C 8.x (тонкий)

Получение значения реквизита справочника в документ

29.05.2014, 12:17. Показов 64939. Ответов 22


Добрый день, есть вопрос
Как сделать чтобы реквизит табличной части документа получал данные из реквизита справочника.
Т.е. при изменении «ФИО» в табличной части документа подставлялись значения (ДатаРождения, Должность)из справочника (Сотрудники)

Есть справочник Сотрудники, реквизиты «Должность», «Дата рождения»

Есть документ в нем табличная часть «Налоги» и его реквизиты «ФИО» «Должность» «ДатаРождения»

если просто ссылаться через форму на значения справочника то в документе выводится визуально и ДатаРождения, и Должность, но на печати эти поля пустые и при установке условий они ни как не считываются, а как будто пустые

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

платформа 8.2



0



GreenkA

Эксперт 1С

3051 / 1998 / 524

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

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

29.05.2014, 12:34

2

Mujinin, пропишите заполнение этих полей при изменении ФИО. Какая форма? Если управляемая, то значения получать придется на клиенте. Иначе — можно все в одной процедуре.
Пример для управляемой:

1C
1
2
3
4
5
6
7
8
9
10
11
&НаКлиенте
Процедура ФИОПриИзменении(Элемент)
  ТекСтрока = Элементы.Налоги.ТекущиеДанные;
  ТекСтрока.ДатаРождения = ПолучитьЗначениеРеквизитаНаСервере(ТекСтрока.ФИО,"ДатаРождения");
  ТекСтрока.Должность = ПолучитьЗначениеРеквизитаНаСервере(ТекСтрока.ФИО,"Должность");
КонецПроцедуры
 
&НаСервереБезКонтекста
Функция ПолучитьЗначениеРеквизитаНаСервере(ИмяОбъекта, ИмяРеквизита)
  Возврат ИмяОбъекта[ИмяРеквизита];
КонецФункции



2



Mujinin

0 / 0 / 0

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

Сообщений: 3

29.05.2014, 12:41

 [ТС]

3

о мой спаситель….почему мне раньше этого никто не мог подсказать….я начал пол года назад и все время обходил это автозаполнение.

делал все тоже самое только «ФИО» в

1C
1
ТекСтрока.Должность = ПолучитьЗначениеРеквизитаНаСервере(ТекСтрока.ФИО,"Должность");

не выставлял



0



Anmut

0 / 0 / 0

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

Сообщений: 12

27.08.2015, 09:09

4

Не подскажите, а как сделать все тоже самое, но только у меня это не строки в ТЧ а реквизиты дока.

1C
1
2
3
4
5
6
7
&НаКлиенте
Процедура ФИОПриИзменении(Элемент)
    \ Что тут надо прописать?
  Объект.Подразделение = ПолучитьЗначениеРеквизитаНаСервере(ТекСтрока.ФИО,"Подразделение");
  Объект.Должность = ПолучитьЗначениеРеквизитаНаСервере(ТекСтрока.ФИО,"Должность");
    
КонецПроцедуры



0



SonicQ

286 / 186 / 18

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

Сообщений: 925

27.08.2015, 10:12

5

Anmut, я бы лучше изменял реквизиты объекта на сервере. Думаю так будет правильнее

1C
1
2
3
4
5
6
7
8
9
&НаКлиенте
Процедура ФИОПриИзменении(Элемент)
   ФИОПриИзмененииНаСервере();
КонецПроцедуры
 
&НаСервере
Процедура ФИОПриИзмененииНаСервере()
    Объект.Должность = ТутЧтоХотитеПолучайте_ЭтоСервер;
КонецПроцедуры



1



340 / 315 / 43

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

Сообщений: 1,242

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

27.08.2015, 15:06

6

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

Думаю так будет правильнее

нет не правильнее и ведет к снижению производительности. Вы туда сю форму спакуете и отправите, добавите и потом все это полетит назад по сети.

Лучше серверный вызов делать в один раз, получать маленькие данные и заполнить на клиенте. Т.к. объет на форме уже заблокирован вами.



0



286 / 186 / 18

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

Сообщений: 925

27.08.2015, 17:28

7

1c-k,
чтобы потом получить надпись вида «Данный элемент заблокирован пользователем»
после чего данные не получить и форма просто висит



0



286 / 186 / 18

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

Сообщений: 925

27.08.2015, 17:41

8

1c-k, бесспорно, вариант с объект.Реквизит = на клиенте быстрее….
Но зачастую нужно не просто изменить один объект…

Миниатюры

Получение значения реквизита справочника в документ
 



1



1c-k

340 / 315 / 43

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

Сообщений: 1,242

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

27.08.2015, 17:43

9

SonicQ, это с чего такие выводы?
Например на сервер ссылка слетала и оттуда ссылка пришла — 50байт.
А если перекидку на сервер, сколько слетало данных?

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
&НаКлиенте
Процедура ФИОПриИзменении(Элемент)
    Объект.Должность = ФИОПриИзмененииНаСервере(Объект.Ссылка);
КонецПроцедуры
 
&НаСервереБезКонтекста
Функция ФИОПриИзмененииНаСервере(ОбъектСсылка)
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   Должности.Ссылка
        |ИЗ
        |   Справочник.Должности КАК Должности
        |ГДЕ
        |   Должности.Ссылка = &Ссылка";
    
    Запрос.УстановитьПараметр("Ссылка", ОбъектСсылка);
    
    РезультатЗапроса = Запрос.Выполнить();
    Если РезультатЗапроса.Пустой() Тогда 
        Возврат Справочники.Должности.ПустаяСсылка();
    КонецЕсли
    
    РезультатЗапроса = РезультатЗапроса.Выбрать();
    
    РезультатЗапроса.Следующий();
    
    Возврат Результат.Ссылка;
КонецФункции

Добавлено через 1 минуту

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

Но зачастую нужно не просто изменить один объект…

за код ниже от меня программеры получают нагоняй.



1



286 / 186 / 18

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

Сообщений: 925

27.08.2015, 17:45

10

1c-k, а клиент при этом плачет, что при заполнении одного реквизита все остальные не заполнились автоматом…



1



340 / 315 / 43

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

Сообщений: 1,242

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

27.08.2015, 17:47

11

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

Добавлено через 1 минуту
SonicQ, ах да, в фрагменте кода на картинке там два раза дёргается сервер, вероятно туда обрабно большие объемы данных гонять это нормально.
А соединить в один серверный вызов никак нельзя?)



1



286 / 186 / 18

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

Сообщений: 925

27.08.2015, 17:48

12

1c-k, я специально для примера так сделал



1



340 / 315 / 43

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

Сообщений: 1,242

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

27.08.2015, 17:50

13

SonicQ, этот пример как грится делают все программеры которые переходят с обычного приложения в управляемое.



1



SonicQ

286 / 186 / 18

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

Сообщений: 925

27.08.2015, 17:58

14

1c-k, однако именно

1C
1
2
3
4
5
6
7
8
9
&НаКлиенте
Процедура ФИОПриИзменении(Элемент)
   ФИОПриИзмененииНаСервере();
КонецПроцедуры
 
&НаСервере
Процедура ФИОПриИзмененииНаСервере()
    Объект.Должность = ТутЧтоХотитеПолучайте_ЭтоСервер;
КонецПроцедуры

реализовано в типовых конфигурациях, только там продолжения типа

1C
1
ПродажиСервер.ЗаполнитьБанковскиеСчетаПоДоговору(Объект.Договор, Объект.БанковскийСчетОрганизации, Объект.БанковскийСчетКонтрагента);



1



340 / 315 / 43

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

Сообщений: 1,242

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

27.08.2015, 18:05

15

SonicQ, однако надо давать себе отчёт, почему и что в типовых конфигурациях сделано.
Партионный учёт УТ 10.3 например глючит и тормозит, а ведь изменения, которые надо сделать в двух местах — нагрузку снимает со всего сервера. Так что же, надо делать, как в типовой?

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



1



286 / 186 / 18

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

Сообщений: 925

27.08.2015, 18:09

16

1c-k, палка двух концов =)



1



340 / 315 / 43

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

Сообщений: 1,242

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

27.08.2015, 18:19

17

SonicQ, нет. Тут надо подходить из разумности вызовов, дёрганья сервера, и т.п.
В данном случае всё банально и просто, как я выше писал и не надо гонять форму на сервер.
А есть случаи когда для расчетов уходит только таблица и возвращается только таблица. Был у меня документ, который именно так и работает. Потому как программеры писали &НаСервере всегда и везде не думая, что в итоге будет. А в документе 12+ табличных частей и около 6 из них под 100к записей имели да еще по 10-12 колонок.
Так, что к решаемой задаче надо подходить зная, как ведет себя платформа в разных контекстах и что происходит с этим.



1



0 / 0 / 0

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

Сообщений: 12

28.08.2015, 11:32

18

Читаю переписку «ассов» и чувствую себя полнейшим дураком в этих вопросах))). Я в програмировании 1с еще, если можно так сказать, новорожденный. Делаю себе индивидуальную конфу «с нуля» и понимаю, если бы вы ее увидели, то сто пудов я бы выслушал кучу слов не входящих в словарь русского языка.)))).
Спс за помощь, сейчас буду пытаться что-нибудь делать дальше, хотя еще не совсем понимаю что там надо дальше прописывать(((



0



1c-k

340 / 315 / 43

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

Сообщений: 1,242

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

28.08.2015, 11:34

19

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

Подскажите, пожалуйста, так правильно будет?

1C
1
2
3
4
5
6
&НаКлиенте
Процедура ФИОПриИзменении(Элемент)
  Объект.Должность = ПолучитьЗначениеРеквизитаНаСервере(Объект.ФИО,"Должность");
  Объект.Подразделение = ПолучитьЗначениеРеквизитаНаСервере(Объект.ФИО,"Подразделение");
  ОбновитьОтображениеДанных();
КонецПроцедуры

Это как вариант. Увидел бы написал как надо.



1



Anmut

0 / 0 / 0

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

Сообщений: 12

28.08.2015, 11:44

20

Спасибо огромное!!! сделал!!!

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

Добавлено через 2 минуты
Не подскажешь? Сделал конструктором печати форму, все нормально работало. Сейчас решил переделать, кнопка в форме стоит в конфе, а запускаю 1с ее нет в доке..



0



Табличные части существуют у многих объектов в 1С:

  • Справочники
  • Документы
  • Отчеты и обработки
  • Планы счетов
  • Планы видов характеристик
  • Планы видов расчета
  • Бизнес-процессы и задачи

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

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

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

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

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

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

КонецЦикла;

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

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

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

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

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

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

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

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

//содержимое цикла

КонецЦикла;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Понравилась статья? Поделить с друзьями:

Другие крутые статьи на нашем сайте:

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии