Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Обработка для выгрузки документов с УТ в самописную базу
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.3
burza
Здравствуйте! Есть обработка для втягивание документов из одной базы в другую.
Проблема в том как перезаписывать уже имеющиеся документы при выгрузке если там есть изменения.
Сейчас я просто сравниваю на изменение по сумме ну и по коду чтобы дублей не было.Если сумма разная делается новый документ.
То есть номер не меняется, меняться может только сумма, и если она изменилась значит перезаписываем только сумму в уже созданном.


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


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

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

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

Точно так же как и создание, только вместо СоздатьДокумент() - ПолучитьОбъект() ссылки найденного документа
burza
logist @ Сегодня, 13:46 необходимо зарегистрироваться для просмотра ссылки ,

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


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

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

НачатьТранзакцию();
                    Док = Документы.СписокЗаявокУТ.НайтиПоНомеру(Выборка.Номер);
                    Док = Док.ПолучитьОбъект();
                    Док.Контрагент = Выборка.Контрагент;
                    Док.ЧислоПутевок = Выборка.ЧислоПутевок;
                    Док.СуммаДокумента = Выборка.СуммаДокумента;
                    Док.НомерЗаявки = Выборка.Номер;
                    Док.Санаторий =  ПодобратьСанаторий(Выборка.Санаторий);
                    Док.РуководительГруппы = Выборка.РуководительГруппы;
                    Док.Партнер   = Выборка.Партнер;
                    Док.Дата  = Выборка.Дата;
                    Док.Оплачено  = Выборка.СуммаОплаты;
                    Док.Записать();
                    ЗафиксироватьТранзакцию();
Vidocq05
burza @ Сегодня, 10:37 необходимо зарегистрироваться для просмотра ссылки ,
Если у Вас документы с периодической нумерацией, тогда нужно так:
Док = Документы.СписокЗаявокУТ.НайтиПоНомеру(Выборка.Номер, Выборка.Дата);
burza
Vidocq05 @ Сегодня, 10:59 необходимо зарегистрироваться для просмотра ссылки ,
не работает(
Vidocq05
burza @ Сегодня, 11:02 необходимо зарегистрироваться для просмотра ссылки ,
Выложите полностью код.
burza
Vidocq05 @ Сегодня, 11:06 необходимо зарегистрироваться для просмотра ссылки ,
&НаСервере
Процедура ПровестиИмпортВходящихПлатежей()
    
    ВыборкаБазДляИмпорта = РегистрыСведений.СоединенияСБазамиДанныхУТ.Выбрать();
    
    Пока ВыборкаБазДляИмпорта.Следующий() Цикл
        Если (ВыборкаБазДляИмпорта.ЗагружатьПриходБезналичный) Тогда
            Сообщить(ВыборкаБазДляИмпорта.СтрокаСоединения);
            
            СоединениеБух = СоединитьсяСБазой(ВыборкаБазДляИмпорта.СтрокаСоединения);
            Если СоединениеБух = неопределено тогда
                Сообщить("Произошла ошибка при соединении с базой предприятия " + ВыборкаБазДляИмпорта.СтрокаСоединения, СтатусСообщения.Внимание);
            Продолжить;
            иначе
                Сообщить("Успешно соединились с базой предприятия " + ВыборкаБазДляИмпорта.СтрокаСоединения, СтатусСообщения.Информация);
            конецЕсли;

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

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

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

                КонецЕсли;

            КонецЦикла;
            

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


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

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

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

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

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

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

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

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

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

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

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

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

            КонецЦикла;
            

        КонецЕсли;
    КонецЦикла;
    
КонецПроцедуры
Petre
burza @ Today, 10:09 необходимо зарегистрироваться для просмотра ссылки ,
Судя по коду, вы уверены, что НайтиПоНомеру всегда возвращает ссылку на документ. Судя по ошибке, возвращается что-то другое...
Vidocq05
Допустил ошибку. Вот так правильно

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


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

Возвращает пустую ссылку.
burza
Vidocq05 @ Сегодня, 11:25 необходимо зарегистрироваться для просмотра ссылки ,
Этот код взял и просто создал все документы по новому(они уже есть)! Мне не нужно загружать документы каждый раз новые.
Мне чтобы менялись только данные в документе а документы оставались прежние.
То есть так нету проверки на уже имеющиеся документы.
Petre
burza @ Today, 10:38 необходимо зарегистрироваться для просмотра ссылки ,
Вы ищите по номеру, но не находите. Что значит документы "уже есть"?
Vidocq05
burza @ Сегодня, 11:38 необходимо зарегистрироваться для просмотра ссылки ,
Тогда так:
Док = Документы.СписокЗаявокУТ.НайтиПоНомеру(Выборка.Номер, Выборка.Дата);

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

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

                           НачатьТранзакцию();
                           Док = Док.ПолучитьОбъект;
                           Док.СуммаДокумента = Выборка.СуммаДокумента;
                           Док.Записать();
                           ЗафиксироватьТранзакцию();
                    
                    КонецЕсли;
burza
Vidocq05
Извините тупанул, не там номер записывал. Все работает СПАСИБО)
Vidocq05
Цитата(burza @ 10.05.18, 11:38) необходимо зарегистрироваться для просмотра ссылки
Этот код взял и просто создал все документы по новому(они уже есть)! Мне не нужно загружать документы каждый раз новые.
Мне чтобы менялись только данные в документе а документы оставались прежние.
То есть так нету проверки на уже имеющиеся документы.

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