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