Имя: Пароль:
1C
1С v8
Как получить имя родителя элемента иерархического справочника в форме документа?
,
0 simon_av
 
25.02.25
10:11
Недавно начал изучать 1С: Предприятие 8.3 (у меня учебная версия), и по мере изучения столкнулся с проблемой (ответы на похожие вопросы мне не помогли).
  У меня есть документ, в котором имеется табличная часть "Комплектующие", в этой ТЧ есть реквизиты "Тип", "Модель", "Цена", "Количество", "Стоимость". Не могу сделать автозаполнение для типа. По моей задумке он должен был заполняться названием родителя модели (например: наименование модели - RTX3060, родитель - видеокарта). "Модель" находится в иерархическом справочнике "Комплектующие".
  Написал код для автозаполнения типа и добавил процедуру "Сообщить" (для проверки), но при выборе модели из списка автозаполнения не происходит, а процедура "Сообщить" выводит пустое сообщение. Проверял запрос (тот что в коде) в управляемой консоли, и он выводит 1 ячейку с названием родителя. Пока что не додумался как это сделать. Если можете, то помогите пожалуйста.
Вот сам код модуля формы документа:

&НаКлиенте
Процедура КомплектующиеМодельПриИзменении(Элемент)
	ТекСтр = Элементы.Комплектующие.ТекущиеДанные;
	ТекСтр.Тип = НайтиРодителя(ТекСтр.Модель);
	Сообщить(НайтиРодителя(ТекСтр.Модель));
КонецПроцедуры

&НаСервере
Функция НайтиРодителя(Наименование)
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	Комплектующие.Родитель КАК Родитель
		|ИЗ
		|	Справочник.Комплектующие КАК Комплектующие
		|ГДЕ
		|	Комплектующие.Наименование = &Наименование";
	Запрос.УстановитьПараметр("Наименование", Наименование);
	РезультатЗапроса = Запрос.Выполнить().Выбрать();
	Возврат РезультатЗапроса.Родитель;
КонецФункции;
1 Bigbro
 
25.02.25
09:28
если модель у вас ссылка на справочник комплектующих то почему вы ее используете в запросе как строковый параметр.
2 simon_av
 
25.02.25
09:48
(1) Я увидел это где-то на другом форуме, там была похожая
(наверное) задача, но вместо Родителя там что-то другое пытались вытащить из запроса, в параметре там так же было указано Элементы.<Название_ТЧ>.ТекущиеДанные.<Название_Реквизита>, но перед этим это всё присвоили к переменной (этот вариант тоже выдаёт пустую строку).
Я пробовал указывать конкретную модель (в виде строки) в параметре, но даже так при автозаполнении была пустая строка (в форме я выбирал ту модель, которая была заранее указана в параметре).
Я пока что не понимаю где именно ошибка, и не знаю откуда и как начать её искать.(
3 Галахад
 
гуру
25.02.25
10:03
(1) + 1.

Но и так работать будет (хотя это дурной тон):

ТекСтр.Тип = ТекСтр.Модель.Родитель;
4 simon_av
 
25.02.25
10:10
(3) Теперь появилась ошибка при выборе модели в форме:
"Поле объекта не обнаружено (Родитель)"
5 Волшебник
 
25.02.25
10:17
(4) Надо же что-то делать, правда?
6 simon_av
 
25.02.25
10:24
(5) Пошёл уже 7-ой час что-то делания
7 Волшебник
 
25.02.25
10:28
(6) Может проверить ТекСтр на Неопределено? и проверить тип поля Модель?
8 simon_av
 
25.02.25
10:36
Спасибо за (5), это настолько ущемило моё самолюбие, что я как-то интуитивно смог всё починить. Вот код (может он кому-то поможет в будущем):

&НаКлиенте
Процедура КомплектующиеМодельПриИзменении(Элемент)
    ТекСтр = Элементы.Комплектующие.ТекущиеДанные;
    ТекСтр.Тип = "" + НайтиРодителя(Строка(ТекСтр.Модель));
КонецПроцедуры

&НаСервере
Функция НайтиРодителя(Наименование)
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    ПРЕДСТАВЛЕНИЕ(Комплектующие.Родитель) КАК Родитель
        |ИЗ
        |    Справочник.Комплектующие КАК Комплектующие
        |ГДЕ
        |    Комплектующие.Наименование = &Наименование";
    
    Запрос.УстановитьПараметр("Наименование", Наименование);
    РезультатЗапроса = Запрос.Выполнить().Выбрать();
    РезультатЗапроса.Следующий();
    Возврат Строка(РезультатЗапроса.Родитель);
КонецФункции;

Извините что без форматирования, я пока что не разобрался как его делать.
9 simon_av
 
25.02.25
10:36
Не знаю как, но теперь в типе указывается имя родителя автоматически
10 Волшебник
 
25.02.25
10:38
Ваш код — говно.
11 Ёпрст
 
25.02.25
10:41
(10) не, архитектура, изначально, то самое, код - это уже следствие
12 simon_av
 
25.02.25
10:41
(10) Очевидно, ведь я за 1С просидел пока что около недели. Наберусь опыта и буду писать "неговно"
13 Волшебник
 
25.02.25
10:43
(12) Уберите все преобразования в строку. Пользуйтесь ссылками