Имя: Пароль:
1C
 
Как в расширении вызвать процедуру из формы
,
0 ded20ded
 
26.01.22
20:39
Вечер добрый.
Перенес форму в расширение, сделал кнопку обновление цены.
Цены меняются, как правильно вызвать пересчет суммы?


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

&НаКлиенте
Процедура Расш1_ПроверкаЦенПоСпецификацииПосле(Команда)
    Расш1_ПроверкаЦенПоСпецификацииПослеНаСервере();
КонецПроцедуры
1 vicof
 
26.01.22
20:42
Провалиться чуток в процедуры изменения цены и вызвать серверные обработчики
2 ded20ded
 
26.01.22
20:42
&НаКлиенте
Процедура ТоварыЦенаПриИзменении(Элемент)
    
    Строка = Элементы.Товары.ТекущиеДанные;
    
    Если НЕ Строка.ЭтоУслуга И Строка.Цена < 0 Тогда
    
        Строка.Цена = 0;
    
    КонецЕсли;
    
    ПересчитатьСуммуТовары("Товары");
    
КонецПроцедуры
3 vicof
 
26.01.22
20:43
и еще немного провалиться
4 ded20ded
 
26.01.22
20:44
&НаКлиенте
Процедура ПересчитатьСуммуТовары(ИмяТабЧасти)

    Строка = Элементы[ИмяТабЧасти].ТекущиеДанные;
    
    ЗначениеПустогоКоличества = ?(ИмяТабЧасти = "Товары" И Строка.ЭтоУслуга, 1, 0);
    
    НалоговыйАгентПоФЗ335 = ПокупательНалоговыйАгентПоНДС = Истина И ВедетсяУчетНДСПоФЗ335;
    ОбщегоНазначенияБПКлиент.ПересчитатьСумму(Строка, Объект.СуммаВключаетНДС, ЗначениеПустогоКоличества,,НалоговыйАгентПоФЗ335);
    
КонецПроцедуры
5 vicof
 
26.01.22
20:45
Ну вот. В цикле перебираешь строки и персечитываешь суммы.
6 vicof
 
26.01.22
20:47
В БПКлиент тоже какие-то серверные процедуры вызываются.
7 ded20ded
 
26.01.22
20:48
&НаСервере
Процедура Расш1_ПроверкаЦенПоСпецификацииПослеНаСервере()
    // Вставить содержимое обработчика.
    Если НЕ ЗначениеЗаполнено(Объект.ДоговорКонтрагента.ТипЦен) Тогда
        Сообщить("Не заполнены типы цены в договоре контрагента");
        Возврат;
    КонецЕсли;    
    Для каждого Стр Из Объект.Товары Цикл
        Запрос=Новый Запрос;
        Запрос.Текст="ВЫБРАТЬ
        |    ЦеныНоменклатурыСрезПоследних.Цена КАК Цена
        |ИЗ
        |    РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ДатаЦены, ) КАК ЦеныНоменклатурыСрезПоследних
        |ГДЕ
        |    ЦеныНоменклатурыСрезПоследних.Номенклатура = &Номенклатура
        |    И ЦеныНоменклатурыСрезПоследних.ТипЦен = &ТипЦен";
        
        Запрос.УстановитьПараметр("ДатаЦены", Объект.Дата);
        Запрос.УстановитьПараметр("Номенклатура", Стр.Номенклатура);    
        Запрос.УстановитьПараметр("ТипЦен", Объект.ДоговорКонтрагента.ТипЦен);
        Выборка=Запрос.Выполнить().Выбрать();
        
        Пока Выборка.Следующий() Цикл
            Если Стр.Цена<>Выборка.Цена И Выборка.Цена<>0 Тогда
                Стр.Цена=Выборка.Цена;
                
                ИмяТабЧасти = "Товары";
                Строка = Элементы[ИмяТабЧасти].ТекущиеДанные;
                
                ЗначениеПустогоКоличества = ?(ИмяТабЧасти = "Товары" И Строка.ЭтоУслуга, 1, 0);
                
                НалоговыйАгентПоФЗ335 = ПокупательНалоговыйАгентПоНДС = Истина И ВедетсяУчетНДСПоФЗ335;
                
                ДокументОбъект = РеквизитФормыВЗначение("Объект");
                РезультатФункции = ДокументОбъект.ОбщегоНазначенияБПКлиент.ПересчитатьСумму(Строка, Объект.СуммаВключаетНДС, ЗначениеПустогоКоличества,,НалоговыйАгентПоФЗ335);
                
            КонецЕсли;    
        КонецЦикла;    
        
    КонецЦикла;    
КонецПроцедуры
8 ded20ded
 
26.01.22
20:49
сделал так (7) но ошибка

Ошибка при получении значения атрибута контекста (ТекущиеДанные)
{Доработки Документ.СчетНаОплатуПокупателю.Форма.ФормаДокумента.Форма(29)}:                Строка = Элементы[ИмяТабЧасти].ТекущиеДанные;
{Доработки Документ.СчетНаОплатуПокупателю.Форма.ФормаДокумента.Форма(46)}:    Расш1_ПроверкаЦенПоСпецификацииПослеНаСервере();
по причине:
Текущие данные таблицы недоступны на сервере
Текущие данные таблицы недоступны на сервере
9 vicof
 
26.01.22
20:51
Для каждого СтрокаТЧ из Объект.Товары Цикл
ОбщегоНазначенияСерверный.ПересчитатьСумму(СтрокаТЧ, Объект.СуммаВключаетНДС, ЗначениеПустогоКоличества,,НалоговыйАгентПоФЗ335);
КонецЦикла;
10 ded20ded
 
26.01.22
20:55
<<?>>ОбщегоНазначенияСерверный.ПересчитатьСумму(Стр, Объект.СуммаВключаетНДС, ЗначениеПустогоКоличества,,НалоговыйАгентПоФЗ335);                 (Проверка: Сервер)
11 ded20ded
 
26.01.22
20:55
не видит в расширении
12 vicof
 
26.01.22
20:59
Ну то есть ты просто все копипастишь? Это был не код из твоей конфигурации, про которую ты не сообщил. А намек на то, что не надо реквизиты формы в значения преобразовывать. И подучить клиент-серверную модель. И намек на то, как надо сделать.
13 ded20ded
 
26.01.22
21:11
&НаСервере
Процедура Расш1_ПроверкаЦенПоСпецификацииПослеНаСервере()
    // Вставить содержимое обработчика.
Элементы.АдресДоставки.Доступность=Истина;

Если НЕ ЗначениеЗаполнено(Объект.ДоговорКонтрагента.ТипЦен) Тогда
        Сообщить("Не заполнены типы цены в договоре контрагента");
        Возврат;
    КонецЕсли;    
    Для каждого Стр Из Объект.Товары Цикл
        Запрос=Новый Запрос;
        Запрос.Текст="ВЫБРАТЬ
        |    ЦеныНоменклатурыСрезПоследних.Цена КАК Цена
        |ИЗ
        |    РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ДатаЦены, ) КАК ЦеныНоменклатурыСрезПоследних
        |ГДЕ
        |    ЦеныНоменклатурыСрезПоследних.Номенклатура = &Номенклатура
        |    И ЦеныНоменклатурыСрезПоследних.ТипЦен = &ТипЦен";
        
        Запрос.УстановитьПараметр("ДатаЦены", Объект.Дата);
        Запрос.УстановитьПараметр("Номенклатура", Стр.Номенклатура);    
        Запрос.УстановитьПараметр("ТипЦен", Объект.ДоговорКонтрагента.ТипЦен);
        Выборка=Запрос.Выполнить().Выбрать();
        
        Пока Выборка.Следующий() Цикл
            Если Стр.Цена<>Выборка.Цена И Выборка.Цена<>0 Тогда
                Стр.Цена=Выборка.Цена;
                
                ИмяТабЧасти = "Товары";
                //Строка = Элементы[ИмяТабЧасти].ТекущиеДанные;
                //
                ЗначениеПустогоКоличества = ?(ИмяТабЧасти = "Товары" И стр.ЭтоУслуга, 1, 0);
                //
                НалоговыйАгентПоФЗ335 = ПокупательНалоговыйАгентПоНДС = Истина И ВедетсяУчетНДСПоФЗ335;
                //
                ДокументОбъект = РеквизитФормыВЗначение("Объект");
                РезультатФункции = ДокументОбъект.ОбщегоНазначенияСерверный.ПересчитатьСумму(Стр, Объект.СуммаВключаетНДС, ЗначениеПустогоКоличества,,НалоговыйАгентПоФЗ335);                
            КонецЕсли;    
        КонецЦикла;    
        
    КонецЦикла;    
КонецПроцедуры
14 ded20ded
 
26.01.22
21:12
(все равно ошибка (10)
15 acht
 
26.01.22
21:14
(13) РезультатФункции = ДокументОбъект.ОбщегоНазначенияСерверный.ПересчитатьСумму(Стр, Объект.СуммаВключаетНДС, ЗначениеПустогоКоличества,,НалоговыйАгентПоФЗ335);

Я бы тоже ругался
16 ded20ded
 
26.01.22
21:17
(15) проясни в чем ошибка?
17 ded20ded
 
26.01.22
21:18
в расширении нет функции пересчета суммы при изменении цены, цена меняется, сумма остается.
18 acht
 
26.01.22
21:23
(16) Что такое ДокументОбъект?
19 ded20ded
 
26.01.22
21:27
Я понимаю что тут ошибка, как правильно получить процедуры и функции "Объекта"  - ДокументОбъект = РеквизитФормыВЗначение("Объект");
20 hhhh
 
26.01.22
21:28
(19) так

РезультатФункции = ДокументОбъект.ПересчитатьСумму(Стр, Объект.СуммаВключаетНДС,
21 ded20ded
 
26.01.22
21:32
(18) ДокументОбъект.СчетНаОплатуПокупателю()
22 ded20ded
 
26.01.22
21:33
(20) сделал так РезультатФункции = ДокументОбъект.ПересчитатьСумму(Стр);
Метод объекта не обнаружен (ПересчитатьСумму)
23 hhhh
 
26.01.22
22:13
(22) так добавь туда этот метод. Копипастом 3 секунды
24 ded20ded
 
27.01.22
11:21
(23) то есть, вызвать процедуру которая в основной конфигурации на форме не возможно? Нужно тупо переносить весь код в расширение?