Версия для печати темы (https://pro1c.org.ua/index.php?s=af472f68e00ab4ec2f1a789a2220ac5e&showtopic=45632)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 8.3 _ Обработка для выгрузки документов с УТ в самописную базу

Автор: burza 08.05.18, 10:23

Здравствуйте! Есть обработка для втягивание документов из одной базы в другую.
Проблема в том как перезаписывать уже имеющиеся документы при выгрузке если там есть изменения.
Сейчас я просто сравниваю на изменение по сумме ну и по коду чтобы дублей не было.Если сумма разная делается новый документ.
То есть номер не меняется, меняться может только сумма, и если она изменилась значит перезаписываем только сумму в уже созданном.


Тут проверка

&НаСервере
Функция ПроверитьСуществованиеДокумента(Номер,СуммаДокумента, НачалоИнтервала, КонецИнтервала)
    Запрос = новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
        |СписокЗаявокУТ.Ссылка
        |ИЗ
        |Документ.СписокЗаявокУТ КАК СписокЗаявокУТ
        |ГДЕ
        |СписокЗаявокУТ.НомерЗаявки = &ПараметрСправочныйНомер
        |И СписокЗаявокУТ.Дата МЕЖДУ &ПараметрНачалоИнтервала И &ПараметрКонецИнтервала
        |И СписокЗаявокУТ.СуммаДокумента = &СуммаДокумента";
                  
    Запрос.УстановитьПараметр("СуммаДокумента", СуммаДокумента);
    Запрос.УстановитьПараметр("ПараметрСправочныйНомер", Номер);
    Запрос.УстановитьПараметр("ПараметрНачалоИнтервала", НачалоИнтервала);
    Запрос.УстановитьПараметр("ПараметрКонецИнтервала",  КонецИнтервала);    
    Результат = Запрос.Выполнить().Выбрать();
    
      Если Результат.Количество() = 0 Тогда
        Возврат Ложь;
    Иначе
        Возврат Истина;
    КонецЕсли;
    
КонецФункции


Запрос
    запр =  СоединениеБух.NewObject("Запрос");
            запр.Текст = "ВЫБРАТЬ
            |    ЗаказКлиента.Номер КАК Номер,
            |    ЗаказКлиента.Дата,
            |    ЗаказКлиента.СуммаОплаты КАК СуммаОплаты,
            |    ЗаказКлиента.СуммаДокумента КАК СуммаДокумента,
            |    ЗаказКлиента.ЧислоПутевок КАК ЧислоПутевок,
            |    ЗаказКлиента.Санаторий.Наименование КАК Санаторий,
            |    ЗаказКлиента.Партнер.Наименование КАК Партнер,
            |    ЗаказКлиента.РуководительГруппы.Наименование КАК РуководительГруппы,
            |    ЗаказКлиента.Контрагент.Наименование КАК  Контрагент
            |ИЗ
            |    Документ.ЗаказКлиента КАК ЗаказКлиента
            |ГДЕ
            |    ЗаказКлиента.Дата МЕЖДУ &НачалоПериода И &КонецПериода
            |    И ЗаказКлиента.Проведен = ИСТИНА
            |    И ЗаказКлиента.ПометкаУдаления = ЛОЖЬ";
            
            запр.УстановитьПараметр("НачалоПериода", Объект.НачалоПериода);
            запр.УстановитьПараметр("КонецПериода", Объект.КонецПериода);
            

            Выборка = запр.Выполнить().Выбрать();
            
                        
            Пока Выборка.Следующий() Цикл
                Сообщить("Загрузка документа №" + Выборка.Номер);
                Если ПроверитьСуществованиеДокумента(Выборка.Номер, Выборка.СуммаДокумента, НачалоГода(Выборка.Дата), КонецГода(Выборка.Дата)) тогда
                        Сообщить("Загрузка №" + Выборка.Номер + " невозможна, поскольку документ уже был загружен");                
                    Иначе    
                    НачатьТранзакцию();
                    НовыйСписокЗаявокУТ = Документы.СписокЗаявокУТ.СоздатьДокумент();
                    НовыйСписокЗаявокУТ.Контрагент = Выборка.Контрагент;
                    НовыйСписокЗаявокУТ.ЧислоПутевок = Выборка.ЧислоПутевок;
                    НовыйСписокЗаявокУТ.СуммаДокумента = Выборка.СуммаДокумента;
                    НовыйСписокЗаявокУТ.НомерЗаявки = Выборка.Номер;
                    НовыйСписокЗаявокУТ.Санаторий =  ПодобратьСанаторий(Выборка.Санаторий);
                    НовыйСписокЗаявокУТ.РуководительГруппы = Выборка.РуководительГруппы;
                    НовыйСписокЗаявокУТ.Партнер   = Выборка.Партнер;
                    НовыйСписокЗаявокУТ.Дата  = Выборка.Дата;
                    НовыйСписокЗаявокУТ.Оплачено  = Выборка.СуммаОплаты;
                    НовыйСписокЗаявокУТ.Записать();
                    ЗафиксироватьТранзакцию();
                КонецЕсли;

            КонецЦикла;

Автор: logist 08.05.18, 12:46

Цитата(burza @ 08.05.18, 11:23) *
как перезаписывать уже имеющиеся документы при выгрузке если там есть изменения.

Точно так же как и создание, только вместо СоздатьДокумент() - ПолучитьОбъект() ссылки найденного документа

Автор: burza 08.05.18, 12:50

logist @ Сегодня, 13:46 * ,

какой код и где нужно дописать?)

Автор: burza 08.05.18, 14:53

burza @ Сегодня, 13:50 * ,
{Обработка.ОбменДаннымиСТорговлей.Форма.Форма.Форма(145)}: Метод объекта не обнаружен (ПолучитьОбъект)
НовыйСписокЗаявокУТ = Документы.СписокЗаявокУТ.ПолучитьОбъект();

Автор: sava1 08.05.18, 14:59

Цитата(burza @ 08.05.18, 15:53) *
НовыйСписокЗаявокУТ = Документы.СписокЗаявокУТ.ПолучитьОбъект();


Док = Документы.СписокЗаявокУТ.НайтиПоНомеру(Выборка.Номер)

Автор: burza 08.05.18, 15:04

sava1 @ Сегодня, 15:59 * ,
вот что вылазит {Обработка.ОбменДаннымиСТорговлей.Форма.Форма.Форма(148)}: Поле объекта недоступно для записи (СуммаДокумента)
НовыйСписокЗаявокУТ.СуммаДокумента = Выборка.СуммаДокумента;

Автор: logist 08.05.18, 15:33

Цитата(burza @ 08.05.18, 16:04) *
вот что вылазит

вы принципиально не хотите думать? Какой смысл в программировании методом тыка...

Автор: burza 10.05.18, 8:07

Никто больше не поможет. Только саркастические сообщение и все?!

Автор: burza 10.05.18, 9:37

Что не так?
{Обработка.ОбменДаннымиСТорговлей.Форма.Форма.Форма(150)}: Ошибка при вызове метода контекста (ПолучитьОбъект)
Док = Док.ПолучитьОбъект();
по причине:
Элемент не выбран!

НачатьТранзакцию();
                    Док = Документы.СписокЗаявокУТ.НайтиПоНомеру(Выборка.Номер);
                    Док = Док.ПолучитьОбъект();
                    Док.Контрагент = Выборка.Контрагент;
                    Док.ЧислоПутевок = Выборка.ЧислоПутевок;
                    Док.СуммаДокумента = Выборка.СуммаДокумента;
                    Док.НомерЗаявки = Выборка.Номер;
                    Док.Санаторий =  ПодобратьСанаторий(Выборка.Санаторий);
                    Док.РуководительГруппы = Выборка.РуководительГруппы;
                    Док.Партнер   = Выборка.Партнер;
                    Док.Дата  = Выборка.Дата;
                    Док.Оплачено  = Выборка.СуммаОплаты;
                    Док.Записать();
                    ЗафиксироватьТранзакцию();

Автор: Vidocq05 10.05.18, 9:59

burza @ Сегодня, 10:37 * ,
Если у Вас документы с периодической нумерацией, тогда нужно так:

Док = Документы.СписокЗаявокУТ.НайтиПоНомеру(Выборка.Номер, Выборка.Дата);

Автор: burza 10.05.18, 10:02

Vidocq05 @ Сегодня, 10:59 * ,
не работает(

Автор: Vidocq05 10.05.18, 10:06

burza @ Сегодня, 11:02 * ,
Выложите полностью код.

Автор: burza 10.05.18, 10:09

Vidocq05 @ Сегодня, 11:06 * ,

&НаСервере
Процедура ПровестиИмпортВходящихПлатежей()
    
    ВыборкаБазДляИмпорта = РегистрыСведений.СоединенияСБазамиДанныхУТ.Выбрать();
    
    Пока ВыборкаБазДляИмпорта.Следующий() Цикл
        Если (ВыборкаБазДляИмпорта.ЗагружатьПриходБезналичный) Тогда
            Сообщить(ВыборкаБазДляИмпорта.СтрокаСоединения);
            
            СоединениеБух = СоединитьсяСБазой(ВыборкаБазДляИмпорта.СтрокаСоединения);
            Если СоединениеБух = неопределено тогда
                Сообщить("Произошла ошибка при соединении с базой предприятия " + ВыборкаБазДляИмпорта.СтрокаСоединения, СтатусСообщения.Внимание);
            Продолжить;
            иначе
                Сообщить("Успешно соединились с базой предприятия " + ВыборкаБазДляИмпорта.СтрокаСоединения, СтатусСообщения.Информация);
            конецЕсли;

            // Создаём запрос для выборки всех исходящих платежей за период
            запр =  СоединениеБух.NewObject("Запрос");
            запр.Текст = "ВЫБРАТЬ
            |    ЗаказКлиента.Номер КАК Номер,
            |    ЗаказКлиента.Дата,
            |    ЗаказКлиента.СуммаОплаты КАК СуммаОплаты,
            |    ЗаказКлиента.СуммаДокумента КАК СуммаДокумента,
            |    ЗаказКлиента.ЧислоПутевок КАК ЧислоПутевок,
            |    ЗаказКлиента.Санаторий.Наименование КАК Санаторий,
            |    ЗаказКлиента.Партнер.Наименование КАК Партнер,
            |    ЗаказКлиента.РуководительГруппы.Наименование КАК РуководительГруппы,
            |    ЗаказКлиента.Контрагент.Наименование КАК  Контрагент
            |ИЗ
            |    Документ.ЗаказКлиента КАК ЗаказКлиента
            |ГДЕ
            |    ЗаказКлиента.Дата МЕЖДУ &НачалоПериода И &КонецПериода
            |    И ЗаказКлиента.Проведен = ИСТИНА
            |    И ЗаказКлиента.ПометкаУдаления = ЛОЖЬ
            |   И НЕ ЗаказКлиента.СуммаДокумента = &СуммаДокумента";
            
            запр.УстановитьПараметр("НачалоПериода", Объект.НачалоПериода);
            запр.УстановитьПараметр("КонецПериода", Объект.КонецПериода);
            запр.УстановитьПараметр("СуммаДокумента", 0);
        

            Выборка = запр.Выполнить().Выбрать();
            
                        
            Пока Выборка.Следующий() Цикл
                Сообщить("Загрузка документа №" + Выборка.Номер);
                Если ПроверитьСуществованиеДокумента(Выборка.Номер, Выборка.СуммаДокумента, НачалоГода(Выборка.Дата), КонецГода(Выборка.Дата)) тогда
                        Сообщить("Загрузка №" + Выборка.Номер + " невозможна, поскольку документ уже был загружен");
                        
                
                    Иначе    
        

                        
                    НачатьТранзакцию();
                    Док = Документы.СписокЗаявокУТ.НайтиПоНомеру(Выборка.Номер);
                    Док = Док.ПолучитьОбъект();
                    Док.Контрагент = Выборка.Контрагент;
                    Док.ЧислоПутевок = Выборка.ЧислоПутевок;
                    Док.СуммаДокумента = Выборка.СуммаДокумента;
                    Док.НомерЗаявки = Выборка.Номер;
                    Док.Санаторий =  ПодобратьСанаторий(Выборка.Санаторий);
                    Док.РуководительГруппы = Выборка.РуководительГруппы;
                    Док.Партнер   = Выборка.Партнер;
                    Док.Дата  = Выборка.Дата;
                    Док.Оплачено  = Выборка.СуммаОплаты;
                    Док.Записать();
                    ЗафиксироватьТранзакцию();

                КонецЕсли;

            КонецЦикла;
            

        КонецЕсли;
    КонецЦикла;
    
КонецПроцедуры


&НаСервере
Функция ПроверитьСуществованиеДокумента(Номер,СуммаДокумента, НачалоИнтервала, КонецИнтервала)
    Запрос = новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
        |СписокЗаявокУТ.Ссылка
        |ИЗ
        |Документ.СписокЗаявокУТ КАК СписокЗаявокУТ
        |ГДЕ
        |СписокЗаявокУТ.НомерЗаявки = &ПараметрСправочныйНомер
        |И СписокЗаявокУТ.Дата МЕЖДУ &ПараметрНачалоИнтервала И &ПараметрКонецИнтервала
        |И СписокЗаявокУТ.СуммаДокумента = &СуммаДокумента";
                  
    Запрос.УстановитьПараметр("СуммаДокумента", СуммаДокумента);
    Запрос.УстановитьПараметр("ПараметрСправочныйНомер", Номер);
    Запрос.УстановитьПараметр("ПараметрНачалоИнтервала", НачалоИнтервала);
    Запрос.УстановитьПараметр("ПараметрКонецИнтервала",  КонецИнтервала);    
    Результат = Запрос.Выполнить().Выбрать();

             Если Результат.Количество() = 0 Тогда
        Возврат Ложь;
    Иначе
        Возврат Истина;
    КонецЕсли;

    
КонецФункции

Автор: Vidocq05 10.05.18, 10:25

burza @ Сегодня, 11:09 * ,
Конечно не работает. Вы вдумайтесь в смысл выполнения кода.

&НаСервере
Процедура ПровестиИмпортВходящихПлатежей()
    
    ВыборкаБазДляИмпорта = РегистрыСведений.СоединенияСБазамиДанныхУТ.Выбрать();
    
    Пока ВыборкаБазДляИмпорта.Следующий() Цикл
        Если (ВыборкаБазДляИмпорта.ЗагружатьПриходБезналичный) Тогда
            Сообщить(ВыборкаБазДляИмпорта.СтрокаСоединения);
            
            СоединениеБух = СоединитьсяСБазой(ВыборкаБазДляИмпорта.СтрокаСоединения);
            Если СоединениеБух = неопределено тогда
                Сообщить("Произошла ошибка при соединении с базой предприятия " + ВыборкаБазДляИмпорта.СтрокаСоединения, СтатусСообщения.Внимание);
            Продолжить;
            иначе
                Сообщить("Успешно соединились с базой предприятия " + ВыборкаБазДляИмпорта.СтрокаСоединения, СтатусСообщения.Информация);
            конецЕсли;

            // Создаём запрос для выборки всех исходящих платежей за период
            запр =  СоединениеБух.NewObject("Запрос");
            запр.Текст = "ВЫБРАТЬ
            |    ЗаказКлиента.Номер КАК Номер,
            |    ЗаказКлиента.Дата,
            |    ЗаказКлиента.СуммаОплаты КАК СуммаОплаты,
            |    ЗаказКлиента.СуммаДокумента КАК СуммаДокумента,
            |    ЗаказКлиента.ЧислоПутевок КАК ЧислоПутевок,
            |    ЗаказКлиента.Санаторий.Наименование КАК Санаторий,
            |    ЗаказКлиента.Партнер.Наименование КАК Партнер,
            |    ЗаказКлиента.РуководительГруппы.Наименование КАК РуководительГруппы,
            |    ЗаказКлиента.Контрагент.Наименование КАК  Контрагент
            |ИЗ
            |    Документ.ЗаказКлиента КАК ЗаказКлиента
            |ГДЕ
            |    ЗаказКлиента.Дата МЕЖДУ &НачалоПериода И &КонецПериода
            |    И ЗаказКлиента.Проведен = ИСТИНА
            |    И ЗаказКлиента.ПометкаУдаления = ЛОЖЬ
            |   И НЕ ЗаказКлиента.СуммаДокумента = &СуммаДокумента";
            
            запр.УстановитьПараметр("НачалоПериода", Объект.НачалоПериода);
            запр.УстановитьПараметр("КонецПериода", Объект.КонецПериода);
            запр.УстановитьПараметр("СуммаДокумента", 0);
        

            Выборка = запр.Выполнить().Выбрать();
            
                        
            Пока Выборка.Следующий() Цикл
                Сообщить("Загрузка документа №" + Выборка.Номер);

                // Это уже не нужно и функцию можете удалить
                //Если ПроверитьСуществованиеДокумента(Выборка.Номер, Выборка.СуммаДокумента, НачалоГода(Выборка.Дата), КонецГода(Выборка.Дата)) тогда
                        //Сообщить("Загрузка №" + Выборка.Номер + " невозможна, поскольку документ уже был загружен");
                        
                
                   // Иначе    
        
                    Док = Документы.СписокЗаявокУТ.НайтиПоНомеру(Выборка.Номер, Выборка.Дата);

                    Если НЕ Док.Пустая Тогда

                           Если Док.СуммаДокумента = Выборка.СуммаДокумента Тогда
                                  Сообщить("Загрузка №" + Выборка.Номер + " невозможна, поскольку документ уже был загружен");
                                  Продолжить;
                           КонецЕсли;

                           НачатьТранзакцию();
                           Док = Док.ПолучитьОбъект();

                    Иначе
                          
                           НачатьТранзакцию();
                           Док = Документы.СписокЗаявокУТ.СоздатьДокумент();

                    КонецЕсли;
                    
                    Док.Контрагент = Выборка.Контрагент;
                    Док.ЧислоПутевок = Выборка.ЧислоПутевок;
                    Док.СуммаДокумента = Выборка.СуммаДокумента;
                    Док.НомерЗаявки = Выборка.Номер;
                    Док.Санаторий =  ПодобратьСанаторий(Выборка.Санаторий);
                    Док.РуководительГруппы = Выборка.РуководительГруппы;
                    Док.Партнер   = Выборка.Партнер;
                    Док.Дата  = Выборка.Дата;
                    Док.Оплачено  = Выборка.СуммаОплаты;
                    Док.Записать();
                    ЗафиксироватьТранзакцию();

                //КонецЕсли;

            КонецЦикла;
            

        КонецЕсли;
    КонецЦикла;
    
КонецПроцедуры

Автор: Petre 10.05.18, 10:26

burza @ Today, 10:09 * ,
Судя по коду, вы уверены, что НайтиПоНомеру всегда возвращает ссылку на документ. Судя по ошибке, возвращается что-то другое...

Автор: Vidocq05 10.05.18, 10:30

Допустил ошибку. Вот так правильно

Если НЕ Док.Пустая() Тогда


Цитата(Petre @ 10.05.18, 11:26) *
Судя по ошибке, возвращается что-то другое...

Возвращает пустую ссылку.

Автор: burza 10.05.18, 10:38

Vidocq05 @ Сегодня, 11:25 * ,
Этот код взял и просто создал все документы по новому(они уже есть)! Мне не нужно загружать документы каждый раз новые.
Мне чтобы менялись только данные в документе а документы оставались прежние.
То есть так нету проверки на уже имеющиеся документы.

Автор: Petre 10.05.18, 10:49

burza @ Today, 10:38 * ,
Вы ищите по номеру, но не находите. Что значит документы "уже есть"?

Автор: Vidocq05 10.05.18, 10:51

burza @ Сегодня, 11:38 * ,
Тогда так:

Док = Документы.СписокЗаявокУТ.НайтиПоНомеру(Выборка.Номер, Выборка.Дата);

                    Если НЕ Док.Пустая Тогда

                           Если Док.СуммаДокумента = Выборка.СуммаДокумента Тогда
                                  Сообщить("Загрузка №" + Выборка.Номер + " невозможна, поскольку документ уже был загружен");
                                  Продолжить;
                           КонецЕсли;

                           НачатьТранзакцию();
                           Док = Док.ПолучитьОбъект;
                           Док.СуммаДокумента = Выборка.СуммаДокумента;
                           Док.Записать();
                           ЗафиксироватьТранзакцию();
                    
                    КонецЕсли;

Автор: burza 10.05.18, 10:56

Vidocq05
Извините тупанул, не там номер записывал. Все работает СПАСИБО)

Автор: Vidocq05 10.05.18, 11:01

Цитата(burza @ 10.05.18, 11:38) *
Этот код взял и просто создал все документы по новому(они уже есть)! Мне не нужно загружать документы каждый раз новые.
Мне чтобы менялись только данные в документе а документы оставались прежние.
То есть так нету проверки на уже имеющиеся документы.

Нет, всетаки я Вас не понял.
Последний код, что я писал, искал документ в базе и если находил то проверял сумму документа и если она отличается то сумма перезаполняется и документ перезаписывается.
В предпоследнем моем коде происходило тоже самое, плюс если документ не находился то создавался новый и заполнялся данными и записывался.
А что нужно Вам?

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua