Перейти к контенту
Перейти в раздел примеры кода 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
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник
Как получить реквизит от ссылочного значения на клиенте
На чтение 2 мин Просмотров 6.3к. Опубликовано 20.04.2017
На стороне клиента нельзя обратиться к данным базы, в т.ч. получить реквизит от ссылочного значения. Рассмотрим как все же можно решить эту задачу.
На стороне клиента код вида
Контрагент.ИНН
приведет к ошибке. Такие конструкции возможны только на сервере.
Предположим, что стоит задача при нажатии на кнопку отобразить ИНН контрагента, выбранного на форме. Для решения поставленной задачи необходимо обратиться на сервер для получения требуемой информации(ИНН). Программный код может иметь вид:
&НаКлиенте
Процедура ПолучитьИНН(Команда)
// Вызов серверной внеконтекстной функции
ИННКонтрагента = ПолучитьИНННаСервере(Контрагент);
Сообщить("ИНН контрагента: " + ИННКонтрагента);
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьИНННаСервере(Контрагент)
Возврат Контрагент.ИНН;
КонецФункции
При нажатии на кнопку ПолучитьИНН вызывается серверная функция ПолучитьИНННаСервере(). В единственном параметре передается контрагент, выбранный интерактивно пользователем. Функция получает ИНН через точку и сразу же возвращает значение обратно на клиент. Результат работы серверной функции помещается в переменную ИННКонтрагента и выводится пользователю с помощью метода Сообщить().
Серверная функция является внеконтекстной (&НаСервереБезКонтекста). Это значит, что данные, содержащиеся в форме, не будут отсылаться на сервер, что уменьшит объем передаваемых данных и скорость возврата результата функции.
Внимание!
При работе с конфигурациями, в которые встроена библиотека стандартных подсистем, вместо получения реквизита через точку рекомендуется использовать функцию ЗначениеРеквизитаОбъекта() из общего модуля ОбщегоНазначения. Таким образом, строку
Возврат Контрагент.ИНН;
можно заменить на:
Возврат ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Контрагент, "ИНН");
В случае, когда значение реквизита нужно только для визуального отображения пользователю, можно пойти другим путем: имеется возможность вывести реквизит от ссылочного значения на форму. При этом пользователь не сможет отредактировать этот реквизит.
Рассмотрим пример: на форме документа рядом с полем ввода контрагента должен выводиться его ИНН. Для этого перенесем реквизит ИНН на форму:
В пользовательском режиме при указании контрагента, его ИНН будет автоматически отображен на форме. Никакого программирования в этом случае не потребовалось.
|
|||
SFilchakov
20.02.16 — 22:04 |
Всем привет. |
||
SFilchakov
1 — 20.02.16 — 22:05 |
ОбщегоНазначенияКлиент.ЗначениеРеквизита(ОбъектаОбъект.СостояниеЗаказа, «Предопределенный») |
||
Cyberhawk
2 — 20.02.16 — 22:05 |
Флажок «Вызов сервера» у модуля тебя спасет (позволит с клиента звать серверные модули) |
||
Cyberhawk
3 — 20.02.16 — 22:05 |
Названием этого флажка, конечно, так и не проникся… |
||
SFilchakov
4 — 20.02.16 — 22:17 |
Типовой модуль УНФ, на поддержке, как то не охота его трогать. |
||
Cyberhawk
5 — 20.02.16 — 22:19 |
Я тебя не понял, что тебе надо |
||
Cyberhawk
6 — 20.02.16 — 22:21 |
ОбщегоНазначенияУТВызовСервера вот оттуда используй |
||
mikecool
7 — 20.02.16 — 22:23 |
(0) если надо более одного реквизита за раз — пиши запрос |
||
Drac0
8 — 20.02.16 — 22:41 |
(7) В БСП 4 варианта функции: (4) Ищи в модулях общего назначения, где есть ВызовСервера. |
||
Drac0
9 — 20.02.16 — 22:51 |
+(8) Похоже, в УНФ нет такого модуля, как и в стандартной БСП. Даже и не замечал. Если тебе так надо вызывать именно с клиента, то положи рядом свой модуль или делать в модуле формы обертку из безконтекстного вызова. |
||
Cyberhawk 10 — 20.02.16 — 23:08 |
Да, посмотрел УНФ 1.5 в модуле УправлениеНебольшойФирмойСервер с галкой «Вызов сервера»:
//////////////////////////////////////////////////////////////////////////////// И нет там универсальной функции — только обертки по тем именам реквизитов, что зашиты в код… |
TurboConf — расширение возможностей Конфигуратора 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" ФайловыеФункцииСлужебныйКлиент.ОткрытьПроводникСФайлом(Знач ПолноеИмяФайла)
Так же выложил обработку с перечнем функций в модуле объекта для изучения по клавише F12.
В будущем планирую написать про полезную программу с предиктивным набором текста (пока тестирую).
К примеру всегда приходится писать однотипные имена переменных, представляете как было бы полезно, если бы программа запоминала вводимые вами слова и предлогала сразу подставить нужное, исходя из частоты использования слово, либо показала в виде контекстной подсказки все похожие слова. Для программистов это был бы незаменимый помощник.
Содержание:
1. Реквизиты объекта и реквизиты формы в 1С
2. Как получить значения из элементов формы 1С
1. Реквизиты объекта и реквизиты формы в 1С
В обычном приложении у элемента формы 1С 8.3 было свойство «Значение», доступное как для чтения, так и для записи. Какой аналог в управляемом приложении?
Элементы формы 1С 8.3 могут содержать реквизиты двух видов: реквизиты объекта 1С и реквизиты формы.
Красным помечен реквизит объекта 1С Контрагент, а зеленым – реквизит формы в 1С.
Интерактивно выберем эти элементы в пользовательском режиме 1С и попробуем прочитать их «программно» кнопкой «Прочитать».
Если читать значения реквизитов в клиентской процедуре, то код для 1С Предприятия будет следующий:
Все бы хорошо: мы получили на клиенте значения реквизитов объекта 1С и формы, но – не значения элементов формы 1С. На клиенте значение элементов формы 1С получить нельзя.
2. Как получить значения из элементов формы 1С
Чтобы получить значения из элементов формы 1С, нам потребуется серверный вызов:
Именно на сервере у элемента формы 1С 8.3 становится доступно свойство ПутьКДанным, по которому его можно извлечь либо из Объекта, который имеет тип ДанныеФормыСтруктура:
…либо из Формы, которая имеет тип ФормаКлиентскогоПриложения:
Форма и ее элементы не видны на сервере без контекста. То есть код для 1С:Предприятия выдаст множество ошибок.
Также Форму нельзя передать как параметр в процедуру и функцию на сервер или в общий модуль.
Еще хочется разобрать момент, когда нам возможно увидеть состояние различающихся значений в элементе форме 1С и в объекте. Это возможно в событии элемента ОбработкаВыбора.
Например, при значении поля Контрагент — Ассоль, мы выбрали контрагента Бакалея:
Новое значение доступно как параметр процедуры ВыбранноеЗначение.
Система дает шанс что-то сделать в этой ситуации.
Специалист компании ООО «Кодерлайн»
Добрыгин Михаил
ЗначениеРеквизитаОбъекта (БСП)
ОбщийМодуль.ОбщегоНазначения
Значение реквизита объекта.
Возвращает значения реквизита, прочитанного из информационной базы по ссылке на объект.
// Возвращает значения реквизита, прочитанного из информационной базы по ссылке на объект.
// Рекомендуется использовать вместо обращения к реквизитам объекта через точку от ссылки на объект
// для быстрого чтения отдельных реквизитов объекта из базы данных.
//
// Если необходимо зачитать реквизит независимо от прав текущего пользователя,
// то следует использовать предварительный переход в привилегированный режим.
//
// Параметры:
// Ссылка - ЛюбаяСсылка - объект, значения реквизитов которого необходимо получить.
// - Строка - полное имя предопределенного элемента, значения реквизитов которого необходимо получить.
// ИмяРеквизита - Строка - имя получаемого реквизита.
// ВыбратьРазрешенные - Булево - если Истина, то запрос к объекту выполняется с учетом прав пользователя;
// если есть ограничение на уровне записей, то возвращается Неопределено;
// если нет прав для работы с таблицей, то возникнет исключение;
// если Ложь, то возникнет исключение при отсутствии прав на таблицу
// или любой из реквизитов.
//
// Возвращаемое значение:
// Произвольный - зависит от типа значения прочитанного реквизита.
// - если в параметр Ссылка передана пустая ссылка, то возвращается Неопределено;
// - если в параметр Ссылка передана ссылка несуществующего объекта (битая ссылка),
// то возвращается Неопределено.
//
Функция ЗначениеРеквизитаОбъекта(Ссылка, ИмяРеквизита, ВыбратьРазрешенные = Ложь) Экспорт
Если ПустаяСтрока(ИмяРеквизита) Тогда
ВызватьИсключение
НСтр("ru = 'Неверный второй параметр ИмяРеквизита в функции ОбщегоНазначения.ЗначениеРеквизитаОбъекта:
|- Имя реквизита должно быть заполнено'");
КонецЕсли;
Результат = ЗначенияРеквизитовОбъекта(Ссылка, ИмяРеквизита, ВыбратьРазрешенные);
Возврат Результат[СтрЗаменить(ИмяРеквизита, ".", "")];
КонецФункции
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////
Рекомендации
TurboConf — расширение Конфигуратора 1С