Ошибка в расчете строки

Версия для печатиPDF-версия

Платформа:

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

Да вообще удивительно, что что-то понятное получается.

К чему привязана эта процедуру? Что передаётся в параметр Элемент?

Процедура привязана к динамической колонке, которая создаеется ранее

Процедура с созданием колонок

&НаСервере
Процедура СформироватьСеткуНаСервере()
 
Если ДобавленныеЭлементы.Количество()>0 Тогда
Для Каждого ДобЭлемент Из ДобавленныеЭлементы Цикл
Элементы.Удалить(Элементы[ДобЭлемент.Значение]);
КонецЦикла;
ДобавленныеЭлементы.Очистить();
КонецЕсли;
   
Если ДобавленныеРеквизиты.Количество()>0 Тогда
ИзменитьРеквизиты(, ДобавленныеРеквизиты.ВыгрузитьЗначения());
ДобавленныеРеквизиты.Очистить();
КонецЕсли;
 
нРеквизиты = Новый Массив;
 
Для Каждого Стр Из Объект.СписокСкладов Цикл
ИдентификаторРеквизита = Стр.СкладМагазин.ДополнительныеРеквизиты[0].Значение;
ИмяМагазина = Стр.СкладМагазин.Наименование;
нРеквизиты.Добавить(Новый РеквизитФормы(ИдентификаторРеквизита, Новый ОписаниеТипов("Число"),"Объект.Товары",ИдентификаторРеквизита,Истина));
ДобавленныеРеквизиты.Добавить("Объект.Товары." + ИдентификаторРеквизита);
КонецЦикла;
 
ИзменитьРеквизиты(нРеквизиты);
 
Для Каждого нРеквизит Из нРеквизиты Цикл
нЭлемент     = Элементы.Добавить(нРеквизит.Имя, Тип("ПолеФормы"),Элементы.Товары);
нЭлемент.Вид = ВидПоляФормы.ПолеВвода;
ПутьКОбъектуДляЭлемента = СокрЛП("Объект.Товары."+нРеквизит.Имя); 
нЭлемент.ПутьКДанным    = ПутьКОбъектуДляЭлемента;
нЭлемент.УстановитьДействие("ПриИзменении","ОбработчикПриИзмененииКолонкиКоличества");
ДобавленныеЭлементы.Добавить(нРеквизит.Имя);
КонецЦикла;
 
КонецПроцедуры
 
Количество колонок формируется по списку складов из еще одной табличной части "СписокСкладов"

Получается, что Вы из значения КоличествоСверка вычитаете количество в текущей колонке столько раз, сколько складов в СписокСкладов.

Надо в цикле перебирать нРеквизиты. И перед выполнением цикла в СверкаР помещать значение Количество из текущих данных.

Счас попробую, но что-то до конца еще не сообразил... Может в процессе дойдет... :)

  • "И перед выполнением цикла в СверкаР помещать значение Количество из текущих данных."

А зачем? Текущих данных чего?

Текущих данных таблицы Товары (Элементы.Товары.ТекущиеДанные).

&НаКлиенте
Процедура ОбработчикПриИзмененииКолонкиКоличества(Элемент);
Сверка  = Элементы.Товары.ТекущиеДанные.Количество;
ТД      = Элементы.Товары.ТекущиеДанные;
СверкаР = Сверка;
Для Сч = 1 По ДобавленныеРеквизиты.Количество() Цикл
ИмяРеквизита = СтрЗаменить(ДобавленныеРеквизиты[Сч-1].Значение,"Объект.Товары.","");
СверкаР = СверкаР - ТД[ИмяРеквизита];
КонецЦикла;
Элементы.Товары.ТекущиеДанные.КоличествоСверка = СверкаР;
 
КонецПроцедуры
 
Спасибо. Получилось))) Вот так - работает

Алексей. простите что отвлекаю. Еще один вопрос, который вы можете отнести к категории глупых... А как по значению дополнительного реквизита найти владельца? То есть например есть значение СтроковыйКодСклада со значением AVTZD и надо найти по нему Склад, у которого это значение. Значения уникальные и не повторяются

Запрос = Новый Запрос;
Запрос.Текст = 
	"ВЫБРАТЬ
	|	СкладыДополнительныеРеквизиты.Ссылка КАК Склад
	|ИЗ
	|	Справочник.Склады.ДополнительныеРеквизиты КАК СкладыДополнительныеРеквизиты
	|ГДЕ
	|	СкладыДополнительныеРеквизиты.Свойство.Наименование = &Наименование
	|	И СкладыДополнительныеРеквизиты.Значение = &Значение";

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

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

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

Блин, огромное человеческое спасибо:) И номер карточки я все еще помню) Осталось з/п дождаться)

Только может быть не "если... тогда.... конецесли", а "пока... цикл.... конеццикла"

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

Если ... Тогда... вполне подойдёт, т.к. нужно получить единственное значение. Нет смысла в переборе выборки.

Надо ещё наименование свойства в запрос передавать, а то теоретически может неоднозначная ситуация получиться.

А вообще-то неправильно запрос выполнять в цикле. Правильней получить все склады одним запросом, а в цикле уже из выборки нужные значения вытаскивать.

Тяжко их так подхватывать...

Алексей если можно еще один вопрос - не записывает она данные в табличную часть документа. Сама процедура целиком:

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

Надо этот код в процедуру ПередЗаписью перенести.

ПС. А какие сложности с "подхватыванием" складов? В начале процедуры получаете запросом все склады со значениями нужного свойства. Выгружаете результат запроса в таблицу значений. А в цикле по значению элемента находите строку таблицы значений и получаете из неё склад.

не, со складами все норм) Спасибо большое

Хм... Не прокатило.

Перенес в ПередЗаписьюНаСервере - не сохраняет

Сетка заполняется, но не сохраняется?

В ПередЗаписьюНаСервере записываемый объект находится в переменной ТекущийОбъект. Так что заполнение Сетки нужно производить у ТекущийОбъект.

О! Теперь получилось. Спасибо огромное