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