Здравствуйте! Есть обработка для втягивание документов из одной базы в другую.
Проблема в том как перезаписывать уже имеющиеся документы при выгрузке если там есть изменения.
Сейчас я просто сравниваю на изменение по сумме ну и по коду чтобы дублей не было.Если сумма разная делается новый документ.
То есть номер не меняется, меняться может только сумма, и если она изменилась значит перезаписываем только сумму в уже созданном.
Тут проверка
&НаСервере
Функция ПроверитьСуществованиеДокумента(Номер,СуммаДокумента, НачалоИнтервала, КонецИнтервала)
Запрос = новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
|СписокЗаявокУТ.Ссылка
|ИЗ
|Документ.СписокЗаявокУТ КАК СписокЗаявокУТ
|ГДЕ
|СписокЗаявокУТ.НомерЗаявки = &ПараметрСправочныйНомер
|И СписокЗаявокУТ.Дата МЕЖДУ &ПараметрНачалоИнтервала И &ПараметрКонецИнтервала
|И СписокЗаявокУТ.СуммаДокумента = &СуммаДокумента";
Запрос.УстановитьПараметр("СуммаДокумента", СуммаДокумента);
Запрос.УстановитьПараметр("ПараметрСправочныйНомер", Номер);
Запрос.УстановитьПараметр("ПараметрНачалоИнтервала", НачалоИнтервала);
Запрос.УстановитьПараметр("ПараметрКонецИнтервала", КонецИнтервала);
Результат = Запрос.Выполнить().Выбрать();
Если Результат.Количество() = 0 Тогда
Возврат Ложь;
Иначе
Возврат Истина;
КонецЕсли;
КонецФункции
запр = СоединениеБух.NewObject("Запрос");
запр.Текст = "ВЫБРАТЬ
| ЗаказКлиента.Номер КАК Номер,
| ЗаказКлиента.Дата,
| ЗаказКлиента.СуммаОплаты КАК СуммаОплаты,
| ЗаказКлиента.СуммаДокумента КАК СуммаДокумента,
| ЗаказКлиента.ЧислоПутевок КАК ЧислоПутевок,
| ЗаказКлиента.Санаторий.Наименование КАК Санаторий,
| ЗаказКлиента.Партнер.Наименование КАК Партнер,
| ЗаказКлиента.РуководительГруппы.Наименование КАК РуководительГруппы,
| ЗаказКлиента.Контрагент.Наименование КАК Контрагент
|ИЗ
| Документ.ЗаказКлиента КАК ЗаказКлиента
|ГДЕ
| ЗаказКлиента.Дата МЕЖДУ &НачалоПериода И &КонецПериода
| И ЗаказКлиента.Проведен = ИСТИНА
| И ЗаказКлиента.ПометкаУдаления = ЛОЖЬ";
запр.УстановитьПараметр("НачалоПериода", Объект.НачалоПериода);
запр.УстановитьПараметр("КонецПериода", Объект.КонецПериода);
Выборка = запр.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить("Загрузка документа №" + Выборка.Номер);
Если ПроверитьСуществованиеДокумента(Выборка.Номер, Выборка.СуммаДокумента, НачалоГода(Выборка.Дата), КонецГода(Выборка.Дата)) тогда
Сообщить("Загрузка №" + Выборка.Номер + " невозможна, поскольку документ уже был загружен");
Иначе
НачатьТранзакцию();
НовыйСписокЗаявокУТ = Документы.СписокЗаявокУТ.СоздатьДокумент();
НовыйСписокЗаявокУТ.Контрагент = Выборка.Контрагент;
НовыйСписокЗаявокУТ.ЧислоПутевок = Выборка.ЧислоПутевок;
НовыйСписокЗаявокУТ.СуммаДокумента = Выборка.СуммаДокумента;
НовыйСписокЗаявокУТ.НомерЗаявки = Выборка.Номер;
НовыйСписокЗаявокУТ.Санаторий = ПодобратьСанаторий(Выборка.Санаторий);
НовыйСписокЗаявокУТ.РуководительГруппы = Выборка.РуководительГруппы;
НовыйСписокЗаявокУТ.Партнер = Выборка.Партнер;
НовыйСписокЗаявокУТ.Дата = Выборка.Дата;
НовыйСписокЗаявокУТ.Оплачено = Выборка.СуммаОплаты;
НовыйСписокЗаявокУТ.Записать();
ЗафиксироватьТранзакцию();
КонецЕсли;
КонецЦикла;
burza @ Сегодня, 13:50
,
{Обработка.ОбменДаннымиСТорговлей.Форма.Форма.Форма(145)}: Метод объекта не обнаружен (ПолучитьОбъект)
НовыйСписокЗаявокУТ = Документы.СписокЗаявокУТ.ПолучитьОбъект();
sava1 @ Сегодня, 15:59
,
вот что вылазит {Обработка.ОбменДаннымиСТорговлей.Форма.Форма.Форма(148)}: Поле объекта недоступно для записи (СуммаДокумента)
НовыйСписокЗаявокУТ.СуммаДокумента = Выборка.СуммаДокумента;
Никто больше не поможет. Только саркастические сообщение и все?!
Что не так?
{Обработка.ОбменДаннымиСТорговлей.Форма.Форма.Форма(150)}: Ошибка при вызове метода контекста (ПолучитьОбъект)
Док = Док.ПолучитьОбъект();
по причине:
Элемент не выбран!
НачатьТранзакцию();
Док = Документы.СписокЗаявокУТ.НайтиПоНомеру(Выборка.Номер);
Док = Док.ПолучитьОбъект();
Док.Контрагент = Выборка.Контрагент;
Док.ЧислоПутевок = Выборка.ЧислоПутевок;
Док.СуммаДокумента = Выборка.СуммаДокумента;
Док.НомерЗаявки = Выборка.Номер;
Док.Санаторий = ПодобратьСанаторий(Выборка.Санаторий);
Док.РуководительГруппы = Выборка.РуководительГруппы;
Док.Партнер = Выборка.Партнер;
Док.Дата = Выборка.Дата;
Док.Оплачено = Выборка.СуммаОплаты;
Док.Записать();
ЗафиксироватьТранзакцию();
burza @ Сегодня, 10:37
,
Если у Вас документы с периодической нумерацией, тогда нужно так:
Док = Документы.СписокЗаявокУТ.НайтиПоНомеру(Выборка.Номер, Выборка.Дата);
&НаСервере
Процедура ПровестиИмпортВходящихПлатежей()
ВыборкаБазДляИмпорта = РегистрыСведений.СоединенияСБазамиДанныхУТ.Выбрать();
Пока ВыборкаБазДляИмпорта.Следующий() Цикл
Если (ВыборкаБазДляИмпорта.ЗагружатьПриходБезналичный) Тогда
Сообщить(ВыборкаБазДляИмпорта.СтрокаСоединения);
СоединениеБух = СоединитьсяСБазой(ВыборкаБазДляИмпорта.СтрокаСоединения);
Если СоединениеБух = неопределено тогда
Сообщить("Произошла ошибка при соединении с базой предприятия " + ВыборкаБазДляИмпорта.СтрокаСоединения, СтатусСообщения.Внимание);
Продолжить;
иначе
Сообщить("Успешно соединились с базой предприятия " + ВыборкаБазДляИмпорта.СтрокаСоединения, СтатусСообщения.Информация);
конецЕсли;
// Создаём запрос для выборки всех исходящих платежей за период
запр = СоединениеБух.NewObject("Запрос");
запр.Текст = "ВЫБРАТЬ
| ЗаказКлиента.Номер КАК Номер,
| ЗаказКлиента.Дата,
| ЗаказКлиента.СуммаОплаты КАК СуммаОплаты,
| ЗаказКлиента.СуммаДокумента КАК СуммаДокумента,
| ЗаказКлиента.ЧислоПутевок КАК ЧислоПутевок,
| ЗаказКлиента.Санаторий.Наименование КАК Санаторий,
| ЗаказКлиента.Партнер.Наименование КАК Партнер,
| ЗаказКлиента.РуководительГруппы.Наименование КАК РуководительГруппы,
| ЗаказКлиента.Контрагент.Наименование КАК Контрагент
|ИЗ
| Документ.ЗаказКлиента КАК ЗаказКлиента
|ГДЕ
| ЗаказКлиента.Дата МЕЖДУ &НачалоПериода И &КонецПериода
| И ЗаказКлиента.Проведен = ИСТИНА
| И ЗаказКлиента.ПометкаУдаления = ЛОЖЬ
| И НЕ ЗаказКлиента.СуммаДокумента = &СуммаДокумента";
запр.УстановитьПараметр("НачалоПериода", Объект.НачалоПериода);
запр.УстановитьПараметр("КонецПериода", Объект.КонецПериода);
запр.УстановитьПараметр("СуммаДокумента", 0);
Выборка = запр.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить("Загрузка документа №" + Выборка.Номер);
Если ПроверитьСуществованиеДокумента(Выборка.Номер, Выборка.СуммаДокумента, НачалоГода(Выборка.Дата), КонецГода(Выборка.Дата)) тогда
Сообщить("Загрузка №" + Выборка.Номер + " невозможна, поскольку документ уже был загружен");
Иначе
НачатьТранзакцию();
Док = Документы.СписокЗаявокУТ.НайтиПоНомеру(Выборка.Номер);
Док = Док.ПолучитьОбъект();
Док.Контрагент = Выборка.Контрагент;
Док.ЧислоПутевок = Выборка.ЧислоПутевок;
Док.СуммаДокумента = Выборка.СуммаДокумента;
Док.НомерЗаявки = Выборка.Номер;
Док.Санаторий = ПодобратьСанаторий(Выборка.Санаторий);
Док.РуководительГруппы = Выборка.РуководительГруппы;
Док.Партнер = Выборка.Партнер;
Док.Дата = Выборка.Дата;
Док.Оплачено = Выборка.СуммаОплаты;
Док.Записать();
ЗафиксироватьТранзакцию();
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
&НаСервере
Функция ПроверитьСуществованиеДокумента(Номер,СуммаДокумента, НачалоИнтервала, КонецИнтервала)
Запрос = новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
|СписокЗаявокУТ.Ссылка
|ИЗ
|Документ.СписокЗаявокУТ КАК СписокЗаявокУТ
|ГДЕ
|СписокЗаявокУТ.НомерЗаявки = &ПараметрСправочныйНомер
|И СписокЗаявокУТ.Дата МЕЖДУ &ПараметрНачалоИнтервала И &ПараметрКонецИнтервала
|И СписокЗаявокУТ.СуммаДокумента = &СуммаДокумента";
Запрос.УстановитьПараметр("СуммаДокумента", СуммаДокумента);
Запрос.УстановитьПараметр("ПараметрСправочныйНомер", Номер);
Запрос.УстановитьПараметр("ПараметрНачалоИнтервала", НачалоИнтервала);
Запрос.УстановитьПараметр("ПараметрКонецИнтервала", КонецИнтервала);
Результат = Запрос.Выполнить().Выбрать();
Если Результат.Количество() = 0 Тогда
Возврат Ложь;
Иначе
Возврат Истина;
КонецЕсли;
КонецФункции
burza @ Сегодня, 11:09
,
Конечно не работает. Вы вдумайтесь в смысл выполнения кода.
&НаСервере
Процедура ПровестиИмпортВходящихПлатежей()
ВыборкаБазДляИмпорта = РегистрыСведений.СоединенияСБазамиДанныхУТ.Выбрать();
Пока ВыборкаБазДляИмпорта.Следующий() Цикл
Если (ВыборкаБазДляИмпорта.ЗагружатьПриходБезналичный) Тогда
Сообщить(ВыборкаБазДляИмпорта.СтрокаСоединения);
СоединениеБух = СоединитьсяСБазой(ВыборкаБазДляИмпорта.СтрокаСоединения);
Если СоединениеБух = неопределено тогда
Сообщить("Произошла ошибка при соединении с базой предприятия " + ВыборкаБазДляИмпорта.СтрокаСоединения, СтатусСообщения.Внимание);
Продолжить;
иначе
Сообщить("Успешно соединились с базой предприятия " + ВыборкаБазДляИмпорта.СтрокаСоединения, СтатусСообщения.Информация);
конецЕсли;
// Создаём запрос для выборки всех исходящих платежей за период
запр = СоединениеБух.NewObject("Запрос");
запр.Текст = "ВЫБРАТЬ
| ЗаказКлиента.Номер КАК Номер,
| ЗаказКлиента.Дата,
| ЗаказКлиента.СуммаОплаты КАК СуммаОплаты,
| ЗаказКлиента.СуммаДокумента КАК СуммаДокумента,
| ЗаказКлиента.ЧислоПутевок КАК ЧислоПутевок,
| ЗаказКлиента.Санаторий.Наименование КАК Санаторий,
| ЗаказКлиента.Партнер.Наименование КАК Партнер,
| ЗаказКлиента.РуководительГруппы.Наименование КАК РуководительГруппы,
| ЗаказКлиента.Контрагент.Наименование КАК Контрагент
|ИЗ
| Документ.ЗаказКлиента КАК ЗаказКлиента
|ГДЕ
| ЗаказКлиента.Дата МЕЖДУ &НачалоПериода И &КонецПериода
| И ЗаказКлиента.Проведен = ИСТИНА
| И ЗаказКлиента.ПометкаУдаления = ЛОЖЬ
| И НЕ ЗаказКлиента.СуммаДокумента = &СуммаДокумента";
запр.УстановитьПараметр("НачалоПериода", Объект.НачалоПериода);
запр.УстановитьПараметр("КонецПериода", Объект.КонецПериода);
запр.УстановитьПараметр("СуммаДокумента", 0);
Выборка = запр.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить("Загрузка документа №" + Выборка.Номер);
// Это уже не нужно и функцию можете удалить
//Если ПроверитьСуществованиеДокумента(Выборка.Номер, Выборка.СуммаДокумента, НачалоГода(Выборка.Дата), КонецГода(Выборка.Дата)) тогда
//Сообщить("Загрузка №" + Выборка.Номер + " невозможна, поскольку документ уже был загружен");
// Иначе
Док = Документы.СписокЗаявокУТ.НайтиПоНомеру(Выборка.Номер, Выборка.Дата);
Если НЕ Док.Пустая Тогда
Если Док.СуммаДокумента = Выборка.СуммаДокумента Тогда
Сообщить("Загрузка №" + Выборка.Номер + " невозможна, поскольку документ уже был загружен");
Продолжить;
КонецЕсли;
НачатьТранзакцию();
Док = Док.ПолучитьОбъект();
Иначе
НачатьТранзакцию();
Док = Документы.СписокЗаявокУТ.СоздатьДокумент();
КонецЕсли;
Док.Контрагент = Выборка.Контрагент;
Док.ЧислоПутевок = Выборка.ЧислоПутевок;
Док.СуммаДокумента = Выборка.СуммаДокумента;
Док.НомерЗаявки = Выборка.Номер;
Док.Санаторий = ПодобратьСанаторий(Выборка.Санаторий);
Док.РуководительГруппы = Выборка.РуководительГруппы;
Док.Партнер = Выборка.Партнер;
Док.Дата = Выборка.Дата;
Док.Оплачено = Выборка.СуммаОплаты;
Док.Записать();
ЗафиксироватьТранзакцию();
//КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
burza @ Today, 10:09
,
Судя по коду, вы уверены, что НайтиПоНомеру всегда возвращает ссылку на документ. Судя по ошибке, возвращается что-то другое...
Допустил ошибку. Вот так правильно
Если НЕ Док.Пустая() Тогда
Vidocq05 @ Сегодня, 11:25
,
Этот код взял и просто создал все документы по новому(они уже есть)! Мне не нужно загружать документы каждый раз новые.
Мне чтобы менялись только данные в документе а документы оставались прежние.
То есть так нету проверки на уже имеющиеся документы.
burza @ Today, 10:38
,
Вы ищите по номеру, но не находите. Что значит документы "уже есть"?
burza @ Сегодня, 11:38
,
Тогда так:
Док = Документы.СписокЗаявокУТ.НайтиПоНомеру(Выборка.Номер, Выборка.Дата);
Если НЕ Док.Пустая Тогда
Если Док.СуммаДокумента = Выборка.СуммаДокумента Тогда
Сообщить("Загрузка №" + Выборка.Номер + " невозможна, поскольку документ уже был загружен");
Продолжить;
КонецЕсли;
НачатьТранзакцию();
Док = Док.ПолучитьОбъект;
Док.СуммаДокумента = Выборка.СуммаДокумента;
Док.Записать();
ЗафиксироватьТранзакцию();
КонецЕсли;
Vidocq05
Извините тупанул, не там номер записывал. Все работает СПАСИБО)
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua