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

Задача заключается в том, чтобы получить реквизит от ссылочного значения, хранящегося в реквизите формы. Например у документа Накладная есть реквизит ссылочного типа – Поставщик. Необходимо получить ИНН этого поставщика:


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

Поэтому для решения этой задачи в модуле формы создадим серверную внеконтекстную функцию, которую вызовем с клиента и передадим в нее ссылку на поставщика. В теле функции, на сервере, мы получим ИНН поставщика и вернем его на клиента.

Например, локальная команда формы, вызывающая серверную функцию, будет выглядеть следующим образом:

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

А функцию ПолучитьИНННаСервере() опишем здесь же, в модуле формы:

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

Таким образом на сервере мы сразу же получаем значение реквизита «через точку» от полученной ссылки и возвращаем его на клиента.

Важно заметить, что функция ПолучитьИНННаСервере() не использует контекст формы (директива компиляции &НаСервереБезКонтекста). Потому что все, что нужно передать на сервер, – это только ссылка, и мы передаем ее в параметре функции. Использовать контекстный вызов и передавать на сервер весь контекст формы только ради того, чтобы на сервере взять из него значение одного реквизита формы, — это слишком расточительно.

   Politexovec

24.01.07 — 11:59

Люди, недавно начал изучать 1с v8, скажите, как получить реквизиты справочника, если есть его название?

  

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

   Волшебник

Модератор

1 — 24.01.07 — 11:59

через метаданные

   Волшебник

Модератор

2 — 24.01.07 — 12:00

Для Каждого Рекв Из Метаданные.Справочники[ИмяСпр] Цикл
  Сообщить(Рекв.Имя);
КонецЦикла;

   Politexovec

3 — 24.01.07 — 12:01

Спасибо!

Ща попробую

   Politexovec

4 — 24.01.07 — 12:13

Ошибки выкидывает!

Я беру имя справочника из ПолеВыбора, которое сначала формируется так:

____________________________

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

   ЭлементыФормы.ПолеВыбора1.СписокВыбора.Очистить();

   Для каждого Объект Из Метаданные.Справочники

       Цикл

       ЭлементыФормы.ПолеВыбора1.СписокВыбора.Добавить(Объект.ПолноеИмя());

   КонецЦикла;

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

______________________________

Потом просто хочу вывести реквизиты выбранного справочника в ПолеСписка:

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

   Значение = ЭлементыФормы.ПолеВыбора1.Значение;

   Для каждого Рекв Из Метаданные.Справочники[Значение]

       Цикл

         ПолеСписка2.Вставить(Рекв);

       КонецЦикла;

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

___________________________

Ошибки выкидывает :) Что не так? Заранее извиняюсь за простые вопросы, недавно начал работать с 1с!

   dimoff

5 — 24.01.07 — 12:16

Почему Добавить(Объект.ПолноеИмя()); а не

Добавить(Объект.Имя, Объект.Представление);

   Politexovec

6 — 24.01.07 — 12:18

Еще один вопрос, как сделать так, чтобы возращалось имя справочника в виде ИМЯ а не Справочник.Имя ?

   yalex

7 — 24.01.07 — 12:18

(4) Нафига ты в обработчике Выбора получаешь какое-то значение, в параметрах процедуры уже есть параметр ВыбранноеЗначение?

   Politexovec

8 — 24.01.07 — 12:18

:) это я тоже хотел узнать

   dimoff

9 — 24.01.07 — 12:25

(6) В (5)

   Politexovec

10 — 24.01.07 — 12:26

Имя теперь получает в формате ИМЯ

Для каждого Объект Из Метаданные.Справочники

       Цикл

       ЭлементыФормы.ПолеВыбора1.СписокВыбора.Добавить(Объект.Имя);

   КонецЦикла;

Для каждого Рекв Из Метаданные.Справочники[ВыбранноеЗначение]

       Цикл

         ПолеСписка2.Вставить(Рекв);

       КонецЦикла;

Но вот это все равно не пашет! Пишет Итератор не определен для Метаданные.Справочники[ВыбранноеЗначение]

   Politexovec

11 — 24.01.07 — 12:27

С Имя.Представление не пашет:)

   dimoff

12 — 24.01.07 — 12:31

Для каждого Рекв Из Метаданные.Справочники[ВыбранноеЗначение].Реквизиты

Объект.Представление замени на Объект.Синоним

   Politexovec

13 — 24.01.07 — 12:33

ЗАПАХАЛО!!! СПАСИБО!

   Politexovec

14 — 24.01.07 — 13:14

Еще вопрос: Имя справочника, которое получилось из СписокВыбора

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

ВыбранноеЗначение — Его можно использовать только в этой процедуре? как мне это значение использовать в другой функции чтобы обратиться к справочнику с именем ВыбранноеЗначение?

  

DoReMi

15 — 24.01.07 — 16:51

Ну если ты сохранил выбранное значение в ПолеВыбора1, то можно обратиться туда.

У справочников в 1С есть встроенные функции для поиска в них элементов, к ним относится НайтиПоКоду, НайтиПоНаименованию и НайтиПоРеквизиту;

В данном случае рассмотрим поиск по реквизиту. Реквизит может браться любой кроме реквизитов с неограниченной длиной и типом ХранилещеЗначений.

Синтаксис:

Справочники.<НазваниеСправочника>.НайтиПоРеквизиту (<ИмяРекизита>, <Значение>, <Родитель>, <Владелец>)

Параметры:

НазваниеСправочника — наименование справочника, к примеру Сотрудники.

ИмяРекизита — имя реквизита [строка].

Значение — искомое значение реквизита.

Родитель — Ссылка на родителя. Поиск будет вестись только по тем элементам где указан данный родитель. (необязательный)

Владелец — Ссылка на элемент владельца справочника, указанного на закладке Владельцы. (необязательный)

Результат:

Если элемент не найден возвращается ПустаяСсылка, иначе ссылка на элемент.

Если существует несколько элементов, возвращается только 1.

Если реквизит отсутствует в справочнике, то возвращается Неопределено.

Пример:

РеквизитСтаж = 12;
ТекСправочник = Справочники.Преподаватели;
РезультатПоискаПоРеквизиту = ТекСправочник.НайтиПоРеквизиту("Стаж",РеквизитСтаж); 
Если РезультатПоискаПоРеквизиту = ТекСправочник.ПустаяСсылка() Тогда
  Сообщить("Не найден");
Иначе
  Сообщить(РезультатПоискаПоРеквизиту.наименование);
КонецЕсли;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

0 / 0 / 0

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

Сообщений: 7

1

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

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

28.05.2016, 18:09. Показов 9512. Ответов 10


Добрый день, очень сильно нужна помощь….

Есть справочник «ВидыУслуг», реквизит «Тариф»

Есть справочник «ЛицевыеСчета», и табличная часть «Услуги» с реквизитом «Тариф»

Как получить значение реквизита «ВидыУслуг» справочника «ЛицевыеСчета» и перенести их в реквизит «Тариф» табличной части «Услуги» другого справочника «ЛицевыеСчета»?

если ссылаться просто на справочник то совсем не то…
через отбор вообще пусто…

Прошу в поиск не посылать, т.к. своими усилиями перепробовала все что только можно… Успехов 0.

платформа 8.2

Буду очень рада любой помощи….



0



122 / 66 / 26

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

Сообщений: 173

28.05.2016, 18:32

2

Как-то сложно у вас, скорее всего — не оправданно.
Услуги в ТЧ спр ЛицСчета — разве не элементы спр ВидыУслуг?

Да, и тариф оптимально хранить в РС, периодическом, он же может изменяться, скорее всего.



0



0 / 0 / 0

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

Сообщений: 7

28.05.2016, 18:48

 [ТС]

3

Услуги в ТЧ спр ЛицСчета — разве не элементы спр ВидыУслуг?

Нет, это разные справочники

Возможно и сложно, по другому к сожалению не вижу…

В любом случае во всех местах упираюсь в эти действия…

Поэтому нужно освоить что куда и как, а дальше уже если что отталкиваться.



0



122 / 66 / 26

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

Сообщений: 173

28.05.2016, 18:55

4

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

Нет, это разные справочники

Тогда поясните, какая связь между видами услуг и собственно услугами (тем более, что и у тех, и у других есть тариф).
И создайте для услуг новый справочник, оттуда и будете выбирать их в ТЧ справочника ЛицевыеСчета.



0



0 / 0 / 0

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

Сообщений: 7

28.05.2016, 19:08

 [ТС]

5

Тогда поясните, какая связь между видами услуг и собственно услугами (тем более, что и у тех, и у других есть тариф).
И создайте для услуг новый справочник, оттуда и будете выбирать их в ТЧ справочника ЛицевыеСчета.

Прикрепила скрины. И один из вариантов как перенести… но не правильный.. а ошибку не вижу…((

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



0



122 / 66 / 26

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

Сообщений: 173

28.05.2016, 19:18

6

Так не делается. Всё поместили в один справочник.
В общем, вот так:
Справочник Услуги,
Справочник ЛицевыеСчета,
Справочник Клиенты,
РС Тарифы, периодический (наверное, с периодом Месяц),
Документ НачислениеПлатежей.
В документе в шапке ЛицевойСчет (с данными клиента); естественно, дата; а также номер, не несущий особого смысла. В ТЧ список услуг (можно заполнять как вручную, так и организовать автоматическое заполнение при создании документа). Можно также услуги указывать в спр ЛицевыеСчета, а в документ опять же подтягивать автоматически по лицевому счету.
Тариф подтягивается из РС по услуге и дате.



0



pippipi

0 / 0 / 0

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

Сообщений: 7

28.05.2016, 19:29

 [ТС]

7

alex1248, попробую конечно переделать. Но у меня же не один справочник, а 15, просто данные подтягиваются. Это разве неверно?

И вопрос так и остается в воздухе…
Может вы ведите ошибку в моем коде?

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



0



122 / 66 / 26

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

Сообщений: 173

28.05.2016, 19:42

8

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

Это разве неверно?

Очень неверно, что вы документ заменили справочником — честно, вообще никуда не годится, не представляю, как, например, вы будете формировать отчеты.

По поводу кода. Не понятно, что вы вообще хотите получить. Вот что вы писали сначала

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

значение реквизита «ВидыУслуг» справочника «ЛицевыеСчета» и перенести их в реквизит «Тариф» табличной части «Услуги» другого справочника «ЛицевыеСчета»

Что значит — другого справочника ЛицевыеСчета? Вы имеете ввиду другой элемент справочника? Какой именно?

ИМХО, переделать проще, чем потом мучаться с тем, что может получиться.



0



0 / 0 / 0

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

Сообщений: 7

28.05.2016, 20:15

 [ТС]

9

alex1248,
ой… что то я совсем неправильно выразилась, прошу прощения…)Необходимо получить значение реквизита «Тариф» из справочника «ВидыУслуг» и поместить это значение в Справочник «ЛицевыеСчета» ТЧ «Услуги» реквизита «Тариф».
Это возможно?)

Очень неверно, что вы документ заменили справочником — честно, вообще никуда не годится, не представляю, как, например, вы будете формировать отчеты.

Очень стыдно…)) Будем учиться на ходу)))и хочется верить то что обойдусь без отчетов…)



0



122 / 66 / 26

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

Сообщений: 173

28.05.2016, 21:04

10

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

Решение

Код

&НаКлиенте 
Процедура УслугиПриИзменении(Элемент) 
ТекСтрока = Элементы.Услуги.ТекущиеДанные; 
ТекСтрока.Тариф = ПолучитьЗначениеРеквизитаНаСервере(ТекСтрока.ВидУслуги); 
КонецПроцедуры 
&НаСервереБезКонтекста Функция ПолучитьЗначениеРеквизитаНаСервере(Услуга) 
Возврат Услуга.Тариф; 
КонецФункции

Может быть так.

Добавлено через 2 минуты
Это если реквизит ВидУслуги ТЧ Услуги спр ЛицевыеСчета имеет тип спр ВидыУслуг.



1



0 / 0 / 0

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

Сообщений: 7

28.05.2016, 21:13

 [ТС]

11

alex1248, Дааааа!)))) Спасибо огрооомное)))))) после стольких мучений!!))))) Волшебник))))
Именно то чего я так то, чего я так долго добивалась!)))))



0



&НаСервере
Процедура СозданиеИИзменениеЭлементовИГруппСправочникаНаСервере()
 
    /// Как создать новый элемент справочника в 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;
 
    // преобразуем документа обратно в данные формы
    ЗначениеВДанныеФормы(Еда, ДанныеФормы);
 
КонецПроцедуры
 
/// Скачать и выполнить эти примеры на компьютере

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

На чтение 2 мин Просмотров 6.3к. Опубликовано 20.04.2017

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

На стороне клиента код вида
Контрагент.ИНН
приведет к ошибке. Такие конструкции возможны только на сервере.

Предположим, что стоит задача при нажатии на кнопку отобразить ИНН контрагента, выбранного на форме. Для решения поставленной задачи необходимо обратиться на сервер для получения требуемой информации(ИНН). Программный код может иметь вид:

&НаКлиенте
Процедура ПолучитьИНН(Команда)
// Вызов серверной внеконтекстной функции
ИННКонтрагента =
ПолучитьИНННаСервере(Контрагент)
;
Сообщить("ИНН контрагента: " + ИННКонтрагента);
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПолучитьИНННаСервере(Контрагент)
Возврат Контрагент.ИНН;
КонецФункции
При нажатии на кнопку ПолучитьИНН вызывается серверная функция ПолучитьИНННаСервере(). В единственном параметре передается контрагент, выбранный интерактивно пользователем. Функция получает ИНН через точку и сразу же возвращает значение обратно на клиент. Результат работы серверной функции помещается в переменную ИННКонтрагента и выводится пользователю с помощью метода Сообщить().

Серверная функция является внеконтекстной (&НаСервереБезКонтекста). Это значит, что данные, содержащиеся в форме, не будут отсылаться на сервер, что уменьшит объем передаваемых данных и скорость возврата результата функции.


Внимание!

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

Возврат Контрагент.ИНН;

можно заменить на:

Возврат ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Контрагент, "ИНН");


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

Рассмотрим пример: на форме документа рядом с полем ввода контрагента должен выводиться его ИНН. Для этого перенесем реквизит ИНН на форму:

Выбор подчиненного реквизита

В пользовательском режиме при указании контрагента, его ИНН будет автоматически отображен на форме. Никакого программирования в этом случае не потребовалось.

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