Доброго времени суток, есть документы ПТУ в трех базах. С этих трех баз скидываются в приемник, в приемнике нужно перенумеровать документы, чтобы номера шли по порядку.
Имею вот такой код:
вОпределитьТипИДлиннуНомера("Поступление");
НеУникальныеНомера = Новый Соответствие;
МаксимальныйНомер = Число(вДополнитьСтрокуСимволами("", мДлинаНомера, "9"));
Если Не ЗначениеЗаполнено(НачПериода) или Не ЗначениеЗаполнено(КонПериода) Тогда
Сообщить("Укажите дату начала и окончания периода обработки", СтатусСообщения.Внимание);
Возврат;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ПоступлениеТоваровУслуг.Ссылка,
| ПоступлениеТоваровУслуг.Дата
|ИЗ
| Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
|ГДЕ
| ПоступлениеТоваровУслуг.Дата >= &НачПериода
| И ПоступлениеТоваровУслуг.Дата <= &КонПериода
| И ПоступлениеТоваровУслуг.Организация В(&Организация)
| И ВЫРАЗИТЬ(ПоступлениеТоваровУслуг.Номер КАК СТРОКА(200)) ПОДОБНО ""%"" + &ПрефиксОрганизации + ""%""
|
|УПОРЯДОЧИТЬ ПО
| ПоступлениеТоваровУслуг.Дата";
Запрос.УстановитьПараметр("НачПериода", НачалоДня(НачПериода));
Запрос.УстановитьПараметр("КонПериода", КонецДня(КонПериода));
Запрос.УстановитьПараметр("Организация", Организация);
Запрос.УстановитьПараметр("ПрефиксОрганизации", Организация.Префикс);
Выборка = Запрос.Выполнить().Выбрать();
//Получить последний номер документа ПТУ перед датой начала обработки
//++
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| ПоступлениеТоваровУслуг.Ссылка,
| ПоступлениеТоваровУслуг.Дата
|ИЗ
| Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
|ГДЕ
| ПоступлениеТоваровУслуг.Дата < &НачПериода
| И ПоступлениеТоваровУслуг.Организация В(&Организация)
| И ВЫРАЗИТЬ(ПоступлениеТоваровУслуг.Номер КАК СТРОКА(200)) ПОДОБНО ""%"" + &ПрефиксОрганизации + ""%""
|
|УПОРЯДОЧИТЬ ПО
| ПоступлениеТоваровУслуг.Дата УБЫВ";
Запрос.УстановитьПараметр("НачПериода", НачПериода);
Запрос.УстановитьПараметр("Организация", Организация);
Запрос.УстановитьПараметр("ПрефиксОрганизации", Организация.Префикс);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаПоследнийНомер = РезультатЗапроса.Выбрать();
Если ВыборкаПоследнийНомер.Следующий() Тогда
ПоследнийНомер = ВыборкаПоследнийНомер.Ссылка.Номер;
Иначе
ПоследнийНомер = "00000000000";
КонецЕсли;
//--
НачальныйНомер = ?(ЗначениеЗаполнено(ПоследнийНомер),ПоследнийНомер,"00000000");
//Обработка документов "Поступления товаров и услуг"
Сч = 0;
Пока Выборка.Следующий() Цикл
Номер = "";
Объект = Выборка.Ссылка.ПолучитьОбъект();
СтроковаяЧастьНомера = Выборка.Ссылка.Организация.Префикс; //ПРЕФИКС ОРГАНИЗАЦИИ
//Определеним первое число номера
КолСимволовВПрефиксе = СтрДлина(СтроковаяЧастьНомера);
Если СЧ = 0 Тогда
ЧисловаяЧастьНомера = Сред(НачальныйНомер,КолСимволовВПрефиксе+1,мДлинаНомера-КолСимволовВПрефиксе);
ЧисловаяЧастьНомера = Число(ЧисловаяЧастьНомера) + 1;
Иначе
ЧисловаяЧастьНомера = Сред(Номер,КолСимволовВПрефиксе+1,мДлинаНомера-КолСимволовВПрефиксе);
ЧисловаяЧастьНомера = Число(ЧисловаяЧастьНомера) + 1;
КонецЕсли;
ПервыйСимволЧисловогоНомера = Сред(НачальныйНомер,КолСимволовВПрефиксе+1,1);
НовыйНомер = СтроковаяЧастьНомера;
НовыйНомер = НовыйНомер + ПервыйСимволЧисловогоНомера;
Пока СтрДлина(НовыйНомер) < мДлинаНомера - СтрДлина(ЧисловаяЧастьНомера) Цикл
НовыйНомер = НовыйНомер + "0";
КонецЦикла;
НовыйНомер = НовыйНомер + Формат(ЧисловаяЧастьНомера,"ЧГ=0");
Объект.Номер = НовыйНомер;
Номер = НовыйНомер;
Попытка
Объект.Записать();
Исключение
Объект.Номер = Формат(МаксимальныйНомер - Сч, "ЧГ=0");
Объект.Записать();
НеУникальныеНомера.Вставить(НовыйНомер, Объект.Ссылка);
КонецПопытки;
Для каждого Зн Из НеУникальныеНомера Цикл
НовыйНомер = Зн.Ключ;
Объект = Зн.Значение.ПолучитьОбъект();
Объект.Номер = НовыйНомер;
Попытка
Объект.Записать();
Исключение
Сообщить("Повтор номера: " + НовыйНомер + " за пределами данной выборки!");
КонецПопытки;
КонецЦикла;
Сч = Сч + 1;
КонецЦикла;
При записи возникает ситуация когда такой номер уже есть в базе, как решить эту проблему? Смотрел обрабботку "УниверсальныйПодборИОБработкаОбъектов", последний цикл с нее, но это не решает проблему.
Подскажите как сделать?
Второй цикл перенес за первый, сори сразу не заметил...