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

0 / 0 / 0

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

Сообщений: 3

1

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

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

29.05.2014, 12:17. Показов 64905. Ответов 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. 17.05.2019, 09:54


    #1

    MasterLoma вне форума


    Гость форума


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

    Доброго времени суток! У меня возникли некоторые трудности с получением значения реквизита из справочника в документ. Мне нужно, чтобы когда я в табличной части (документа) в реквизите «Номенклатура» выбирал какую-то номенклатуру, то в реквизит «Цена» табличной части, записывалась её цена из справочника. Для того, чтобы получить значение из справочника, как я понял, нужно создать функцию….А вот как прописать в функции то, что она должна возвращать цену какой-то номенклатуры?
    В справочнике «Номенклатура» у меня хранятся книги. Через предопределённые данные я создал группы (Жанры книг) и в каждом из жанров находятся элементы (книги) с информацией об авторе и тд.


  2. 17.05.2019, 10:38


    #2

    Margofs вне форума


    Пришел за помощью


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

    Какая конфигурация? на какой платформе?


  3. 17.05.2019, 10:54


    #3

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

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

    Доброго времени суток! У меня возникли некоторые трудности с получением значения реквизита из справочника в документ. Мне нужно, чтобы когда я в табличной части (документа) в реквизите «Номенклатура» выбирал какую-то номенклатуру, то в реквизит «Цена» табличной части, записывалась её цена из справочника. Для того, чтобы получить значение из справочника, как я понял, нужно создать функцию….А вот как прописать в функции то, что она должна возвращать цену какой-то номенклатуры?
    В справочнике «Номенклатура» у меня хранятся книги. Через предопределённые данные я создал группы (Жанры книг) и в каждом из жанров находятся элементы (книги) с информацией об авторе и тд.

    Цена — это реквизит справочника «Номенклатура»?
    Тогда можно обращаться без функции: Цена=Номенклатура.Цена;
    Это должно быть прописано в процедуре «ПриВыбореНоменклатуры», которая назначается колонке «Номенклатура»вашей табличной части


  4. 17.05.2019, 11:07


    #4

    Margofs вне форума


    Пришел за помощью


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

    на клиенте он заполняет табличную часть….. не обратиться он объектно!


  5. 17.05.2019, 11:10


    #5

    Margofs вне форума


    Пришел за помощью


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

    &НаКлиенте
    **************
    Для каждого стр из Объект.Товары Цикл /// к примеру, либо получать текущую строку табличной части
    Цена =ВернутьЦену(стр.Номенклат� �ра);
    **************************

    &НаСервере
    Функция ВернутьЦену(Товар)
    Если Не ЗНачениеЗаполнено(Товар) Тогда
    Возврат 0;
    КонецЕсли;

    Возврат Товар.Цена;
    КонецФункции


  6. Пользователь сказал cпасибо:


  7. 17.05.2019, 11:20


    #6

    Margofs вне форума


    Пришел за помощью


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

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

    &НаКлиенте
    **************
    Для каждого стр из Объект.Товары Цикл /// к примеру, либо получать текущую строку табличной части
    Цена =ВернутьЦену(стр.Номенклат� �ра);
    **************************

    &НаСервере
    Функция ВернутьЦену(Товар)
    Если Не ЗНачениеЗаполнено(Товар) Тогда
    Возврат 0;
    КонецЕсли;

    Возврат Товар.Цена;
    КонецФункции

    часть


  8. 17.05.2019, 12:23


    #7

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

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

    &НаКлиенте
    **************
    Для каждого стр из Объект.Товары Цикл /// к примеру, либо получать текущую строку табличной части
    Цена =ВернутьЦену(стр.Номенклат� �ра);
    **************************

    &НаСервере
    Функция ВернутьЦену(Товар)
    Если Не ЗНачениеЗаполнено(Товар) Тогда
    Возврат 0;
    КонецЕсли;

    Возврат Товар.Цена;
    КонецФункции

    Можно так:
    &НаКлиенте
    Процедура ТабличнаяЧасть1Номенклату� �аПриИзменении(Элемент)
    ТекущиеДанные = Элементы.ТабличнаяЧасть1.Т� �кущиеДанные;
    УИ=ТекущиеДанные.Номенклат ура.УникальныйИдентификат� �р();
    ТекущиеДанные.Цена=НайтиЦе ну(УИ);
    КонецПроцедуры
    &Насервере
    Функция НайтиЦену(Реквизит)
    ТекН=Справочники.Номенклат ура.ПолучитьСсылку(Реквизи т);
    Возврат ТекН.Цена;

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


  9. Пользователь сказал cпасибо:


  10. 17.05.2019, 14:03


    #8

    MasterLoma вне форума


    Гость форума


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

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

    Какая конфигурация? на какой платформе?

    1С:Предприятие 8.3, учебная версия (8.3.6.2014)


  11. 17.05.2019, 14:04


    #9

    MasterLoma вне форума


    Гость форума


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

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

    &НаКлиенте
    **************
    Для каждого стр из Объект.Товары Цикл /// к примеру, либо получать текущую строку табличной части
    Цена =ВернутьЦену(стр.Номенклат� �ра);
    **************************

    &НаСервере
    Функция ВернутьЦену(Товар)
    Если Не ЗНачениеЗаполнено(Товар) Тогда
    Возврат 0;
    КонецЕсли;

    Возврат Товар.Цена;
    КонецФункции

    Спасибо попозже попробую таким образом сделать.


Похожие темы

  1. Ответов: 16

    Последнее сообщение: 24.03.2017, 10:41

  2. Ответов: 0

    Последнее сообщение: 14.01.2014, 12:53

  3. Ответов: 1

    Последнее сообщение: 24.04.2012, 13:36

  4. Ответов: 0

    Последнее сообщение: 28.01.2012, 12:20

  5. Ответов: 4

    Последнее сообщение: 11.11.2011, 08:35

Социальные закладки

Социальные закладки


Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •  
  • BB коды Вкл.
  • Смайлы Вкл.
  • [IMG] код Вкл.
  • [VIDEO] код Вкл.
  • HTML код Выкл.

Правила форума

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

Автор ab30ru, 27 июл 2017, 19:08

0 Пользователей и 1 гость просматривают эту тему.

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


Цитата: ab30ru от 27 июл 2017, 19:08Нужно чтобы при выборе книги в переменную НомерКниги записывался инвентарный номер из справочника

Я правильно понял? В форме документа?

&НаКлиенте
Процедура КнигаПриИзменении(Элемент)
    НомерКниги = ПолучитьНомер(Объект.Книга);
КонецПроцедуры

&НаСервере
Функция ПолучитьНомер(Книга)
    Возврат Книга.ИнвентарныйНомер
КонецФункции

Спасибо за Сказать спасибо


Цитата: ab30ru от 27 июл 2017, 19:08
Здравствуйте. Есть справочник Книги. В нем реквизит ИнвентарныйНомер. Есть документ ВыдачаКниг реквизит Книга ссылка на справочник Книги. Нужно чтобы при выборе книги в переменную НомерКниги записывался инвентарный номер из справочника. Помогите пожалуйста с кодом

Если ЗначениеЗаполнено(Объект.ВыдачаКниг) Тогда
    Объект.НомерКниги = Объект.ВыдачаКниг.ИнвентарныйНомер;
Иначе
Объект.НомерКниги = "";
КонецЕсли;

Прописать при изменение реквизита Книга

Помог, нажми спасибо. Не помог, нажми спасибо :-)
Если у Вас есть проблема, то её уже кто то решил @Yandex, @Google


Все верно, только проверь на

ЗначениеЗаполнено(Объект.Книга), и функцию выполняй

&НаСервереБезКонтекста _))


Имеется справочник «Контрагенты» и документ «ЗаписьНаТестДрайв».
«Контрагенты» имеет реквизиты: ФИО, «Паспортные данные», мобильный телефон.
Как мне при выборе клиента на форме документа «ЗаписьНаТестДрайв» заполнить автоматически поля ФИО, «Паспортные данные», мобильный телефон?
Я смог поставить ссылку на справочник, но как оттуда взять все данные, а не только имя?справочник и форма

задан 2 мая 2017 в 19:41

kot_mapku3's user avatar

kot_mapku3kot_mapku3

1,1751 золотой знак13 серебряных знаков32 бронзовых знака

Двойной щелчок по полю ФИО (то, что выделено сейчас на скриншоте), откроется панель свойств, внизу ищем событие ПриИзменении, нажимаем на увеличительное стекло справа. Откроется модуль формы с заготовкой процедуры. Нам нужно написать в ней код, который заполнит нам нужные поля. Т.к. событие выполняется на клиенте, реквизиты других объектов (в данном случае элемента спр-ка Контрагенты) нам недоступны, поэтому мы должны написать функцию, выполняющуюся на сервере и вызвать её. В итоге будет вот так:

&НаКлиенте
Процедура ФИОПриИзменении(Элемент)

    ЗаполнитьДанныеКонтрагентаНаСервере();

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

&НаСервере
Процедура ЗаполнитьДанныеКонтрагентаНаСервере()

    Объект.СерияПаспорта = Объект.ФИО.СерияПаспорта;
    Объект.НомерПаспорта = Объект.ФИО.НомерПаспорта;
    // и так далее, все нужные поля

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

ответ дан 4 мая 2017 в 12:28

Mikhail Sibirev's user avatar

Доступ к Реквизитам Справочника из Модуля формы

Я
   myr4ik07

02.09.14 — 21:00

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

Что то не могу понять принцип работы со Справкой 1С. Вот если я хочу обратиться к какому то типу (например Справочник.НазваниеСправочника) то мне в Справке нужно двигаться Прикладные объекты — Справочники или нужно глядеть в Справке на то откуда ты хочешь обратиться к реквизиту?! (Прикладные объекты — Документы например) ?

Вот не доходит…

  

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

   myr4ik07

1 — 02.09.14 — 21:02

Что я не делаю с модуля формы документа я постоянно получаю Тип Справочника как Справочник.Менеджер

например

Переменная = Справочники.МойСправочник;

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

   myr4ik07

2 — 02.09.14 — 23:23

Ссылка = Справочники.НашиКонтакты.НайтиПоКоду(«000000001»);

    Реквизит = Объект.НашиКонтакты.ПолучитьОбъект();

    Реквизит.НашиКонтакты.Наименование = Ссылка.Наименование;

    Реквизит.Записать();

почему  «Элемент не выбран»?

   vicof

3 — 03.09.14 — 05:33

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

   Рэйв

4 — 03.09.14 — 05:53

(2)

Если НЕ Объект.НашиКонтакты.Пустая() Тогда

   Реквизит = Объект.НашиКонтакты.ПолучитьОбъект();

Иначе

    Сообщить(«Не заполнены наши контакты, какой объект нафиг?»);

    Возврат;

КонецЕсли;

   DrZombi

5 — 03.09.14 — 06:04

Каша, надо так. И поменьше используй в переменных такие название, как Ссылка, Владелец, Родитель, Дата, Номер…

А то может оказаться что заполнишь, но не то :)

СсылкаКонтрагент = Справочники.НашиКонтакты.НайтиПоКоду(«000000001»);

Если НЕ Объект.НашиКонтакты.Пустая() Тогда

    ОбъектКонтр = СсылкаКонтрагент.ПолучитьОбъект();

    ОбъектКонтр.Наименование = СсылкаКонтрагент.Наименование;

    ОбъектКонтр.Записать();

Иначе

    Сообщить(«Не заполнены наши контакты, какой объект нафиг?»);

    Возврат;

КонецЕсли;

   DrZombi

6 — 03.09.14 — 06:05

+(5) Если НЕ Объект.НашиКонтакты.Пустая() Тогда

изменить на

Если НЕ СсылкаКонтрагент.Пустая() Тогда

   Рэйв

7 — 03.09.14 — 06:58

(6)Да, точно:-)  Не проснулся еще

  

chelentano

8 — 03.09.14 — 07:32

не надо заполнять реквизит документа при открытии

Компьютер — устройство разработанное для ускорения и автоматизации человеческих ошибок.

&НаСервере
Процедура СозданиеИИзменениеЭлементовИГруппСправочникаНаСервере()
 
    /// Как создать новый элемент справочника в 1с 8.3, 8.2
 
    // создадим новый элемент справочника Города
    // с именем Владивосток
    Владивосток = Справочники.Города.СоздатьЭлемент();
    Владивосток.Наименование = "Владивосток";
    Владивосток.Записать();
 
    /// Как создать новую группу справочника в 1с 8.3, 8.2
 
    // создадим новую группу справочника Города
    ГородаУМоря = Справочники.Города.СоздатьГруппу();
    ГородаУМоря.Наименование = "Города у моря";
    ГородаУМоря.Записать();
 
    /// Как перенести элемент справочника в другую группу в 1с 8.3, 8.2
 
    // перенесём созданный Владивосток в группу "Города у моря"
    Владивосток.Родитель = ГородаУМоря.Ссылка;
    Владивосток.Записать();
 
    /// Как внести изменения в элемент справочника по ссылке 
    /// в 1с 8.3, 8.2
 
    // найдём город Калькутта
    КалькуттаСсылка = Справочники.Города.НайтиПоНаименованию("Калькутта");
    Если Не КалькуттаСсылка.Пустая() Тогда
        // изменим и запишем численность жителей в городе
        Калькутта = КалькуттаСсылка.ПолучитьОбъект();
        Калькутта.Численность = 1000000;
        Калькутта.Записать();
    КонецЕсли;
 
    /// Как получить и проверить пустую ссылку типа справочник в 1с 8.3, 8.2
 
    ПустаяСсылка = Справочники.Города.ПустаяСсылка();
    Если ПустаяСсылка.Пустая() Тогда
        Сообщить("Ссылка действительно пустая.");
    КонецЕсли;
 
    /// Как узнать принадлежность элемента справочника группе
    /// с учетом уровней иерархии в 1с 8.3, 8.2
 
    ПермьСсылка = Справочники.Города.НайтиПоНаименованию("Пермь");
    РоссияСсылка = Справочники.Города.НайтиПоНаименованию("Россия");
 
    // проверим принадлежит ли город Пермь группе Россия
 
    Если ПермьСсылка.ПринадлежитЭлементу(РоссияСсылка) Тогда
        Сообщить("Элемент Пермь находится в группе Россия.");
    КонецЕсли;
 
    /// Как скопировать существующий элемент справочника в 1с 8.3, 8.2
 
    // скопируем элемент Пермь
 
    КопияПерми = ПермьСсылка.Скопировать();
    КопияПерми.Наименование = КопияПерми.Наименование + " КОПИЯ";
    КопияПерми.УстановитьНовыйКод();
    КопияПерми.Записать();
 
    /// Как выяснить уровень вложенности элемента справочника 
    /// в 1с 8.3, 8.2
 
    Сообщить(КопияПерми.Уровень()); // 1
 
    /// Как заблокировать элемент справочника перед изменениями 
    /// в 1с 8.3, 8.2
 
    // выполним блокировку элемента справочника
    // от изменения другими режимами или пользователями
 
    Пермь = ПермьСсылка.ПолучитьОбъект();
    Если Не Пермь.Заблокирован() Тогда
        Пермь.Заблокировать();
        // тут идёт какой-то долгий алгоритм
        // в результате которого мы меняем
        // заблокированный элемент
        Пермь.Численность = 5000;
        Пермь.Записать();
        // и только потом освобождаем его
        // для других режимов и пользователей
        Пермь.Разблокировать();
    КонецЕсли;
 
    /// Как заполнить новый элемент справочника на основании 
    /// в 1с 8.3, 8.2
 
    // в модуле справочника Города я определил процедуру
    // ОбработкаЗаполнения, которая обрабатывает ситуации
    // когда мы заполняем один элемент на основании
    // данных другого (см. в базе для скачивания)
 
    Хабаровск = Справочники.Города.СоздатьЭлемент();
    Хабаровск.Заполнить(
        Справочники.Города.НайтиПоНаименованию("Рио-де-Жанейро")
    );
    Хабаровск.Наименование = "Хабаровск";
    Хабаровск.Записать();
 
    /// Как пометить на удаление элемент справочника в 1с 8.3, 8.2
 
    // пометим на удаление только что созданный Хабаровск
    Хабаровск.УстановитьПометкуУдаления(
        Истина, // пометка удаления
        Ложь // включая подчиненные (если речь о группе справочника)
    );
    // метод Записать вызывать не нужно
 
КонецПроцедуры
 
&НаСервереБезКонтекста
Функция ПолучитьКлиентаПоИмени(Имя)
    Возврат Справочники.Клиенты.НайтиПоНаименованию(Имя);
КонецФункции
 
/// Как открыть форму существующего элемента справочника 
/// по ссылке в 1с 8.3, 8.2
 
&НаКлиенте
Процедура КакОткрытьФормуСуществующегоЭлементаСправочника(Команда)
 
    СсылкаНаЭлемент = ПолучитьКлиентаПоИмени("Андрей");
 
    ПараметрыФормы = Новый Структура("Ключ", СсылкаНаЭлемент);
 
    ОткрытьФорму(
        "Справочник.Клиенты.ФормаОбъекта", // имя формы
        ПараметрыФормы // параметры для формы
    );
 
КонецПроцедуры
 
/// Как открыть форму существующей группы справочника 
/// по ссылке в 1с 8.3, 8.2
 
&НаКлиенте
Процедура КакОткрытьФормуСуществующейГруппыСправочника(Команда)
 
    СсылкаНаГруппу = ПолучитьКлиентаПоИмени("Vip");
 
    ПараметрыФормы = Новый Структура("Ключ", СсылкаНаГруппу);
 
    ОткрытьФорму(
        "Справочник.Клиенты.ФормаГруппы", // имя формы
        ПараметрыФормы // параметры для формы
    );
 
КонецПроцедуры
 
/// Как открыть форму выбора элемента справочника и
/// отследить её закрытие в 1с 8.3, 8.2
 
&НаКлиенте
Процедура КакОткрытьФормуВыбораЭлементаСправочника(Команда)
 
    ОповещениеОЗакрытии = Новый ОписаниеОповещения("ПослеВыбораЭлемента",
        ЭтотОбъект);
 
    ОткрытьФорму(
        "Справочник.Клиенты.ФормаВыбора",,,,,,ОповещениеОЗакрытии        
    );
 
КонецПроцедуры
 
&НаКлиенте
Процедура ПослеВыбораЭлемента(Результат, Параметры) Экспорт
 
    Если Результат <> Неопределено Тогда
        Сообщить("Был выбран элемент " + Результат);
    КонецЕсли;	
 
КонецПроцедуры
 
/// Как открыть форму выбора группы справочника и
/// отследить её закрытие в 1с 8.3, 8.2
 
&НаКлиенте
Процедура КакОткрытьФормуВыбораГруппыСправочника(Команда)
 
    ОповещениеОЗакрытии = Новый ОписаниеОповещения("ПослеВыбораГруппы",
        ЭтотОбъект);
 
    ОткрытьФорму(
        "Справочник.Клиенты.ФормаВыбораГруппы",,,,,,ОповещениеОЗакрытии        
    );
 
КонецПроцедуры
 
&НаКлиенте
Процедура ПослеВыбораГруппы(Результат, Параметры) Экспорт
 
    Если Результат <> Неопределено Тогда
        Сообщить("Была выбрана группа " + Результат);
    КонецЕсли;	
 
КонецПроцедуры
 
/// Как открыть форму списка справочника и
/// установить отбор по реквизиту в 1с 8.3, 8.2
 
&НаКлиенте
Процедура КакОткрытьФормаСпискаСправочникаСОтбором(Команда)
 
    // откроем список клиентов, оставив
    // только мужчин
 
    ПараметрыОтбора = Новый Структура;
    ПараметрыОтбора.Вставить("Пол", ПолучитьПеречислениеМужской());
 
    ПараметрыФормы = Новый Структура;
    ПараметрыФормы.Вставить("Отбор", ПараметрыОтбора);
 
    ОткрытьФорму(
        "Справочник.Клиенты.ФормаСписка",
        ПараметрыФормы
    );
 
КонецПроцедуры
 
&НаСервереБезКонтекста
Функция ПолучитьПеречислениеМужской()
    Возврат Перечисления.Пол.Мужской;
КонецФункции
 
/// Как открыть форму списка справочника с нужным отображением
/// в 1с 8.3, 8.2
 
&НаКлиенте
Процедура КакОткрытьФормуСпискаСправочникаСНужнымОтображением(Команда)
 
    // откроем список клиентов с отображением "Список"
 
    ФормаСписка = ПолучитьФорму("Справочник.Клиенты.ФормаСписка");    
    ФормаСписка.Открыть();
    ФормаСписка.Элементы.Список.Отображение = ОтображениеТаблицы.Список;
 
КонецПроцедуры
 
/// Как открыть форму только что созданного, но ещё
/// не записанного элемента справочника в 1с 8.3, 8.2
 
&НаКлиенте
Процедура КакОткрытьФормуНовогоНеЗаписанногоСправочника(Команда)
 
    // получаем форму нового справочника
    ФормаНовогоСправочника = ПолучитьФорму(
        "Справочник.Еда.ФормаОбъекта",,, Истина); 
 
    // делаем копию её данных (так как напрямую их менять
    // нельзя)
    КопияДанныхФормы = ФормаНовогоСправочника.Объект;
 
    // заполняем эти данные на сервере
    ЗаполнитьДанныеФормыНаСервере(КопияДанныхФормы);
 
    // копируем заполненные данные в исходную форму
    КопироватьДанныеФормы(КопияДанныхФормы,
        ФормаНовогоСправочника.Объект);
 
    // показываем форму нового заполненного
    // элемента справочника пользователю
    ФормаНовогоСправочника.Открыть();
 
КонецПроцедуры
 
&НаСервере
Процедура ЗаполнитьДанныеФормыНаСервере(ДанныеФормы)
 
    // преобразуем данные формы в документ
    Еда = ДанныеФормыВЗначение(ДанныеФормы,
        Тип("СправочникОбъект.Еда")); 
 
    Еда.Наименование = "Груша";
    Еда.Калорийность = 500;
 
    // преобразуем документа обратно в данные формы
    ЗначениеВДанныеФормы(Еда, ДанныеФормы);
 
КонецПроцедуры
 
/// Скачать и выполнить эти примеры на компьютере

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

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

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

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

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

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

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

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

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

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

 
// Возвращает структуру, содержащую значения реквизитов прочитанные из информационной базы
// по ссылке на объект.
//
//  Если доступа к одному из реквизитов нет, возникнет исключение прав доступа.
//  Если необходимо зачитать реквизит независимо от прав текущего пользователя,
//  то следует использовать предварительный переход в привилегированный режим.
//
// Параметры:
//  Ссылка       - ссылка на объект, - элемент справочника, документ, ...
//  ИменаРеквизитов - Строка или Структура - Если Строка, то имена реквизитов,
//               перечисленные через запятую, в формате требований к свойствам структуры.
//               Например, "Код, Наименование, Родитель".
//               Если Структура, то в качестве ключа передается псевдоним поля для
//               возвращаемой структуры с результатом, а в качестве значения (опционально)
//               - фактическое имя поля в таблице.
//               Если значение не определено, то имя поля берется из ключа.
//
// Возвращаемое значение:
//  Структура    - содержит список свойств, как список имен в строке
//                 ИменаРеквизитов, со значениям реквизитов, прочитанных
//                 из информационной базы.
//
Функция ПолучитьЗначенияРеквизитов(Ссылка, ИменаРеквизитов) Экспорт
        Если ТипЗнч(ИменаРеквизитов) = Тип("Структура") Тогда
                СтруктураРеквизитов = ИменаРеквизитов;
        ИначеЕсли ТипЗнч(ИменаРеквизитов) = Тип("Строка") Тогда
                СтруктураРеквизитов = Новый Структура(ИменаРеквизитов);;
        Иначе
                ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
                        НСтр("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
///Конец Функция ПоказатьТаблицу///

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

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

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

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

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

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

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