Имя: Пароль:
1C
1С v8
ТекущиеДанные = Неопределено
,
0 Trezvy
 
13.02.23
13:11
Здравствуйте!

Добавляю строку в объект:

НоваяСтрока = Объект.Товары.Добавить();
// заполнение
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаСпецификации);
// запись в номенклатуру
СоздатьЗаписьНоменклатуры(СтрокаСпецификации.Номенклатура, КонтрагентСпецификации, Объект.Ссылка);
            
вызываю процедуру изменения новой строки и там ТекущиеДанные = Неопределено            
Почему, ведь данные есть, строка создана...            
            
ЗаполнитьГруппуПроцентИзменения(НоваяСтрока.Номенклатура, НоваяСтрока.Цена);


Процедура ЗаполнитьГруппуПроцентИзменения(ВыбНоменклатура = Неопределено,ТекущаяЦена = Неопределено)
    
    Если ВыбНоменклатура = Неопределено и ТекущаяЦена = Неопределено Тогда
        ТекущиеДанные   = Элементы.Товары.ТекущиеДанные;
        ВыбНоменклатура = ТекущиеДанные.Номенклатура;
        ТекущаяЦена     = ТекущиеДанные.Цена;
    КонецЕсли;
                
    Если ЗначениеЗаполнено(ВыбНоменклатура) Тогда
        
        СтруктураГруппы = ПолучитьПоследнееЗначениеЦены(ВыбНоменклатура);
        
        Если СтруктураГруппы <> Неопределено Тогда    
            ТекущиеДанные.ПроцентИзменения   = ОКР(ТекущаяЦена*100/СтруктураГруппы.ПредыдущаяЦена-100,2);
            ТекущиеДанные.ДатаПредыдущейЦены = СтруктураГруппы.ДатаПредыдущейЦены;
            ТекущиеДанные.ПредыдущаяЦена     = СтруктураГруппы.ПредыдущаяЦена;
        КонецЕсли;
                          
    КонецЕсли;
    
КонецПроцедуры
1 vicof
 
13.02.23
13:14
Контекст выполнения процедур тоже важен
2 spiller26
 
13.02.23
13:16
(0) Как ты определяешь "ТекущиеДанные", если ВыбНоменклатура <> Неопределено ???
3 Trezvy
 
13.02.23
13:34
vicof(1),

&НаСервере
Процедура СоздатьЗаписьЦеныНоменклатуры(Номенклатура,Контрагент,СсылкаНаДокумент)
    
    МенеджерЗаписи = РегистрыСведений.ЦеныНоменклатуры.СоздатьМенеджерЗаписи();

    МенеджерЗаписи.Номенклатура = Номенклатура;
    МенеджерЗаписи.Контрагент   = Контрагент;
    МенеджерЗаписи.Цена         = Цена;
    МенеджерЗаписи.Валюта       = Валюта;
    МенеджерЗаписи.ВнутреннийДокумент = СсылкаНаДокумент;
    
    МенеджерЗаписи.Записать();
    
КонецПроцедуры
4 Trezvy
 
13.02.23
13:38
ТекущиеДанные = Неопределено

Выносил

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

выше, до проверки, реузльтат всё равно  ТекущиеДанные = Неопределено
5 vicof
 
13.02.23
13:42
ЗаполнитьГруппуПроцентИзменения в каком контексте?
6 Kassern
 
13.02.23
13:43
(0) Зачем вам вообще это "Элементы.Товары.ТекущиеДанные"?
Если вы добавляете строку и работаете с ней, то у вас она уже хранится в НоваяСтрока
7 Kassern
 
13.02.23
13:43
Напишите по рабоче-крестьянски, что сделать-то хотите?
8 Остап Ибрагимович
 
13.02.23
13:50
Навскидку: мало что-то добавить в данные - для доступа к ним через параметры и свойства элементов диалога надо соответствующие реквизиты диалога привести в состояние, соответствующие измененным данным. Например, Активизировать в диалоге то, откуда хотите тянуть ТекущиеДанные.
9 Trezvy
 
13.02.23
13:51
(5) &НаКлиенте
Процедура ЗаполнитьГруппуПроцентИзменения(ВыбНоменклатура = Неопределено,ТекущаяЦена = Неопределено)
10 Trezvy
 
13.02.23
13:54
(7) Хочу заполнить данные строк в таблице Товары данными из СтруктураГруппы:

            ТекущиеДанные.ПроцентИзменения   = ОКР(ТекущаяЦена*100/СтруктураГруппы.ПредыдущаяЦена-100,2);
            ТекущиеДанные.ДатаПредыдущейЦены = СтруктураГруппы.ДатаПредыдущейЦены;
            ТекущиеДанные.ПредыдущаяЦена     = СтруктураГруппы.ПредыдущаяЦена;
11 Trezvy
 
13.02.23
14:05
(6) Передавать в ЗаполнитьГруппуПроцентИзменения НоваяСтрока и присваивать значения через неё, без ТекущиеДанные?


Процедура ЗаполнитьГруппуПроцентИзменения(ВыбНоменклатура = Неопределено,ТекущаяЦена = Неопределено, НоваяСтрока = Неопределено)
    
        
        СтруктураГруппы = ПолучитьПоследнееЗначениеЦены(ВыбНоменклатура);
        
        Если СтруктураГруппы <> Неопределено Тогда    
            
            НоваяСтрока.ПроцентИзменения   = ОКР(ТекущаяЦена*100/СтруктураГруппы.ПредыдущаяЦена-100,2);
            НоваяСтрока.ДатаПредыдущейЦены = СтруктураГруппы.ДатаПредыдущейЦены;
            НоваяСтрока.ПредыдущаяЦена     = СтруктураГруппы.ПредыдущаяЦена;
        КонецЕсли;
                          
КонецПроцедуры
12 Kassern
 
13.02.23
14:27
(11) Зачем вы передаете "ВыбНоменклатура = Неопределено,ТекущаяЦена = Неопределено" в параметрах? У вас есть НоваяСтрока, в которой уже есть и номенклатура и цена.
13 Kassern
 
13.02.23
14:28
И да, ТекущиеДанные вам не нужны при этом.
14 Kassern
 
13.02.23
14:29
Сами ТекущиеДанные нужны, когда вы работаете с формой, и нужно получить текущие данные строки, но раз вы сами добавляете эту строку, то в этом нет необходимости.
15 Trezvy
 
13.02.23
15:03
(14) Дело в том, что эта же процедура ЗаполнитьГруппуПроцентИзменения() - без параметров - вызывается при изменение данных строки в таблице (при редактировании). В этом случае ТекущиеДанные отрабатывают корректно.

Ошибка с ними получалась при вызове этой процедуры ЗаполнитьГруппуПроцентИзменения(ВыбНоменклатура = Неопределено,ТекущаяЦена = Неопределено) из процедуры заполнения таблицы данными из файла. Создаем в таблице очередную новую запись - и вызываем ЗаполнитьГруппуПроцентИзменения. Но при этом ТекущиеДанные = Неопределено.

Сейчас получается такая модернизация:

&НаКлиенте
Процедура ЗаполнитьГруппуПроцентИзменения(ВыбНоменклатура = Неопределено,ТекущаяЦена = Неопределено, НоваяСтрока = Неопределено)

    // ++++++++ для пересчета текущий записи
    Если ВыбНоменклатура = Неопределено и ТекущаяЦена = Неопределено Тогда
        ТекущиеДанные   = Элементы.Товары.ТекущиеДанные;
        ВыбНоменклатура = ТекущиеДанные.Номенклатура;
        ТекущаяЦена     = ТекущиеДанные.Цена;
    КонецЕсли;

    Если ЗначениеЗаполнено(ВыбНоменклатура) И ЗначениеЗаполнено(Объект.M3_DATE_ORD) Тогда
        
        СтруктураГруппы = ПолучитьПоследнееЗначениеЦены(ВыбНоменклатура,Дата(Объект.M3_DATE_ORD+" 00:00:00"));
        
        Если СтруктураГруппы <> Неопределено Тогда
            // ++++++++ пересчет текущий записи
            Если  ТекущиеДанные <> Неопределено Тогда    
                Процент = ОКР(ТекущаяЦена*100/СтруктураГруппы.ПредыдущаяЦена-100,2);
                ТекущиеДанные.ПроцентИзменения   = Процент;
                ТекущиеДанные.ДатаПредыдущейЦены = СтруктураГруппы.ДатаПредыдущейЦены;
                ТекущиеДанные.ПредыдущаяЦена     = СтруктураГруппы.ПредыдущаяЦена;
            Иначе    
                // +++++++++++++ обработка новой записи
                // вместо ТекущиеДанные используем переданный параметр НоваяСтрока
                НоваяСтрока.ПроцентИзменения   = Процент;
                НоваяСтрока.ДатаПредыдущейЦены = СтруктураГруппы.ДатаПредыдущейЦены;
                НоваяСтрока.ПредыдущаяЦена     = СтруктураГруппы.ПредыдущаяЦена;
                // -------------
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры
16 Kassern
 
13.02.23
15:13
(15) Если честно, то код коряво написан, читать сложно, куча условий лишних.
Что у вас является Объект?
M3_DATE_ORD - что за реквизиты такие?
Зачем вы делаете так Объект.M3_DATE_ORD+" 00:00:00"? Нельзя разве хранить в реквизите дату, а при желании ее всегда можно через формат привести к нужному виду.
Зачем вы проверяете на "  Если ВыбНоменклатура = Неопределено и ТекущаяЦена = Неопределено Тогда "? У вас имхо можно написать общую логику на пересчет текущей строки и добавленной. Просто в параметрам процедуры передавайте строку, которую нужно пересчитать. В одном случае будете текущие данные передавать, в другом - новую строку.
17 Kassern
 
13.02.23
15:14
Один хрен вы на каждую строку дергаете сервер ради "ПолучитьПоследнееЗначениеЦены". Так какой смысл было делать процедуру на клиенте, а не сразу на сервере посчитать запросом и заполнить, что нужно?
18 Trezvy
 
14.02.23
06:29
(16) Спасибо!
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший