Имя: Пароль:
1C
1С v8
Немного жести. Универсальная функция пересчета табличной части
0 Beduin
 
16.01.19
18:35
Типовая ЕРП.
Несложная задача, по результатам которой надо пересчитать суммы, ндс и т.п. во всех строках.
Чтобы не писать самому очередной велосипед, решил посмотреть как решают проблему разработчики. Оказалось слово из темы. Жесть везде.
Универсальности никакой нет. Кучи вызовов, из разных общих модулей для каждой ситуации уникальных.
Может быть я не увидел их? Никто не сталкивался с универсальными функциями обработки ТЧ?
1 бедхуин
 
16.01.19
18:44
А как же жаба андроид? Не осилил? За 50 тыс таки одинесишь?
2 Beduin
 
16.01.19
18:46
(1) По Андроиду на профильных форумах задаю. Есть два клиента на ЕРП, платят норм. Смысла пока нет отказываться.
3 d4rkmesa
 
16.01.19
18:47
(0) Сам удивляюсь. А не жесть, когда вместо обработкизаполнения две ничего не значащие строчки, зато весь код в ПриСозданииНаСервере формы документа? Хочешь сделать массовое программное создание документа - делаешь свой велосипед от начала до конца. Вопрос риторический.
4 Beduin
 
16.01.19
18:50
(3) Я склоняюсь, к тому, что сами уже не пишут. Есть инструмент, который генерит определенный код. Отсюда и получается по 20 вложенных вызовов. Ни одна команда не сможет такое поддерживать.
5 бедхуин
 
16.01.19
18:53
(2) дооо, конечно, скажи лучше ниасилил, хоть что-то правдивое услышим от тебя, а то эти байки про одинесников за 50 в мск уже надоело слушать
6 quest
 
16.01.19
18:53
(4) Поддержу.
7 VladZ
 
16.01.19
18:56
(4) Где бы взять этот "генератор бреда"?
8 Beduin
 
16.01.19
18:59
(5) Вам же помогаю. Молодежь прочитает, что 50 это потолок и все. Будет до пенсии по 300 заколачивать.
9 Beduin
 
16.01.19
19:02
(5) В андроидах проще.
Берешь один из классов, которые 90 процентов проблем закрывают. Наследуешся от него и все. Вызовы переопределил на свои алгоритмы, задачу решил. За все проекты больше трех вложенных вызовов не было ни разу.
10 Garykom
 
гуру
16.01.19
19:38
(0) Посмотри любой крупный проект на java и увидишь что там жести не меньше чем в ЕРП.

А проектики под андроид просто пока очень маленькие, разрабов мало как и строчек кода или тупо потроха не увидеть у тех что покрупнее.

Я как то попробовал на свой старый смартфон (не совсем слабый кста) поставить King's Bounty Legions.
Вот это жесть из жести и по размеру и по тому как оно работало, как сча не в курсе.

Короче зря бочку катишь на ЕРП это обычная картинка автоматизированного хаоса.
11 Garykom
 
гуру
16.01.19
19:40
В ЕРП меня больше добило что там даже между разными документами разный интерфейс загрузки внешних данных из файликов экселя.
Совсем разный и отдельно наваянный - как увидел ржал долго.

Разрабы между собой походу совсем не общаются и даже не в курсе конфы и что другие делают ))
12 shuhard
 
16.01.19
20:37
(0)[Жесть везде. ]
тебе пора на пенсию
мозг костенеет
14 Beduin
 
17.01.19
09:42
(10) Между платформой 1С и java большая разница в предназначении и возможностях.
15 Beduin
 
17.01.19
09:43
(12) Тебе этот гемор, который в типовых возник только на руку. Больше денег за разбирательство.
16 RomaH
 
naïve
17.01.19
09:51
(0) мельком вроде видел - то ли в БП 3 то ли еще где
там УТ в структуру пишется, что надо сделать - потом вызов универсальной

Процедура ТоварыНоменклатураПриИзмененииВопросПользователюЗавершение(Результат, ДополнительныеПараметры) Экспорт
    
    Если РеализацияСверхЗаказа И Не Результат Тогда
        Возврат;
    КонецЕсли;
    
    ТекущаяСтрока = ДополнительныеПараметры.ТекущаяСтрока;
    
    СтруктураПересчетаСуммы = ОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруПересчетаСуммыНДСВСтрокеТЧ(Объект);
    
    СтруктураДействий = Новый Структура;
    СтруктураДействий.Вставить("ПроверитьХарактеристикуПоВладельцу", ТекущаяСтрока.Характеристика);
    СтруктураДействий.Вставить("ПроверитьЗаполнитьУпаковкуПоВладельцу", ТекущаяСтрока.Упаковка);
    СтруктураДействий.Вставить("ПересчитатьКоличествоЕдиниц");
    СтруктураДействий.Вставить("ПроверитьЗаполнитьСклад", ОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруЗаполненияСкладаВСтрокеТЧ(Объект, СкладГруппа));
    
    Если ИспользоватьСоглашенияСКлиентами И ЗначениеЗаполнено(Объект.Соглашение) Тогда
        СтруктураДействий.Вставить("ЗаполнитьУсловияПродаж", ОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруЗаполненияУсловийПродажВСтрокеТЧ(Объект));
    Иначе
        СтруктураДействий.Вставить("ЗаполнитьЦенуПродажи", ОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруЗаполненияЦеныВСтрокеТЧ(Объект));
    КонецЕсли;
    СтруктураДействий.Вставить("ЗаполнитьСтавкуНДС", Объект.НалогообложениеНДС);
    СтруктураДействий.Вставить("ЗаполнитьСтавкуНДСВозвратнойТары", Объект.ВернутьМногооборотнуюТару);
    СтруктураДействий.Вставить("ЗаполнитьПризнакБезВозвратнойТары", Объект.ВернутьМногооборотнуюТару);
    СтруктураДействий.Вставить("ПересчитатьСуммуНДС", СтруктураПересчетаСуммы);
    СтруктураДействий.Вставить("ПересчитатьСуммуСНДС", СтруктураПересчетаСуммы);
    СтруктураДействий.Вставить("ПересчитатьСумму");
    СтруктураДействий.Вставить("ПересчитатьСуммуСУчетомРучнойСкидки", Новый Структура("Очищать", Истина));
    СтруктураДействий.Вставить("ПересчитатьСуммуСУчетомАвтоматическойСкидки", Новый Структура("Очищать", Истина));
    СтруктураДействий.Вставить("ОчиститьСуммуВзаиморасчетов");
    СтруктураДействий.Вставить("ЗаполнитьПризнакТипНоменклатуры", Новый Структура("Номенклатура", "ТипНоменклатуры"));
    СтруктураДействий.Вставить("ЗаполнитьДубликатыЗависимыхРеквизитов", ЗависимыеРеквизиты());
    СтруктураДействий.Вставить("ЗаполнитьПризнакАртикул", Новый Структура("Номенклатура", "Артикул"));
    СтруктураДействий.Вставить("ПроверитьСериюРассчитатьСтатус", Новый Структура("Склад, ПараметрыУказанияСерий", ТекущаяСтрока.Склад, ПараметрыУказанияСерий));
    СтруктураДействий.Вставить("ПересчитатьСуммуСверхЗаказа", Новый Структура("РеализацияПоступлениеПоЗаказу, ТребуетсяЗалогЗаТару",
        Объект.РеализацияПоЗаказам, Объект.ТребуетсяЗалогЗаТару));
    
    НаправленияДеятельностиКлиентСервер.СтруктураДействийВставитьПриДобавленииСтроки(ЭтаФорма, СтруктураДействий);
    
    СтруктураДействий.Вставить("НоменклатураПриИзмененииПереопределяемый", Новый Структура("ИмяФормы, ИмяТабличнойЧасти",
        ЭтаФорма.ИмяФормы, "Товары"));
        
    ОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
17 Вафель
 
17.01.19
10:07
(16) упрощенный вариант для ут-ерп
https://gist.github.com/a-sitnikov/7fecf7efabdde63f82d1c835204c3b8f
18 Вафель
 
17.01.19
10:09
То что такой код - жесть - это однозначно
19 spiller26
 
17.01.19
10:39
Как-то смотрел код расчета НДС сверху и в сумме, ну да жесть, но можно разобраться.
Сейчас в типовых очень много кода с временными таблицами и ещё любят в фон запихивать обработчики.
20 craxx
 
17.01.19
11:10
(19) да всякой жести хватает. Например почему-то в типовых любят в динамических списках запросы к критериям отбора лепить. Пофиг что лютые тормоза при этом.
21 catena
 
модератор
17.01.19
11:19
Сейчас вот обсуждение опасно близко к п.6 правил, связанных с платформой.
22 Вася Теркин
 
17.01.19
11:47
(16) Сейчас во всех тонких через структуру действий. Вполне универсально.
23 Beduin
 
17.01.19
12:07
(21) Платформа то бомба. Мы тут про типовые конфы.
24 Beduin
 
17.01.19
12:12
(22) Это нормально, вопрос в наличии универсального метода, который может переварить все.
(21) Сейчас ниже не пинок в платформу будет, а предложение по ее развитию

В Андроидах такие проблемы решаются перегрузками. Имя метода одно, а в зависимости от сигнатуры вызова(Количество и тип входящих параметров) вызывается необходимый алгоритм. Очень мощный инструмент.
Короче это старая песня о применимости ООП в 1С.
25 SUA
 
17.01.19
12:37
(24) Имя метода одно,
>> ОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ
а в зависимости от сигнатуры вызова(Количество и тип входящих параметров) вызывается необходимый алгоритм.
>> СтруктураДействий

Итого только что предлагается сделать ровно то же самое что уже сделано
(перегрузка только визуально несколько лучше выглядит чем простыни Если ТипЗнч()…)
26 catena
 
17.01.19
12:48
(23)(24)В п.6 правил как раз и говорится об обсуждении кода типовых. Вряд ли предложения по развитию, высказанные на мисте, как-то повлияют на ситуацию ;)
27 Beduin
 
17.01.19
12:52
(26) Ок. Принято.
28 Boroda
 
17.01.19
13:01
(16)в УТ и ЕРП обработка ТЧ одинакова.
Как раз, для обработки ставки НД2С0% для самописки по УТ, выдергивал строку:
СтруктураДействий.Вставить("ЗаполнитьСтавкуНДС", ...
из типового ЕРП уже с исправленным НДС.
29 Beduin
 
17.01.19
13:03
(28) Это для одной строки. Если нужно пересчитать все, то уже сложнее.
30 тарам пам пам
 
17.01.19
13:47
(29) Угу. Потому что эти "универсалисты" хреновы из ЕРП для одной строки догадались сделать единую функцию пересчета, а для нескольких строк - нет.
В итоге либо рисуешь запрос в цикле, как в (17), и тогда прощай, производительность; или копируешь/выдираешь кучу кода, и тогда прощай, простая поддержка и универсальность.
31 Вася Теркин
 
17.01.19
13:57
(30) Вы многого хотите от типовых. В мерсе подвеска тоже лучше чем в ладе калина. По этой логике лада калина - г@вно. А это между прочим автомобиль миллионов и мерсов у них не будет никогда.
Но им и не нужна супер производительность. Лишь бы считало. Именно так и сделано. Тупой нудный и доступный алгоритм.
32 Конструктор1С
 
17.01.19
14:05
Таки, есть же там методы, которые пересчитывают сразу для всех строк или для нескольких. Давно не заглядывал в типовую УТ/ЕРП, но точно помню, что такие были.
33 SUA
 
17.01.19
14:12
(30) НоменклатураСервер.ОбработатьТЧ например есть
34 Beduin
 
17.01.19
14:16
(33) Ее в самом начале вызвал
СтруктураПересчета = ОбработкаТабличнойЧастиКлиентСервер.ПараметрыПересчетаСуммыНДСВТЧ(Объект);
    СтруктураДействий = Новый Структура;
    СтруктураДействий.Вставить("ПересчитатьСуммуНДС", СтруктураПересчета);
    СтруктураДействий.Вставить("ПересчитатьСуммуСНДС", СтруктураПересчета);
    ОбработкаТабличнойЧастиСервер.ОбработатьТЧ(Объект.Товары, СтруктураДействий, Неопределено);
Оказалось, что параметров структуры для пересчета поля суммы нет.
35 FIXXXL
 
17.01.19
14:16
(32) разговор о том, что на каждую строку идет обращение к серверу...
НО, при интерактивной работе, когда добавляется по одной строке в ТЧ, по-другому и не сделать
а весь этот код расчитан ТОЛЬКО на интерактивную работу...
36 FIXXXL
 
17.01.19
14:20
со всем этм "зоопарком" куч зависимых друг от друга элементов метаданных не хватает инструмента для описания этих самых зависимостей на уровне метаданных
к примеру, что бы при изменении Цены, не глядя, "дернуть" все зависимые и их тоже до кучи пересчитать или при изменении Номенклатуры перезаполнить все связанные реквизиты ТЧ...
или не разрешать изменять подчиненные реквизиты при "закрытом" родительском...
37 Вафель
 
17.01.19
15:01
(35) сначала перейди на сервер, а потом обрабатывай строки
38 FIXXXL
 
17.01.19
15:11
(37) сорри, не так выразился
не вызов сервера, а подтягивание инфы из базы данных
то же получение Номенклатура.СтавкиНДС
39 Вафель
 
17.01.19
15:18
(38) это все мелочи. даже не стоит на это внимание обращать
40 FIXXXL
 
17.01.19
15:35
(39) как скажешь :)
41 Вафель
 
17.01.19
15:52
(40) Не стоит заниматься преждевременной оптимизацией (с)
42 FIXXXL
 
17.01.19
16:26
(41) а то без работы останемся :)
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.