Имя: Пароль:
1C
 
Конвертация данных 2.1 не работает проверка перед выгрузкой
0 I_learn_1c
 
03.04.25
18:29
Всем доброго вечера,
Сориентируйте плиз как описать в ПКО перед выгрузкой условие про ставку НДС.

Гружу документ из ERP в УПП. Надо передать ставку НДС.
Проблема, что в ERP ставка указана в ТЧ в каждой строчке, а в УПП реквизит в шапке.
Решили, что если в доке в ERP во всех строчках ставка одинаковая, то ее и пишем в УПП.

в ПКО по выгрузке этого документа в обработчике Перед выгрузкой прописано следующее

МассивСтавкиНДС = Новый Массив;

Для Каждого _Строка Из Источник.Расходы Цикл    

   Если МассивСтавкиНДС.Количество() = 0 Тогда
      МассивСтавкиНДС.Добавить(_Строка.СтавкаНДС);

   ИначеЕсли МассивСтавкиНДС[0] <> _Строка.СтавкаНДС Тогда
      МассивСтавкиНДС.Добавить(_Строка.СтавкаНДС);
   КонецЕсли

КонецЦикла;


Если МассивСтавкиНДС.Количество() = 1 Тогда  
    Если МассивСтавкиНДС[0] = Перечисления.СтавкиНДС.БезНДС Тогда
        ИмяСтавкаНДС = "БезНДС";
    ИначеЕсли МассивСтавкиНДС[0] = Перечисления.СтавкиНДС.НДС18 Тогда
        ИмяСтавкаНДС = "НДС18";
    ИначеЕсли МассивСтавкиНДС[0] = Перечисления.СтавкиНДС.НДС18_118 Тогда
        ИмяСтавкаНДС = "НДС18_118";
    ИначеЕсли МассивСтавкиНДС[0] = Перечисления.СтавкиНДС.НДС10 Тогда
        ИмяСтавкаНДС = "НДС10";
    ИначеЕсли МассивСтавкиНДС[0] = Перечисления.СтавкиНДС.НДС10_110 Тогда
        ИмяСтавкаНДС = "НДС10_110";
    ИначеЕсли МассивСтавкиНДС[0] = Перечисления.СтавкиНДС.НДС0 Тогда
        ИмяСтавкаНДС = "НДС0";
    ИначеЕсли МассивСтавкиНДС[0] = Перечисления.СтавкиНДС.НДС20 Тогда
        ИмяСтавкаНДС = "НДС20";
    ИначеЕсли МассивСтавкиНДС[0] = Перечисления.СтавкиНДС.НДС20_120 Тогда
        ИмяСтавкаНДС = "НДС20_120";
    ИначеЕсли МассивСтавкиНДС[0] = Перечисления.СтавкиНДС.НДС5 Тогда
        ИмяСтавкаНДС = "НДС5";
    ИначеЕсли МассивСтавкиНДС[0] = Перечисления.СтавкиНДС.НДС5_105 Тогда
        ИмяСтавкаНДС = "НДС5_105";
    ИначеЕсли МассивСтавкиНДС[0] = Перечисления.СтавкиНДС.НДС7 Тогда
        ИмяСтавкаНДС = "НДС7";
    ИначеЕсли МассивСтавкиНДС[0] = Перечисления.СтавкиНДС.НДС7_107 Тогда
        ИмяСтавкаНДС = "НДС7_107";
    КонецЕсли;
    
    Сообщить(МассивСтавкиНДС[0]);
    Сообщить(МассивСтавкиНДС[0] = Перечисления.СтавкиНДС.НДС20);
    Сообщить("Имя ставка: "+ИмяСтавкаНДС);
    
    ВходящиеДанные.Вставить("УчитыватьНДС", Истина);    
    ВходящиеДанные.Вставить("СтавкаНДС", ИмяСтавкаНДС);    
КонецЕсли;



Сообщить() - само собой для тестов, проверки.

Проблема - не работает условие МассивСтавкиНДС[0] = Перечисления.СтавкиНДС.НДС20 и аналогичные ему.
В доке в ЕРП ставка 20%, а в "сообщить" выводит:
20%
Нет
Имя ставка:

В чем может быть проблема? В модуле формы внешней обработки такой же код обрабатывает без проблем, сравнивает, результат "истина".
В обработчике какие-то ограничения на сравнение ссылок?
1 I_learn_1c
 
03.04.25
18:35
изначально не было такого дикого условия Если, хотела просто получать имя ставки НДС.
было:

ОбъектМетаданных = МассивСтавкиНДС[0].Метаданные();    
ИндексЗначения = Перечисления[ОбъектМетаданных.Имя].Индекс(МассивСтавкиНДС[0]);
ИмяСтавки = ОбъектМетаданных.ЗначенияПеречисления[ИндексЗначения].Имя;

но тоже не работало в конвертации именно, писало - Ошибка при вызове метода контекста (Индекс)
во внешней обработке опять же все без проблем отрабатывало.
2 laeg
 
03.04.25
18:53
А зачем такие сложности ?
Самый простой пример, берем ставку из первой строки:
ПКС Источника пустое, Приемника СтавкаНДС
ПередВыгрузкой
Значение = Источник.ТабличнаяЧасть[0].СтавкаНДС;
3 big
 
03.04.25
19:03
(0) При всяких-любых вариантах надо в УПП делать то количество документов, сколько ставок НДС есть в документе ERP. Не выдумывать ничего, а просто сделать так, чтобы всё работало. Как там оно будет с нумерацией и поиском - это есть часть решения задачи. Если по другому - будут глюки, и глюки будут постоянно.
4 big
 
03.04.25
19:04
(2) За такое решение надо жизни лишать. Причем в течение лет эдак пяти, каждый день и ночь тоже! (((
5 I_learn_1c
 
03.04.25
19:08
(2) но ведь все равно придется писать что-то типа
Если Источник.ТабличнаяЧасть[0].СтавкаНДС = Перечисления.СтавкиНДС.НДС20 Тогда
   Значение = "НДС20";
   ............
КонецЕсли;

сразу Значение = Источник.ТабличнаяЧасть[0].СтавкаНДС; не отрабатывает
6 I_learn_1c
 
03.04.25
19:10
(3) без пафоса не? я не выдумываю, есть ТЗ - делаю. вопрос чисто технически почему не срабатывает проверка условия в обработчике.

если вдруг будут разные ставки, то в УПП Ставка вообще не заполнится, зайдут и поправят руками тогда, но это скорее исключение редкое
7 big
 
03.04.25
19:16
(5) Вы при сравнении данных из (0) типы данных смотрели, которые сравниваете? Скорее всего там сравнение того не с тем.
8 big
 
03.04.25
19:20
(6) Никакого пафоса, ради Б*га, избавьте от этого. Просто, следуя по ТЗ, имеется живой вариант присутствия различного НДС в одном документе. Скажете, что это в данной организации невозможно, потому что они так не делают? Хм... А потом начнут делать )))  

ИМХО это огромный косяк и ГЛЮК изначально в обмене - ориентироваться на первую строку документа. Это просто *****!!!  Так делать нельзя и втопку такие ТЗ - это всё самому дороже обойдётся.
9 Доминошник
 
03.04.25
19:29
(0) Весьма похоже на то, что нужно сравнивать не с перечислением "СтавкиНДС" а со справочником "СтавкиНДС"
Об этом же говорится в (7)
10 laeg
 
03.04.25
20:15
(4) Конкретики ноль, одни сопли.
я написал простейший пример, как без кучи условий и кода  конвертировать значение
а какие условия и как брать данные - вопрос уже 10-ый
Главное что бы было ПКО для СтавокНДС
11 I_learn_1c
 
04.04.25
09:17
(7) (9) справочника Ставки НДС тут нет.
ПеречислениеСсылка.СтавкиНДС в приемнике и ПеречислениеСсылка.СтавкиНДС в источнике.


(8)ориентироваться на первую строку - предложили тут.
в моем варианте - на всякий случай проверяю все строки, если одинаковая ставка, то заполняю, если нет - останется пустым (собственно и сейчас поле пустое в принципе, правила до меня писали).

(10) никаких соплей, просто при этом варианте тоже придется писать сравнение, чтобы определить что писать в Значение = "ИмяСтавки".
и хотя сравнивается ПеречислениеСсылка.СтавкиНДС (из входящих данных или из первой строки не важно) и ПеречислениеСсылка.СтавкиНДС для приемника, правило есть для ставок, но почему-то сравнение выдает Ложь.
При написании сравнения в "Перед выгрузкой" там даже не важно ведь по идее есть правило или нет, код на стороне выгрузки же выполняется.
так и почему сравнение в обработке работает, а в обработчике в конвертации нет?
12 I_learn_1c
 
04.04.25
10:41
в общем если кому-то тоже нужно
чтобы работало сравнение в обработчике в конвертации нужно указать еще ".ПеречислениеСтавкаНДС" к переменной в которой какое-то значение перечисления указано.

То есть, сравнение получается вида
Если Источник.СтавкаНДС.ПеречислениеСтавкаНДС = Перечисления.СтавкиНДС.НДС20 Тогда ....

в этом случае сравнение работает
13 Доминошник
 
04.04.25
12:51
(12) Как и говорили ранее - "Справочник.СтавкиНДС" 😂