Имя: Пароль:
1C
1С v8
Ошибка при вызове метода контекста (Записать)
,
0 3axap_4
 
16.10.13
22:33
Доброго времени суток:
собственно принялся устранять дубли в Бухгалтерии 3.0 скачал обработку  от сюда http://infostart.ru/public/14986/ все хорошо находит дубли находит ссылки но при попытке замены и записи документа начинает ругаться на Ошибка при вызове метода контекста (Записать), как это можно поправить?
Спасибо за внимание!
1 3axap_4
 
16.10.13
22:39
Собственно по коду:
Попытка    
Параметры.Объект.Записать();
Исключение            
Сообщить(ИнформацияОбОшибке().Описание, СтатусСообщения.Важное);

Собственно происходит замена значения реквизита (дубликата) на правильное значение и после этого попытка записи измененного документа где:
Параметры - структура
Параметры.Объект - собственно ДокументОбъект
2 3axap_4
 
16.10.13
22:49
или посоветуйте достойную альтернативу, кроме сам напиши, время поджимает
3 vicof
 
16.10.13
23:15
Сообщить(ТипЗнч(Объект));
4 vicof
 
16.10.13
23:16
Ну или как там в УФ
5 3axap_4
 
16.10.13
23:19
(3) минутку
6 3axap_4
 
16.10.13
23:20
например:
Документ объект: Ввод начальных остатков
7 vicof
 
16.10.13
23:25
Период открыт?
8 vicof
 
16.10.13
23:25
Дата и номер отличны от других документов того же типа?
9 vicof
 
16.10.13
23:26
Объект.ОбменДанными.Загрузка = Истина?
10 vicof
 
16.10.13
23:27
11 3axap_4
 
16.10.13
23:27
(9) Истина
Отличны, в ручную (проставляя те же значения) все отлично перепроводится и сохраняется...
12 3axap_4
 
16.10.13
23:28
(10) искал уже...
13 vicof
 
16.10.13
23:32
Ну давай сюда свой код полностью
14 3axap_4
 
16.10.13
23:36
БылиИсключения = Ложь;
    Если ВыполнятьВТранзакции Тогда
        НачатьТранзакцию();
    КонецЕсли;
    ОбрабатываемаяСсылка = Неопределено;
        
    Параметры = Новый Структура;
        
    Параметры.Вставить("Объект", Неопределено);    
    СтруктураКоллизий = Новый Структура;
    
    ЕСли мФормаИндикатора<>Неопределено Тогда
        мФормаИндикатора.МаксимальноеЗначение = ТаблицаСсылок.Количество();
        мФормаИндикатора.КомментарийЗначения = "Выполняется замена элементов." + ЗаголовокИндикации;
        мФормаИндикатора.Значение = 0;
    КонецЕсли;
    
    Для Каждого СтрокаТаблицы Из ТаблицаСсылок Цикл
        
        Ссылка = СтрокаТаблицы.Ссылка;
        
        // **** надо вынести в корень
        Заменяемые = Новый Соответствие;
        Заменяемые.Вставить(Ссылка, ПравильныйЭлемент);
        
        ОбработкаПрерыванияПользователя();
        Сообщить("Обрабатывается " + СтрокаТаблицы.Данные);
        
        Если ОбрабатываемаяСсылка <> СтрокаТаблицы.Данные Тогда
            Если Истина
                И ОбрабатываемаяСсылка <> Неопределено
                И Не ЛксЛиКлючЗаписиРегистра(ОбрабатываемаяСсылка)
            Тогда
                Если ОтключатьКонтрольЗаписи Тогда
                    Параметры.Объект.ОбменДанными.Загрузка = Истина;
                КонецЕсли;
                
                Попытка
                    Параметры.Объект.Записать(РежимЗаписиДокумента.Проведение);
                Исключение
                    Сообщить(ТипЗнч(Параметры.Объект));
                    Сообщить(ИнформацияОбОшибке().Описание, СтатусСообщения.Важное);
                    БылиИсключения = Истина;
                    Если ВыполнятьВТранзакции Тогда
                        Перейти ~ОТКАТ;
                    КонецЕсли;
                КонецПопытки;
                Параметры.Объект = Неопределено;
            КонецЕсли;
            ОбрабатываемаяСсылка = СтрокаТаблицы.Данные;
            
        КонецЕсли;
        
            
        Если Метаданные.Документы.Содержит(СтрокаТаблицы.Метаданные) Тогда
            
            Если Параметры.Объект = Неопределено Тогда
                Параметры.Объект = СтрокаТаблицы.Данные.ПолучитьОбъект();
            КонецЕсли;
            
            Для Каждого Реквизит Из СтрокаТаблицы.Метаданные.Реквизиты Цикл
                Если Реквизит.Тип.СодержитТип(ТипЗнч(Ссылка)) И Параметры.Объект[Реквизит.Имя] = Ссылка Тогда
                    Параметры.Объект[Реквизит.Имя] = ПравильныйЭлемент;
                КонецЕсли;
            КонецЦикла;
                
            Для Каждого ТЧ ИЗ СтрокаТаблицы.Метаданные.ТабличныеЧасти Цикл
                Для Каждого Реквизит Из ТЧ.Реквизиты Цикл
                    Если Реквизит.Тип.СодержитТип(ТипЗнч(Ссылка)) Тогда
                        СтрокаТабЧасти = Параметры.Объект[ТЧ.Имя].Найти(Ссылка, Реквизит.Имя);
                        Пока СтрокаТабЧасти <> Неопределено Цикл
                            СтрокаТабЧасти[Реквизит.Имя] = ПравильныйЭлемент;
                            СтрокаТабЧасти = Параметры.Объект[ТЧ.Имя].Найти(Ссылка, Реквизит.Имя);
                        КонецЦикла;
                    КонецЕсли;
                КонецЦикла;
            КонецЦикла;
            
            Для Каждого Движение ИЗ СтрокаТаблицы.Метаданные.Движения Цикл
                БылиИсключения = Не ОбработатьЗаписьРегистра(Параметры.Объект.Движения[Движение.Имя], Заменяемые);
                Если Истина
                    И БылиИсключения
                    И ВыполнятьВТранзакции
                Тогда
                    Перейти ~ОТКАТ;
                КонецЕсли;
            КонецЦикла;
            
            Для Каждого Последовательность ИЗ Метаданные.Последовательности Цикл
                Если Последовательность.Документы.Содержит(СтрокаТаблицы.Метаданные) Тогда
                    НадоЗаписывать = Ложь;
                    НаборЗаписи = Последовательности[Последовательность.Имя].СоздатьНаборЗаписей();
                    НаборЗаписи.Отбор.Регистратор.Установить(СтрокаТаблицы.Данные);
                    НаборЗаписи.Прочитать();
                    Если НаборЗаписи.Количество() = 0 Тогда
                        Продолжить;
                    КонецЕсли;
                    Для Каждого Измерение ИЗ Последовательность.Измерения Цикл
                        Если Истина
                            И Измерение.Тип.СодержитТип(ТипЗнч(Ссылка))
                            И НаборЗаписи[0][Измерение.Имя] = Ссылка
                        Тогда
                            НаборЗаписи[0][Измерение.Имя] = ПравильныйЭлемент;
                            НадоЗаписывать = Истина;
                        КонецЕсли;
                    КонецЦикла;
                    Если НадоЗаписывать Тогда
                        Если ОтключатьКонтрольЗаписи Тогда
                            НаборЗаписи.ОбменДанными.Загрузка = Истина;
                        КонецЕсли;
                        Попытка
                            НаборЗаписи.Записать();
                        Исключение
                            Сообщить(ИнформацияОбОшибке().Описание, СтатусСообщения.Важное);
                            БылиИсключения = Истина;
                            Если ВыполнятьВТранзакции Тогда
                                Перейти ~ОТКАТ;
                            КонецЕсли;
                        КонецПопытки;
                    КонецЕсли;
                КонецЕсли;
            КонецЦикла;
            
        ИначеЕсли Метаданные.Справочники.Содержит(СтрокаТаблицы.Метаданные) Тогда
            
            Если Параметры.Объект = Неопределено Тогда
                Параметры.Объект = СтрокаТаблицы.Данные.ПолучитьОбъект();
            КонецЕсли;
            
            Если СтрокаТаблицы.Метаданные.Владельцы.Содержит(Ссылка.Метаданные()) И Параметры.Объект.Владелец = Ссылка Тогда
                Параметры.Объект.Владелец = ПравильныйЭлемент;
            КонецЕсли;
            
            Если СтрокаТаблицы.Метаданные.Иерархический И Параметры.Объект.Родитель = Ссылка Тогда
                Параметры.Объект.Родитель = ПравильныйЭлемент;
            КонецЕсли;
            
            Для Каждого Реквизит Из СтрокаТаблицы.Метаданные.Реквизиты Цикл
                Если Реквизит.Тип.СодержитТип(ТипЗнч(Ссылка)) И Параметры.Объект[Реквизит.Имя] = Ссылка Тогда
                    Параметры.Объект[Реквизит.Имя] = ПравильныйЭлемент;
                КонецЕсли;
            КонецЦикла;
            
            Для Каждого ТЧ ИЗ СтрокаТаблицы.Метаданные.ТабличныеЧасти Цикл
                Для Каждого Реквизит Из ТЧ.Реквизиты Цикл
                    Если Реквизит.Тип.СодержитТип(ТипЗнч(Ссылка)) Тогда
                        СтрокаТабЧасти = Параметры.Объект[ТЧ.Имя].Найти(Ссылка, Реквизит.Имя);
                        Пока СтрокаТабЧасти <> Неопределено Цикл
                            СтрокаТабЧасти[Реквизит.Имя] = ПравильныйЭлемент;
                            СтрокаТабЧасти = Параметры.Объект[ТЧ.Имя].Найти(Ссылка, Реквизит.Имя);
                        КонецЦикла;
                    КонецЕсли;
                КонецЦикла;
            КонецЦикла;
            
        ИначеЕсли Метаданные.ПланыВидовХарактеристик.Содержит(СтрокаТаблицы.Метаданные)
                  ИЛИ Метаданные.ПланыСчетов.Содержит(СтрокаТаблицы.Метаданные)
                  ИЛИ Метаданные.ПланыВидовРасчета.Содержит(СтрокаТаблицы.Метаданные)
                  ИЛИ Метаданные.Задачи.Содержит(СтрокаТаблицы.Метаданные)
                  ИЛИ Метаданные.БизнесПроцессы.Содержит(СтрокаТаблицы.Метаданные) Тогда
            
            Если Параметры.Объект = Неопределено Тогда
                Параметры.Объект = СтрокаТаблицы.Данные.ПолучитьОбъект();
            КонецЕсли;
                        
            Для Каждого Реквизит Из СтрокаТаблицы.Метаданные.Реквизиты Цикл
                Если Реквизит.Тип.СодержитТип(ТипЗнч(Ссылка)) И Параметры.Объект[Реквизит.Имя] = Ссылка Тогда
                    Параметры.Объект[Реквизит.Имя] = ПравильныйЭлемент;
                КонецЕсли;
            КонецЦикла;
            
            Для Каждого ТЧ ИЗ СтрокаТаблицы.Метаданные.ТабличныеЧасти Цикл
                Для Каждого Реквизит Из ТЧ.Реквизиты Цикл
                    Если Реквизит.Тип.СодержитТип(ТипЗнч(Ссылка)) Тогда
                        СтрокаТабЧасти = Параметры.Объект[ТЧ.Имя].Найти(Ссылка, Реквизит.Имя);
                        Пока СтрокаТабЧасти <> Неопределено Цикл
                            СтрокаТабЧасти[Реквизит.Имя] = ПравильныйЭлемент;
                            СтрокаТабЧасти = Параметры.Объект[ТЧ.Имя].Найти(Ссылка, Реквизит.Имя);
                        КонецЦикла;                            
                    КонецЕсли;
                КонецЦикла;
            КонецЦикла;    
            
        ИначеЕсли Метаданные.Константы.Содержит(СтрокаТаблицы.Метаданные) Тогда
            
            Константы[СтрокаТаблицы.Метаданные.Имя].Установить(ПравильныйЭлемент);
            
            
        ИначеЕсли Метаданные.РегистрыСведений.Содержит(СтрокаТаблицы.Метаданные) Тогда    
            
            МенеджерЗаписи            = РегистрыСведений[СтрокаТаблицы.Метаданные.Имя].СоздатьМенеджерЗаписи();
            КоллизийныйМенеджерЗаписи = РегистрыСведений[СтрокаТаблицы.Метаданные.Имя].СоздатьМенеджерЗаписи();
            Периодический = (СтрокаТаблицы.Метаданные.ПериодичностьРегистраСведений <> Метаданные.СвойстваОбъектов.ПериодичностьРегистраСведений.Непериодический);
            Если Периодический Тогда
                МенеджерЗаписи.Период            = СтрокаТаблицы.Данные.Период;
                КоллизийныйМенеджерЗаписи.Период = СтрокаТаблицы.Данные.Период;
            КонецЕсли;
            МассивИзмененныхИзмерений = Новый Массив;
            Для каждого Рекв Из СтрокаТаблицы.Метаданные.Измерения Цикл
                ЗначениеИзмерения = СтрокаТаблицы.Данные[Рекв.Имя];
                МенеджерЗаписи[Рекв.Имя] = ЗначениеИзмерения;
                Если ЗначениеИзмерения = Ссылка Тогда
                    КоллизийныйМенеджерЗаписи[Рекв.Имя] = ПравильныйЭлемент;
                    МассивИзмененныхИзмерений.Добавить(Рекв.Имя);
                Иначе
                    КоллизийныйМенеджерЗаписи[Рекв.Имя] = ЗначениеИзмерения;
                КонецЕсли;
            КонецЦикла;
            
            БылаКоллизия = Ложь;
            Если МассивИзмененныхИзмерений.Количество() > 0 Тогда
                КоллизийныйМенеджерЗаписи.Прочитать();
                Если КоллизийныйМенеджерЗаписи.Выбран() Тогда
                    МенеджерЗаписи.Прочитать();
                    МассивКоллекцийРеквизитов = Новый Массив;
                    МассивКоллекцийРеквизитов.Добавить(СтрокаТаблицы.Метаданные.Ресурсы);
                    МассивКоллекцийРеквизитов.Добавить(СтрокаТаблицы.Метаданные.Реквизиты);
                    Если Не СтруктураКоллизий.Свойство(СтрокаТаблицы.Метаданные.Имя) Тогда
                        ТаблицаЗаписей = РегистрыСведений[СтрокаТаблицы.Метаданные.Имя].СоздатьНаборЗаписей().Выгрузить();
                        ТаблицаЗаписей.Колонки.Добавить("МенеджерЗамены");
                        ТаблицаЗаписей.Колонки.Добавить("МенеджерОригинала");
                        Для Каждого КоллекцияРеквизитов Из МассивКоллекцийРеквизитов Цикл
                            Для Каждого МетаРеквизит Из КоллекцияРеквизитов Цикл
                                ИмяКолонки = МетаРеквизит.Имя;
                                ПредставлениеКолонки = МетаРеквизит.Представление();
                                КолонкаОригинала = ТаблицаЗаписей.Колонки[ИмяКолонки];
                                КолонкаОригинала.Имя       = "Оригинал"   + ИмяКолонки;
                                КолонкаОригинала.Заголовок = "Оригинал: " + ПредставлениеКолонки;
                                КолонкаЗамены = ТаблицаЗаписей.Колонки.Вставить(ТаблицаЗаписей.Колонки.Индекс(КолонкаОригинала),
                                    "Замена" + ИмяКолонки, , "Замена: " + ПредставлениеКолонки);
                                ЗаполнитьЗначенияСвойств(КолонкаЗамены, КолонкаОригинала, , "Имя, Заголовок");
                            КонецЦикла;
                        КонецЦикла;
                        ТаблицаЗаписей.Колонки.Вставить(0, "Заменить", Новый ОписаниеТипов("Булево"), "Заменить");
                        СтруктураКоллизий.Вставить(СтрокаТаблицы.Метаданные.Имя, ТаблицаЗаписей);
                    КонецЕсли;
                    НоваяКоллизийнаяЗапись = СтруктураКоллизий[СтрокаТаблицы.Метаданные.Имя].Добавить();
                    Для Каждого КоллекцияРеквизитов Из МассивКоллекцийРеквизитов Цикл
                        Для Каждого МетаРеквизит Из КоллекцияРеквизитов Цикл
                            ИмяКолонки = МетаРеквизит.Имя;
                            ЗначениеРеквизита = МенеджерЗаписи[ИмяКолонки];
                            НоваяКоллизийнаяЗапись["Оригинал" + ИмяКолонки] = КоллизийныйМенеджерЗаписи[ИмяКолонки];
                            Если ЗначениеРеквизита = Ссылка Тогда
                                НоваяКоллизийнаяЗапись["Замена" + ИмяКолонки] = ПравильныйЭлемент;
                            Иначе
                                НоваяКоллизийнаяЗапись["Замена" + ИмяКолонки] = ЗначениеРеквизита;
                            КонецЕсли;
                            КоллизийныйМенеджерЗаписи[ИмяКолонки] = НоваяКоллизийнаяЗапись["Замена" + ИмяКолонки];
                            Если НоваяКоллизийнаяЗапись["Оригинал" + ИмяКолонки] <> НоваяКоллизийнаяЗапись["Замена" + ИмяКолонки] Тогда
                                БылаКоллизия = Истина;
                            КонецЕсли;
                        КонецЦикла;
                    КонецЦикла;
                    Если БылаКоллизия Тогда
                        ЗаполнитьЗначенияСвойств(НоваяКоллизийнаяЗапись, КоллизийныйМенеджерЗаписи);
                        Для Каждого ИмяКолонки Из МассивИзмененныхИзмерений Цикл
                            НоваяКоллизийнаяЗапись[ИмяКолонки] = МенеджерЗаписи[ИмяКолонки];
                        КонецЦикла;
                        НоваяКоллизийнаяЗапись.МенеджерЗамены    = КоллизийныйМенеджерЗаписи;
                        НоваяКоллизийнаяЗапись.МенеджерОригинала = МенеджерЗаписи;
                    Иначе
                        СтруктураКоллизий[СтрокаТаблицы.Метаданные.Имя].Удалить(НоваяКоллизийнаяЗапись);
                        МенеджерЗаписи.Удалить();
                        БылаКоллизия = Истина;
                    КонецЕсли;
                КонецЕсли;
            КонецЕсли;
            
            Если БылаКоллизия Тогда
                БылиИсключения = Ложь;
            Иначе
                БылиИсключения = Не ОбработатьЗаписьРегистра(МенеджерЗаписи, Заменяемые);
            КонецЕсли;
            
            Если Истина
                И БылиИсключения
                И ВыполнятьВТранзакции
            Тогда
                Перейти ~ОТКАТ;
            КонецЕсли;

        Иначе
            Сообщить("Ссылки типа "+СтрокаТаблицы.Метаданные+" не заменяются!!");
        КонецЕсли;
        ОбработкаПрерыванияПользователя();
        Если мФормаИндикатора <> Неопределено Тогда
            мФормаИндикатора.Значение = мФормаИндикатора.Значение + 1;
        Иначе
            Состояние("Выполнено " + Формат(100 * ТаблицаСсылок.Индекс(СтрокаТаблицы) + 1 / ТаблицаСсылок.Количество(), "ЧЦ=5; ЧДЦ=2") + "%");
        КонецЕсли;
    КонецЦикла;
    
    Если Параметры.Объект <> Неопределено Тогда
        Если ОтключатьКонтрольЗаписи Тогда
            Параметры.Объект.ОбменДанными.Загрузка = Истина;
        КонецЕсли;
        Попытка
            Параметры.Объект.Записать();
            Если ОтключатьКонтрольЗаписи Тогда
                ЗаписьЖурналаРегистрации("Запись с флагом Загрузка", УровеньЖурналаРегистрации.Информация, СтрокаТаблицы.Метаданные,
                    СтрокаТаблицы.Данные, "");
            КонецЕсли;
        Исключение
            Сообщить(ИнформацияОбОшибке().Описание, СтатусСообщения.Важное);
            БылиИсключения = Истина;
            Если ВыполнятьВТранзакции Тогда
                Перейти ~ОТКАТ;
            КонецЕсли;
        КонецПопытки;
    КонецЕсли;
    
    МассивЭлементовКУдалению = Новый Массив;
    Для Каждого ЭлементТаблицыРегистра Из СтруктураКоллизий Цикл
        Если ЭлементТаблицыРегистра.Значение.Количество() = 0 Тогда
            МассивЭлементовКУдалению.Добавить(ЭлементТаблицыРегистра.Ключ);
        КонецЕсли;
    КонецЦикла;
    Для Каждого ЭлементКУдалению Из МассивЭлементовКУдалению Цикл
        СтруктураКоллизий.Удалить(ЭлементКУдалению);
    КонецЦикла;
    Если СтруктураКоллизий.Количество() > 0 Тогда
        ФормаЗамещенияВНезависимыхРегистрахСведений = ПолучитьФорму("ФормаЗамещенияВНезависимыхРегистрахСведений");
        ФормаЗамещенияВНезависимыхРегистрахСведений.СтруктураКоллизий = СтруктураКоллизий;
        ФормаЗамещенияВНезависимыхРегистрахСведений.ОткрытьМодально();
    КонецЕсли;

~ОТКАТ:
    Если ВыполнятьВТранзакции Тогда
        Если БылиИсключения Тогда
            ОтменитьТранзакцию();
        Иначе
            ЗафиксироватьТранзакцию();
        КонецЕсли;    
    КонецЕсли;
    Возврат Не БылиИсключения;
15 vicof
 
16.10.13
23:49
На первый взгляд все нормуль. Может какие обязательные реквизиты не заполнены в документе.
16 vicof
 
16.10.13
23:49
Поковыряйся перед записью и при записи этого дока
17 3axap_4
 
16.10.13
23:50
да вроде нет вручную делаю абсолютно те же действия (меняю значения, перепровожу) все ок, ничего лишнего...
18 3axap_4
 
16.10.13
23:50
(16) в том то и дело что выскакивает на всех доках
19 3axap_4
 
16.10.13
23:51
(16) а хотя ты знаешь, не всех, есть опредеенная группа, действительно пойду в этом направлении спасибо!
20 Apokalipsec
 
17.10.13
00:07
посмотри в ЖР ошибки и так какую ошибку он тебе говорит?
21 3axap_4
 
17.10.13
00:22
(20) чёт в жр ничего про ошибки нет, если делать в транзакции то у нее статус - отменено, если без - то завершено, но документ не в том ни в другом случае не сохраняется