| 
    
            
         
         | 
    
  | 
        Автоматический пересчет колонок ТЧ после внешней обработки         | ☑ | ||
|---|---|---|---|---|
| 
    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)
 
        тыкнули - неприятно... по поводу вынести за цикл - согласен писалось поздно вечером по поводу КоличествоУпаковок - реквизит отсутствует в КП клиенту :( из-за этого и весь сыр-бор  | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |