Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
21 ноя 2024, 21:14

Заполнение табличной части документа из справочника

Автор sas_255, 25 июн 2021, 16:04

0 Пользователей и 1 гость просматривают эту тему.

sas_255

Не могу разобраться с заполнением реквизитов табличной части приходного документа из справочника.
Есть приходный документ, в табличную часть которого можно добавлять устройства по серийному номеру из справочника устройств.
Сначала не мог передать параметр отбора из табличной части, пришлось создавать объект СерийныйНомерСлужебный, чтобы использовать его в качестве параметра.
Параметр я передал, а вот при работе выходит ошибка "Поле объекта не обнаружено (ТипУстройства)"
Я так понимаю что по какой-то причине результат выборки не передается в табличную часть.
В чем причина не могу разобраться и буду рад подсказкам.
Вид формы в вложении..

Код запроса ниже:


&НаКлиенте
Процедура УстройстваСерийныйНомерПриИзменении(Элемент)

Строка = Элементы.Устройства.ТекущиеДанные;

Объект.СерийныйНомерСлужебный = Строка.СерийныйНомер;

СерийныйНомер = Строка.СерийныйНомер;
ЗаполнитьРеквизиты();


ОбновитьОтображениеДанных();

КонецПроцедуры




&НаСервере
Процедура ЗаполнитьРеквизиты()


//Выполняем выборку устройств по серийному номеру и заполняем соответствующие поля приходного документа.


Запрос = Новый Запрос;
Запрос.Текст =
      "ВЫБРАТЬ
| Устройства.Код КАК Код,
| Устройства.ТипУстройства КАК ТипУстройства,
| Устройства.Производитель КАК Производитель,
| Устройства.Модель КАК Модель,
| Устройства.СостояниеУстройства КАК СостояниеУстройства,
| Устройства.Поставщик КАК Поставщик,
| Устройства.ШтрихКод КАК ШтрихКод,
| Устройства.Цена КАК Цена
|ИЗ
| Справочник.Устройства КАК Устройства
|ГДЕ
| Устройства.Код = &Код";


Запрос.УстановитьПараметр("Код",Объект.СерийныйНомерСлужебный);


Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Выборка.Следующий();


Объект.Устройства.ТипУстройства = Выборка.ТипУстройства;
Объект.Устройства.Производитель = Выборка.Производитель;






КонецПроцедуры






LexaK

попробуйте такой вариант,
только проверьте Имена/Синонимы колонок в Запросе и ТЧ должны совпадать

&НаКлиенте
Процедура УстройстваСерийныйНомерПриИзменении(Элемент)
   
    Строка = Элементы.Устройства.ТекущиеДанные;
ЗаполнитьЗначенияСвойств(Строка, ПолучитьРеквизиты(Строка.СерийныйНомер));

КонецПроцедуры

&НаСервере
Функция ПолучитьРеквизиты(СерийныйНомер)
   
//Выполняем выборку устройств по серийному номеру и заполняем соответствующие поля приходного документа.

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

лкРезультат = Запрос.Выполнить();
лкВыборка = лкРезультат.Выбрать();
лкКолонки = "";
Для каждого лкКол Из лкРезультат.Колонки Цикл
лкКолонки = лкКолонки + лкКол.Имя + ",";
КонецЦикла;
лкДанные = Новый Структура(лкКолонки);
Если лкВыборка.Следующий() Тогда
ЗаполнитьЗначенияСвойств(лкДанные,лкВыборка);
КонецЕсли;
Возврат лкДанные;

Возврат лкДанные;
 
КонецФункции
если помогло нажмите: Спасибо!

sas_255

Попробовал. Единственное что поменял это вот эту строку
"ВЫБРАТЬ
     |    Устройства.Код КАК СерийныйНомер,

чтобы соответствовало название.
Не работает от слова совсем. Хотя и ошибок не выдает :)
Причем при выборе серийного номера он перестал отображаться, отображается только пустая строка.

LexaK

вот как раз и работает
вы вбиваете серийный номер, который на самом деле Код
(вообще серийный номер и код это две большие разницы, но может быть для вашей задачи это одно и тоже...)
система не находит такого элемента и возвращает вам ПУСТЫЕ данные,
которые заодно затирают ваш серийный номер, по которому нет элементов,
(затирания можно избежать, убрав поле из запроса, или из Заполнения)

в консоли и под отладчиком посмотрите как у вас процесс идет
самое главное процесс пошел, вы у сервера что-то запрашиваете, вам сервер что-то (или ничего) отвечает
 

если помогло нажмите: Спасибо!

sas_255

Просто у меня поле код используется для хранения серийного номера, и у него синоним именно серийный номер, и так же называется элемент табличной части. Я так понял что это должно полностью совпадать для корректного заполнения.

Выборка почему то не срабатывает вообще. Не могу понять в чем причина.
Серийный номер точно правильный, я в принципе его выбираю из справочника.
Параметр передается в выборку нормально (в отладчике видно что серийник передался) а вот почему он в справочнике его не находит, большой вопрос.
В отладчике в результатах выборки лкВыборка стоит "Ошибка чтения значения".
Других способов заполнения табличной части не существует?

Если я уберу поле Серийный номер (Код) из запроса то как он будет фильтровать данные согласно этому самому номеру?


LexaK

"Ошибка чтения значения". -- какая-то странная ошибка (оч.давно похожего не встречал)
(может тестирование и исправление базы прогнать)(или выгрузку/загрузку сделать)
а в Консоли запросов проходит/выполняется этот запрос?

Запрос состоит из нескольких секций,
Отбор/поиск происходит в секции "ГДЕ"
В секции "Выбрать" может и не быть того поля по которому делаете отбор
если помогло нажмите: Спасибо!

sas_255

Цитата: LexaK от 26 июн 2021, 08:58(может тестирование и исправление базы прогнать)(или выгрузку/загрузку сделать)
а в Консоли запросов проходит/выполняется этот запрос?

Запрос состоит из нескольких секций,
Отбор/поиск происходит в секции "ГДЕ"
В секции "Выбрать" может и не быть того поля по которому делаете отбор

Тестирование прогнал все нормально.
В консоли запросов все отбирается так как нужно.
А вот Результат запроса почему то в значениях полей null то есть он почему то не находит нужные значения. Может проблема в том что для отбора используется поле Код?
При этом новая строка в табличной части вставляется, только она пустая конечно. Такое ощущение что параметр отбора почему то не применяется. Ошибочного ввода быть не может вообще. Ставил параметр вручную, все равно не отбирает.

КонсольЗапросов.PNG

LexaK

скорее всего несовпадение типов данных,
так бывает, все очень внимательно надо перепроверить,
под отладчиком... 
если помогло нажмите: Спасибо!

sas_255

Что имеется в виду под несовпадением типов данных?
Типы данных в ТаблЧасти и справочнике?
Должно быть полное совпадение по типу и длине строки например?

LexaK

ЦитироватьДолжно быть полное совпадение по типу и длине строки например?
да типы должны совпадать (с самой 1С может какое то неявное преобразование быть, а в запросе нет),  а по длине строки там хотя бы меньшая длина заполнится
если помогло нажмите: Спасибо!

Похожие темы (5)

Рейтинг@Mail.ru

Поиск