1. user1200515 15.04.19 19:00 Сейчас в теме

Ссылка на справочник

Добрый вечер, есть такой вопрос, как получить значения справочника для выбора в таб часть документа, знаю что можно поставить тип "Ссылка на справочник такой-то", но как реализовать это программно, может кто подсказать? Сделала такой код, возвращает только одно значение, последнее
&НаСервере
Функция ПолучитьСпр()	
Выборка = Справочники.ФизическиеЛица.Выбрать();
Пока Выборка. Следующий() Цикл
     Перемен=Выборка.Наименование;
 КонецЦикла;
Возврат  Перемен
КонецФункции


&НаКлиенте
Процедура ИсторияИзмененияПриИзменении(Элемент)
    Стр=Элементы.ИсторияИзменения.ТекущиеДанные;
   Стр.Ответственный=ПолучитьСпр();
  КонецПроцедуры
Показать
Найденные решения
23. pdimas 3 17.04.19 10:11 Сейчас в теме
Надо на сервер создать ТаблицуЗначений, туда занести все значения справочника, и на клиент уже делать возврат ТаблицыЗначений, а затем уже с ней дальше работать. Если же тебе надо обработать справочник то тогда всё делается на сервер без возврата.
Остальные ответы
Избранное Подписка Сортировка: Древо
2. burni4 5 15.04.19 19:07 Сейчас в теме
Тут видно не понимание отличия НаКлиенте и НаСервере, напишите конкретно задачу, получите готовое решение
4. user1200515 15.04.19 19:11 Сейчас в теме
(2) есть документ, в нем есть табличная часть-История изменения, в данной таб части есть поле Ответственный, можно установить этому полю тип Справочник.ссылка.ФизическиеЛица, но мне необходимо сделать это программно
6. alxarz 29 15.04.19 19:13 Сейчас в теме
(1)
Пока Выборка. Следующий() Цикл
Перемен=Выборка.Наименование;
КонецЦикла;
а зачем этот цикл? Перебрать все элементы справочника и записать в одну и туже переменную "перемен", а после окончания цикла вернуть её значение? Если уж хотите получить весь справочник, так хотя бы в массив сохраняйте наименования...
9. user1200515 15.04.19 19:14 Сейчас в теме
(6)Интересная мысли, попробую через массив
19. tjurikov_ivan 176 16.04.19 09:53 Сейчас в теме
(1)Какого типа реквизит в ТЧ? произвольный или строка?
Если произвольный и нужно просто указать тип (а не выбирать сначала тип, а потом само значение) то можно обойтись строкой
Стр.Ответственный = ПредопределенноеЗначение("Справочник.ФизическиеЛица.ПустаяСсылка");


Если Строка или любой другой тип, вы хотите хранить просто наименование физ лица?

Тут можно воспользоваться вариантом который предложили в (13)

Вы двигались в правильном направлении в (16)
только лучше думаю так:
&НаКлиенте 
Процедура ИсторияИзмененияОтветственныйНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) 
СтандартнаяОбработка = Ложь;
ОткрытьФорму("Справочник.ФизическиеЛица.ФормаВыбора", , Этаформа);
КонецПроцедуры


Но это не все, после окончания выбора на форме будет вызвана процедура ОбработкаВыбора в которой и нужно указать заполнение реквизита
&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
	//Название формы у вас будет другим, проверьте через отладчик
	Если ИсточникВыбора.Имя = "Справочник.ФизическиеЛица.ФормаВыбора" Тогда
                //Проверяем был ли выбран элемент
		Если ВыбранноеЗначение <> Неопределено Тогда
//получаем текущую строку и заполняем 
			Стр=Элементы.ИсторияИзменения.ТекущиеДанные;
	  		Стр.Ответственный=ВыбранноеЗначение;
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры
Показать
21. DrZombi 17.04.19 06:28 Сейчас в теме
(1) Вы хоть понимаете, что такое Сервер и Клиент?

Использование директив компиляции и инструкций препроцессора
Директивы "НаКлиенте" или "Сервере"

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

1. Директивы компиляции:

&НаКлиенте (&AtClient)
&НаСервере (&AtServer)
&НаСервереБезКонтекста (&AtServerNoContext)

следует применять только в коде модулей управляемых форм и в коде модулей команд. В остальных модулях рекомендуется применять инструкции препроцессору.

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

2. Не следует использовать инструкции препроцессора в клиент-серверных общих модулях для проверки клиентского и серверного контекстов (#Если Сервер, #Если Клиент) ввиду невозможности надежного определения контекста исполнения. Процедуры и функции, которые работают по-разному при вызове с клиента и с сервера, следует размещать в общих модулях с постфиксами Клиент и Сервер, а не КлиентСервер.

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

Например, неправильно:

Функция КодОсновногоЯзыка() Экспорт
#Если НЕ ТонкийКлиент И НЕ ВебКлиент Тогда
 Возврат Метаданные.ОсновнойЯзык.КодЯзыка;
#Иначе
 Возврат СтандартныеПодсистемыКлиент.ПараметрКлиента("КодОсновногоЯзыка");
#КонецЕсли
КонецФункции

также неправильно:

Функция КодОсновногоЯзыка() Экспорт
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
 Возврат Метаданные.ОсновнойЯзык.КодЯзыка;
#Иначе
 Возврат СтандартныеПодсистемыКлиент.ПараметрКлиента("КодОсновногоЯзыка");
#КонецЕсли
КонецФункции


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

В то же время, как и в обычных клиентских модулях, допустимо ветвление кода для учета специфики различных режимов работы клиентского приложения: веб-клиент, тонкий или толстый клиент (например, #Если ВебКлиент).

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

Например, неправильно:

Процедура Пример1()
  а = 1
#Область ИмяОбласти
    + 2;
#КонецОбласти // разрыв выражения
КонецПроцедуры


#Область ИмяОбласти
Процедура Пример2()
    // ...
#КонецОбласти // разрыв процедуры
КонецПроцедуры

Если <...> Тогда
    // ...
#Если ВебКлиент Тогда // разрыв блока Если
Иначе
    // ...
#КонецЕсли
КонецЕсли;
Показать


Результат = Пример4(Параметр1,
#Если Клиент Тогда
  Параметр2, // некорректный вызов функции
#КонецЕсли
  Параметр3);

Данные ошибки диагностируются автоматически с помощью среды разработки 1C:Enterprise Development Tools (EDT).

Правильно использовать инструкции препроцессора без разрыва конструкций.
3. user995537 16 15.04.19 19:10 Сейчас в теме
Если Вы хотите чтобы при нажатии на кнопку выбора в ячейке ответственный элемента формы история изменения открывался список выбора справочника физические лица, то достаточно для элемента ответственный установить тип справочникссылка.ФизическиеЛица. То что Вы написали при изменении всегда будет устанавливать ответственным последний элемент выборки.
5. user1200515 15.04.19 19:12 Сейчас в теме
(3)Мне необходимо сделать это программно(
7. user995537 16 15.04.19 19:13 Сейчас в теме
Вы создаете колонки программно?
8. user1200515 15.04.19 19:14 Сейчас в теме
10. Sander80 15.04.19 19:14 Сейчас в теме
Тип у реквизита табличной части поменять со строки на справочник, вроде, это и и в предыдущем вопросе писал...
11. user1200515 15.04.19 19:16 Сейчас в теме
(10)Мне нужно сделать это программно, написать код для получения ссылки на справочник)
12. burni4 5 15.04.19 19:17 Сейчас в теме
(11)
&НаСервере
Функция ПолучитьСпр()
Возврат Справочники.ФизическиеЛица.НайтиПоНаименованию("Виктория Павловна");
КонецФункции
13. Sander80 15.04.19 19:20 Сейчас в теме
(11) окей, примем, что в реквизите строка.
Тогда двигаемся дальше.

ПриИзменении это вообще не то событие, которое вам нужно.

Оно происходит, как и подсказывает название, когда уже что-то изменилось.
У вас два варианта, обрабатывать события поля
НачалоВыбора
и
АвтоПодбор

Начало выбора вызывается, если нажимаете на многоточие. Тогда можно что-то подкинуть .
Например, ВвестиЗначение/ПоказатьВводЗначение, если через массивы. Или же можно открыть форму выбора соответствующего справочника.

АвтоПодбор это когда начинают вводить текст, можно повлиять на всплывающий список
14. user1200515 15.04.19 19:25 Сейчас в теме
(13) Спасибо, сейчас попробую создать процедуру НачалоВыбора, и открыть форму выбора справочника)
16. user1200515 15.04.19 20:02 Сейчас в теме
(13) В том направлении двигаюсь? просто ничего вообще не происходит, даже ошибок нет
&НаКлиенте
	Процедура ИсторияИзмененияОтветственныйНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	СтандартнаяОбработка=Ложь;
	//Тс=Элементы.ИсторияИзмененияОтветственный;
	//ТекущиеДанные=ЭтаФорма.ТекущийЭлемент.ТекущиеДанные;
	//ОткрытьФорму("Справочник.ФизическиеЛица.Форма.ФормаВыбора");
ПолучитьФорму("Справочник.ФизическиеЛица.Форма.ФормаВыбора",ТекущиеДанные);
	Форма.Открыть();
		
КонецПроцедуры
Показать
18. Sander80 16.04.19 09:50 Сейчас в теме
(16) В том. Только если ПолучитьФорму, то
ОткрываемаяФорма = ПолучитьФорму();
ОткрываемаяФорма.Открыть();

Иначе Форма относится к текущей.

Но лучше использовать ОткрытьФорму

Кроме того, у поля на форме нужно в свойствах добавить кнопку выбора, то самое "многоточие"
20. user1200515 16.04.19 18:07 Сейчас в теме
(18) Работает))
Спасибо большое
&НаКлиенте  
Процедура ИсторияИзмененияОтветственныйНачалоВыбора(Элемент, ДанныеВыбора, 
СтандартнаяОбработка)
	СтандартнаяОбработка=Ложь;
	ОткрытьФорму("Справочник.ФизическиеЛица.Форма.ФормаВыбора");	
КонецПроцедуры

Добавила кнопку выбора и все работает
15. user995537 16 15.04.19 19:25 Сейчас в теме
Зачем делать реквизит объекта с не верным типом, а потом программно управлять ограничением типа элемента формы? Не проще по событию создавать программно и реквизиты объекта и реквизиты формы например так:


&НаСервере
Процедура ЗаполнениеТаблицыНаСервере()
	ТЧСписок.Очистить();
	МассивУдаляемых = Новый Массив;
	Для Каждого Колонка Из Элементы.ТЧСписок.ПодчиненныеЭлементы Цикл
		Если Колонка.Имя = "ТЧСписокНомерПП" Тогда
			Продолжить;
		КонецЕсли;	
		//Элементы.Удалить(Элементы.Найти("ТЧСписок" + Колонка.Имя));
		МассивУдаляемых.Добавить("ТЧСписок." + СтрЗаменить(Колонка.Имя, "ТЧСписок", ""));
	КонецЦикла;
	Если НЕ МассивУдаляемых.Количество() = 0 Тогда
		ИзменитьРеквизиты(, МассивУдаляемых);
	КонецЕсли;
	Для Каждого Колонка Из МассивУдаляемых Цикл
		ТекИмя = СтрЗаменить(Колонка, ".", "");
		Если Элементы.Найти(ТекИмя) = Неопределено ИЛИ Колонка = "НомерПП" Тогда
			Продолжить;
		КонецЕсли;	
		Элементы.Удалить(Элементы.Найти(ТекИмя));
	КонецЦикла;
	Реквизиты = Новый Массив;
	Для Каждого СтрТЧСоответствияИмен Из ТЧСоответствияИмен Цикл
		СтрокаНаименованиеКолонки = Строка(СтрТЧСоответствияИмен.НаименованиеКолонки);
		СоздатьИмяКолонки(СтрокаНаименованиеКолонки);
		Реквизиты.Добавить(Новый РеквизитФормы(СтрокаНаименованиеКолонки, Новый ОписаниеТипов("Строка"), "ТЧСписок"));
	КонецЦикла;
	Реквизиты.Вставить(2, (Новый РеквизитФормы("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"), "ТЧСписок","Номенклатура")));
	Если НЕ КолонкаКоличество = 0 Тогда
		Реквизиты.Добавить(Новый РеквизитФормы("Количество", Новый ОписаниеТипов("Число"), "ТЧСписок"));
	КонецЕсли;	
	мОТЕдИзмСтр = Новый Массив;
	мОТЕдИзмСтр.Добавить(Тип("СправочникСсылка.ЕдиницыИзмерения"));
	мОТЕдИзмСтр.Добавить(Тип("Строка"));
	мОТЧислоСтр = Новый Массив;
	мОТЧислоСтр.Добавить(Тип("Число"));
	мОТЧислоСтр.Добавить(Тип("Строка"));
	н = 1;
	Для Каждого СтрТЧУпаковкиНоменклатуры Из ТЧУпаковкиНоменклатуры Цикл
		Реквизиты.Добавить(Новый РеквизитФормы("ШК_" + н + "ЕдиницаИзмерения", Новый ОписаниеТипов(мОТЕдИзмСтр), "ТЧСписок"));
		Реквизиты.Добавить(Новый РеквизитФормы("ШК_" + н + "Коэффициент", Новый ОписаниеТипов(мОТЧислоСтр), "ТЧСписок"));
		Реквизиты.Добавить(Новый РеквизитФормы("ШК_" + н + "Штрихкод", Новый ОписаниеТипов("Строка"), "ТЧСписок"));
		н = н + 1;
	КонецЦикла;
	н = 1;
	Для Каждого СтрТЧЦены Из ТЧЦены Цикл
		Реквизиты.Добавить(Новый РеквизитФормы("ЦЕН_" + н + "ВидЦены", Новый ОписаниеТипов("СправочникСсылка.ВидыЦен"), "ТЧСписок"));
		Реквизиты.Добавить(Новый РеквизитФормы("ЦЕН_" + н + "Цена", Новый ОписаниеТипов(мОТЧислоСтр), "ТЧСписок"));
		Реквизиты.Добавить(Новый РеквизитФормы("ЦЕН_" + н + "ЕдиницаИзмерения", Новый ОписаниеТипов(мОТЕдИзмСтр), "ТЧСписок"));
		Реквизиты.Добавить(Новый РеквизитФормы("ЦЕН_" + н + "Коэффициент", Новый ОписаниеТипов(мОТЧислоСтр), "ТЧСписок"));
		н = н + 1;
	КонецЦикла;	
	// добавим реквизиты на форму
	ИзменитьРеквизиты(Реквизиты);
	Рек = Элементы.Добавить("ТЧСписокНоменклатура", Тип("ПолеФормы"), Элементы.ТЧСписок);
	Рек.Вид = ВидПоляФормы.ПолеВвода;
	Рек.ПутьКДанным = "ТЧСписок.Номенклатура";
	Рек.Видимость = Ложь;
	Для Каждого СтрТЧСоответствияИмен Из ТЧСоответствияИмен Цикл
		СтрокаНаименованиеКолонки = Строка(СтрТЧСоответствияИмен.НаименованиеКолонки);
		СоздатьИмяКолонки(СтрокаНаименованиеКолонки);
		Рек = Элементы.Добавить("ТЧСписок" + СтрокаНаименованиеКолонки, Тип("ПолеФормы"), Элементы.ТЧСписок);
		Рек.Вид = ВидПоляФормы.ПолеНадписи;
		Рек.ПутьКДанным = "ТЧСписок" + "." + СтрокаНаименованиеКолонки;
		Если Метаданные.Справочники.Номенклатура.Реквизиты.Найти(СтрокаНаименованиеКолонки) = Неопределено Тогда
			Рек.Заголовок = СтрЗаменить(СтрЗаменить(СтрокаНаименованиеКолонки, "__", " "), "ДС_", "");
		Иначе
			Рек.Заголовок = Метаданные.Справочники.Номенклатура.Реквизиты.Найти(СтрокаНаименованиеКолонки).Синоним;
		КонецЕсли;	
	КонецЦикла;
	Если НЕ КолонкаКоличество = 0 Тогда
		Рек = Элементы.Добавить("ТЧСписокКоличество", Тип("ПолеФормы"), Элементы.ТЧСписок);
		Рек.Вид = ВидПоляФормы.ПолеНадписи;
		Рек.ПутьКДанным = "ТЧСписок.Количество";
	КонецЕсли;	
	н = 1;
	Для Каждого СтрТЧУпаковкиНоменклатуры Из ТЧУпаковкиНоменклатуры Цикл
		Рек = Элементы.Добавить("ТЧСписок" + "ШК_" + н + "ЕдиницаИзмерения", Тип("ПолеФормы"), Элементы.ТЧСписок);
		Рек.Вид = ВидПоляФормы.ПолеНадписи;
		Рек.ПутьКДанным = "ТЧСписок" + "." + "ШК_" + н + "ЕдиницаИзмерения";
		Рек.Заголовок = "ШК " + н + " Ед.";
		Рек = Элементы.Добавить("ТЧСписок" + "ШК_" + н + "Коэффициент", Тип("ПолеФормы"), Элементы.ТЧСписок);
		Рек.Вид = ВидПоляФормы.ПолеНадписи;
		Рек.ПутьКДанным = "ТЧСписок" + "." + "ШК_" + н + "Коэффициент";
		Рек.Заголовок = "ШК " + н + " Коэф.";
		Рек = Элементы.Добавить("ТЧСписок" + "ШК_" + н + "Штрихкод", Тип("ПолеФормы"), Элементы.ТЧСписок);
		Рек.Вид = ВидПоляФормы.ПолеНадписи;
		Рек.ПутьКДанным = "ТЧСписок" + "." + "ШК_" + н + "Штрихкод";
		Рек.Заголовок = "ШК " + н + " Штрихкод";
		н = н + 1;
	КонецЦикла;
	н = 1;
	Для Каждого СтрТЧЦены Из ТЧЦены Цикл
		Рек = Элементы.Добавить("ТЧСписок" + "ЦЕН_" + н + "ВидЦены", Тип("ПолеФормы"), Элементы.ТЧСписок);
		Рек.Вид = ВидПоляФормы.ПолеНадписи;
		Рек.ПутьКДанным = "ТЧСписок" + "." + "ЦЕН_" + н + "ВидЦены";
		Рек.Заголовок = "Цена " + н + " Вид";
		Рек = Элементы.Добавить("ТЧСписок" + "ЦЕН_" + н + "Цена", Тип("ПолеФормы"), Элементы.ТЧСписок);
		Рек.Вид = ВидПоляФормы.ПолеНадписи;
		Рек.ПутьКДанным = "ТЧСписок" + "." + "ЦЕН_" + н + "Цена";
		Рек.Заголовок = "Цена " + н;
		Рек = Элементы.Добавить("ТЧСписок" + "ЦЕН_" + н + "ЕдиницаИзмерения", Тип("ПолеФормы"), Элементы.ТЧСписок);
		Рек.Вид = ВидПоляФормы.ПолеНадписи;
		Рек.ПутьКДанным = "ТЧСписок" + "." + "ЦЕН_" + н + "ЕдиницаИзмерения";
		Рек.Заголовок = "Цена " + н + " Ед.";
		Рек = Элементы.Добавить("ТЧСписок" + "ЦЕН_" + н + "Коэффициент", Тип("ПолеФормы"), Элементы.ТЧСписок);
		Рек.Вид = ВидПоляФормы.ПолеНадписи;
		Рек.ПутьКДанным = "ТЧСписок" + "." + "ЦЕН_" + н + "Коэффициент";
		Рек.Заголовок = "Цена " + н + " Коэф.";
		н = н + 1;
	КонецЦикла;	
КонецПроцедуры // ЗаполнениеТаблицыНаСервере()
Показать
17. alxarz 29 16.04.19 05:54 Сейчас в теме
(15)
Не проще по событию создавать программно и реквизиты объекта и реквизиты формы например так:


лучше писать в спойлере


код
22. mixperm 59 17.04.19 09:33 Сейчас в теме
Мдааа, прочитал и прослезился от уровня сегодняшних программистов 1С
23. pdimas 3 17.04.19 10:11 Сейчас в теме
Надо на сервер создать ТаблицуЗначений, туда занести все значения справочника, и на клиент уже делать возврат ТаблицыЗначений, а затем уже с ней дальше работать. Если же тебе надо обработать справочник то тогда всё делается на сервер без возврата.
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Программист 1С
Санкт-Петербург
зарплата от 135 000 руб. до 135 000 руб.
Полный день

Программист 1С
Норильск
зарплата от 50 000 руб. до 80 000 руб.
Полный день

Руководитель отдела внедрения 1С
Новосибирск
зарплата от 60 000 руб. до 160 000 руб.
Полный день

Ведущий программист 1С
Москва
зарплата от 120 000 руб. до 150 000 руб.
Полный день