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

Перейти к контенту

Перейти в раздел примеры кода 1С 8.3:

1С 8.3 БСП ЗначениеРеквизитаОбъекта. Возвращает значения реквизита, прочитанного из информационной базы по ссылке на объект. Рекомендуется использовать вместо обращения к реквизитам объекта через точку от ссылки на объект для быстрого чтения отдельных реквизитов объекта из базы данных. Функция доступна только на сервере, но если нужно получить реквизит на клиенте, то я ищу модуль ВызовCервера, например, в БП 3.0 это ОбменСКонтрагентамиСлужебныйВызовСервера.ЗначениеРеквизитаОбъекта/

Примера кода от rayastar

&НаКлиенте
Процедура ЗначениеРеквизитаОбъекта(Команда)

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

   // Использование на сервере
   СтранаПроисхождения = СтранаПроисхождения();

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

&НаСервере
Функция СтранаПроисхождения()

   Возврат ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Номенклатура, «СтранаПроисхождения»);

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

// Автор библиотеки: ООО «1С-Софт». Все права защищены © 2021

// Типовая конфигурация Библиотека стандартных подсистем (далее — БСП)
// Код БСП распространяется по лицензии Attribution 4.0 International (CC BY 4.0):
// ссылка на лицензию: https://creativecommons.org/licenses/by/4.0/legalcode

Функция БСП

Функция ЗначениеРеквизитаОбъекта(Ссылка, ИмяРеквизита, ВыбратьРазрешенные = Ложь) Экспорт

   Если ПустаяСтрока(ИмяРеквизита) Тогда
       ВызватьИсключение
           НСтр(«ru = ‘Неверный второй параметр ИмяРеквизита в функции ОбщегоНазначения.ЗначениеРеквизитаОбъекта:
                    |- Имя реквизита должно быть заполнено'»);
   КонецЕсли;

   Результат = ЗначенияРеквизитовОбъекта(Ссылка, ИмяРеквизита, ВыбратьРазрешенные);
   Возврат Результат[СтрЗаменить(ИмяРеквизита, «.», «»)];

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

// Автор библиотеки: ООО «1С-Софт». Все права защищены © 2021

// Типовая конфигурация Библиотека стандартных подсистем (далее — БСП)
// Код БСП распространяется по лицензии Attribution 4.0 International (CC BY 4.0):
// ссылка на лицензию: https://creativecommons.org/licenses/by/4.0/legalcode

Функция на клиенте

ОбщегоНазначенияУТВызовСервера.ЗначенияРеквизитовОбъекта(Ссылка, ИмяРеквизита, ВыбратьРазрешенные);

Copyright©, «Программист 1С в г.Минске», 07.06.2021

Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник

Есть в БСП функция ПолучитьРеквизитСправочникаНАСервере(ИмяСправочника,ИмяРеквизитаШапки)

Я
   Вася Теркин

30.01.19 — 13:19

Писать в модуле

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

функция  ПолучитьРеквизитСправочникаНАСервере(ИмяСправочника,ИмяРеквизитаШапки)

Возврат Справочники[ИмяСправочника][ИмяРеквизитаШапки];

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

или искать в БСП — вот в чем вопрос?

  

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

   Вася Теркин

1 — 30.01.19 — 13:20

Стоп, чего-то не то…

   OldCondom

2 — 30.01.19 — 13:21

общегоназначения.значениеобъекта…

там еще значение объектОВ есть

   Numerus Mikhail

3 — 30.01.19 — 13:21

И что тебе должно вернуться?

   OldCondom

4 — 30.01.19 — 13:21

значениереквизита + значенияРеквизитов что-то такое

   Numerus Mikhail

5 — 30.01.19 — 13:22

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

ОбщегоНазначения.ЗначениеРеквизитаОбъекта

   OldCondom

6 — 30.01.19 — 13:23

   Вася Теркин

7 — 30.01.19 — 13:23

функция  ПолучитьРеквизитСправочникаНАСервере(СсылкаСправочника,ИмяРеквизитаШапки)

Возврат СсылкаСправочника[ИмяРеквизитаШапки];

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

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

   Вася Теркин

8 — 30.01.19 — 13:24

ОК. Свою напишу промежуточную и из нее буду ОбщегоНазначения вызывать

   Numerus Mikhail

9 — 30.01.19 — 13:26

(7) Это плохой способ получения значения реквизита. При обращении через точку тащится весь объект. Тащи нужный реквизит запросом.

   Вася Теркин

10 — 30.01.19 — 13:26

Или такую оставить:

функция  ПолучитьРеквизитСправочникаНАСервере(СсылкаСправочника,ИмяРеквизитаШапки)

Возврат СсылкаСправочника[ИмяРеквизитаШапки];

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

в общий модуль свой вставлю. Не обязательно же все через БСП?

   Вася Теркин

11 — 30.01.19 — 13:27

(9) Тогда через БСП

   Вася Теркин

12 — 30.01.19 — 14:37

Одно не понятно — почему вместо

    Результат = Новый Структура;

    Для Каждого КлючИЗначение Из СтруктураРеквизитов Цикл

        Результат.Вставить(КлючИЗначение.Ключ);

    КонецЦикла;

    ЗаполнитьЗначенияСвойств(Результат, Выборка);

    
    Возврат Результат;

не написать

    ЗаполнитьЗначенияСвойств(Реквизиты, Выборка);

    
    Возврат Реквизиты;

   Вася Теркин

13 — 30.01.19 — 14:38

Ну в смысле

ЗаполнитьЗначенияСвойств(СтруктураРеквизитов, Выборка);

    
    Возврат СтруктураРеквизитов;

   Вася Теркин

14 — 30.01.19 — 14:43

Ну он же NULL все равно нигде не вернет и ни одного реквизита выборка не пропустит.

   Вася Теркин

15 — 30.01.19 — 14:44

Вот вся функция у кого нету

Функция ЗначенияРеквизитовОбъекта(Ссылка, Знач Реквизиты) Экспорт

    
    Если ТипЗнч(Реквизиты) = Тип(«Строка») Тогда

        Если ПустаяСтрока(Реквизиты) Тогда

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

        КонецЕсли;

        Реквизиты = СтрРазделить(Реквизиты, «,», Ложь);

    КонецЕсли;

    
    СтруктураРеквизитов = Новый Структура;

    Если ТипЗнч(Реквизиты) = Тип(«Структура») Или ТипЗнч(Реквизиты) = Тип(«ФиксированнаяСтруктура») Тогда

        СтруктураРеквизитов = Реквизиты;

    ИначеЕсли ТипЗнч(Реквизиты) = Тип(«Массив») Или ТипЗнч(Реквизиты) = Тип(«ФиксированныйМассив») Тогда

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

            СтруктураРеквизитов.Вставить(СтрЗаменить(Реквизит, «.», «»), Реквизит);

        КонецЦикла;

    Иначе

        ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр(«ru = ‘Неверный тип второго параметра Реквизиты: %1′»), Строка(ТипЗнч(Реквизиты)));

    КонецЕсли;

    
    ТекстПолей = «»;

    Для Каждого КлючИЗначение Из СтруктураРеквизитов Цикл

        ИмяПоля   = ?(ЗначениеЗаполнено(КлючИЗначение.Значение),

                      СокрЛП(КлючИЗначение.Значение),

                      СокрЛП(КлючИЗначение.Ключ));

        
        Псевдоним = СокрЛП(КлючИЗначение.Ключ);

        
        ТекстПолей  = ТекстПолей + ?(ПустаяСтрока(ТекстПолей), «», «,») + »

        |    » + ИмяПоля + » КАК » + Псевдоним;

    КонецЦикла;

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

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

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

    «ВЫБРАТЬ

    |» + ТекстПолей + »

    |ИЗ

    |    » + Ссылка.Метаданные().ПолноеИмя() + » КАК ПсевдонимЗаданнойТаблицы

    |ГДЕ

    |    ПсевдонимЗаданнойТаблицы.Ссылка = &Ссылка

    |»;

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

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

    
    Результат = Новый Структура;

    Для Каждого КлючИЗначение Из СтруктураРеквизитов Цикл

        Результат.Вставить(КлючИЗначение.Ключ);

    КонецЦикла;

    ЗаполнитьЗначенияСвойств(Результат, Выборка);

    
    Возврат Результат;

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

   Victorov_S

16 — 04.02.19 — 13:29

Добрый день, для выполнения практических заданий нужна БСП 2.3.2.59, кто знает где взять?

   Вася Теркин

17 — 04.02.19 — 13:56

Разве на ИТС нету?

   Nikoss

18 — 04.02.19 — 14:31

(5)(6) откуда вы помните все эти функции БСП? Просто по опыту? Или прям по списку с ИТС учить приходится?

П.С. там одних процедур/функций в общем назначении 300 штук

   Вася Теркин

19 — 04.02.19 — 14:33

(18) Там 61 подсистема, вроде…

   Numerus Mikhail

20 — 04.02.19 — 14:35

(18) Помню только самые часто используемые

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

   Victorov_S

21 — 04.02.19 — 14:40

Неа, нашел только 2.1.8.2 ли 3.0.2.164 там.

  

Victorov_S

22 — 04.02.19 — 14:47

Вернее БСП 2.3.2.59 — 2.3.2.73 подойдет

Получить значение реквизита объектов (&НаСервере)



FastCode


1413

11
21
66



БСП

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

Автор: HostHost

ФизическиеЛицаПодобранныхСотрудников = ОбщегоНазначения.ЗначениеРеквизитаОбъектов(МассивСотрудников, "ФизическоеЛицо");

0

0


0

ред. 2 года назад

Недостаточно рейтинга для добавления отрицательного голоса. Шаблон будет скрыт из ваших результатов поиска.

{1} Переменной ФизическиеЛицаПодобранныхСотрудников присвоено значение, но оно нигде не используется


  • Шаблоны кода 1С

    База полезных фрагментов кода



  • Секреты TurboConf

    С автором программы



  • Нейросети и AI

    Будущее наступает



  • Лайфхаки 1С

    Полезные советы, база знаний



  • Бубен админа

    Приемы администрирования



  • 1С не всерьез

    Одинесники шутят


Комментарии

См. также

ПолучитьЗначениеРеквизитаПредмета (БСП)

ПриЧтенииПредставленийНаСервере (БСП)

ПриЧтенииНаСервере (БСП)

ПолучитьНовоеЗначениеРеквизитаДопУпорядочивания (БСП)

ПолучитьБлокируемыеРеквизитыОбъекта (БСП)

Вернуть значения реквизитов объекта

ЗначениеРеквизитаОбъекта (БСП)

ЗначениеРеквизитаОбъектов (БСП)

ЗначенияРеквизитовОбъектов (БСП)

sale

fastcode_tg

courses_fastcode

courses_fastcode

Previous

Next

Модератору

Полезные функции БСП

Полезные функции БСП

Список часто востребованных, по моему мнению, функций из состава Библиотеки стандартных подсистем 2.2.

Сегодня смотрел конфигурацию клиента и наткнулся на забавный код:

ФизЛицо = ПользователиИнформационнойБазы.ТекущийПользователь().ФизическоеЛицо;

(этот код вообще не рабочий, если внимательно посмотреть)

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

ИмяПользователя = ПользователиИнформационнойБазы.ТекущийПользователь().ПолноеИмя();
 
Пользователь = Справочники.Пользователи.НайтиПоНаименованию(ИмяПользователя);

Например для вышестоящего кода, правильно было бы писать вот так:

ФизЛицо = Пользователи.ТекущийПользователь().ФизическоеЛицо;
 
Пользователь = Пользователи.ТекущийПользователь();
 
//Краткая справка по функции:
// Возвращаемое значение:
//  СправочникСсылка.Пользователи

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

Вот примерный перечень:

1.

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

Пример:

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

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

2.

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

Можно использовать в своей обработке, например при удалении данных проверять ссылки, к тому же в отличии от встроенной функции НайтиСсылки, работает параметр ИсключаемыеОбъекты, что не есть плохо.

3.

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

4. 

// Получает файл из Интернета по протоколу http(s), либо ftp и сохраняет его по указанному пути на сервере.
ПолучениеФайловИзИнтернета.СкачатьФайлНаСервере(Знач URL, ПараметрыПолучения = Неопределено, Знач ЗаписыватьОшибку = Истина)

5.

// Проверяет, является ли текущий или указанный пользователь полноправным.
Пользователи.ЭтоПолноправныйПользователь()
 
Пример:
Если НЕ Пользователи.ЭтоПолноправныйПользователь() Тогда
     ВызватьИсключение НСтр("ru = 'У Вас нет доступа!'");
КонецЕсли;

6.

// Получает номер документа для вывода на печать; из номера удаляются префиксы и лидирующие нули
ПрефиксацияОбъектовКлиентСервер.ПолучитьНомерНаПечать(Знач НомерОбъекта, УдалитьПрефиксИнформационнойБазы = Ложь, УдалитьПользовательскийПрефикс = Ложь)

Пример:

НомерНаПечать = ПрефиксацияОбъектовКлиентСервер.ПолучитьНомерНаПечать("УТПД-00023", Истина, Истина);
//НомерНаПечать будет равен строке "23"

Полезно для тех кто делает дополнительные печатные формы.

7.

// Возвращает курс валюты на дату.
РаботаСКурсамиВалют.ПолучитьКурсВалюты(Валюта, ДатаКурса)

Пример:

//Получение курса валюты документа на 30 января 2014 года
Курс = РаботаСКурсамиВалют.ПолучитьКурсВалюты(ВалютаДокумента, Дата(2014, 01, 30));

8.

// Подставляет параметры в строку. Максимально возможное число параметров - 9.
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Знач СтрокаПодстановки,
     Знач Параметр1, Знач Параметр2 = Неопределено, Знач Параметр3 = Неопределено,
     Знач Параметр4 = Неопределено, Знач Параметр5 = Неопределено, Знач Параметр6 = Неопределено,
     Знач Параметр7 = Неопределено, Знач Параметр8 = Неопределено, Знач Параметр9 = Неопределено)

Очень полезная функция, номер параметра задается знаком процента, пример:

Шаблон = "Недостаточно номенклатуры %1 на складе %2 в количестве %3 шт.";
ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Шаблон, Номенклатура, Склад, КоличествоОстаток);

Советую более подробно посмотреть все функции модуля СтроковыеФункцииКлиентСервер.

 

9.

// Открывает Проводник Windows и выделяет указанный файл.
// пример: ""С:Tempreport.txt"
ФайловыеФункцииСлужебныйКлиент.ОткрытьПроводникСФайлом(Знач ПолноеИмяФайла)

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

В будущем планирую написать про полезную программу с предиктивным набором текста (пока тестирую).

К примеру всегда приходится писать однотипные имена переменных, представляете как было бы полезно, если бы программа запоминала вводимые вами слова и предлогала сразу подставить нужное, исходя из частоты использования слово, либо показала в виде контекстной подсказки все похожие слова. Для программистов это был бы незаменимый помощник.Laughing

Довольно часто в алгоритмах приходится обращаться к значениям реквизитов различных объектов «через точку». При этом, если объект ссылочного типа, то возможно многократное обращение к БД. В данной статье попробуем унифицировать и оптимизировать этот процесс.

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

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

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

Определимся с параметрами:

  1. Объект — объект, данные которого необходимо получить;
  2. ИменаРеквизитов — Список имен реквизитов, данные которых необходимо получить. Если спиок не указан, то предполагаем, что нужно получить данные всех реквизитов;
  3. ДополнительныеРеквизиты — Структура, с помошью которой можно было бы описать дополнительные данные, которые нужно получить вместе с реквизитами объекта (без использования явных соединений с другими таблицами) или выполнение каких-то действий с полями выборки на языке запросов. В ключе элемента структуры описываем имя реквизита в общем списке реквизитов объекта, в значении — поле выборки или алгоритм обработки полей выборки на языке запросов.

Функция ДанныеРеквизитовОбъекта(Объект, ИменаРеквизитов = Неопределено,
                               
ДополнительныеРеквизиты = Неопределено) Экспорт

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

    СтруктураОбъекта = Новый Структура;
   
МетаданныеОбъекта = Объект.Метаданные();

    Если ИменаРеквизитов = Неопределено тогда
       
МассивИменРеквизитов = МассивИменРеквизитовОбъекта(Объект);
    иначе
        Если
ТипЗнч(ИменаРеквизитов) = Тип(«Массив») тогда
           
МассивИменРеквизитов = ИменаРеквизитов;
        иначеЕсли
ТипЗнч(ИменаРеквизитов) = Тип(«Строка») тогда
           
МассивИменРеквизитов = МассивПодстрокИзСтроки(ИменаРеквизитов);
        КонецЕсли;
    КонецЕсли;

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

Если список имен задан в виде строки разделенной запятыми, то разложим ее на подстроки с помошью функции МассивПодстрокИзСтроки(). Это не сложная задача, алгоритм этой функции разбирать не будем.

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

    ЭтоСсылка = ЭтоСсылка(Объект);
   
СсылкаОбъекта = ?(ЭтоСсылка, Объект, Объект.Ссылка);

    ПолучитьДанныеИзОбъекта = НЕ ЭтоСсылка;
    Если
ЭтоСсылка И СсылкаОбъекта.Пустая() тогда
       
// это пустая ссылка (данных в базе нет)
       
ПолучитьДанныеИзОбъекта = Истина;
    КонецЕсли;

Теперь, если данные объекта хранятся в памяти — мы можем их сразу получить, в противном случае необходио подготовиться для составления запроса к БД (переведем список имен реквизитов из типа данных Массив в тип Структура).

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

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

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

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

        // сформируем текст выборки по реквизитам
       
ТекстВыборкиРеквизиты = «»;
        Для
индекс = 0 по 1 Цикл
           
СтруктураРеквизитов = ?(индекс = 0, ОсновныеРеквизиты, ДополнительныеРеквизиты);
            Если
СтруктураРеквизитов = Неопределено тогда
                Продолжить;
            КонецЕсли;
            Для каждого
ЭлементСтруктуры из СтруктураРеквизитов Цикл
                Если НЕ
МетаданныеОбъекта.ТабличныеЧасти.Найти(ЭлементСтруктуры.Ключ) = Неопределено тогда
                   
// это имя табличной части
                   
Продолжить;
                КонецЕсли;
               
ТекстВыборкиРеквизиты = ТекстВыборкиРеквизиты
                     + ?(ПустаяСтрока(ТекстВыборкиРеквизиты), «», «,» + Символы.ПС)
                     + ?(
ЗначениеЗаполнено(ЭлементСтруктуры.Значение), ЭлементСтруктуры.Значение, ЭлементСтруктуры.Ключ)
                     +
» КАК » + ЭлементСтруктуры.Ключ;
            КонецЦикла;
        КонецЦикла;

Теперь соберем текст запроса и выполним его. Результат запроса добавим в общую структуру данных объекта

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

    КонецЕсли;

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

    Возврат СтруктураОбъекта;

КонецФункции // ДанныеРеквизитовОбъекта()

Достоинства алгоритма:

  1. Может работать с различными типами объектов конфигурации (которые могут иметь ссылки: Справочники, Документы, ПВХ и т.п.);
  2. Получение всех реквизитов за одно обращение к БД;
  3. Данные возвращаются в виде структуры, что позволяет их передать далее на клиент без преобразования;
  4. С помошью Дополнительных реквизитов можно получить вспомогательные данные (обращение к полям выборки через несколько точек) или на уровне запроса выполнить какие-то действия с данными.
  5. Наглядность кода, данные получаются одной функцией, без надобности каждый раз писать запрос к БД с обработкой результата.

Недостатки:

  1. Не реализована возможность получения табличных частей объектов

Дополнительные функции использованные в алгоритме:

// Возвращает массив имен всех реквизитов переданного объекта
//
Функция МассивИменРеквизитовОбъекта(Объект) Экспорт

    МассивИменРеквизитов = Новый Массив;

    Если ТипЗнч(Объект) = Тип(«ОбъектМетаданных») тогда
       
МетаданныеОбъекта = Объект;
    иначе
       
МетаданныеОбъекта = Метаданные.НайтиПоТипу(ТипЗнч(Объект));
        Если
МетаданныеОбъекта = Неопределено тогда
            Возврат
МассивИменРеквизитов;
        КонецЕсли;
    КонецЕсли;

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

    Возврат МассивИменРеквизитов;

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

// Проверяет используется ли в Объекте указанный общий реквизит
//
Функция ИспользуетсяОбщийРеквизит(ОбщийРеквизит, Объект) Экспорт

    Если ТипЗнч(Объект) = Тип(«ОбъектМетаданных») тогда
       
МетаданныеОбъекта = Объект;
    иначе
       
МетаданныеОбъекта = Метаданные.НайтиПоТипу(ТипЗнч(Объект));
        Если
МетаданныеОбъекта = Неопределено тогда
            Возврат Ложь;
        КонецЕсли;
    КонецЕсли;

    Если ТипЗнч(ОбщийРеквизит) = Тип(«ОбъектМетаданных») тогда
       
МетаданныеОбщегоРеквизита = ОбщийРеквизит;
    иначе
       
МетаданныеОбщегоРеквизита = Метаданные.ОбщиеРеквизиты.Найти(ОбщийРеквизит);
        Если
МетаданныеОбщегоРеквизита = Неопределено тогда
            Возврат Ложь;
        КонецЕсли;
    КонецЕсли;

    ЭлементСостава = МетаданныеОбщегоРеквизита.Состав.Найти(МетаданныеОбъекта);
    Если
ЭлементСостава = Неопределено тогда
        Возврат Ложь;
    КонецЕсли;

    пИспользованиеОбщегоРеквизита = Метаданные.СвойстваОбъектов.ИспользованиеОбщегоРеквизита;
    Если
ЭлементСостава.Использование = пИспользованиеОбщегоРеквизита.Использовать тогда
        Возврат Истина;
    иначеЕсли
ЭлементСостава.Использование = пИспользованиеОбщегоРеквизита.НеИспользовать тогда
        Возврат Ложь;
    иначе
       
пАвтоИспользованиеОбщегоРеквизита = Метаданные.СвойстваОбъектов.АвтоИспользованиеОбщегоРеквизита;
        Если
МетаданныеОбщегоРеквизита.АвтоИспользование = пАвтоИспользованиеОбщегоРеквизита.Использовать тогда
            Возврат Истина;
        иначе
            Возврат Ложь;
        КонецЕсли;
    КонецЕсли;

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

В БСП в модуле ОбщегоНазначения есть самые популярные во всех типовых конфигурациях методы ЗначениеРеквизитаОбъекта и ЗначенияРеквизитовОбъекта, что подтверждено недавней статистикой.

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

Предлагаю перенести эти функции в платформу как методы ссылки. Сравните вызов:
ОбщегоНазначения.ЗначениеРеквизитаОбъекта(МояСсылка, «МойРеквизит»)
И возможный:
МояСсылка.ЗначениеРеквизита(«МойРеквизит»)

Какие плюсы:

  1. Запись намного короче
  2. Работает контекстная подсказка
  3. Работает подсказка возможных реквизитов
  4. Не требуется БСП
  5. Реализация на уровне платформы может работать быстрее
  6. Возможно сделать доступным на клиенте

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

В идеале еще сделать подсказку по реквизитам в параметре-строке. Подобные подсказки в строках уже есть, например, для методов ОткрытьФорму или ПредопределенноеЗначение.

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