Имя: Пароль:
1C
 
Общий модуль
0 ДобрыйПутник
 
naïve
28.03.25
12:19
Здравствуйте, подскажите, сделал процедуру в общем модуле по заполнению ТЧ товаров, вызываю ее с сервера и передаю в нее Объект.Товары, там заполняю, но выдает ошибку -

[ОшибкаВоВремяВыполненияВстроенногоЯзыка]
по причине:
Нельзя изменять поле, содержащее объект данных формы
[ОшибкаИспользованияВстроенногоЯзыка]



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

&НаКлиенте
Процедура ПослеЗакрытияВопроса(Результат, Параметры) Экспорт
    Если Результат = КодВозвратаДиалога.Да Тогда
        Объект.Товары.Очистить();
        ЗаполнитьТабЧастьТоварыОстаткамиПоСкладу(Объект.СкладОтправитель, Объект.Товары);
    КонецЕсли;        
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьТабЧастьТоварыОстаткамиПоСкладу(Склад, ТЧ)
    СкладыСервер.ЗаполнитьТЧОстаткамиТоваровСклада(Склад, ТЧ);
КонецПроцедуры


ОбщийМодуль -

Процедура ЗаполнитьТЧОстаткамиТоваровСклада(Склад, ТЧ) Экспорт
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
    |    ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
    |    ТоварыНаСкладахОстатки.Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры,
    |    ТоварыНаСкладахОстатки.Склад КАК Склад,
    |    ТоварыНаСкладахОстатки.Серия КАК Серия,
    |    ТоварыНаСкладахОстатки.ВНаличииОстаток КАК ВНаличииОстаток,
    |    ТоварыНаСкладахОстатки.КОтгрузкеОстаток КАК КОтгрузкеОстаток,
    |    ТоварыНаСкладахОстатки.ВНаличииОстаток - ТоварыНаСкладахОстатки.КОтгрузкеОстаток КАК ФактОстаток
    |ИЗ
    |    РегистрНакопления.ТоварыНаСкладах.Остатки(, Склад = &Склад) КАК ТоварыНаСкладахОстатки
    |
    |УПОРЯДОЧИТЬ ПО
    |    Номенклатура";
    
    Запрос.УстановитьПараметр("Склад", Склад);
    Результат = Запрос.Выполнить();
    Выборка = Результат.Выбрать();
    Если НЕ Выборка.Количество() = 0 Тогда    
        Пока Выборка.Следующий() Цикл
            Если Выборка.ФактОстаток > 0 Тогда
                Строка = ТЧ.Добавить();
                Строка.Номенклатура = Выборка.Номенклатура;
                Строка.КоличествоУпаковок = Выборка.ФактОстаток;
                Строка.Количество = Выборка.ФактОстаток;
                Строка.ТипНоменклатуры = Выборка.ТипНоменклатуры;
                Если НЕ Выборка.Серия = Справочники.СерииНоменклатуры.ПустаяСсылка() Тогда
                    Строка.СтатусУказанияСерий = 10;
                    Строка.Серия = Выборка.Серия;    
                КонецЕсли;
            КонецЕсли;
        КонецЦикла;
    Иначе
        ОбщегоНазначенияКлиентСервер.СообщитьПользователю("На складе " + Склад + " нету остатков",,,,Истина);
    КонецЕсли;
КонецПроцедуры
1 Pprog151713
 
28.03.25
12:25
ТЧ должно быть не данные формы ТЧ, а Объект тч.
2 ДобрыйПутник
 
naïve
28.03.25
12:29
(1) А я и передаю же объект.тч
3 Fedor-1971
 
28.03.25
12:43
(2) Ты передаёшь коллекцию формы, а не ТЧ
4 Мультук
 
гуру
28.03.25
12:51
(0)
&НаСервере
Процедура ЗаполнитьТабЧастьТоварыОстаткамиПоСкладу(Склад, ТЧ)

     тз = ТЧ.Выгрузить();
     
     СкладыСервер.ЗаполнитьТЧОстаткамиТоваровСклада(Склад, тз);

     тч.Загрузить(тз);
КонецПроцедуры

5 Garykom
 
гуру
28.03.25
13:07
еще есть РеквизитФормыВЗначение и ЗначениеВРеквизитФормы
6 Мультук
 
гуру
28.03.25
13:15
(5)

Которые имхо, в данном случае, совсем не нужны.
7 Garykom
 
гуру
28.03.25
13:26
(6) не нужны но можно использовать, чтобы получить именно ТЧ объекта а не коллекцию формы
и передать ее в процедуру обработки в общем модуле
ТекущийОбъект = РеквизитФормыВЗначение("Объект");
НужнаяТЧ = ТекущийОбъект.ИмяТЧ;
СкладыСервер.ЗаполнитьТЧОстаткамиТоваровСклада(Склад, НужнаяТЧ);

что лучше в конкретном случае хз
8 Мультук
 
гуру
28.03.25
13:46
(7)

Вот зачем ты (я) наступил на мозоль в пятницу :-)

Я теперь начал думать, а как же тогда в типовом коде вот эта хрень работает. А она работает:
-- передаётся табличная часть
-- она таки меняется (цены заполянются)
-- правда новые строки не добавляются

&НаСервере
Функция ЗаполнитьЦеныПоВидуЦенСервер()
	
	КолонкиПоЗначению = Новый Структура("Упаковка", Справочники.УпаковкиЕдиницыИзмерения.ПустаяСсылка());
	ДругиеИменаКолонок = Новый Структура("НоменклатураОприходование, ХарактеристикаОприходование", "Номенклатура", "Характеристика");
	
	ПараметрыЗаполнения = Новый Структура;
	ПараметрыЗаполнения.Вставить("Дата", Объект.Дата);
	ПараметрыЗаполнения.Вставить("Валюта", Объект.Валюта);
	ПараметрыЗаполнения.Вставить("ВидЦены", Объект.ВидЦены);
	ПараметрыЗаполнения.Вставить("КолонкиПоЗначению", КолонкиПоЗначению);
	ПараметрыЗаполнения.Вставить("ДругиеИменаКолонок", ДругиеИменаКолонок);
	
	Возврат ЦеныПредприятияЗаполнениеСервер.ЗаполнитьЦены(
		Объект.Товары, // Табличная часть
		 , // Выделенные строки (заполнять во всех строках)
		ПараметрыЗаполнения);
КонецФункции
9 lubitelxml
 
28.03.25
14:00
(7) я вот тоже привык на УФ именно так делать, а не как в (4) - но в данной ситуации действительно без разницы
10 ДобрыйПутник
 
naïve
28.03.25
14:58
Спасибо
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.