Имя: Пароль:
1C
1С v8
запись документа
,
0 Black Dragon
 
07.09.11
17:33
Всем доброго дня!

Вот такая вот засада - 8.2 УТ 10.3 - платежные документы - были удалены с помощью обработки

   Выборка = Документы.ПлатежноеПоручение.Выбрать();
   Пока Выборка.Следующий() Цикл
       Если Выборка.ПометкаУдаления Тогда
           Сообщить("Платежное поручение " + Выборка.Номер + " от " + Выборка.Дата + " будет удалено!");
           Док = Выборка.ПолучитьОбъект();
           Док.Удалить();
           Сообщить("Платежное поручение " + Выборка.Номер + " от " + Выборка.Дата + " удалено!");
       КонецЕсли;    
   КонецЦикла;    

Затем вместо удаленных доков пытаюсь записывать новые - а тут Оопс!
{Форма.Форма.Форма(60)}: Ошибка при вызове метода контекста (Записать): Значение поля "Номер" не уникально

чего только не делал - и тестирование информационной базы в том числе!

Ничего пока не помогло
1 SeregaMW
 
07.09.11
17:37
Давай выкладывай код как записываешь! Почему то мне кажется что при записи нового документа ты не получаешь Следующий Номер.
2 lxs
 
07.09.11
17:37
Глобальный контекст.ОбновитьНумерациюОбъектов (Global context.RefreshObjectsNumbering)
Глобальный контекст (Global context)
ОбновитьНумерациюОбъектов (RefreshObjectsNumbering)
Синтаксис:

ОбновитьНумерациюОбъектов(<Метаданные>)
Параметры:

<Метаданные> (необязательный)

Тип: Массив; Объекты метаданных. Объект метаданного или массив объектов метаданных, для объектов которого будет выполнено обновление. Если значение параметра не указано, то обновление будет выполнено для всех типов объектов.
Описание:

Выполняет обновление номеров в соответствии с номерами, записанными в базе данных. После вызова данного метода все выданные, но не записанные номера, становятся невалидными, т.к. не гарантируется их уникальность. Данный метод разрешено вызывать только администратору системы.

Доступность:

Сервер, толстый клиент, внешнее соединение.
3 lxs
 
07.09.11
17:38
+(2) за каким ты вообще полез удалять документы?
4 Black Dragon
 
07.09.11
17:39
их нужно было удалить - Удаление помеченных объектов - не помогало
5 SeregaMW
 
07.09.11
17:40
(3) Он же не спрашивает как их восстановить )))
6 Black Dragon
 
07.09.11
17:41
Вообще странно - я же их сам создавал программно - почему не удалить если так требуется? )
7 lxs
 
07.09.11
17:41
(4) !!! С этого места по-подробнее!
8 Black Dragon
 
07.09.11
17:42
(2) есть возможность это действие отменить?
9 Goggy
 
07.09.11
17:42
(4)ужс
10 lxs
 
07.09.11
17:43
нет
11 lxs
 
07.09.11
17:43
ты запустил чтоли?
12 СвинТуз
 
07.09.11
17:43
ЕвроДон и индюшки? ) хотя у них вроде УПП
13 Black Dragon
 
07.09.11
17:44
да нет, ничего подобного не делал!
14 Black Dragon
 
07.09.11
17:44
(12) нет, ну их ... ))
15 СвинТуз
 
07.09.11
17:45
(14)
а что так ? 20 000 мало? )))
16 СвинТуз
 
07.09.11
17:46
я бы не удалял если через удаление помеченных не удаляются
17 Black Dragon
 
07.09.11
17:47
(15) это совсем не зарплата )
18 СвинТуз
 
07.09.11
17:48
а сколько зарплата? )
19 SeregaMW
 
07.09.11
17:48
(0) Новые документы создаешь программно?
(16) Я тоже ибо на них есть ссылки других объектов...

(0)Давай кодинг записи документа, щаз мы тебе поможем
20 Black Dragon
 
07.09.11
17:48
ну от 30000
21 SeregaMW
 
07.09.11
17:49
Через 10 минут форум вымрет все уйдут домой))))))))))))))
22 Black Dragon
 
07.09.11
17:50
Док = База.CreateObject("Документ.ПлатежноеПоручение");
       БазПредставление = "00000000000";
       Если Док.ВыбратьДокументы(Формат(НачДата,"ДЛФ=Д"),Формат(КонДата,"ДЛФ=Д")) Тогда
           Пока Док.ПолучитьДокумент() Цикл
               ТекНомер = Прав(БазПредставление+Док.НомерДок,11);
               ТекПлатежка = Документы.ПлатежноеПоручение.НайтиПоНомеру(ТекНомер);
               Если ТекПлатежка = Документы.ПлатежноеПоручение.ПустаяСсылка() Тогда // документ не найден(не существует)
                   // создадим документ Платежное Поручение
                   Сообщить("Документ Платежное поручение № " + Док.НомерДок + " от " + Док.ДатаДок + " в информационной базе не обнаружен!");
                   НоваяПлатежка = Документы.ПлатежноеПоручение.СоздатьДокумент();
                   НоваяПлатежка.Номер = ТекНомер;
                   НоваяПлатежка.Дата = Док.ДатаДок;
                   НоваяПлатежка.Организация = выбОрганизация;
                   НомерСчета = Справочники.БанковскиеСчета.НайтиПоРеквизиту("НомерСчета",Док.РасчетныйСчет.Номер);
                   НоваяПлатежка.СчетОрганизации = НомерСчета;
                   СтрИНН = СокрЛП(Док.Контрагент.ИНН);
                   Поз = Найти(СтрИНН,"/");
                   Если Поз > 0 Тогда
                       ИНН = Лев(СтрИНН,Поз-1);
                   Иначе
                       ИНН = СтрИНН;
                   КонецЕсли;    
                   СоотвКонтрагент = Справочники.Контрагенты.НайтиПоРеквизиту("ИНН",ИНН);
                   НоваяПлатежка.Контрагент = СоотвКонтрагент;
                   НоваяПлатежка.ДоговорКонтрагента = НоваяПлатежка.Контрагент.ОсновнойДоговорКонтрагента;
                   СчетКонтрагента = Справочники.БанковскиеСчета.НайтиПоРеквизиту("НомерСчета",Док.СчетКонтрагента.Номер);
                   НоваяПлатежка.СчетКонтрагента = СчетКонтрагента;
                   НоваяПлатежка.ВидПлатежа = Док.ВидПлатежа;
                   НоваяПлатежка.ОчередностьПлатежа = Док.Очередность;
                   НоваяПлатежка.НазначениеПлатежа = СокрЛП(Док.Содержание);
                   НоваяПлатежка.СуммаДокумента = Док.Сумма;
                   НоваяПлатежка.ВалютаДокумента = Константы.ВалютаРегламентированногоУчета.Получить();
                   НоваяПлатежка.Комментарий = "Перенесено из 1С:Бухгалтерия 7.7";
                   НоваяПлатежка.ИННПлательщика = выбОрганизация.ИНН;
                   НоваяПлатежка.КПППлательщика = выбОрганизация.КПП;
                   НоваяПлатежка.ИННПолучателя = ИНН;
                   НоваяПлатежка.КПППолучателя = Док.КПППолучателя;
                   НоваяПлатежка.КодБК = Док.КодБК;
                   НоваяПлатежка.КодОКАТО = Док.КодОКАТО;
                   НоваяПлатежка.ПоказательДаты = Док.ПоказательДаты;
                   НоваяПлатежка.ПоказательНомера = Док.ПоказательНомера;
                   НоваяПлатежка.ПоказательОснования = Док.ПоказательОснования;
                   НоваяПлатежка.ПоказательПериода = Док.ПоказательПериода;
                   НоваяПлатежка.ПоказательТипа = Док.ПоказательТипа;
                   НоваяПлатежка.СтатусСоставителя = Док.СтатусСоставителяПлДок;
                   Если Док.ПеречислениеНалога Тогда
                       НоваяПлатежка.ПеречислениевБюджет = Истина;
                   Иначе
                       НоваяПлатежка.ПеречислениевБюджет = Ложь;
                   КонецЕсли;    
                   НоваяПлатежка.ВидПеречислениявБюджет = Перечисления.ВидыПеречисленийВБюджет.НалоговыйПлатеж;
                   НоваяПлатежка.СтавкаНДС = Перечисления.СтавкиНДС.НДС18;
                   НоваяПлатежка.СуммаНДС = Док.НДС;
                   Попытка
                       НоваяПлатежка.Записать();
                   Исключение
                       Сообщить("Не удалось записать документ Платежное поручение № " + НоваяПлатежка.Номер + " от " + НоваяПлатежка.Дата);
                       Сообщить("" + ОписаниеОшибки());
                   КонецПопытки;
               Иначе
                   Сообщить("Документ Платежное поручение №" + ТекПлатежка.Номер + " от " + ТекПлатежка.Дата + " в информационной базе уже существует!");
               КонецЕсли;    
           КонецЦикла;
23 СвинТуз
 
07.09.11
17:50
да блин
как тебя в Ростове на 30 000 берут?
ты же не знаешь как базу чистить правильно )
24 СвинТуз
 
07.09.11
17:52
про транзакции не слышал опять же
25 lxs
 
07.09.11
17:53
(24) Не спасут.
26 unregistered
 
07.09.11
17:53
(4) >> нужно было удалить - Удаление помеченных объектов - не помогало

format c: надёжнее. И нумераторы чистенькие будут...
27 Black Dragon
 
07.09.11
17:54
очень смешно )
а по существу то как нужно было?
28 Black Dragon
 
07.09.11
17:55
(23) и как базу чистить правильно?
29 СвинТуз
 
07.09.11
17:56
(25)
смотря от чего
30 СвинТуз
 
07.09.11
17:57
(27)
а кто его знает то кроме тебя?
ты и код кусками кидаешь
31 unregistered
 
07.09.11
17:58
(28) >> и как базу чистить правильно?

Через удаление помеченных объектов. Если эта обработка не удаляет документы, значит на них есть ссылки.
Если ты удаляешь такие документы принудительно, то в базе остаются битые ссылки.
32 СвинТуз
 
07.09.11
17:59
ТекНомер = Прав(БазПредставление+Док.НомерДок,11);

и тут теоретически напороться можно
все у тебя не чисто )))
33 Black Dragon
 
07.09.11
18:00
это понятно и ежу) (ну типа мне!)

там ссылок не было - потому как я их в базу сам записал, и выписок на эти платежки не было!

потому так и удалил, про валидность номеров однако не знал!
34 Black Dragon
 
07.09.11
18:01
отключить контроль уникальности у документа?
35 unregistered
 
07.09.11
18:01
Если система говорит Значение поля "Номер" не уникально, значит так оно и есть.

Чистить нумератор, как в (2) бесполезно, т.к. нумераторы просто хранят последний выданный номер в разрезе каждого префикса.
36 SeregaMW
 
07.09.11
18:02
(22) Я сталкивался с такой проблемой, соль в том что тот номер который ты указываешь не записывается в документе он изменяется при выполнении метода записать, пройдись отладчиком там найдешь.
37 Black Dragon
 
07.09.11
18:02
(32) нельзя там было напоротся!

тут особенный случай - часть платежек было еще в 7-ке, нужно их оттуда то выбрать и сюда!
38 unregistered
 
07.09.11
18:03
(33) >> там ссылок не было

Врешь. обработка не станет тебя обманывать. Смотри из каких объектов идут ссылки на неудаляемые документы.
39 Black Dragon
 
07.09.11
18:04
(38) логически выходит что так - только сам не понимаю откуда им было взятся?
40 unregistered
 
07.09.11
18:08
(36) Сомневаюсь. ПриУстановкеНовогоНомера отрабатывает только когда номер не установлен руками или программно. А у автора он как раз программно устанавливается.

Если только где-то в коде есть вызов УстановитьНовыйНомер
41 Black Dragon
 
07.09.11
18:08
а собственно я же проверяю перед присвоением - нет же в базе дока с таким номером!

ТекПлатежка = Документы.ПлатежноеПоручение.НайтиПоНомеру(ТекНомер);
42 Black Dragon
 
07.09.11
18:10
больше в коде ничего нет кроме установки соединения с ОЛЕ базой!
43 unregistered
 
07.09.11
18:17
Отладчиком смотри что с Номером происходит перед записью и в момент записи документа. Может там действительно где-то принудительно вызывается установка нового номера.
44 unregistered
 
07.09.11
18:17
Что кстати с префиксами? Используются?
45 Black Dragon
 
07.09.11
18:22
нет, префиксы не используются
46 Black Dragon
 
07.09.11
18:24
на локальной базе провел эксперимент - отключил контроль уникальности - результат таков - новые доки записались, часть из них руками пометил и удалил через Удаление помеченных объектов - удалились без всяких вопросов!

Отсюда вывод - что то видимо Нумератор творит!
47 unregistered
 
07.09.11
18:29
(46) Не может ни чего нумератор творить.
Нумератор может чудить при автоматическом присваивании номеров.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший