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

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

Получить реквизит объекта с клиента, как лучше сделать?

Я
   salvator

03.11.22 — 15:31

Доброго дня!

БП 3.0, документ ПоступлениеТоваровУслуг.

Нужно в клиентском общем модуле, в процедуре, где доступна только Форма прочитать значение реквизита объекта.

В данном документе это будет реквизит: Форма.Объект.ЭтоУниверсальныйДокумент.

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

  

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

   Kuzmich123

1 — 03.11.22 — 15:35

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

   Kuzmich123

2 — 03.11.22 — 15:36

Коллеги подсказали, что в БСП есть ОбщегоНазначения.ЗначенияРеквизитовОбъекта(()

   salvator

3 — 03.11.22 — 15:37

Либо, как вариант:

В процедуре при изменении этого флажка (УПД) вызывается клиентская процедура, где есть строка

Элементы.ПредставлениеУПД.Видимость = ЭтоУниверсальныйДокумент;

И тогда проверять не

Форма.Объект.ЭтоУниверсальныйДокумент

а

Форма.Элементы.ПредставлениеУПД.Видимость

   salvator

4 — 03.11.22 — 15:38

Тут скорее вопрос, корректно ли будет на клиенте из «Форма.Объект» тянуть данные для чтения? С точки зрения правильности разработки и производительности.

   salvator

5 — 03.11.22 — 16:15

(2) «ОбщегоНазначения» — серверный модуль

   lodger

6 — 03.11.22 — 16:17

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

   RomanYS

7 — 03.11.22 — 16:24

(4) Производительность в данном случае вторична. Определитесь, что вы хотите получить: данные формы редактируемые пользователем или данные из базы по ссылке. Это в общем случае разные данные

   Kassern

8 — 03.11.22 — 16:26

(0) «Объект.ЭтоУниверсальныйДокумент» — вроде не даст вам так отработать. Если я не путаю, то на клиенте доступна лишь ссылка, через точку вы не сможете обратиться к реквизитам.

Если вам доступна форма, то передайте в параметрах формы нужные вам данные

   RomanYS

9 — 03.11.22 — 16:30

(8) Это если Объект ссылка, но обычно «Объект» это основной реквизит формы с типом ДокументОбъект(например) и тогда его реквизиты доступны на клиенте

   salvator

10 — 03.11.22 — 16:36

(7) В том то и дело, получил бы данные формы, но нужного нет.

(8) Форма.Объект.ЭтоУниверсальныйДокумент отрабатывает нормально.

   RomanYS

11 — 03.11.22 — 16:43

(10) Что-то сам себе противоречишь: » нужного нет»… «отрабатывает нормально».

Форма.Объект это и есть данные формы

   НафНаф

12 — 03.11.22 — 16:46

Форма.Объект уже на клиенте

   salvator

13 — 03.11.22 — 16:48

(11), (12) Ясно, думал, что если из «Объект», то тянется из самого объекта на сервере.

   Kassern

14 — 03.11.22 — 16:54

(13) Вы всегда можете в отладке посмотреть тип значения у реквизита.

  

salvator

15 — 03.11.22 — 17:18

(14) Да, не подумал что-то. Всем спасибо за помощь!

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

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

Список часто востребованных, по моему мнению, функций из состава Библиотеки стандартных подсистем 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. Работает подсказка возможных реквизитов
  4. Не требуется БСП
  5. Реализация на уровне платформы может работать быстрее
  6. Возможно сделать доступным на клиенте

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

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

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



ОбщийМодуль.ОбщегоНазначения

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

// Возвращает значения реквизита, прочитанного из информационной базы по ссылке на объект.
// Рекомендуется использовать вместо обращения к реквизитам объекта через точку от ссылки на объект
// для быстрого чтения отдельных реквизитов объекта из базы данных.
//
// Если необходимо зачитать реквизит независимо от прав текущего пользователя,
// то следует использовать предварительный переход в привилегированный режим.
//
// Параметры:
//  Ссылка    - ЛюбаяСсылка - объект, значения реквизитов которого необходимо получить.
//            - Строка      - полное имя предопределенного элемента, значения реквизитов которого необходимо получить.
//  ИмяРеквизита       - Строка - имя получаемого реквизита.
//  ВыбратьРазрешенные - Булево - если Истина, то запрос к объекту выполняется с учетом прав пользователя;
//                                если есть ограничение на уровне записей, то возвращается Неопределено;
//                                если нет прав для работы с таблицей, то возникнет исключение;
//                                если Ложь, то возникнет исключение при отсутствии прав на таблицу
//                                или любой из реквизитов.
//
// Возвращаемое значение:
//  Произвольный - зависит от типа значения прочитанного реквизита.
//               - если в параметр Ссылка передана пустая ссылка, то возвращается Неопределено;
//               - если в параметр Ссылка передана ссылка несуществующего объекта (битая ссылка), 
//                 то возвращается Неопределено.
//
Функция ЗначениеРеквизитаОбъекта(Ссылка, ИмяРеквизита, ВыбратьРазрешенные = Ложь) Экспорт
	
	Если ПустаяСтрока(ИмяРеквизита) Тогда 
		ВызватьИсключение 
			НСтр("ru = 'Неверный второй параметр ИмяРеквизита в функции ОбщегоНазначения.ЗначениеРеквизитаОбъекта: 
			           |- Имя реквизита должно быть заполнено'");
	КонецЕсли;
	
	Результат = ЗначенияРеквизитовОбъекта(Ссылка, ИмяРеквизита, ВыбратьРазрешенные);
	Возврат Результат[СтрЗаменить(ИмяРеквизита, ".", "")];
	
КонецФункции

///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

Рекомендации


Обновлятор-1С: групповое (пакетное) обновление и обслуживание всех баз за один раз

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

Список часто востребованных, по моему мнению, функций из состава Библиотеки стандартных подсистем 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"
ФайловыеФункцииСлужебныйКлиент.ОткрытьПроводникСФайлом(Знач ПолноеИмяФайла)

 10.


// Запускает выполнение процедуры в фоновом задании
ДлительныеОперации.ЗапуститьВыполнениеВФоне(Знач ИдентификаторФормы, Знач ИмяЭкспортнойПроцедуры, 
 Знач Параметры, Знач НаименованиеЗадания = "", ИспользоватьДополнительноеВременноеХранилище = Ложь)

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

Для отображения состояния на клиенте существует метод:


ДлительныеОперацииКлиент.ОткрытьФормуДлительнойОперации(Знач ВладелецФормы, Знач ИдентификаторЗадания)

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