Имя: Пароль:
1C
 
Добавить данные из запроса к Справочнику в табличную часть Документа
,
0 greenforest
 
23.04.24
16:40
Здравствуйте, я тренируюсь в 1С и хочу на конкретном примере попробовать сделать одну вещь, но до конца пока не получается реализовать.

Есть Справочник с оборудованием и Документ с проверкой оборудования. Каждое оборудование имеет заводской номер (это не стандартный реквизит "Код", а другой, отдельный).

Я хотела, чтобы по заводскому номеру в табличную часть Документа выводились остальные данные - тип оборудования, предназначение и изготовитель. Они заполнены в Справочнике, а при работе с Документом пользователь лишь вводит заводской номер, и всё остальное само заполняется.

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

Это процедуры из обработчика событий "ПриИзменении", привязаны к колонке из табличной части "Заводской номер"

&НаСервере
Процедура ПереченьОборудованияЗаводскойНомерПриИзмененииНаСервере()
	Оборудование = Справочники.Оборудование;
	СсылкаНаОборудование = Оборудование.НайтиПоРеквизиту("ЗаводскойНомер", Объект.ЗаводскойНомер);
	Если СсылкаНаОборудование <> Оборудование.ПустаяСсылка() Тогда
		МойЗапрос = Новый Запрос;
		МойЗапрос.Текст = "Выбрать
		 |Оборудование.Тип КАК ТипОборудования,
		 |Оборудование.Предназначение КАК ПредназначениеОборудования,
		 |Оборудование.СтранаПроизводитель КАК ПроизводительОборудования, 
		 |ИЗ
		 |Справочник.Оборудование КАК Оборудование	  
		 |ГДЕ
		 |Оборудование.ЗаводскойНомер = &СсылкаНаОборудование"; 
		
	 МойЗапрос.УстановитьПараметр("СсылкаНаОборудование", Объект.ЗаводскойНомер);
		 Выборка = МойЗапрос.Выполнить().Выбрать();
		 
		 Пока Выборка.Следующий()Цикл
		 Объект.ТипОборудования = Выборка.ТипОборудования;  
		 Объект.Предназначение = Выборка.ПредназначениеОборудования;
		 Объект.СтранаПроизводитель = Выборка.ПроизводительОборудования;   
		 КонецЦикла;	   
	 Иначе
		 Сообщить("Нет такого оборудования!");	  
	 КонецЕсли;
	
КонецПроцедуры
 
&НаКлиенте
Процедура ПереченьОборудованияЗаводскойНомерПриИзменении(Элемент)
	ПереченьОборудованияЗаводскойНомерПриИзмененииНаСервере();
КонецПроцедуры
1 Волшебник
 
23.04.24
16:43
Оборудование.СтранаПроизводитель КАК ПроизводительОборудования

Плохой синоним

СсылкаНаОборудование

Плохое название, ведь там не ссылка, а заводской номер

Пока Выборка.Следующий()Цикл
Объект.ТипОборудования = Выборка.ТипОборудования;  
Объект.Предназначение = Выборка.ПредназначениеОборудования;
Объект.СтранаПроизводитель = Выборка.ПроизводительОборудования;   
КонецЦикла;


нет лесенки
Кроме того, в цикле переписывается один и тот же Объект
2 yopQua
 
23.04.24
17:07
тут всего хватает
а в выборке чего то есть?
как то там параметр какой то не такой
3 greenforest
 
23.04.24
17:13
(2) в результате он записывает по заводскому номеру данные в Документ, если я их делаю как обычные реквизиты, без табличной части (ПереченьОборудования - это название табличной части), либо выводит сообщение, если нет оборудования с таким заводским номером.


p.s. не заметила запятую перед строкой |ИЗ в запросе, она там лишняя. Я её убрала. Всё работает, но только для обычных, нетабличных реквизитов
4 greenforest
 
23.04.24
17:14
(1) запомню, спасибо
5 yopQua
 
23.04.24
17:18
(3) таблица это отдельный реквизит, со своими реквизитами
6 Garykom
 
гуру
23.04.24
17:21
(0) смешались в кучу люди, кони...
7 greenforest
 
23.04.24
17:22
(5) да, я прикрепила в своё первое сообщение запрос как раз к таблице. Я её сделала уже потом. До этого у меня был обработчик с запросом, привязанный просто к заводскому номеру как к обычному реквизиту, и в обычные реквизиты (тип, предназначение и производитель) всё записывалось. А когда я эти реквизиты удалила и потом сделала таблицу с ними, с уже новым обработчиком к реквизиту табличной части, у меня ничего не работало.

Я подозреваю, что надо изменить как-то выборку. Чтобы она в табличную часть записывала. Но не знаю, как
8 Garykom
 
гуру
23.04.24
17:22
Оборудование = Справочники.Оборудование;
    СсылкаНаОборудование = Оборудование.НайтиПоРеквизиту("ЗаводскойНомер", Объект.ЗаводскойНомер);    

просто
СсылкаНаОборудование = Справочники.Оборудование.НайтиПоРеквизиту("ЗаводскойНомер", Объект.ЗаводскойНомер);
9 yopQua
 
23.04.24
17:31
(7) возможно с первой компиляции заработает

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

Если Не Результат.Пустой() Тогда
    Объект.ИмяТЧ.Загрузить(Результат.Выгрузить());
Иначе
    Сообщить("Нет такого оборудования!");      
КонецЕсли;

пс. если названия реквизитов тч такие же как синонимы в запросе
ппс. данные в тч при загрузке перетираются
10 Garykom
 
гуру
23.04.24
17:23
(8)+ и все
никаких тупых запросов еще с
|ИЗ
         |Справочник.Оборудование КАК Оборудование      
         |ГДЕ
         |Оборудование.ЗаводскойНомер = &СсылкаНаОборудование";

не надо уже
11 greenforest
 
23.04.24
17:26
Ещё раз напишу подробно.

Изначально у Документа было 4 реквизита без табличной части. Заводской номер, тип, предназначение и производитель. Я сделала обработчик с запросом к заводскому номеру. И представленный в этой теме запрос отлично работал. Он был точно такой же, только привязанный к реквизиту "Заводской номер", а не к табличной части. Т.е. назывался ЗаводскойНомерПриИзмененииНаСервере() - без табличной части.

Потом я создала табличную часть "Перечень оборудования" и туда переместила эти 4 реквизита. А из обычных реквизитов Документа я их удалила, они были теперь только в табличной части. Я сделала новый обработчик с запросом уже к реквизиту табличной части Документа. Соответственно, он и назывался -ПереченьОборудованияЗаводскойНомерПриИзмененииНаСервере(). Я попробовала там проделать тоже самое - по заводскому номеру записать данные. Но этот запрос уже не работал. Его я прикрепила к первому сообщению
12 Волшебник
 
23.04.24
17:27
(9) опять запятая перед ИЗ
13 greenforest
 
23.04.24
17:28
(9) это, получается, весь текст процедуры к серверу?
14 yopQua
 
23.04.24
17:36
(12) )) нууу копирайт же.. но первая компиляция будет только если через конструктор вставлять, да
(13) весь или нет вам виднее, загрузка в тч результата запроса - да
15 Garykom
 
гуру
23.04.24
17:33
Чего то мне эта ветка напоминает
Вероятно
16 yopQua
 
23.04.24
17:34
 Он был точно такой же, только привязанный к реквизиту "Заводской номер", а не к табличной части

вот это либо совсем неверные рассуждения, либо путаница в терминологии
17 Garykom
 
гуру
23.04.24
17:42
если надо при изменении реквизита (строка ЗаводскойНомер, есть реквизит у справочника Оборудование)
отображать на форме данные не одного а всех элементов из справочника оборудование с таким ЗаводскойНомер
то имхо это делается не так

в ТЧ достаточно одного реквизита СправочникСсылка.Оборудование, а все прочие вытаскивать на форму в элемент поле (элемента таблицы) через ссылку по типу
ПутьКДанным = Объект.ТабличнаяЧасть1.Реквизит1.Наименование
нафига их тянуть в документ в реквизиты ТЧ?
18 greenforest
 
23.04.24
17:39
(16) привязан был к реквизиту "ЗаводскойНомер", который был просто как реквизит Документа, без табличной части.
А когда я переместила его в табличную часть, то уже был другой обработчик, привязанный к "Заводской номер" в табличной части "ПереченьОборудования"
19 Garykom
 
гуру
23.04.24
17:40
(17)+ да и строка ЗаводскойНомер (по которому ищем) - сделать реквизитом формы, в сам документ нафик не надо
20 yopQua
 
23.04.24
17:51
(18) на событие какого элемента формы значения не имеет
представьте себя пользователем, который это делает, и нарисуйте в голове, как это делать будет удобнее
в (19) правильно говорит, убрать его из тч, неудобно вбивать в строке каждой тч и + что он должен быть не реквизитом документа, а реквизитом формы, хранить его не надо, это просто поле для ввода текста
(17) не известно, что нужно, нафига это вобще в документе надо
он то и подбор через ввод реквизита если список набить надо, то трудоемко. можно форму выбора открыть, там искать и привыборе в объект добавлять. а список номеров тоже ведь наверно в экселе, можно и загрузить из него. а эксель откуда взялся, может список можно получить минуя эксель и т д и т д))
21 greenforest
 
23.04.24
17:48
(17) в данном случае заводской номер индивидуален для каждого оборудования. С одним заводским номером может быть только какое-то одно оборудование (один элемент Справочника). Просто можно проверить только какое-то одно оборудование, а можно и десять, поэтому табличная часть. Чтобы можно было добавить ещё строк. Кодом делать не стала, т.к. едва ли где-то найдёшь оборудование с кодом 000000001. Да и в заводском номере бывает и серия, состоящая обычно из буквы.

А по поводу тянуть в документ в реквизиты ТЧ - за подсказку спасибо, буду знать, но вообще это немного странный вопрос :) Странный в том смысле, что вы его задаёте мне, новичку. Я как придумала это реализовать, так и написала сюда, я просто пока не додумалась до другого решения. А вы как будто удивляетесь и даже возмущаетесь, чего это я не додумалась :) Ну так потому что я новичок
22 yopQua
 
23.04.24
17:57
возмущения выглядят по-другому, вам кажется
23 greenforest
 
23.04.24
17:57
(8) у меня почему-то эта часть процедуры перестала работать, когда я изменила обработчик и привязала его к реквизиту табличной части "ЗаводскойНомер". Когда был просто реквизит, она работала, а теперь при заполнении объекта (второго параметра в процедуре НайтиПоРеквизиту) он видит только реквизиты Документа. Реквизиты Справочника "Оборудование" он не видит и, соответственно, не может ничего заполнить
24 greenforest
 
23.04.24
17:58
Он не видит Объект.ЗаводскойНомер (Поле объекта не обнаружено) и не заполняет данные. Хотя, наверное, если бы не это, то процедура (9) должна была бы сработать
25 yopQua
 
23.04.24
18:06
аа все сложно
ну если из документа реквизит убрали, то не увидит Объект.Реквизит
сделайте его реквизитом формы. зачем он в тч. для ввода номера уж точно не надо
26 greenforest
 
23.04.24
18:10
(25) я пытаюсь обратиться так: Объект.ПереченьОборудования.(тутдолженбытьреквизит), но он не может обратиться к заводскому номеру как к реквизиту табличной части, он вызывает только методы
27 greenforest
 
23.04.24
18:11
Реквизит в табличной части так и есть, но я не могу до него достучаться
28 greenforest
 
23.04.24
18:13
(25) так по идее же одно оборудование привязано к одному заводскому номеру. Если я его сделаю реквизитом формы, я по идее смогу только одно оборудование добавить
29 greenforest
 
23.04.24
18:13
А тч нужна, чтобы их можно было добавить несколько в один Документ
30 yopQua
 
23.04.24
18:23
(28) мы сейчас про поле для ввода текста, призменении которого вызывается процедура поиска и заполнения данных
а в тч, если там нужен номер, можно оставить
запросом его получать тоже, соответственно при добавлении новой строки в тч его заполнять
31 greenforest
 
23.04.24
18:24
(20) так его вбивать в каждую строку тч надо, чтобы было понятно конкретно, что это за оборудование. Допустим, тех же швейных машин может быть 10 штук одинаковых, и без заводского номера не поймёшь, какие там исправные)) Ну это я так рассуждаю, если это не совсем верно, я переделаю, конечно. Это да, муторно всё в строки ТЧ вбивать, но я пока другого не придумала ничего. Да и этот процесс хотела облегчить, как могу - чтобы вводили только номер, а остальное из запроса само заполнялось
32 greenforest
 
23.04.24
18:25
(30) а, т.е. я могу вводить заводской номер как реквизит формы просто для поиска и по нему искать данные, а заполнять уже отдельно в таблице всё запросом?
33 yopQua
 
23.04.24
18:40
(31) не цель, чтобы вы переделывали
работать будет и так, как придумали, технически. логически и осязательно это не совсем верно.
в шапке документа номер, ниже тч. Вносим номер, жмем интер, запускается приизменении этого элемента, там делаем запрос, с установкой параметром нового значения номера. запросом выбираем НОМЕР, тип, страна, назначение, выполняем запрос, обходим его результат, в цикле пишем

Для Каждого Строка Из Результат Цикл
Новая = ТЧ.Добавить();
Новая.Номер = Строка.Номер;
Новая.Страна = Строка.Страна;
КонецЦикла;

это конечно еще в (1) сказали, но получилось (15))))
34 yopQua
 
23.04.24
18:34
(32) да!)
35 greenforest
 
23.04.24
18:38
(34) всё, поняла)) (33) большое спасибо за объяснение, буду делать :)
36 yopQua
 
23.04.24
18:48
(35) доп задание на дом)
найти способ из этих двух строк кода

Новая.Номер = Строка.Номер;
Новая.Страна = Строка.Страна;

сделать одну. к тому же у вас их будет не две, а четыре. профит? безусловно!
37 greenforest
 
23.04.24
19:19
(36) хорошо, буду пробовать! Ещё раз спасибо :)
38 yopQua
 
23.04.24
19:47
ок, приходите..