Имя: Пароль:
1C
 
Автоматический пересчет колонок ТЧ после внешней обработки
0 abask
 
03.09.25
19:47
Типовая конфигурация ERP
Пишу обработчик ТЧ, который изменяет количество.

Сумма автоматически не пересчитывается.
Пересчет суммы прописан в форме документа, в контексте клиента. Вызываются общие модули, тоже клиентские.

Мой обработчик же выполняется в контексте сервера.

В теории можно самому написать арифметику, но там нужно учитывать НДС, скидки и фиг знает что еще. Есть предположение, что можно закопаться с этим.

Изначально написание обработки для заполнения ТЧ задумана как решение проблемы описанной тут
Учет листового материала в ERP 2.5
1 Волшебник
 
03.09.25
19:58
Ага, удачи с этим ебанутым разделением на клиент/сервер
2 Garykom
 
гуру
03.09.25
20:00
Там же вроде можно передать ТЧ (или даже ТЗ) в общие модули и оно пересчитает
Причем как с клиента так и с сервера должно быть

Просто изучи какие модули и как с клиента вызываются
И поищи аналогичные процедуры/функции в серверных
3 abask
 
03.09.25
20:16
Только в клиентских.

Почитал истории тех кто выбрал этот путь.

Похоже никак.
4 Мультук
 
гуру
03.09.25
20:42
(3)

== Копипаста из &НаСервере  раз ===

об= ссылкаРТУ.ПолучитьОбъект(); //Где-то много выше

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


Копи-паста два

СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ПересчитатьСуммуНДС", СтруктураПересчетаСуммы);
СтруктураДействий.Вставить("ПересчитатьСуммуСНДС", СтруктураПересчетаСуммы);
ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьТЧ(об.Товары, СтруктураДействий, Неопределено);



Пример с пересчётом конкретной строки сами сможете ?
Открыть и посмотреть на ПакетнаяОбработкаТабличнойЧастиСервер в состоянии ?

Если нет, открываем ЗаказКлиента.ФормаДокумента и  через CTRL+F ищем строку
ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьСтрокиТЧ


Примеров в ERP с &НаСервере - тьма, тьмущая.

P.S.
Вместо ЗаказКлиента можно смотреть в ЗаказПоставщику.ФормаДокумента  и там куча примеров
5 abask
 
03.09.25
20:44
(4) нашел
спасибо, буду разбираться
6 Garykom
 
гуру
03.09.25
20:58
(4) Ага
В свое время пришлось все эти обработки строк ТЧ в ЕРПУХ искать и перелопачивать
Добавляя туда обработку акцизов
И на сервере и на клиенте
Да еще ваять обертки чтобы настройки по акцизам тянуло

В итоге понял что НДС - это просто один из видов акцизов ))
Наваяв подсистему учета акцизов что по сложности оказалось сравнимо с подсистемой учета НДС
7 abask
 
03.09.25
22:32
вот так получилось

Процедура РасчитатьМ2(ДанныеФормы) Экспорт
    
    ТекстПодробно = "";
    
    СтруктураПересчетаСуммы = ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПараметрыПересчетаСуммыНДСВСтрокеТЧ(ДанныеФормы);

    СтруктураДействий = Новый Структура;
    СтруктураДействий.Вставить("ПересчитатьСуммуНДС",  СтруктураПересчетаСуммы);
    СтруктураДействий.Вставить("ПересчитатьСуммуСНДС", СтруктураПересчетаСуммы);
    СтруктураДействий.Вставить("ПересчитатьСуммуСУчетомРучнойСкидки",         Новый Структура("Очищать", Ложь));
    СтруктураДействий.Вставить("ПересчитатьСуммуСУчетомАвтоматическойСкидки", Новый Структура("Очищать", Истина));
    
    КэшированныеЗначения = Неопределено;
    
    Для Каждого Товар Из ДанныеФормы.Товары Цикл
        
        ДопСвойствоШирина = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Ширина");
        СвойствоШирина = Товар.Номенклатура.ДополнительныеРеквизиты.Найти(ДопСвойствоШирина);
        Ширина = СвойствоШирина.Значение;
        
        ДопСвойствоДлина = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Длина");
        СвойствоДлина = Товар.Характеристика.ДополнительныеРеквизиты.Найти(ДопСвойствоДлина);
        Длина = СвойствоДлина.Значение;
        
        КоличествоШтук = Товар.Д4Зак_КоличествоСправочно;
        
        Площадь = (Ширина / 1000) * (Длина / 1000) * КоличествоШтук;
        
        Если Товар.Свойство("КоличествоУпаковок") Тогда
            Товар.КоличествоУпаковок = Площадь;
            СтруктураДействий.Вставить("ПересчитатьСумму", "КоличествоУпаковок");
            СтруктураДействий.ПересчитатьСуммуСУчетомРучнойСкидки.Вставить("ИмяКоличества", "КоличествоУпаковок")
        ИначеЕсли Товар.Свойство("Количество") Тогда
            Товар.Количество = Площадь;
            СтруктураДействий.Вставить("ПересчитатьСумму", "Количество");
            СтруктураДействий.ПересчитатьСуммуСУчетомРучнойСкидки.Вставить("ИмяКоличества", "Количество")
        КонецЕсли;
        
        ПакетнаяОбработкаТабличнойЧастиСервер.ОбработатьСтрокуТЧ(Товар, СтруктураДействий, КэшированныеЗначения, ДанныеФормы.Товары);
        
        Если Товар.Свойство("НоменклатураПартнера") Тогда
            Если Товар.НоменклатураПартнера <> Справочники.НоменклатураКонтрагентов.ПустаяСсылка() Тогда
                Наименование = Товар.НоменклатураПартнера.НаименованиеПолное;
            КонецЕсли;
        Иначе
            Наименование = Товар.Номенклатура.НаименованиеПолное;
        КонецЕсли;
        
        ТекстПодробно = ТекстПодробно + Наименование + " длина " + Формат(Длина, "ЧГ=") + " " + КоличествоШтук + " шт" + Символы.ПС;
        
    КонецЦикла;
    
    Если ДанныеФормы.Свойство("ДополнительнаяИнформация") Тогда
        ДанныеФормы.ДополнительнаяИнформация = ТекстПодробно;
    ИначеЕсли ДанныеФормы.Свойство("ПрочаяДополнительнаяИнформацияТекст") Тогда
        ДанныеФормы.ПрочаяДополнительнаяИнформацияТекст = ТекстПодробно;
    КонецЕсли;
    
КонецПроцедуры
8 Мультук
 
гуру
03.09.25
22:44
(7)


1) Если ДанныеФормы.Товары это ЗаказПоставщику.Товары, то

В моей реальности в текущей парадигме ЕРП
в таб.части "Товары" всегда есть оба два реквизита
"КоличествоУпаковок" и "Количество"
и оба, что характерно --  заполнены.

2)

Вообще за гранью добра и зла.

Ну хотя бы вот это можно вынести за цикл и делать один раз ?
ДопСвойствоШирина = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Ширина");
ДопСвойствоДлина = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Длина");


ДопСвойствоШирина = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Ширина");
СвойствоШирина = Товар.Номенклатура.ДополнительныеРеквизиты.Найти(ДопСвойствоШирина);
Ширина = СвойствоШирина.Значение;
        
ДопСвойствоДлина = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Длина");
СвойствоДлина = Товар.Характеристика.ДополнительныеРеквизиты.Найти(ДопСвойствоДлина);
Длина = СвойствоДлина.Значение;


3)
Для Каждого Товар Из ДанныеФормы.Товары Цикл


Лучше всё же вот так. Или так.

Для Каждого СтрокаТовар Из ДанныеФормы.Товары Цикл

Для Каждого Строка Из ДанныеФормы.Товары Цикл


4)
Вы превыкнете, а потом вас за это будут тыкать носом.
Будет неприятно.

Товар.Номенклатура.НаименованиеПолное;
9 abask
 
04.09.25
15:39
(8)
тыкнули - неприятно...
по поводу вынести за цикл - согласен
писалось поздно вечером

по поводу КоличествоУпаковок - реквизит отсутствует в КП клиенту :(
из-за этого и весь сыр-бор