Как сделать ссылку на реквизит справочника 1с
Перейти к содержимому

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

  • автор:

Как получить реквизит от ссылочного значения, хранящегося в реквизите формы?

Задача заключается в том, чтобы получить реквизит от ссылочного значения, хранящегося в реквизите формы. Например у документа Накладная есть реквизит ссылочного типа – Поставщик . Необходимо получить ИНН этого поставщика:

Мы находимся в модуле формы на клиенте. В контексте клиента ссылочные типы очень сильно ограничены в своих возможностях. В частности, нельзя получить значение реквизита от ссылки «через точку». Это можно сделать только в контексте сервера.

Поэтому для решения этой задачи в модуле формы создадим серверную внеконтекстную функцию, которую вызовем с клиента и передадим в нее ссылку на поставщика. В теле функции, на сервере, мы получим ИНН поставщика и вернем его на клиента.

Например, локальная команда формы, вызывающая серверную функцию, будет выглядеть следующим образом:

&НаКлиенте Процедура ПолучитьИННПоставщика(Команда)
ИННПоставщика = ПолучитьИНННаСервере(Объект.Поставщик);
КонецПроцедуры

А функцию ПолучитьИНННаСервере() опишем здесь же, в модуле формы:

&НаСервереБезКонтекста Функция ПолучитьИНННаСервере(СсылкаНаПоставщика)
Возврат СсылкаНаПоставщика.ИНН;
КонецФункции

Таким образом на сервере мы сразу же получаем значение реквизита «через точку» от полученной ссылки и возвращаем его на клиента.

Важно заметить, что функция ПолучитьИНННаСервере() не использует контекст формы (директива компиляции &НаСервереБезКонтекста ). Потому что все, что нужно передать на сервер, – это только ссылка, и мы передаем ее в параметре функции. Использовать контекстный вызов и передавать на сервер весь контекст формы только ради того, чтобы на сервере взять из него значение одного реквизита формы, — это слишком расточительно.

Ссылка в 1С

Мы уже познакомились с таким понятием, как объект в 1С , следующим шагом будет логично познакомиться с таким понятием, как ссылка в 1С.

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

Мы помним, что в платформе 1С 8.3. существуют три вида объектов. Это объекты метаданных, общие объекты и универсальные коллекции значений.

Так вот, ссылка может быть только у объектов метаданных.

Замечу что, ссылка указывает не на сам объект, а на экземпляр объекта. Хотя, очень часто употребляют выражения «ссылка объекта», «ссылка на объект» и т.п.

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

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

Например, в моей конфигурации есть справочник Контрагенты.

Справочник в конфигурации 1С

А также какой-то документ, пусть будет Оплата. И я могу какому-то реквизиту документа Оплата присвоить тип — ссылка на справочник Контрагент.

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

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

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

Если мы используем ссылку в качестве реквизита какого-то объекта, то при редактировании экземпляра, на который указывает ссылка, сам реквизит не изменится.

Поясню на примере. Я выше создал документ Оплата и реквизит Оплативший для этого документа с типом СправочникСсылка.Контрагенты.

Если я переименую элемент справочника Контрагенты.

Элемент справочника 1С

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

Документ 1С

Что это значит? Это не значит, что реквизит Оплативший элемента и сам элемент справочника Номенклатура поменялся автоматически. Нет, это значит, что данный реквизит хранит указатель на экземпляр объекта, который отображается посредством наименования. Поменяли наименование, поменялось только отображение, если бы поменяли какой-нибудь другой реквизит справочника Контрагенты, то пользователь бы ничего не заметил.

Получить ссылку 1С

Каким образом программно получить ссылку на экземпляр объекта, который уже есть в базе?

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

Для демонстрации этих методов, на основной форме документа Оплата я создам команду «Установить контрагента», которую размещу в командной панели формы.

Команда основной формы 1С

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

Обработчики команды 1С

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

Объект.Оплативший = Справочники.Контрагенты.НайтиПоКоду("000000002"); 

Функция НайтиПоКоду вернёт ссылку на экземпляр объекта справочник Контрагенты, которому соответствует код 000000002. Почему мы задали код в виде строки, а не в виде цифры, например? Чтобы понять это, нужно открыть непосредственно редактор справочника Контрагенты в конфигураторе, перейти на закладку «Данные» и посмотреть, какой тип кода у этого справочника.

Тип кода справочника 1С

Тип кода у справочника Контрагенты — строка, поэтому код мы ищем по строковому значению.

Таким образом, данный код:

Справочники.Контрагенты.НайтиПоКоду("000000002") 

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

Рассмотрим синтаксис этой функции для менеджера справочника:

Код – непосредственно тот код, по которому мы ищем наш элемент;

ПоискПоПолномуКоду — если стоит параметр Истина, то поиск будет вестись по кодам всей иерархии, т.е. Вам необходимо будет указывать код каждой группы, куда входит элемент через флеш. Например, так: 001/005/110, где слева будет располагаться самая верхняя группа, а справа непосредственно код элемента.

Данное поле необязательно, по умолчанию – Ложь;

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

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

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

Объект.Оплативший = Справочники.Контрагенты.НайтиПоНаименованию("ООО Поставка"); 

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

Например, у справочников этот реквизит имеется.

Стандартный реквизит Наименование справочника 1С

А у документов его нет.

Отсутствие стандартного реквизита Наименование документа 1С

В случае этой функции, поиск ведется по тому значению, которое в поле Наименование объекта

Синтаксис функции для менеджера справочника следующий:

«Наименование» – непосредственно то наименование, по которому мы ищем наш элемент;

«ТочноеСоответствие» — если стоит параметр Ложь, то поиск будет вестись не точно, т.е. когда левая часть наименования элемента и строка поиска будут совпадать (например, Металл и Металл 01), то поиск выдаст результат. Если стоит Истина, то будут найдены только те элементы, наименование которых будет точно совпадать со строкой поиска.

Данное поле необязательно, по умолчанию – Ложь.

Помните это, что по умолчанию поиск ведется не точно;

Параметры «Родитель» и «Владелец» точно такие же, как для процедуры НайтиПоКоду.

Пустая ссылка 1С

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

Выглядит он так:

ПустаяНоменклатура= Справочники.Номенклатура.ПустаяСсылка();

ПустаяОплата = Документы.Оплата.ПустаяСсылка();

Переменные ПустаяНоменклатура и ПустаяОплата содержат в себе пустые ссылки на каждый объект.

Обращаю Ваше внимание, что для каждого вида справочника и каждого документа будет своя собственная пустая ссылка.

Данный метод очень удобно использовать, когда нам необходимо знать, найден ли элемент справочника по коду (названию) или нет.

Например, доработаем код выше: если элемента с таким названием нет, то выведем сообщение.

ПоставкаОплативший = Справочники.Контрагенты.НайтиПоНаименованию("ООО Поставка"); Если ПоставкаОплативший = Справочники.Контрагенты.ПустаяСсылка() Тогда Сообщить("Не найден контрагент по наименованию ООО Поставка"); иначе Объект.Оплативший = ПоставкаОплативший; КонецЕсли; 

ПустаяСсылка() – это метод менеджера объекта. Также есть метод ссылки объекта Пустая(), который возвращает тип булево. Истина — если это пустая ссылка. Код выше можно переделать:

ПоставкаОплативший = Справочники.Контрагенты.НайтиПоНаименованию("ООО Поставка"); Если ПоставкаОплативший.Пустая() Тогда Сообщить("Не найден контрагент по наименованию ООО Поставка"); иначе Объект.Оплативший = ПоставкаОплативший; КонецЕсли; 

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

&НаСервере Процедура УстановитьКонтрагентаНаСервере() ПоставкаОплативший = Справочники.Контрагенты.НайтиПоНаименованию("ООО Поставка"); Если Не ПоставкаОплативший = Справочники.Контрагенты.ПустаяСсылка() Тогда Объект.Оплативший = ПоставкаОплативший; КонецЕсли; КонецПроцедуры &НаКлиенте Процедура УстановитьКонтрагента(Команда) УстановитьКонтрагентаНаСервере(); Если Объект.Оплативший.Пустая() Тогда ПоказатьПредупреждение(,"Не найден контрагент по наименованию ООО Поставка"); КонецЕсли; КонецПроцедуры 

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

Пустая ссылка в 1С

Более подробно и основательно начальные вопросы программирования в 1С есть вы можете изучить в
Книга «Программировать в 1С за 11 шагов»

Изучайте программирование в 1С в месте с моей книгой «Программировать в 1С за 11 шагов»

Программировать в 1С за 11 шагов

Книга написана понятным и простым языком — для новичка.

  1. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  2. Научитесь понимать архитектуру 1С;
  3. Станете писать код на языке 1С;
  4. Освоите основные приемы программирования;
  5. Закрепите полученные знания при помощи задачника.

О том как разрабатывать под управляемым приложением 1С, читайте в книге Книга «Основы разработки в 1С: Такси»

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

Основы разработки в 1С такси

  1. Очень доступный и понятный язык изложения
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Поймете идеологию управляемого приложения 1С
  4. Узнаете, как разрабатывать управляемое приложение;
  5. Научитесь разрабатывать управляемые формы 1С;
  6. Сможете работать с основными и нужными элементами управляемых форм
  7. Программирование под управляемым приложением станет понятным

Промо-код на скидку в 15% — 48PVXHeYu

Эти книги, плюс книга по программированию оперативного учета имеются в едином комплекте: комплект книг по разработке в 1С.
Только для читателей моего блога,
промо-код на скидку в 300 рублей на весь комплект: blog


Если Вам понравился этот урок, был полезен или помог решить какую-нибудь проблему, то Вы можете поддержать мой проект, перечислив любую сумму
.

можно оплатить вручную:

Яндекс.Деньги — 410012882996301
Web Money — R955262494655

Вступайте в мои группы:

Реквизит «Ссылка» у справочников и документов

Добрый день! Подскажите, пожалуйста, в чем смысл стандартного реквизита «Ссылка» у справочников и документов?

Отслеживать
371 1 1 золотой знак 5 5 серебряных знаков 13 13 бронзовых знаков
задан 29 мая 2013 в 10:57
211 7 7 серебряных знаков 25 25 бронзовых знаков

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

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

Отслеживать
ответ дан 29 мая 2013 в 11:59
Yura Ivanov Yura Ivanov
26.5k 2 2 золотых знака 31 31 серебряный знак 58 58 бронзовых знаков
Yura Ivanov, а реквизит «Ссылка» и СправочникСсылка. <Имя справочника>это одно и то же?
29 мая 2013 в 17:48

@leklerk реквизит у справочников Ссылка имеет тип СправочникСсылка, у документов ДокументСсылка бывают еще ссылки для Перечисление, Задача, ПланСчетов, ПланВидовХарактеристик, БизнесПроцесс. У каждого типа свои методы и функции, но принцип у всех одинаковый — ссылка на объект конфигурации.

29 мая 2013 в 19:10

Спасибо, понял. 🙂 Скажите, а где можно прочитать, что реквизит у справочников Ссылка имеет тип СправочникСсылка (в документации или где-нибудь еще?). Я нигде не нашел. Интуитивно понимаю, что это верно, но просто интересно, ГДЕ это написано? 🙂

Как сделать ссылку на реквизит справочника

Author24 — интернет-сервис помощи студентам

Приветствую!
Я не так давно начал знакомиться со средой 1С и столкнулся с проблемой.
У меня имеется Документ в нем есть Табличная часть «Отчет» со следующими реквизитами: «Наименование»(Ссылка), «Фамилия», «Имя», «Отчество» и т.д.
Так же у меня есть справочник «Сотрудники» с реквизитами: «Наименование», «Фамилия», «Имя», «Отчество», «Оклад».
Мне необходимо чтобы при составлении документа у реквизита документа «Фамилия» я мог выбрать нужную мне фамилию , однако я не знаю как именно сделать ссылку на реквизит справочника «Сотрудники».
Буду благодарен за помощь или совет как решить эту проблему.
Для разработки используется (управляемое приложение).

94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Как сделать ссылку реквизита табличной части справочника
Я недавний пользователь 1с. И я решил сделать на нём диплом (Библиотека). В процессе возник вопрос.

Как использовать реквизит справочника в форме документа?
Добрый день! Подскажите пожалуйста, как использовать реквизит справочника в форме документа? Есть.

Как правильно получить реквизит элемента справочника
Друзья! Столкнулся с интересной ошибкой, прошу помочь. Хочу выдернуть реквизит.

Как в реквизит справочника вывести значения из реквизитов других справочников и суммировать?
Всем привет! Такой вопрос. Есть справочник Договор, с реквизитом СуммаДоговора, в него нужно.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *