Объект ссылка

Чтобы перепроверить, я решил попробовать записать картинку к себе на жесткий диск и БД 1с- получилось.
Подумал, может из-за того что на сервере происходила запись в поле (тип строка) картинка, может ее нужно перечитать на форме из БД.
Сделал и это ошибки нет, и изображения тоже нет((((
Пример моего кода, может кто-то подскажет, в чем моя тупость.

&НаСервере
Процедура ПоместитьФайлОбъекта(Адрес)
спр = РеквизитФормыВЗначение(«Объект»);
ДвоичныеДанные = ПолучитьИзВременногоХранилища(Адрес);
Спр.Файл = Новый ХранилищеЗначения(ДвоичныеДанные);
УдалитьИзВременногоХранилища(Адрес);
Рисунок = Спр.Файл.Получить();
Спр.Записать();
ИмяФайла = «D:\!_1C_Prog\Картинка2.bmp»;
Рисунок.Записать(ИмяФайла);
ЗначениеВРеквизитФормы(спр,»Объект»);
КонецПроцедуры
&Наклиенте
Процедура Команда1(Команда)
Перем Имя,Адрес;
Если
ПоместитьФайл(Адрес,»»,Имя,истина,ЭтаФорма.УникальныйИдентификатор) Тогда
Объект.ИмяФайла = Имя;
ПоместитьФайлОбъекта(Адрес);
Элементы.Рисунок.Обновить();
КонецЕсли;
КонецПроцедуры
Спасибо logist
ПОЛУЧИЛОСЬ АЛИЛУЙЯ!
&НаСервере
Процедура ПоместитьФайлОбъекта(Адрес)
спр = РеквизитФормыВЗначение(«Объект»);
ДвоичныеДанные = ПолучитьИзВременногоХранилища(Адрес);
Спр.Файл = Новый ХранилищеЗначения(ДвоичныеДанные);
УдалитьИзВременногоХранилища(Адрес);
Картинка = Спр.Файл.Получить();
Спр.Записать();
ИмяФайла = «D:\!_1C_Prog\Картинка2.bmp»;
Картинка.Записать(ИмяФайла);
ЗначениеВРеквизитФормы(спр,»Объект»);
КонецПроцедуры
&Наклиенте
Процедура Команда1(Команда)
Перем Имя,Адрес;
Если
ПоместитьФайл(Адрес,»»,Имя,истина,ЭтаФорма.УникальныйИдентификатор) Тогда
Объект.ИмяФайла = Имя;
ПоместитьФайлОбъекта(Адрес);

До этого момента мы успели рассмотреть 2 основных типа переменных:

обычные переменные, которые хранят значения напрямую;

указатели, которые хранят адрес другого значения (или null), для доступа к которым выполняется операция разыменования указателя.

Ссылки — это третий базовый тип переменных в языке C++.

Ссылки

Ссылка — это тип переменной в языке C++, который работает как псевдоним другого объекта или значения. Язык C++ поддерживает 3 типа ссылок:

Ссылки на неконстантные значения (обычно их называют просто «ссылки» или «неконстантные ссылки»), которые мы обсудим на этом уроке.

Ссылки на константные значения (обычно их называют «константные ссылки»), которые мы обсудим на следующем уроке.

В C++11 добавлены ссылки r-value, о которых мы поговорим чуть позже.

Ссылка (на неконстантное значение) объявляется с использованием амперсанда (&) между типом данных и именем ссылки:

1 2 int value = 7; // обычная переменная int &ref = value; // ссылка на переменную value

В этом контексте амперсанд не означает «оператор адреса», он означает «ссылка на».

Ссылки в качестве псевдонимов

Ссылки обычно ведут себя идентично значениям, на которые они ссылаются. В этом смысле ссылка работает как псевдоним объекта, на который она ссылается, например:

Результат выполнения программы:

9
10

В примере, приведенном выше, объекты ref и value обрабатываются как одно целое. Использование оператора адреса с ссылкой приведет к возврату адреса значения, на которое ссылается ссылка:

1 2 std::cout << &value; // выведется 0035FE58 std::cout << &ref; // выведется 0035FE58

Краткий обзор l-value и r-value

На уроке №10 мы уже рассматривали, что такое l-value и r-value. l-value — это объект, который имеет определенный адрес памяти (например, переменная x) и сохраняется за пределами одного выражения. r-value — это временное значение без определенного адреса памяти и с областью видимости выражения (т.е. сохраняется в пределах одного выражения). В качестве r-values могут быть как результаты выражения (например, 2 + 3), так и литералы.

Инициализация ссылок

Ссылки должны быть инициализированы при создании:

В отличие от указателей, которые могут содержать нулевое значение, ссылки нулевыми быть не могут.

Ссылки на неконстантные значения могут быть инициализированы только неконстантными l-values. Они не могут быть инициализированы константными l-values или r-values:

Обратите внимание, во втором случае вы не можете инициализировать неконстантную ссылку константным объектом. В противном случае, вы бы могли изменить значение константного объекта через ссылку, что уже является нарушением понятия «константа».

После инициализации изменить объект, на который указывает ссылка — нельзя. Рассмотрим следующий фрагмент кода:

Обратите внимание, во втором стейтменте (ref = value2;) выполняется не то, что вы могли бы ожидать! Вместо переприсваивания ref (ссылаться на переменную value2), значение из value2 присваивается переменной value1 (на которое и ссылается ref).

Ссылки в качестве параметров в функциях

Ссылки чаще всего используются в качестве параметров в функциях. В этом контексте ссылка-параметр работает как псевдоним аргумента, а сам аргумент не копируется при передаче в параметр. Это в свою очередь улучшает производительность, если аргумент слишком большой или затратный для копирования.

На уроке №82 мы говорили о том, что передача аргумента-указателя в функцию позволяет функции при разыменовании этого указателя напрямую изменять значение аргумента.

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

Результат выполнения программы:

7
8

Когда аргумент x передается в функцию, то параметр функции ref становится ссылкой на аргумент x. Это позволяет функции изменять значение x непосредственно через ref! Обратите внимание, переменная x не обязательно должна быть ссылкой.

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

Основным недостатком использования неконстантных ссылок в качестве параметров в функциях является то, что аргумент должен быть неконстантным l-value (т.е. константой или литералом он быть не может). Мы поговорим об этом подробнее (и о том, как это обойти) на следующем уроке.

Ссылки как более легкий способ доступа к данным

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

Предположим, что нам нужно работать с полем value1 структуры Something переменной other структуры Other (звучит сложно, но такое также встречается на практике). Обычно, доступ к этому полю осуществлялся бы через other.something.value1. А что, если нам нужно неоднократно получать доступ к этому члену? В этом случае код становится громоздким и беспорядочным. Ссылки же предоставляют более легкий способ доступа к данным:

1 2 int &ref = other.something.value1; // ref теперь может использоваться вместо other.something.value1

Таким образом, следующие два стейтмента идентичны:

1 2 other.something.value1 = 7; ref = 7;

Ссылки позволяют сделать ваш код более чистым и понятным.

Ссылки vs. Указатели

Ссылка — это тот же указатель, который неявно разыменовывается при доступе к значению, на которое он указывает («под капотом» ссылки реализованы с помощью указателей). Таким образом, в следующем коде:

1 2 3 int value = 7; int *const ptr = &value; int &ref = value;

*ptr и ref обрабатываются одинаково. Т.е. это одно и то же:

1 2 *ptr = 7; ref = 7;

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

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

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

Вариант 1: ОкноКлиентскогоПриложения (ClientApplicationWindow)
ПолучитьНавигационнуюСсылку (GetURL)
Синтаксис:
Код 1C v 8.х ПолучитьНавигационнуюСсылку()
Возвращаемое значение:
Тип: Строка.
Описание: Получает навигационную ссылку в формате 1С:Предприятия на текущую форму.
Доступность: Тонкий клиент, веб-клиент, толстый клиент, внешнее соединение.
Вариант 2: Глобальный контекст (Global context)
ПолучитьНавигационнуюСсылку (GetURL)
Синтаксис:
Код 1C v 8.х ПолучитьНавигационнуюСсылку(<Объект>, <ИмяРеквизита>, <Индекс>)
Параметры: <Объект> (обязательный)
Тип: Ссылка на объект информационной базы. Ссылка на объект. <ИмяРеквизита> (необязательный)
Тип: Строка. Имя реквизита объекта или ресурса Регистра сведений, для которого нужно выяснить ссылку. Если это реквизит табличной части объекта, то параметр указывается как <имя табличной части>.<имя реквизита>, то есть с разделителем «.» (точка).
<Индекс> (необязательный)
Тип: Число. Индекс строки в табличной части, в том случае если объект является реквизитом табличной части. Первая строка имеет индекс равный 0.
Возвращаемое значение: Тип: Строка.
Описание: Получает текст ссылки на объект информационной базы или его реквизит в формате 1С:Предприятия.
В первом случае принимает в качестве параметра ссылку на объект (это может быть как ссылка, так и ключ записи регистра сведений). Объектом могут быть: справочник, документ, ключ записи регистра сведений, бизнес процессы, задачи.
Во втором, в качестве параметров принимает ключ объекта (это может быть как ссылка, так и ключ записи регистра сведений) и имя реквизита (ресурса). Если нужно получить ссылку на реквизит табличной части, перед именем реквизита необходимо добавить имя табличной части и точку «.».
Доступность: Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение.
Примечание: Выполняет обращение к серверу только при получении ссылки на реквизит. При получении ссылки на объект информационной базы запрос на сервер не выполняется.
Код 1C v 8.2 УП // Адрес объекта
Адрес1 = ПолучитьНавигационнуюСсылку(Объект.Ссылка);
// Адрес реквизита объекта
Адрес2 = ПолучитьНавигационнуюСсылку(Объект.Ссылка, «Реквизит1»);
// Адрес реквизита табличной части объекта
Адрес3 = ПолучитьНавигационнуюСсылку(Объект.Ссылка, «ТабличнаяЧасть1.Реквизит1», 10);
// ПолучитьНавигационнуюСсылку на форму обработки
сс=ПОлучитьНавигационнуюСсылку(Обработки.Обработка1.ПолучитьФорму(«Форма1»));
// «e1cib/app/Обработка.Обработка1»
Получить навигационную ссылку для константы?
Вопрос: В конфигурации есть константа с типом ХранилищеЗначения для хранения изображения. Пытаюсь реализовать Загрузку и Выгрузку изображения: СсылкаНаКартинку = ПолучитьНавигационнуюСсылку(Константы.Логотип.Получить());
где СсылкаНаКартинку — реквизит формы с типом строка, а на форме есть элемент, у которого путь к данным = СсылкаНаКартинку
Возможно ли реализовать отображение картинки таким образом, или стоит хранить картинку где-либо еще?
Ответ:
Навигационную ссылку на константу получить не получится(
Получится только так:
Код 1C v 8.2 УП СсылкаНаКартинку = ПоместитьВоВременноеХранилище(Константы.Логотип.Получить().Получить(),УникальныйИдентификатор);
т.е. в процедуру ПриСозданииНаСервере поместить картинку во временное хранилище и она там сидит пока закроете форму
Есть форма списка справочника «Сотрудники».
В нем есть реквизит «Фото», который имеет тип «СправочникСсылка.ХранилищеДополнительнойИнформации» (справочник «ХранилищеДополнительнойИнформации» по структуре полностью совпадает анологичным справочником в 1С 8.1).
В реквизиты формы списка добавил «АдресКартинки» тип «строка», в элементы добавил поле «Картинка» (вид — поле картинки) с путем к данным «АдресКартинки». Как вывести Картинку?
Ответ:
Код 1C v 8.2 УП &НаКлиенте
Процедура СписокПриАктивизацииСтроки(Элемент)
СотрудникСсылка = Элементы.Список.ТекущиеДанные.Ссылка; //в форме списка должен быть такой элемент — Ссылка
Показатькартинку(СотрудникСсылка);
КонецПроцедуры
&НаСервере
Процедура ПоказатьКартинку (СотрудникСсылка)
АдресКартинки = ПолучитьНавигационнуюСсылку(СотрудникСсылка.Фото, «Хранилище»);
КонецПроцедуры
«Хранилище» — это «стандартный» реквизит справочника «ХранилищеДополнительнойИнформации».
Имеется регистр сведений с именем «Изображения» следующей структуры:
Измерения:
— ИдИзображения (тип — уникальный идентификатор);
Реквизиты:
— Изображение (тип — ХранилищеЗначений)
Реализовать возможность записи изображений в него, проблемы не составило. А застрял на получении навигационной ссылки на нужную запись регистра?
Ответ — Для регистра сведений первым параметром должен быть ключ записи, а не ссылка на объект.
Т.е. если есть регистр сведений ХранилищеКартинок с изменением Ном (тип справочник Ном) и ресурс Картинка (тип хранилище значений) — код для получения навигационной ссылки должен быть примерно таким:
Код 1C v 8.2 УП Процедура ПриЧтенииНаСервере(ТекущийОбъект)
КлючЗаписиРег = РегистрыСведений.ХранилищеКартинок.СоздатьКлючЗаписи(Новый Структура(«Ном», ТекущийОбъект.ссылка));
Если Не КлючЗаписиРег.Пустой() Тогда
СсылкаНаКартинку = ПолучитьНавигационнуюСсылку(КлючЗаписиРег, «Картинка»);
КонецЕсли;
КонецПроцедуры
При использовании в web-клиенте
Стояла следующая задача: отправлять уведомления о изменениях в документах на почту и вкладывать в письмо гиперссылку на измененный документ. База опубликована на web-севере. Полученная в 1С ссылка методом ПолучитьНавигационнуюСсылку() имела следующий вид
https://localhost/#e1cib/data/Документы.Счет?ref=»ab99005056c0000811e00f627bcddd55″
Вложенная в таком виде ссылка не открывала нужный документ, а лишь инициировала переход в базу.
Как оказалось проблема была в следующем, в URL-адресах не должны присутствовать кавычки, их заменяем на %22

Информация взята с сайта http://helpf.pro

Для 8.х НайтиПоСсылкам (FindDataByRef)
Синтаксис:
НайтиПоСсылкам (< Список ссылок> )
Параметры:
<Список ссылок> Обязательный
Тип: Массив. Массив со списком ссылок на объекты, ссылки на которые нужно найти.
Возвращаемое значение:
Тип: ТаблицаЗначений. Таблица значений, состоящая из ко­лонок с индексами: 0 — Искомая ссылка; 1 — Ссылка на объект, который содержит искомую ссылку.
Описание:
Осуществляет поиск ссылок на объекты.
Код 1C v 8.х //Примеры:
Ссылки = НайтиПомеченныеНаУдаление();
ТабСсылок = НайтиПоСсылкам (Ссылки);
Для Каждого Ссылка из ТабСсылок Цикл
Сообщить (» » + Сокр(Ссылка) + » » + Сокр(Ссылка));
КонецЦикла;
//или
Массив = Новый Массив;
Массив.Добавить(СвылкаНаИскомыйОбъект);
СсылкиНаОбъект = НайтиПоСсылкам(Массив);
Для каждого элем из СсылкиНаОбъект цикл
Сообщить(элем);
ОбработкаПрерыванияПользователя();
КонецЦикла;
Функция НайтиПоСсылке имеет особенность: для корректной её работы необходимо, чтоб все объекты были доступны на чтение. Если у вас есть роли, имеющие ограничение на чтение, то вызов функции НайтиПоСсылке можно выполнять только в привилегированном модуле, иначе может возникать ошибка такого рода:
НайтиПоСсылкам(Ссылки) {(1)}: Ошибка при вызове метода контекста (НайтиПоСсылкам): У пользователя недостаточно прав на исполнение операции над базой данных.
Для 7-рки — НайтиСсылки
Находит ссылки на объекты, переданные в списке значений.
Синтаксис:
НайтиСсылки(<Объекты>,<Ссылки>)
Англоязычныйсиноним:
FindReferences
Параметры:
<Объекты> Конкретное значение объекта илиобъект типа СписокЗначений, в котором данной процедуре передаются объекты, по которым надо найти ссылки.
<Ссылки> Идентификатор объекта типа ТаблицаЗначений, в который данная процедура помещает найденные ссылки на объекты. Таблица значений состоит из 3 колонок: 1. Объект — объект, на который ссылаются; 2. Ссылка — объект, который содержит ссылку; 3. Комментарий — комментарий кссылке.
Описание:
Процедура НайтиСсылки находит ссылки на переданные в списке объекты, и помещает их в таблицу значений.
Код 1C v 7.x СсылкиТЗ=СоздатьОбъект(«ТаблицаЗначений»);
НайтиСсылки(СсылкаНаТовар,СсылкиТЗ);
//В результате мы получаем ТЗ с ссылками на данный элемент
Информация взята с сайта http://helpf.pro