Имя: Пароль:
1C
1С v8
1С 8.2 Запись с такими ключевыми полями существует! При программной записи.
0 Darhon
 
27.12.13
18:50
Добрый вечер! Появилось проблема! Пытаюсь по мере выполнения кода записать регистр сведений. В нем три измерения: Время Пользователь и позывной. И два измерения: менеджер старый и менеджер новый. При попытке записи падает с ошибкой:

Обработка.Присвоение_Менеджеру_Позывного.Форма.Форма.Форма(158)}: Ошибка при вызове метода контекста (Записать)
    НаборЗаписейРегистра.Записать();
по причине:
Запись с такими ключевыми полями существует! : ИсторияИзмененияМенеджеров: Александр Васильевич, 27.12.2013 0:00:


Вот код:

ТекстЗапроса="";
    ТекстЗапроса = "select drv_op.cod_op from drv_op where drv_op.cod_drv="+КодВодителя;
    НаборЗаписей = Новый COMОбъект("ADODB.RecordSet");
    НаборЗаписей.ActiveConnection = Соединение;
    Попытка
        //Сообщить(ТекстЗапроса);
        НаборЗаписей.Open(ТекстЗапроса);
    Исключение
        Сообщить(ОписаниеОшибки());
    КонецПопытки;

    Пока не НаборЗаписей.Eof() Цикл
        МенеджерОПРСВСтарый=НаборЗаписей.Fields("cod_op").Value;
        НаборЗаписей.MoveNext();
    КонецЦикла;
    МенеджерОПРСВСтарый = Справочники.МенеджерыMySQL.НайтиПоРеквизиту("КодmySQL", МенеджерОПРСВСтарый);
    
    НаборЗаписейРегистра = РегистрыСведений.ИсторияИзмененияМенеджеров.СоздатьНаборЗаписей();
    НаборЗаписейРегистра.Прочитать();
    
    НовЗапись = НаборЗаписейРегистра.Добавить();
    НовЗапись.Время= ТекущаяДата();
    НовЗапись.Пользователь=Справочники.Сотрудники.НайтиПоРеквизиту("УИП", ПользователиИнформационнойБазы.ТекущийПользователь().УникальныйИдентификатор);
    НовЗапись.МенеджерОПРСВСтарый = МенеджерОПРСВСтарый;
    НовЗапись.Позывной= Позывной;
        
    ТекстЗапроса="";
    ТекстЗапроса = "UPDATE drv_op
    |SET drv_op.cod_op="+Число(СтрокаТЧ.КодMySQL)+"
    |where drv_op.cod_drv ="+КодВодителя;
    НаборЗаписей = Новый COMОбъект("ADODB.RecordSet");
    НаборЗаписей.ActiveConnection = Соединение;
    Попытка
        //Сообщить(ТекстЗапроса);
        НаборЗаписей.Open(ТекстЗапроса);
    Исключение
        Сообщить(ОписаниеОшибки());
    КонецПопытки;
    //НаборЗаписей.Close();
    Соединение.Close();
    НовЗапись.МенеджерОПРСВНовый=СтрокаТЧ;
    НаборЗаписейРегистра.Записать();


Помогите разобраться пожалуйста! Заранее спасибо!
1 Wobland
 
27.12.13
18:51
три измерения и два измерения - это пять измерений? я нигде не ошибся?
2 Wobland
 
27.12.13
18:53
>Запись с такими ключевыми полями существует!
это значит, что уже есть запись с такими ключевыми полями
3 Darhon
 
27.12.13
18:54
(2) и 2 реквизита :) Все сплю находу :(
4 Darhon
 
27.12.13
18:56
Так ключевых поля 3...то есть 3 измерения. А до записи третьего он не доходит. Да и время должно разным быть...
5 Wobland
 
27.12.13
19:01
(4) я что-то у тебя цикла не увидел
6 GROOVY
 
27.12.13
19:07
Я извиняюсь, а зачем Вы читаете набор записей?
7 МишКа
 
27.12.13
19:11
(4) Время может быть и одинаковым. Точность - секунда.
8 AaNnDdRrEeYy
 
27.12.13
22:52
бах, и весь регистр в прочитан, отборов то нет, в вдруг там миллионы записей? и зачем его читать?

НаборЗаписейРегистра = РегистрыСведений.ИсторияИзмененияМенеджеров.СоздатьНаборЗаписей();
    НаборЗаписейРегистра.Прочитать();
    
Где отборы по измерениям? при такой записи всегда будет только одна запись в таблице, та что последней писалась. и то только если Записть(Истина), а так да ошибка 100%

    НовЗапись = НаборЗаписейРегистра.Добавить();
НаборЗаписейРегистра.Записать();
9 Darhon
 
28.12.13
10:34
(8) А как будет правильно ) Подскажите неразумному :)))
10 Darhon
 
28.12.13
10:35
У м(7) У меня почему то время вообще 00:00:00 пишется ((
11 Sabbath
 
28.12.13
11:05
(10) Может Время это не измерение, а регистр периодический? (что было бы логично) А 0 часов пишется, т.к. периодичность в пределах дня
12 Sabbath
 
28.12.13
11:10
(9) если нужно добавить запись в регистр (независимый), то можно просто СоздатьМенеджерЗаписи()
А вообще я не совсем понял код)
13 Sabbath
 
28.12.13
11:12
А не, судя по  НовЗапись.Время это именно измерение
14 Sabbath
 
28.12.13
11:15
+(13) тогда по идее надо состав Дата и время. Хотя если регистр называется ИсторияИзмененияМенеджеров, то историю как раз хранят в периодических регистрах, чтобы смотреть срезы на определенную дату
15 Darhon
 
28.12.13
11:18
(11) Регистр непериодический...не стал мудрить с периодическим...
16 Wobland
 
28.12.13
11:19
(15) недоперепроектировал?
17 Darhon
 
28.12.13
11:20
(12) Я бы объяснил...код изменяет внешний источник данных. Изменения записываются в регистр сведений.
18 Darhon
 
28.12.13
11:21
(16) Ага...недодумал...
19 Darhon
 
28.12.13
11:22
И еще в ресурс МенеджерОПРСВСтарый почему-то попадает значение "Объект не найден" и код объета.
20 Sabbath
 
28.12.13
11:22
(15) а по смыслу надо было периодический) Там мутить нечего особо, настроить два свойства и все. Наверняка, дальше тебе будет удобней именно периодический. Как ты будешь получать текущее состояние на дату, брать на максимальную ближайшую дату? Срез последних упрощает это дело)
21 Darhon
 
28.12.13
11:23
Да мне текущее состояние брать не придется...мне нужно наоборот вся история изменений одного позывного например, или все изменения одного пользователя...
22 Sabbath
 
28.12.13
11:29
(21) Ну короче ты изобрел периодический регистр с помощью измерения Время, хотя можно было без него)
23 Darhon
 
28.12.13
11:31
(22) Попробую на период переделать....а что в процедуру записи в регистр добавить добавить, если он периодический??  И как избавиться от "Объект не найден"
24 Sabbath
 
28.12.13
11:39
(23) У тебя просто вместо Время будет реквизит по умолчанию Период. Делай с ним то же, что и со временем) И не забудть периодичность настроить, я так понял, тебе в пределах секунды.
Насчет не найденного объекта, надо искать, почему его нет. По идее, если б не было, то и не нашел бы по реквизиту, была бы пустая ссылка. Как вариант пока только мысли, что либо ты там его там удалил по ходу дела, уже после создания записи в регистре.
25 Darhon
 
28.12.13
11:42
(24) Вот самое странное что это элемент справочника, в справочнике то он есть :) А вообще можно ли сделать это не обработкой а документом, и он будет регистр автоматически заполнять при проведении??
26 Wobland
 
28.12.13
11:47
не вникал. какая-то хитровымудренная оболочка для редактирования чужой БД у автора получается. натурально, удаление аппендицита через задний вход ногами в костюме космонавта
27 Sabbath
 
28.12.13
11:48
(25) Можно. Делаешь подчинение регистратору и прописываешь в обработке проведения формирование движений конструктором. Будет тебе почти все автоматически. Вопрос только откуда ты берешь данные для движения. Я думаю, из предварительно заполненной ТЧ)

(26) очень похоже на то)
28 Darhon
 
28.12.13
11:51
(26) БД своя. Только вот отчетности по ней нету никакой...все делается через HiDiSQL. включая изменнения в БД. Поэтому все делают ИТшники. Вот и решил на коленке набросать такую вот фигню... :)
29 Darhon
 
28.12.13
11:52
(27) да...основная проблема будет где хранить реквизиты ТЧ до изменения. Создавать таблицу значений если только, но как тогда ее передать в обработку проведения :(
30 Wobland
 
28.12.13
11:57
(28) чужая в значении внешняя по отношению к 1с
31 Wobland
 
28.12.13
11:58
я тут картинку вздумал для подсистемы нарисовать. и что ты думаешь? пришлось применить более удобные инструменты, нежели 1С. не надо ею везде тыкать
32 Sabbath
 
28.12.13
12:08
(29) ну задачу то я не онимаю, потому сложно сказать. Мне лично не совсем понятно, зачем МенеджерОПРСВСтарый, если суть именно в изменении этого менеджера. Как раз старый хранится в предыдущей записи, а ты как бы каждой новой записью определяешь нового. Тогда, вероятно, все эти телодвижения со старым менеджером не нужны
33 Darhon
 
28.12.13
12:50
(32) А при первом изменении будет непонятно кто был старым :((
34 Sabbath
 
28.12.13
13:32
(33) сделай начальное заполнение по текущим данным
Закон Брукера: Даже маленькая практика стоит большой теории.