Имя: Пароль:
1C
1С v8
Запись данных из файла xml в документ
0 Ivan2020
 
12.07.20
21:35
Всем привет!
Прошу помощи. Не могу разобраться, что я делаю не так.
Задача стоит в следующем: Есть файл формата XML, необходимо по трем совместным условиям (Если дата, цена и количество из документа Поступление товаров одновременно совпадают со строкой файла XML, то из этой строки файла необходимо взять поле "Оценка" и записать в соответствующий документ 1с.
При этом, если у документа есть документ основание, то дата берется оттуда, а оценка записывается и в основной документ и в документ-основание.

У меня файл читается, находится первый документ и ничего не происходит, записи нет. хотя поиск верный. Строк в файле может быть очень много.
Помогите разобраться, что я делаю не так, пожалуйста.



Процедура КомандаЗагрузитьОценку(АдресВХранилище, ААА, ОбновлятьОценку) Экспорт
    
    ДД = ПолучитьИзВременногоХранилища(АдресВХранилище);
    ИмяФайла = ПолучитьИмяВременногоФайла("xml");
    ДД.Записать(ИмяФайла);
    
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    ПоступлениеТовара.Ссылка КАК ДокументПоступление,
    |    ПоступлениеТовара.ДокументОснование КАК ДокументОснование,
    |    ПоступлениеТовара.Дата КАК Дата,
    |    ПоступлениеТовара.ДокументОснование.Дата КАК ДокументОснованиеДата,
    |    ЕСТЬNULL(ПоступлениеТовара.ДокументОснование.Дата, ПоступлениеТовара.Дата) КАК ДатаПродажи,
    |    ПоступлениеТовара.Цена КАК Цена,
    |    ПоступлениеТовара.Количество КАК Количество,
                  |    ПоступлениеТовара.Качество КАК Качество
    |ИЗ
    |    Документ.ПоступлениеТовара КАК ПоступлениеТовара
    |ГДЕ
    |    НЕ ПоступлениеТовара.ПометкаУдаления
    |    И ЕСТЬNULL(ПоступлениеТовара.ДокументОснование.Дата, ПоступлениеТовара.Дата) = &DATE
    |    И ПоступлениеТовара.Цена = &PRICE
    |    И ПоступлениеТовара.Количе ство = &QUANTITY";
    
    
    Чтение = Новый ЧтениеXML();
    Чтение.ОткрытьФайл(ИмяФайла, , , "UTF-8");
    Чтение.ПерейтиКСодержимому();
    
    //НачатьТранзакцию();
    
    Пока Чтение.Прочитать() Цикл
        
        Если Чтение.ТипУзла <> ТипУзлаXML.НачалоЭлемента Или Чтение.Имя <> "row" Тогда
            Продолжить;
        КонецЕсли;
        
        ПоступлениеВыбытие = Документы.ПоступлениеТовара.ПустаяСсылка();
        
        ////////Установка параметров запроса из файла XML/////////////////////////
        Цена = Число(Чтение.ЗначениеАтрибута("PRICE"));
        Запрос.УстановитьПараметр("PRICE", Цена);
        
        Количество = Число(Чтение.ЗначениеАтрибута("QUANTITY"));
        Запрос.УстановитьПараметр("QUANTITY", Количество);
        
        ДатаБезВремени = Дата(СтрЗаменить(Чтение.ЗначениеАтрибута("TDATE"), "-", ""));
        DATE = Формат(ДатаБезВремени, "ДФ=dd.MM.yyyy") + " "+ Чтение.ЗначениеАтрибута("TIME");
        ДатаСделки = Дата(DATE);
        Запрос.УстановитьПараметр("DATE", ДатаПродажи);
        
        
        Результат = Запрос.Выполнить();
        
        Если Результат.Пустой() Тогда
            Сообщить("Нет данных для обработки!");
            Возврат;
        КонецЕсли;
        
        
        Выборка = Результат.Выбрать();
        кол = Выборка.Количество();
        Сообщить("Обрабатывается записей: "+Строка(кол));
        ном = 0;
        Пока Выборка.Следующий() Цикл
            
            ном = ном+1;
            
            НачатьТранзакцию();
            
            Попытка
            ОбъектПоступлениеТовара = Выборка.ДокументПоступление.ПолучитьОбъект();
            
            Оценка= Число(Чтение.ЗначениеАтрибута("OCENKA"));
            
            ОбъектПоступлениеТовара.Качество = Оценка;
            
            //Если ТипЗнч(Документы.ПоступлениеТовара.ДокументОснование) <> Тип("Неопределено")  Тогда
            //    ОбъектПоступлениеТовара.ДокументОснование.Качество = Оценка;
            //КонецЕсли;
            ОбъектПоступлениеТовара.ОбменДанными.Загрузка = Истина;
            ОбъектПоступлениеТовара.Записать();
            Исключение
                Сообщить("Не удалось записать оценку в документ: "+Строка(ОбъектПоступлениеТовара.Ссылка));
                ОтменитьТранзакцию();
                Продолжить;
            КонецПопытки;
            
        КонецЦикла;
        
    КонецЦикла;
    
    ЗафиксироватьТранзакцию();
    
    Чтение.Закрыть();
    УдалитьФайлы(ИмяФайла);
    
    Сообщить("Обработка завершена: "+Строка(ТекущаяДата())
    +Символы.ПС+"Обработано записей: "+Строка(ном)+" из "+Строка(кол));
    
КонецПроцедуры
1 acht
 
12.07.20
21:43
>  Запрос.УстановитьПараметр("DATE", ДатаПродажи);
ДатаПродажи - этачо?
2 Ivan2020
 
12.07.20
22:47
ДатаБезВремени = Дата(СтрЗаменить(Чтение.ЗначениеАтрибута("TDATE"), "-", ""));
        DATE = Формат(ДатаБезВремени, "ДФ=dd.MM.yyyy") + " "+ Чтение.ЗначениеАтрибута("TIME");
        ДатаСделки = Дата(DATE);
        Запрос.УстановитьПараметр("DATE", ДатаПродажи);
       ДатаБезВремени = Дата(СтрЗаменить(Чтение.ЗначениеАтрибута("TDATE"), "-", ""));
        DATE = Формат(ДатаБезВремени, "ДФ=dd.MM.yyyy") + " "+ Чтение.ЗначениеАтрибута("TIME");
        ДатаПродажи = Дата(DATE);
        Запрос.УстановитьПараметр("DATE", ДатаПродажи);



Код редактировал сейчас и забыл переименовать. Но проблема не в этом. Так как в оригинале все работает. Отбор по запросу
3 Ivan2020
 
12.07.20
22:50
Почему-то код на форуме двоится. Вместо датасделки переписала датаПродажи
4 acht
 
12.07.20
22:53
Чудес не бывает. Ты или пишешь не в тот документ, который ожидаешь или смотришь не в те данные. Дальше варианты - кривой поиск, запись в документ не того типа, сброс данных при открытии документа или перезапись в подписках.

Кстати, а почему ты Иван, если ты Наталья?
5 Ivan2020
 
12.07.20
23:00
Этот аккаунт создавала супруга и указала свой почтовый ящик. На момент регистрации забыл пароль от своей почты, а нужно было срочно спросить совета.
6 MyNick
 
12.07.20
23:09
Увидел переменную ААА и дальше не читал, смысла нет
7 acht
 
12.07.20
23:11
У тебя еще там забавная схема начал и фиксации транзакций. Убери ее, пожалуйста и проверь отладчиком по шагам. Результат поиска, результат записи.
8 AlvlSpb
 
12.07.20
23:26
(0) Если Результат.Пустой() Тогда
            Сообщить("Нет данных для обработки!");
            Возврат;
        КонецЕсли;
Замени Возврат на Продолжить