Перейти к контенту
Перейти в раздел примеры кода 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
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник
Получить реквизит объекта с клиента, как лучше сделать? |
Я |
03.11.22 — 15:31
Доброго дня!
БП 3.0, документ ПоступлениеТоваровУслуг.
Нужно в клиентском общем модуле, в процедуре, где доступна только Форма прочитать значение реквизита объекта.
В данном документе это будет реквизит: Форма.Объект.ЭтоУниверсальныйДокумент.
Правильно ли так будет обратиться к реквизиту документа с клиента?
1 — 03.11.22 — 15:35
Для бухи не помню, но в УТ в свое время была предопредленная функция ОбщегоНазначенияУТВызовСервера.ЗначениеРеквизитаОбъекта(). Копай в эту сторону.
2 — 03.11.22 — 15:36
Коллеги подсказали, что в БСП есть ОбщегоНазначения.ЗначенияРеквизитовОбъекта(()
3 — 03.11.22 — 15:37
Либо, как вариант:
В процедуре при изменении этого флажка (УПД) вызывается клиентская процедура, где есть строка
Элементы.ПредставлениеУПД.Видимость = ЭтоУниверсальныйДокумент;
И тогда проверять не
Форма.Объект.ЭтоУниверсальныйДокумент
а
Форма.Элементы.ПредставлениеУПД.Видимость
4 — 03.11.22 — 15:38
Тут скорее вопрос, корректно ли будет на клиенте из «Форма.Объект» тянуть данные для чтения? С точки зрения правильности разработки и производительности.
5 — 03.11.22 — 16:15
(2) «ОбщегоНазначения» — серверный модуль
6 — 03.11.22 — 16:17
(4) так там вроде везде и всюду ковыряются в реквизитах форм и даже в реквизитах основных реквизитов форм. ибо они прочитаны клиентом, если стоит признак «Использовать всегда».
7 — 03.11.22 — 16:24
(4) Производительность в данном случае вторична. Определитесь, что вы хотите получить: данные формы редактируемые пользователем или данные из базы по ссылке. Это в общем случае разные данные
8 — 03.11.22 — 16:26
(0) «Объект.ЭтоУниверсальныйДокумент» — вроде не даст вам так отработать. Если я не путаю, то на клиенте доступна лишь ссылка, через точку вы не сможете обратиться к реквизитам.
Если вам доступна форма, то передайте в параметрах формы нужные вам данные
9 — 03.11.22 — 16:30
(8) Это если Объект ссылка, но обычно «Объект» это основной реквизит формы с типом ДокументОбъект(например) и тогда его реквизиты доступны на клиенте
10 — 03.11.22 — 16:36
(7) В том то и дело, получил бы данные формы, но нужного нет.
(8) Форма.Объект.ЭтоУниверсальныйДокумент отрабатывает нормально.
11 — 03.11.22 — 16:43
(10) Что-то сам себе противоречишь: » нужного нет»… «отрабатывает нормально».
Форма.Объект это и есть данные формы
12 — 03.11.22 — 16:46
Форма.Объект уже на клиенте
13 — 03.11.22 — 16:48
(11), (12) Ясно, думал, что если из «Объект», то тянется из самого объекта на сервере.
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.
В будущем планирую написать про полезную программу с предиктивным набором текста (пока тестирую).
К примеру всегда приходится писать однотипные имена переменных, представляете как было бы полезно, если бы программа запоминала вводимые вами слова и предлогала сразу подставить нужное, исходя из частоты использования слово, либо показала в виде контекстной подсказки все похожие слова. Для программистов это был бы незаменимый помощник.
В БСП в модуле ОбщегоНазначения
есть самые популярные во всех типовых конфигурациях методы ЗначениеРеквизитаОбъекта
и ЗначенияРеквизитовОбъекта
, что подтверждено недавней статистикой.
Оно и понятно, ведь эти методы избавляют от обращения к реквизитам ссылки и чтения всего объекта с возможной блокировкой, т.е. неоптимальной работы кода. Однако многие не используют эти методы, просто потому что не знают про них или они просто громоздкие.
Предлагаю перенести эти функции в платформу как методы ссылки. Сравните вызов:
ОбщегоНазначения.ЗначениеРеквизитаОбъекта(МояСсылка, «МойРеквизит»)
И возможный:
МояСсылка.ЗначениеРеквизита(«МойРеквизит»)
Какие плюсы:
- Запись намного короче
- Работает контекстная подсказка
- Работает подсказка возможных реквизитов
- Не требуется БСП
- Реализация на уровне платформы может работать быстрее
- Возможно сделать доступным на клиенте
Т.к. ссылка доступна на клиенте, то и эти методы можно сделать доступными с клиента, конечно, с вызовом сервера. Тогда не надо будет на формах создавать отдельную серверную функцию ил искать модуль ОбщегоНазначения…ВызовСервера
.
В идеале еще сделать подсказку по реквизитам в параметре-строке. Подобные подсказки в строках уже есть, например, для методов ОткрытьФорму
или ПредопределенноеЗначение
.
ЗначениеРеквизитаОбъекта (БСП)
ОбщийМодуль.ОбщегоНазначения
Значение реквизита объекта.
Возвращает значения реквизита, прочитанного из информационной базы по ссылке на объект.
// Возвращает значения реквизита, прочитанного из информационной базы по ссылке на объект.
// Рекомендуется использовать вместо обращения к реквизитам объекта через точку от ссылки на объект
// для быстрого чтения отдельных реквизитов объекта из базы данных.
//
// Если необходимо зачитать реквизит независимо от прав текущего пользователя,
// то следует использовать предварительный переход в привилегированный режим.
//
// Параметры:
// Ссылка - ЛюбаяСсылка - объект, значения реквизитов которого необходимо получить.
// - Строка - полное имя предопределенного элемента, значения реквизитов которого необходимо получить.
// ИмяРеквизита - Строка - имя получаемого реквизита.
// ВыбратьРазрешенные - Булево - если Истина, то запрос к объекту выполняется с учетом прав пользователя;
// если есть ограничение на уровне записей, то возвращается Неопределено;
// если нет прав для работы с таблицей, то возникнет исключение;
// если Ложь, то возникнет исключение при отсутствии прав на таблицу
// или любой из реквизитов.
//
// Возвращаемое значение:
// Произвольный - зависит от типа значения прочитанного реквизита.
// - если в параметр Ссылка передана пустая ссылка, то возвращается Неопределено;
// - если в параметр Ссылка передана ссылка несуществующего объекта (битая ссылка),
// то возвращается Неопределено.
//
Функция ЗначениеРеквизитаОбъекта(Ссылка, ИмяРеквизита, ВыбратьРазрешенные = Ложь) Экспорт
Если ПустаяСтрока(ИмяРеквизита) Тогда
ВызватьИсключение
НСтр("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.
// Запускает выполнение процедуры в фоновом задании ДлительныеОперации.ЗапуститьВыполнениеВФоне(Знач ИдентификаторФормы, Знач ИмяЭкспортнойПроцедуры, Знач Параметры, Знач НаименованиеЗадания = "", ИспользоватьДополнительноеВременноеХранилище = Ложь)
Будет полезно для операций длительных по времени, запустили и дали возможность пользователю работать дальше.
Для отображения состояния на клиенте существует метод:
ДлительныеОперацииКлиент.ОткрытьФормуДлительнойОперации(Знач ВладелецФормы, Знач ИдентификаторЗадания)