Как сделать ссылку на реквизит справочника
Приветствую!
Я не так давно начал знакомиться со средой 1С и столкнулся с проблемой.
У меня имеется Документ в нем есть Табличная часть «Отчет» со следующими реквизитами: «Наименование»(Ссылка), «Фамилия», «Имя», «Отчество» и т.д.
Так же у меня есть справочник «Сотрудники» с реквизитами: «Наименование», «Фамилия», «Имя», «Отчество», «Оклад».
Мне необходимо чтобы при составлении документа у реквизита документа «Фамилия» я мог выбрать нужную мне фамилию , однако я не знаю как именно сделать ссылку на реквизит справочника «Сотрудники».
Буду благодарен за помощь или совет как решить эту проблему.
Для разработки используется (управляемое приложение).
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Как сделать ссылку реквизита табличной части справочника
Я недавний пользователь 1с. И я решил сделать на нём диплом (Библиотека). В процессе возник вопрос.
Как использовать реквизит справочника в форме документа?
Добрый день! Подскажите пожалуйста, как использовать реквизит справочника в форме документа? Есть.
Как правильно получить реквизит элемента справочника
Друзья! Столкнулся с интересной ошибкой, прошу помочь. Хочу выдернуть реквизит.
Как в реквизит справочника вывести значения из реквизитов других справочников и суммировать?
Всем привет! Такой вопрос. Есть справочник Договор, с реквизитом СуммаДоговора, в него нужно.
2017 / 1388 / 494
Регистрация: 16.01.2015
Сообщений: 5,987
AgrailDark,
![]()
3054 / 2001 / 524
Регистрация: 25.06.2009
Сообщений: 6,964
polax, ТС видимо хочет не просто ссылочный тип. В самом справочнике Сотрудники реквизиты: Фамилия, Имя, Отчество, Оклад.
Мой «клиенто-хотелко-локатор» подсказывает, что ТС хочет выбирать в документе в поле Фамилия — те фамилии, которые существуют в справочнике Сотрудники
А для этого надо описать событие НачалоВыбора() для поля Фамилия табличной части:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
&НаКлиенте Процедура ОтчетФамилияНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; ДанныеВыбора = ПолучитьСписокФамилийНаСервере(); КонецПроцедуры &НаСервереБезКонтекста Функция ПолучитьСписокФамилийНаСервере() СписокФамилий = Новый СписокЗначений; ВсеСотрудники = Справочники.Сотрудники.Выбрать(); Пока ВсеСотрудники.Следующий() Цикл СписокФамилий.Добавить(ВсеСотрудники.Ссылка.Фамилия); КонецЦикла; Возврат СписокФамилий; КонецФункции
Не забудьте выставить «кнопку выбора»в свойствах поля Фамилия табличной части.
Подозреваю, что у вас везде типы — Строка. Что конечно же с точки зрения структурирования конфигурации — не верно.
Как сделать ссылку на реквизит справочника 1с
Есть Справочник Сотрудники организации, в нем реквизит ТекущийТрудовойДоговор, тип Документ.Ссылка, как програмно изменить документ на который ссылается текущий элемент справочника.
Эээ. присвоить этому реквизиту новое значение? В чем проблема-то?
Ааа, тьфу. Не читатель
+(1) и записать )))
Об = ТекущийТрудовойДоговор.ПолучитьОбъект();
//изменил что нужно
Об.Записать();
Я получаю объект, и что мне в нем менять все реквизиты что ли. А потом записывать. А проще выхода нету .
(5) Эт-т-та пять ))). Я счЕтаю.
А тебе все реквизиты документа нужно менять?
(5) сделай структуру имя реквизита и новое значение
потом её «загрузи» в док и сохрани
(5)Ты прежде чем садиться к компу сначала уж определись сам что тебе там надо:-)
(8) Продолжу тему из (5). «А проще выхода нету . »
Вернёт объект записи справочника. Тут можно будет поменять ссылку одного документа на ссылку другого.
Вернёт объект самого документа, на который ссылается запись справочника. Т.е. изменить сам документ.
Вобщем я понял что только заменой всех реквизитов, мне этот документ нужно заменить на абсолютно другой по значениям. Извиняюсь, с 1С работаю месяц
По ходу я таки в (1) правильно угадал. ТС хочет не реквизита документа меня, а поменять значение реквизита справочника на другое.
(12) А этот «другой» документ существует?
(12) Поподробней, пжалуста
(12) «мне этот документ нужно заменить на абсолютно другой» Если «абсолютно другой» существует — см. (1)
(15) Ему (как оказалось) нужно не реквизиты ТекущийТрудовойДоговор поменять, а подставить другой договор.
Остап Сулейманович так точно
Как это сделать.
Еще раз извиняюсь что вызываю у Вас смех
+ (21) Это если в форме элемента справочника «сотрудники».
А программно, если не в формеэлемента справочника
У меня внешняя обработка! И из нее мне нужно выполнить замену.
1. Запросом выбираем сотрудников, которым хотим поменять договор.
2. Для каждого выбранного сотрудника выполняем код:
Объект = Сотрудник.ПолучитьОбъект();
Объект.ТекущийТрудовойДоговор = ПравильныйТрудовойДоговор; // правильный договор получаем любым удобным способом
Объект.Записать();
Как получить реквизит от ссылочного значения, хранящегося в реквизите формы?
Задача заключается в том, чтобы получить реквизит от ссылочного значения, хранящегося в реквизите формы. Например у документа Накладная есть реквизит ссылочного типа – Поставщик . Необходимо получить ИНН этого поставщика:

Мы находимся в модуле формы на клиенте. В контексте клиента ссылочные типы очень сильно ограничены в своих возможностях. В частности, нельзя получить значение реквизита от ссылки «через точку». Это можно сделать только в контексте сервера.
Поэтому для решения этой задачи в модуле формы создадим серверную внеконтекстную функцию, которую вызовем с клиента и передадим в нее ссылку на поставщика. В теле функции, на сервере, мы получим ИНН поставщика и вернем его на клиента.
Например, локальная команда формы, вызывающая серверную функцию, будет выглядеть следующим образом:
&НаКлиенте Процедура ПолучитьИННПоставщика(Команда)
ИННПоставщика = ПолучитьИНННаСервере(Объект.Поставщик);
КонецПроцедуры
А функцию ПолучитьИНННаСервере() опишем здесь же, в модуле формы:
&НаСервереБезКонтекста Функция ПолучитьИНННаСервере(СсылкаНаПоставщика)
Возврат СсылкаНаПоставщика.ИНН;
КонецФункции
Таким образом на сервере мы сразу же получаем значение реквизита «через точку» от полученной ссылки и возвращаем его на клиента.
Важно заметить, что функция ПолучитьИНННаСервере() не использует контекст формы (директива компиляции &НаСервереБезКонтекста ). Потому что все, что нужно передать на сервер, – это только ссылка, и мы передаем ее в параметре функции. Использовать контекстный вызов и передавать на сервер весь контекст формы только ради того, чтобы на сервере взять из него значение одного реквизита формы, — это слишком расточительно.
Как сделать ссылку на реквизит справочника 1с
Как записать в реквизит нового элемента справочника в модуле объекта ссылку на самого себя? Тут проблемы какие есть?
P.S. Помню в 7.7 это проблемой было. К сожалению дома проверить не могу.
+(0) я знаю, что есть ЭтотОбъект.Ссылка, но мне надо именно в реквизит записать самого себя.
Установить ссылку нового перед записью
запиши новый, и ставь ссылку куда хочешь
(2) Пытался. что-то не получается 🙁
Образца кодинга нет?
(3) Мне надо в ПередЗаписью() в модуле объекта.
(4) «Мне надо в ПередЗаписью() в модуле объекта.»
вопрос жизни и смерти?
+(4) и чтобы плевать было, ЭтоНовый() или НЕ ЭтоНовый()
(5) почти. боюсь завтра часа полтора потерять на этом.
(7) ты не бойся, просто сделай
(8) было бы лучше, если бы очень опытный чел поделился кодом. Был бы ему благодарен.
+(9) я же ламер, полдня провожусь — потом по шее получу 🙁
Ссылка появляется только после записи, или как (2) сначала создаешь ссылку и присваиваешь кому хочешь.
(11) т.е. думаешь в ПередЗаписью() в модуле объекта проканает?
(12)
Если ЭтоНовый() Тогда
УИД = Новый УникальныйИдентификатор;
СсылкаНаТекОбъект = Справочники.Номенклатура.ПолучитьСсылку(УИД);
УстановитьСсылкуНового(СсылкаНаТекОбъект);
Иначе
СсылкаНаТекОбъект = Ссылка;
КонецЕсли;
стесянюсь спросить, а нафига такой изврат?
(14) — а я почем знаю. человеку хочется до записи объекта получить на него ссылку.
(14) есть супер-универсальная процедура обработки большого массива данных объектов по приналежности к вхождению по определенному типу значений, не хочу её нагружать проверкой
Если Объект.ССылка = СобственноСамТипЗначений.
(14) Смешно, но только такой вот изврат во всех типовых 1С. Организация пишет в свой реквизит «головная организация» саму себя, если головной организации нет.
(13) Спасибо большое, завтра попробую.
(17) наверно, они это для обмена данными через планы обмена придумали.
Смешно нагружать гигантскую выборку измененных объектов проверкой на вхождение в самое себя.
(19) Это для отчетов, где выбирается головной контрагент.
(13)
Плохой пример. Такой код может боком выйти при большом размере справочника и/или высоконагруженных системах, так как элемент справочника физически будет втыкаться в середину таблицы, а не в конец. Ну таблица справочника из-за этого подраспухнет. По УИД объекта строиться кластерный индекс, лучше не надо его пытаться генерировать самому, это не простой ГУИД. Система это сделает сама гораздо лучше. Нужно использовать ПолучитьСсылкуНового(). Если интересно — могу объяснить подробнее.
(21) ты это разработчика ЗиК расскажи и спроси заодно, зачем они так сделали в справочнике Сотрудники
Я бы код от 1С как пример поостерегся приводить )))
(21) правильно написал — сам использую такой подход и проблем нет.
с типовой БП в реквизит головной контрагент записывается ссылка на себя, посмотри
(21) ЫЫЫЫЫ. «Нужно использовать ПолучитьСсылкуНового()» — я валяюсь пацталом в истерике.
(21) хх. ерунду-с сморозил-с про ПолучитьСсылкуНового
(21)Вероятно, ты имел в виду Справочники.Имя.ПолучитьСсылку() (без параметров)
(0) Попробуй в модуле справочника. сработает если элемент уже в этот момент есть в БД.
Процедура ПриЗаписи()
СсылкаНаСебя = Ссылка;
КонецПроцедуры
(28) C добрым утром.
(0) В общем, я бы написал так: -)
Если ЭтоНовый() тогда
УстановитьСсылкуНового(Справочники.Имя.ПолучитьСсылку());
СсылкаНаСебя=ПолучитьСсылкуНового();
Иначе
СсылкаНаСебя=Ссылка;
(30) я извращалась по другому
НовыйКонтрагент.Записать();
НовыйКонтрагент.ГоловнойКонтрагент = НовыйКонтрагент.Ссылка;
НовыйКонтрагент.Записать();
потому что ПолучитьСсылкуНового() почему-то хромал
(31) Месье знает толк в извращениях? Понимаешь, что будет, если вызывать запись в, например, ПередЗаписью() ?
🙂
(31)(32) Прошу прощения, Мадам )
не обратил внимания.
(33)конечно мадам знает)) понимаю) но для меня-то это было не принципиально) и почему вдруг понадобилась такая важность пихать именно ПередЗаписью()?
(34) Не приципиально? ) Значит не понимает.
На всякий случай допоясню, что ПредЗаписью() — я имел в виду событие объекта (не формы)
Почему именно в ПередЗаписью? Имхо логично именно там готовить элемент к записи.
(35)ой, ладно, не буду спорить) иначе вы тут начнете оптимизировать мой код))
(36) Вопрос не в оптимизации, а в фатальной ошибке, которая произойдет, если вызывать запись из обработчика записи. Получится ничто иное, как бесконечная рекурсия. Последствия просто не могут быть «не принципиальными».
Хотя это уже выходит за границы темы (а ТС из нее вообще ушел:)
(25),(26)
Да, попутал. Вот что на самом деле я имел ввиду:
Если ЭтоНовый() Тогда
СсылкаНаТекОбъект = Справочники.Номенклатура.ПолучитьСсылку();
УстановитьСсылкуНового(СсылкаНаТекОбъект);
Иначе
СсылкаНаТекОбъект = Ссылка;
КонецЕсли;
Ранее предложенный вариант будет работать на небольших базах. А вот если справочник вырастет до сотен тысяч — миллионов записей, то могут быть серьезные проблемы. Да и на несколько меньших объемах будет отрыв по производительности, особенно при добавлении новых записей. Кто не верит — может провести реальный тест.
(30)
Точно так! 🙂
(38) не понял какая печалька системы из каких цифр состоит гуид? Т.е. если я гуид сам рисую, будет тормоза? С какого перепуга?
А я вот не понимаю главный вопрос — нафига?! Зачем в элементе в реквизит записывать ссылку на самого себя? Тем более что это циклическая ссылка и она еще и у к утечкам памяти приводить может
(40)
Печалька в том, что по нему строиться кластерный индекс. При генерации ссылки стандартными средствами это учитывается. Гуиды для ссылок генерируются таким образом, что при сохранении в БД они получаются строго в порядке возрастания. Таким образом новые элементы физически (именно физически — в файле БД или файле SQL) располагаются друг за другом. Накладные расходы при добавлении записи в конец таблицы минимальны. Если генерировать произвольно — то новые записи втыкаются в случайное место таблицы, приходится добавлять новые блоки, разбивать старые, делать кучу лишних телодвижений по перестроению кластерного и других индексов.
Но есть и еще очень важная вещь, которая может значительно повлиять на производительность не только вставки, но и впоследствии самых различных запросов, в которых будет использоваться этот справочник (и особенно — если это документ). В больших, постоянно растущих, справочниках обращение выполняется, как правило, к более свежим элементам. Если элементы в таблице физически расположены в порядке добавления, то при таком расположении может потребоваться намного меньше дисковых операций, чем если бы они были расположены в таблице случайным образом.
Кстати, для документов кластерный индекс делается точно так же — по ссылке. Таблица документов растет постоянно, причем обращение тут идет строго к «кучкам» документов (типично выборка — месяц, квартал, год). И если написать такую генерацию ссылки как в первом варианте, то последствия для производительности могут оказаться просто фатальными. Причем выясниться это не сразу, а через годик-другой, когда таблица документов вырастет. Фактически, это получиться просто логическая бомба медленного действия. Причем исправление кода в конфигурации ситуацию не исправит.
(42) а я согласен с Кузей, во всем кроме логической бомбы. Дело в том, что кластерный индекс даст выигрыш только в том случае, если в результате запроса данные требуются именно в том порядке, в котором были записаны. Как по мне, то таких запросов мало и обычные индексы справятся не хуже
