|
Добавить данные из запроса к Справочнику в табличную часть Документа | ☑ | ||
---|---|---|---|---|
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
|
ок, приходите..
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |