Заполнение табличной части документа структурой с помощью ЗаполнитьЗначенияСвойств()
Здравствуйте! Назрел вопрос: почему в данном кусочке кода структура не заполняет табличную часть дока? Запрос возвращает необходимые мне значения, все имена совпадают (в таб. части документа тоже). Подскажите, пожалуйста, где моя ошибка.
&НаСервереБезКонтекста
Функция ТоварыНоменклатураАвтоПодборНаСервере(СсылкаНом)
ДанныеОстатки = Новый Структура;
Запрос = Новый Запрос("ВЫБРАТЬ
| ТоварыНаСкладахОстатки.Склад КАК Склад,
| ТоварыНаСкладахОстатки.ВНаличииОстаток КАК ОстатокНаСкладе,
| ТоварыНаСкладахОстатки.КОтгрузкеОстаток КАК РезервНаСкладе
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки
|ГДЕ
| ТоварыНаСкладахОстатки.Номенклатура = &Номенклатура");
Запрос.УстановитьПараметр("Номенклатура", СсылкаНом);
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Сообщить ("Нет данных по остаткам выбранной номенклатуры на складе");
Иначе
ТЗ = Результат.Выбрать();
Если ТЗ.Следующий() Тогда
ЗаполнитьЗначенияСвойств(ДанныеОстатки, ТЗ);
КонецЕсли;
КонецЕсли;
Возврат ДанныеОстатки;
КонецФункции
&НаКлиенте
Процедура ТоварыНоменклатураАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка)
ТекДанные = Элементы.Товары.ТекущиеДанные;
ДанныеОстатки = ТоварыНоменклатураАвтоПодборНаСервере(ТекДанные.Номенклатура);
ЗаполнитьЗначенияСвойств(Элементы.ОстаткиНаСкладах, ДанныеОстатки);
КонецПроцедуры
ПоказатьПо теме из базы знаний
Найденные решения
(20) Тогда вам нужно добавлять строку. Если я правильно понял задачу (что не факт))), то так:
.
Если ОстаткиНаСкладах это конечно таблица значений.
Если в ОстаткиНаСкладах всегда должна быть только одна строка, то перед этим все ее очищаем
ТекДанные = Элементы.Товары.ТекущиеДанные;
ДанныеОстатки = ТоварыНоменклатураАвтоПодборНаСервере(ТекДанные.Номенклатура);
НоваяСтр = ОстаткиНаСкладах.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтр, ДанныеОстатки);
Если ОстаткиНаСкладах это конечно таблица значений.
Если в ОстаткиНаСкладах всегда должна быть только одна строка, то перед этим все ее очищаем
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Я вижу что заполнить значения свойств есть, но не хватает цикла для обхода....
ТЗ= РезультатЗапроса.Выбрать();
Пока ТЗ.Следующий() Цикл
НоваяСтрока = ДанныеОстатки.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтр,ТЗ);
КонецЦикла;
ТЗ= РезультатЗапроса.Выбрать();
Пока ТЗ.Следующий() Цикл
НоваяСтрока = ДанныеОстатки.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтр,ТЗ);
КонецЦикла;
(9)Ну тут уже только отладчиком смотреть пошагово, что на каком этапе заполняется/не заполняется.
Возможно, СсылкаНом не заполнена у текущих данных, возможно остатков нет, возможно имена полей отличаются в запросе и в табличной части...
Опять же что вы тут заполняете:
ЗаполнитьЗначенияСвойств(Элементы.ОстаткиНаСкладах, ДанныеОстатки);
Элемент формы? нужно же заполнять эти же текущие данные.
Возможно, СсылкаНом не заполнена у текущих данных, возможно остатков нет, возможно имена полей отличаются в запросе и в табличной части...
Опять же что вы тут заполняете:
ЗаполнитьЗначенияСвойств(Элементы.ОстаткиНаСкладах, ДанныеОстатки);
Элемент формы? нужно же заполнять эти же текущие данные.
(10) СсылкаНом точно отрабатывает, ибо для определенной номенклатуры действительно нет остатков, и сообщение об ошибке появляется (что нет данных по номенклатуре на складах). Имена полей одинаковы, перепроверял. Значит, проблема в заполнении при вызове ЗаполнитьЗначенияСвойств(Элементы.ОстаткиНаСкладах, ДанныеОстатки);, действительно недостаёт ТекущиеДанные, насколько я понимаю.
(20) Тогда вам нужно добавлять строку. Если я правильно понял задачу (что не факт))), то так:
.
Если ОстаткиНаСкладах это конечно таблица значений.
Если в ОстаткиНаСкладах всегда должна быть только одна строка, то перед этим все ее очищаем
ТекДанные = Элементы.Товары.ТекущиеДанные;
ДанныеОстатки = ТоварыНоменклатураАвтоПодборНаСервере(ТекДанные.Номенклатура);
НоваяСтр = ОстаткиНаСкладах.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтр, ДанныеОстатки);
Если ОстаткиНаСкладах это конечно таблица значений.
Если в ОстаткиНаСкладах всегда должна быть только одна строка, то перед этим все ее очищаем
(21)Изначально неправильно понял задачу (Думал данные заполняются в той же таблице, из которой берется номенклатура). Давайте уточним: в одной таблице (Товары) выбирается какая-то номенклатура, и на основе нее должна заполниться другая таблица (ОстаткиНаСкладах)? Если так, то должен сработать вариант в (22).
&НаСервереБезКонтекста
Функция ТоварыНоменклатураАвтоПодборНаСервере(СсылкаНом)
ДанныеОстатки = Новый Массив;
Запрос = Новый Запрос("ВЫБРАТЬ
| ТоварыНаСкладахОстатки.Склад КАК Склад,
| ТоварыНаСкладахОстатки.ВНаличииОстаток КАК ОстатокНаСкладе,
| ТоварыНаСкладахОстатки.КОтгрузкеОстаток КАК РезервНаСкладе
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки
|ГДЕ
| ТоварыНаСкладахОстатки.Номенклатура = &Номенклатура");
Запрос.УстановитьПараметр("Номенклатура", СсылкаНом);
Результат = Запрос.Выполнить();
ТЗ = Результат.Выбрать();
Если ТЗ.Следующий() Тогда
СтруктураМассива = Новый Структура("Склад,ОстатокНаСкладе,РезервНаСкладе");
ЗаполнитьЗначенияСвойств(СтруктураМассива, ТЗ);
ДанныеОстатки.Добавить(СтруктураМассива);
КонецЕсли;
КонецЕсли;
Возврат ДанныеОстатки;
КонецФункции
&НаКлиенте
Процедура ТоварыНоменклатураАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка)
ТекДанные = Элементы.Товары.ТекущиеДанные;
ДанныеОстатки = ТоварыНоменклатураАвтоПодборНаСервере(ТекДанные.Номенклатура);
Если ДанныеОстатки.Количество() = 0 Тогда
Сообщить("Нет данных по остаткам выбранной номенклатуры на складе");
Возврат;
КонецЕсли;
Для Д = 0 По ДанныеОстатки.ВГраница() Цикл
ЗаполнитьЗначенияСвойств(ОстаткиНаСкладах.Добавить(), ДанныеОстатки[Д]);
КонецЦикла
КонецПроцедуры
ПоказатьГде то приблизительно так можно было бы получить остатки и заполнить их на форме (если таблица ОстаткиНаСкладах так и называется. Не смотрел в отладчике. Но вроде должно работать.
&НаСервереБезКонтекста
Функция ТоварыНоменклатураАвтоПодборНаСервере(СсылкаНом)
ДанныеОстатки = Новый Структура;
Запрос = Новый Запрос("ВЫБРАТЬ
| ТоварыНаСкладахОстатки.Склад КАК Склад,
| ТоварыНаСкладахОстатки.ВНаличииОстаток КАК ОстатокНаСкладе,
| ТоварыНаСкладахОстатки.КОтгрузкеОстаток КАК РезервНаСкладе
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(, Номенклатура = &Номенклатура) КАК ТоварыНаСкладахОстатки");
Запрос.УстановитьПараметр("Номенклатура", СсылкаНом);
Результат = Запрос.Выполнить();
ТЗ = Результат.Выбрать();
Счетчик = 1;
Если ТЗ.Следующий() Тогда
СтруктураМассива = Новый Структура("Склад,ОстатокНаСкладе,РезервНаСкладе");
ЗаполнитьЗначенияСвойств(СтруктураМассива, ТЗ);
ДанныеОстатки.Вставить("КлючСтруктуры"+ СтрЗаменить(Строка(Счетчик), Символы.НПП, ""), СтруктураМассива);
Счетчик = Счетчик + 1;
КонецЕсли;
Возврат ДанныеОстатки;
КонецФункции
&НаКлиенте
Процедура ТоварыНоменклатураПриИзменении(Элемент)
ОстаткиНаСкладах.Очистить();
ТекДанные = Элементы.Товары.ТекущиеДанные;
ДанныеОстатки = ТоварыНоменклатураАвтоПодборНаСервере(ТекДанные.Номенклатура);
Если ДанныеОстатки.Количество() = 0 Тогда
Сообщить("Нет данных по остаткам выбранной номенклатуры на складе");
Возврат;
КонецЕсли;
Для Каждого КлючСтруктуры Из ДанныеОстатки Цикл
ЗаполнитьЗначенияСвойств(ОстаткиНаСкладах.Добавить(), ДанныеОстатки[КлючСтруктуры.Ключ]);
КонецЦикла;
КонецПроцедуры
ПоказатьГде то приблизительно так можно было бы получить остатки и заполнить их на форме (если таблица ОстаткиНаСкладах так и называется и у таблицы есть такие же реквизиты "Склад,ОстатокНаСкладе,РезервНаСкладе" с таким же типом значения как и в регистре накопления ТоварыНаСкладах. Не смотрел в отладчике. Но вроде должно работать.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот