Заполнение табличной части документа структурой с помощью ЗаполнитьЗначенияСвойств()

1. BuryMeInVegas 25.06.20 12:15 Сейчас в теме
Здравствуйте! Назрел вопрос: почему в данном кусочке кода структура не заполняет табличную часть дока? Запрос возвращает необходимые мне значения, все имена совпадают (в таб. части документа тоже). Подскажите, пожалуйста, где моя ошибка.
&НаСервереБезКонтекста
Функция ТоварыНоменклатураАвтоПодборНаСервере(СсылкаНом)
	
	ДанныеОстатки = Новый Структура;
	Запрос = Новый Запрос("ВЫБРАТЬ
	                      |	ТоварыНаСкладахОстатки.Склад КАК Склад,
	                      |	ТоварыНаСкладахОстатки.ВНаличииОстаток КАК ОстатокНаСкладе,
	                      |	ТоварыНаСкладахОстатки.КОтгрузкеОстаток КАК РезервНаСкладе
	                      |ИЗ
	                      |	РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки
	                      |ГДЕ
	                      |	ТоварыНаСкладахОстатки.Номенклатура = &Номенклатура");
	Запрос.УстановитьПараметр("Номенклатура", СсылкаНом);

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

&НаКлиенте
Процедура ТоварыНоменклатураАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка)
	
	ТекДанные = Элементы.Товары.ТекущиеДанные;
	ДанныеОстатки = ТоварыНоменклатураАвтоПодборНаСервере(ТекДанные.Номенклатура);
	ЗаполнитьЗначенияСвойств(Элементы.ОстаткиНаСкладах, ДанныеОстатки);
	
КонецПроцедуры
Показать
По теме из базы знаний
Найденные решения
22. user1357043 25.06.20 12:57 Сейчас в теме
(20) Тогда вам нужно добавлять строку. Если я правильно понял задачу (что не факт))), то так:
    ТекДанные = Элементы.Товары.ТекущиеДанные;
    ДанныеОстатки = ТоварыНоменклатураАвтоПодборНаСервере(ТекДанные.Номенклатура);
    НоваяСтр = ОстаткиНаСкладах.Добавить(); 
    ЗаполнитьЗначенияСвойств(НоваяСтр, ДанныеОстатки);
.
Если ОстаткиНаСкладах это конечно таблица значений.
Если в ОстаткиНаСкладах всегда должна быть только одна строка, то перед этим все ее очищаем
user1066941; shalupov61; +2 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. user1357043 25.06.20 12:19 Сейчас в теме
Нужно заполнять построчно:
Пока ТЗ.Следующий() Цикл
    НоваяСтр = ДанныеОстатки.Добавить();
    ЗаполнитьЗначенияСвойств(НоваяСтр , ТЗ);
КонецЦикла;


Либо попробовать через Запрос.Выполнить().Выгрузить()
4. M_A_D 184 25.06.20 12:21 Сейчас в теме
(2)
кек, чуток опередил меня))))
5. user1357043 25.06.20 12:23 Сейчас в теме
(2)Стоп. Тут проблема совсем в другом.
У вас же ДанныеОстатки это пустая структура. без полей. Поэтому ничего и не заполняется.
Нужно создать структуру с соответствующими полями. Тогда заполнится и всё будет работать.
7. BuryMeInVegas 25.06.20 12:26 Сейчас в теме
(5)Боже, кажется понял, в чём проблема.
33. ivan1703 79 11.12.20 12:25 Сейчас в теме
(2)
Либо попробовать через Запрос.Выполнить().Выгрузить()


это боль) не делайте так
3. M_A_D 184 25.06.20 12:20 Сейчас в теме
Я вижу что заполнить значения свойств есть, но не хватает цикла для обхода....

ТЗ= РезультатЗапроса.Выбрать();

Пока ТЗ.Следующий() Цикл
НоваяСтрока = ДанныеОстатки.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтр,ТЗ);
КонецЦикла;
6. BuryMeInVegas 25.06.20 12:26 Сейчас в теме
(3) Метод объекта не обнаружен (Добавить())...

(5) Так я специально создаю пустую структуру, чтобы потом туда залить данные из ТЗ. Потом эту структуру передаю на клиент, где заполняю ею уже табличную часть дока.
8. user1357043 25.06.20 12:33 Сейчас в теме
(6)Структура с пустыми полями и пустая структура без полей - немного разные вещи. ЗаполнитьЗначение() заполняет по названию свойств, которые в приемнике уже должны быть.
9. BuryMeInVegas 25.06.20 12:35 Сейчас в теме
(8) Да-да, я сначала написал, а потом осознал это отличие.) Только проблема в том, что табличная часть всё равно не заполняется. Совсем.
10. user1357043 25.06.20 12:38 Сейчас в теме
(9)Ну тут уже только отладчиком смотреть пошагово, что на каком этапе заполняется/не заполняется.
Возможно, СсылкаНом не заполнена у текущих данных, возможно остатков нет, возможно имена полей отличаются в запросе и в табличной части...
Опять же что вы тут заполняете:
ЗаполнитьЗначенияСвойств(Элементы.ОстаткиНаСкладах, ДанныеОстатки);
Элемент формы? нужно же заполнять эти же текущие данные.
12. BuryMeInVegas 25.06.20 12:42 Сейчас в теме
(10) Грустно, ибо отладка на серваке недоступна. До сисадмина не достучаться.
16. BuryMeInVegas 25.06.20 12:45 Сейчас в теме
(10) СсылкаНом точно отрабатывает, ибо для определенной номенклатуры действительно нет остатков, и сообщение об ошибке появляется (что нет данных по номенклатуре на складах). Имена полей одинаковы, перепроверял. Значит, проблема в заполнении при вызове ЗаполнитьЗначенияСвойств(Элементы.ОстаткиНаСкладах, ДанныеОстатки);, действительно недостаёт ТекущиеДанные, насколько я понимаю.
19. user1357043 25.06.20 12:48 Сейчас в теме
20. BuryMeInVegas 25.06.20 12:50 Сейчас в теме
(19) Не подойдёт.) ТекДанные - это текущие данные таб части "Товары", я же гружу структуру в таб часть "ОстаткиНаСкладах". "ОстаткиНаСкладах" - это реквизит формы, имеющий тип ТаблицаЗначений. Данных там нет вообще.
22. user1357043 25.06.20 12:57 Сейчас в теме
(20) Тогда вам нужно добавлять строку. Если я правильно понял задачу (что не факт))), то так:
    ТекДанные = Элементы.Товары.ТекущиеДанные;
    ДанныеОстатки = ТоварыНоменклатураАвтоПодборНаСервере(ТекДанные.Номенклатура);
    НоваяСтр = ОстаткиНаСкладах.Добавить(); 
    ЗаполнитьЗначенияСвойств(НоваяСтр, ДанныеОстатки);
.
Если ОстаткиНаСкладах это конечно таблица значений.
Если в ОстаткиНаСкладах всегда должна быть только одна строка, то перед этим все ее очищаем
user1066941; shalupov61; +2 Ответить
21. BuryMeInVegas 25.06.20 12:55 Сейчас в теме
(10) А при попытке заполнить Элементы.ОстаткиНаСкладах.ТекущиеДанные вылетает с ошибкой "Неверный параметр №1". Я совсем запутался.)
23. user1357043 25.06.20 12:59 Сейчас в теме
(21)Изначально неправильно понял задачу (Думал данные заполняются в той же таблице, из которой берется номенклатура). Давайте уточним: в одной таблице (Товары) выбирается какая-то номенклатура, и на основе нее должна заполниться другая таблица (ОстаткиНаСкладах)? Если так, то должен сработать вариант в (22).
24. BuryMeInVegas 25.06.20 13:00 Сейчас в теме
(23) Да-да, именно такая задача. Выделяем номенклатуру в ТЧ "Товары", получаем её остатки на складах в ТЧ "ОстаткиНаСкладах". Простите, что недостаточно корректно раскрыл задачу.
25. user1357043 25.06.20 13:01 Сейчас в теме
26. BuryMeInVegas 25.06.20 13:14 Сейчас в теме
(25) Всё ещё нет... Метод объекта не обнаружен (Добавить()), при попытке сделать ДобавитьСтроку(), ошибка "Попытка обращения к процедуре объекта как к функции".
27. user1357043 25.06.20 13:20 Сейчас в теме
(26)ОстаткиНаСкладах точно реквизит формы с типом ТаблицаЗначений? Можно скриншот конструктора формы, чтобы было видно тип данных этого реквизита?
28. BuryMeInVegas 25.06.20 13:22 Сейчас в теме
(27) Похоже, это мой кретинизм.) Обращался к ОстаткиНаСкладах через Элементы, не напрямую. Сейчас запускается режим предприятия, затестим.
29. BuryMeInVegas 25.06.20 13:24 Сейчас в теме
(27) Это победа!) Да, именно в моём последнем сообщении и крылась проблема, обращался к таблице значений через Элементы. Обратился напрямую, через ОстаткиНаСкладах.Добавить(); и всё удалось! Большое Вам спасибо!
11. nomad_irk 76 25.06.20 12:42 Сейчас в теме
(9)Потому, что нужно работать с Объект.<ИмяТЧ>, а не с Элементы.ОстаткиНаСкладах.
13. BuryMeInVegas 25.06.20 12:42 Сейчас в теме
(11) Элементы.ОстаткиНаСкладах - это реквизит формы. Какой там объект, скажите, пожалуйста?
14. user1357043 25.06.20 12:44 Сейчас в теме
(13)Как-то так:
ТекДанные = Элементы.Товары.ТекущиеДанные;
    ДанныеОстатки = ТоварыНоменклатураАвтоПодборНаСервере(ТекДанные.Номенклатура);
    ЗаполнитьЗначенияСвойств(ТекДанные , ДанныеОстатки);
15. nomad_irk 76 25.06.20 12:45 Сейчас в теме
(13)Откуда ж я знаю, вам должно быть виднее. В свойствах этого элемента смотрите, какая ТЧ является источником данных.
17. BuryMeInVegas 25.06.20 12:46 Сейчас в теме
(15) Эту ТЧ заводил собственноручно, она пустая, играет роль только приёмника данных.
18. nomad_irk 76 25.06.20 12:47 Сейчас в теме
(17)Если это реквизит формы, то обращайтесь напрямую по его имени.
30. user1507208 11.12.20 03:26 Сейчас в теме
&НаСервереБезКонтекста
Функция ТоварыНоменклатураАвтоПодборНаСервере(СсылкаНом)
    
    ДанныеОстатки = Новый Массив;
    Запрос = Новый Запрос("ВЫБРАТЬ
                          |    ТоварыНаСкладахОстатки.Склад КАК Склад,
                          |    ТоварыНаСкладахОстатки.ВНаличииОстаток КАК ОстатокНаСкладе,
                          |    ТоварыНаСкладахОстатки.КОтгрузкеОстаток КАК РезервНаСкладе
                          |ИЗ
                          |    РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки
                          |ГДЕ
                          |    ТоварыНаСкладахОстатки.Номенклатура = &Номенклатура");
    Запрос.УстановитьПараметр("Номенклатура", СсылкаНом);

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

&НаКлиенте
Процедура ТоварыНоменклатураАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка)
    
    ТекДанные = Элементы.Товары.ТекущиеДанные;
    ДанныеОстатки = ТоварыНоменклатураАвтоПодборНаСервере(ТекДанные.Номенклатура);
    Если ДанныеОстатки.Количество() = 0 Тогда
             Сообщить("Нет данных по остаткам выбранной номенклатуры на складе");
             Возврат;
     КонецЕсли;    
    Для Д = 0 По ДанныеОстатки.ВГраница() Цикл    
           ЗаполнитьЗначенияСвойств(ОстаткиНаСкладах.Добавить(), ДанныеОстатки[Д]);
    КонецЦикла 
   
КонецПроцедуры
Показать


Где то приблизительно так можно было бы получить остатки и заполнить их на форме (если таблица ОстаткиНаСкладах так и называется. Не смотрел в отладчике. Но вроде должно работать.
shalupov61; +1 Ответить
31. user614227_kamil-uzd 11.12.20 03:32 Сейчас в теме
&НаСервереБезКонтекста
Функция ТоварыНоменклатураАвтоПодборНаСервере(СсылкаНом)
	
	ДанныеОстатки = Новый Структура;
	Запрос = Новый Запрос("ВЫБРАТЬ
	                      |	ТоварыНаСкладахОстатки.Склад КАК Склад,
						  |    ТоварыНаСкладахОстатки.ВНаличииОстаток КАК ОстатокНаСкладе,
                          |    ТоварыНаСкладахОстатки.КОтгрузкеОстаток КАК РезервНаСкладе
	                      |ИЗ
	                      |	РегистрНакопления.ТоварыНаСкладах.Остатки(, Номенклатура = &Номенклатура) КАК ТоварыНаСкладахОстатки");
	Запрос.УстановитьПараметр("Номенклатура", СсылкаНом);
	
	Результат = Запрос.Выполнить();
	
	ТЗ = Результат.Выбрать();
	Счетчик = 1;
	Если ТЗ.Следующий() Тогда
		СтруктураМассива = Новый Структура("Склад,ОстатокНаСкладе,РезервНаСкладе");
		ЗаполнитьЗначенияСвойств(СтруктураМассива, ТЗ);
		ДанныеОстатки.Вставить("КлючСтруктуры"+ СтрЗаменить(Строка(Счетчик), Символы.НПП, ""), СтруктураМассива);
		Счетчик = Счетчик + 1;
	КонецЕсли;
	
	Возврат ДанныеОстатки;
	
КонецФункции

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


Где то приблизительно так можно было бы получить остатки и заполнить их на форме (если таблица ОстаткиНаСкладах так и называется и у таблицы есть такие же реквизиты "Склад,ОстатокНаСкладе,РезервНаСкладе" с таким же типом значения как и в регистре накопления ТоварыНаСкладах. Не смотрел в отладчике. Но вроде должно работать.
shalupov61; +1 Ответить
32. user614227_kamil-uzd 11.12.20 04:08 Сейчас в теме
(31) В отладчике правил некоторые моменты (относительно синтаксиса), но саму процедуру не запускал.
34. user2088490 24.05.24 16:02 Сейчас в теме
(31) Спасибо. Мне помогло!
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот