Меню

Ошибка при выборе метода контекста записать 1с

Ошибка при вызове метода контекста (Записать)

Я
   3axap_4

16.10.13 — 22:33

Доброго времени суток:

собственно принялся устранять дубли в Бухгалтерии 3.0 скачал обработку  от сюда http://infostart.ru/public/14986/ все хорошо находит дубли находит ссылки но при попытке замены и записи документа начинает ругаться на Ошибка при вызове метода контекста (Записать), как это можно поправить?

Спасибо за внимание!

   3axap_4

1 — 16.10.13 — 22:39

Собственно по коду:

Попытка    

Параметры.Объект.Записать();

Исключение            

Сообщить(ИнформацияОбОшибке().Описание, СтатусСообщения.Важное);

Собственно происходит замена значения реквизита (дубликата) на правильное значение и после этого попытка записи измененного документа где:

Параметры — структура

Параметры.Объект — собственно ДокументОбъект

   3axap_4

2 — 16.10.13 — 22:49

или посоветуйте достойную альтернативу, кроме сам напиши, время поджимает

   vicof

3 — 16.10.13 — 23:15

Сообщить(ТипЗнч(Объект));

   vicof

4 — 16.10.13 — 23:16

Ну или как там в УФ

   3axap_4

5 — 16.10.13 — 23:19

(3) минутку

   3axap_4

6 — 16.10.13 — 23:20

например:

Документ объект: Ввод начальных остатков

   vicof

7 — 16.10.13 — 23:25

Период открыт?

   vicof

8 — 16.10.13 — 23:25

Дата и номер отличны от других документов того же типа?

   vicof

9 — 16.10.13 — 23:26

Объект.ОбменДанными.Загрузка = Истина?

   vicof

10 — 16.10.13 — 23:27

   3axap_4

11 — 16.10.13 — 23:27

(9) Истина

Отличны, в ручную (проставляя те же значения) все отлично перепроводится и сохраняется…

   3axap_4

12 — 16.10.13 — 23:28

(10) искал уже…

   vicof

13 — 16.10.13 — 23:32

Ну давай сюда свой код полностью

   3axap_4

14 — 16.10.13 — 23:36

БылиИсключения = Ложь;

    Если ВыполнятьВТранзакции Тогда

        НачатьТранзакцию();

    КонецЕсли;

    ОбрабатываемаяСсылка = Неопределено;

        
    Параметры = Новый Структура;

        
    Параметры.Вставить(«Объект», Неопределено);    

    СтруктураКоллизий = Новый Структура;

    
    ЕСли мФормаИндикатора<>Неопределено Тогда

        мФормаИндикатора.МаксимальноеЗначение = ТаблицаСсылок.Количество();

        мФормаИндикатора.КомментарийЗначения = «Выполняется замена элементов.» + ЗаголовокИндикации;

        мФормаИндикатора.Значение = 0;

    КонецЕсли;

    
    Для Каждого СтрокаТаблицы Из ТаблицаСсылок Цикл

        
        Ссылка = СтрокаТаблицы.Ссылка;

        
        // **** надо вынести в корень

        Заменяемые = Новый Соответствие;

        Заменяемые.Вставить(Ссылка, ПравильныйЭлемент);

        
        ОбработкаПрерыванияПользователя();

        Сообщить(«Обрабатывается » + СтрокаТаблицы.Данные);

        
        Если ОбрабатываемаяСсылка <> СтрокаТаблицы.Данные Тогда

            Если Истина

                И ОбрабатываемаяСсылка <> Неопределено

                И Не ЛксЛиКлючЗаписиРегистра(ОбрабатываемаяСсылка)

            Тогда

                Если ОтключатьКонтрольЗаписи Тогда

                    Параметры.Объект.ОбменДанными.Загрузка = Истина;

                КонецЕсли;

                
                Попытка

                    Параметры.Объект.Записать(РежимЗаписиДокумента.Проведение);

                Исключение

                    Сообщить(ТипЗнч(Параметры.Объект));

                    Сообщить(ИнформацияОбОшибке().Описание, СтатусСообщения.Важное);

                    БылиИсключения = Истина;

                    Если ВыполнятьВТранзакции Тогда

                        Перейти ~ОТКАТ;

                    КонецЕсли;

                КонецПопытки;

                Параметры.Объект = Неопределено;

            КонецЕсли;

            ОбрабатываемаяСсылка = СтрокаТаблицы.Данные;

            
        КонецЕсли;

        
            
        Если Метаданные.Документы.Содержит(СтрокаТаблицы.Метаданные) Тогда

            
            Если Параметры.Объект = Неопределено Тогда

                Параметры.Объект = СтрокаТаблицы.Данные.ПолучитьОбъект();

            КонецЕсли;

            
            Для Каждого Реквизит Из СтрокаТаблицы.Метаданные.Реквизиты Цикл

                Если Реквизит.Тип.СодержитТип(ТипЗнч(Ссылка)) И Параметры.Объект[Реквизит.Имя] = Ссылка Тогда

                    Параметры.Объект[Реквизит.Имя] = ПравильныйЭлемент;

                КонецЕсли;

            КонецЦикла;

                
            Для Каждого ТЧ ИЗ СтрокаТаблицы.Метаданные.ТабличныеЧасти Цикл

                Для Каждого Реквизит Из ТЧ.Реквизиты Цикл

                    Если Реквизит.Тип.СодержитТип(ТипЗнч(Ссылка)) Тогда

                        СтрокаТабЧасти = Параметры.Объект[ТЧ.Имя].Найти(Ссылка, Реквизит.Имя);

                        Пока СтрокаТабЧасти <> Неопределено Цикл

                            СтрокаТабЧасти[Реквизит.Имя] = ПравильныйЭлемент;

                            СтрокаТабЧасти = Параметры.Объект[ТЧ.Имя].Найти(Ссылка, Реквизит.Имя);

                        КонецЦикла;

                    КонецЕсли;

                КонецЦикла;

            КонецЦикла;

            
            Для Каждого Движение ИЗ СтрокаТаблицы.Метаданные.Движения Цикл

                БылиИсключения = Не ОбработатьЗаписьРегистра(Параметры.Объект.Движения[Движение.Имя], Заменяемые);

                Если Истина

                    И БылиИсключения

                    И ВыполнятьВТранзакции

                Тогда

                    Перейти ~ОТКАТ;

                КонецЕсли;

            КонецЦикла;

            
            Для Каждого Последовательность ИЗ Метаданные.Последовательности Цикл

                Если Последовательность.Документы.Содержит(СтрокаТаблицы.Метаданные) Тогда

                    НадоЗаписывать = Ложь;

                    НаборЗаписи = Последовательности[Последовательность.Имя].СоздатьНаборЗаписей();

                    НаборЗаписи.Отбор.Регистратор.Установить(СтрокаТаблицы.Данные);

                    НаборЗаписи.Прочитать();

                    Если НаборЗаписи.Количество() = 0 Тогда

                        Продолжить;

                    КонецЕсли;

                    Для Каждого Измерение ИЗ Последовательность.Измерения Цикл

                        Если Истина

                            И Измерение.Тип.СодержитТип(ТипЗнч(Ссылка))

                            И НаборЗаписи[0][Измерение.Имя] = Ссылка

                        Тогда

                            НаборЗаписи[0][Измерение.Имя] = ПравильныйЭлемент;

                            НадоЗаписывать = Истина;

                        КонецЕсли;

                    КонецЦикла;

                    Если НадоЗаписывать Тогда

                        Если ОтключатьКонтрольЗаписи Тогда

                            НаборЗаписи.ОбменДанными.Загрузка = Истина;

                        КонецЕсли;

                        Попытка

                            НаборЗаписи.Записать();

                        Исключение

                            Сообщить(ИнформацияОбОшибке().Описание, СтатусСообщения.Важное);

                            БылиИсключения = Истина;

                            Если ВыполнятьВТранзакции Тогда

                                Перейти ~ОТКАТ;

                            КонецЕсли;

                        КонецПопытки;

                    КонецЕсли;

                КонецЕсли;

            КонецЦикла;

            
        ИначеЕсли Метаданные.Справочники.Содержит(СтрокаТаблицы.Метаданные) Тогда

            
            Если Параметры.Объект = Неопределено Тогда

                Параметры.Объект = СтрокаТаблицы.Данные.ПолучитьОбъект();

            КонецЕсли;

            
            Если СтрокаТаблицы.Метаданные.Владельцы.Содержит(Ссылка.Метаданные()) И Параметры.Объект.Владелец = Ссылка Тогда

                Параметры.Объект.Владелец = ПравильныйЭлемент;

            КонецЕсли;

            
            Если СтрокаТаблицы.Метаданные.Иерархический И Параметры.Объект.Родитель = Ссылка Тогда

                Параметры.Объект.Родитель = ПравильныйЭлемент;

            КонецЕсли;

            
            Для Каждого Реквизит Из СтрокаТаблицы.Метаданные.Реквизиты Цикл

                Если Реквизит.Тип.СодержитТип(ТипЗнч(Ссылка)) И Параметры.Объект[Реквизит.Имя] = Ссылка Тогда

                    Параметры.Объект[Реквизит.Имя] = ПравильныйЭлемент;

                КонецЕсли;

            КонецЦикла;

            
            Для Каждого ТЧ ИЗ СтрокаТаблицы.Метаданные.ТабличныеЧасти Цикл

                Для Каждого Реквизит Из ТЧ.Реквизиты Цикл

                    Если Реквизит.Тип.СодержитТип(ТипЗнч(Ссылка)) Тогда

                        СтрокаТабЧасти = Параметры.Объект[ТЧ.Имя].Найти(Ссылка, Реквизит.Имя);

                        Пока СтрокаТабЧасти <> Неопределено Цикл

                            СтрокаТабЧасти[Реквизит.Имя] = ПравильныйЭлемент;

                            СтрокаТабЧасти = Параметры.Объект[ТЧ.Имя].Найти(Ссылка, Реквизит.Имя);

                        КонецЦикла;

                    КонецЕсли;

                КонецЦикла;

            КонецЦикла;

            
        ИначеЕсли Метаданные.ПланыВидовХарактеристик.Содержит(СтрокаТаблицы.Метаданные)

                  ИЛИ Метаданные.ПланыСчетов.Содержит(СтрокаТаблицы.Метаданные)

                  ИЛИ Метаданные.ПланыВидовРасчета.Содержит(СтрокаТаблицы.Метаданные)

                  ИЛИ Метаданные.Задачи.Содержит(СтрокаТаблицы.Метаданные)

                  ИЛИ Метаданные.БизнесПроцессы.Содержит(СтрокаТаблицы.Метаданные) Тогда

            
            Если Параметры.Объект = Неопределено Тогда

                Параметры.Объект = СтрокаТаблицы.Данные.ПолучитьОбъект();

            КонецЕсли;

                        
            Для Каждого Реквизит Из СтрокаТаблицы.Метаданные.Реквизиты Цикл

                Если Реквизит.Тип.СодержитТип(ТипЗнч(Ссылка)) И Параметры.Объект[Реквизит.Имя] = Ссылка Тогда

                    Параметры.Объект[Реквизит.Имя] = ПравильныйЭлемент;

                КонецЕсли;

            КонецЦикла;

            
            Для Каждого ТЧ ИЗ СтрокаТаблицы.Метаданные.ТабличныеЧасти Цикл

                Для Каждого Реквизит Из ТЧ.Реквизиты Цикл

                    Если Реквизит.Тип.СодержитТип(ТипЗнч(Ссылка)) Тогда

                        СтрокаТабЧасти = Параметры.Объект[ТЧ.Имя].Найти(Ссылка, Реквизит.Имя);

                        Пока СтрокаТабЧасти <> Неопределено Цикл

                            СтрокаТабЧасти[Реквизит.Имя] = ПравильныйЭлемент;

                            СтрокаТабЧасти = Параметры.Объект[ТЧ.Имя].Найти(Ссылка, Реквизит.Имя);

                        КонецЦикла;                            

                    КонецЕсли;

                КонецЦикла;

            КонецЦикла;    

            
        ИначеЕсли Метаданные.Константы.Содержит(СтрокаТаблицы.Метаданные) Тогда

            
            Константы[СтрокаТаблицы.Метаданные.Имя].Установить(ПравильныйЭлемент);

            
            
        ИначеЕсли Метаданные.РегистрыСведений.Содержит(СтрокаТаблицы.Метаданные) Тогда    

            
            МенеджерЗаписи            = РегистрыСведений[СтрокаТаблицы.Метаданные.Имя].СоздатьМенеджерЗаписи();

            КоллизийныйМенеджерЗаписи = РегистрыСведений[СтрокаТаблицы.Метаданные.Имя].СоздатьМенеджерЗаписи();

            Периодический = (СтрокаТаблицы.Метаданные.ПериодичностьРегистраСведений <> Метаданные.СвойстваОбъектов.ПериодичностьРегистраСведений.Непериодический);

            Если Периодический Тогда

                МенеджерЗаписи.Период            = СтрокаТаблицы.Данные.Период;

                КоллизийныйМенеджерЗаписи.Период = СтрокаТаблицы.Данные.Период;

            КонецЕсли;

            МассивИзмененныхИзмерений = Новый Массив;

            Для каждого Рекв Из СтрокаТаблицы.Метаданные.Измерения Цикл

                ЗначениеИзмерения = СтрокаТаблицы.Данные[Рекв.Имя];

                МенеджерЗаписи[Рекв.Имя] = ЗначениеИзмерения;

                Если ЗначениеИзмерения = Ссылка Тогда

                    КоллизийныйМенеджерЗаписи[Рекв.Имя] = ПравильныйЭлемент;

                    МассивИзмененныхИзмерений.Добавить(Рекв.Имя);

                Иначе

                    КоллизийныйМенеджерЗаписи[Рекв.Имя] = ЗначениеИзмерения;

                КонецЕсли;

            КонецЦикла;

            
            БылаКоллизия = Ложь;

            Если МассивИзмененныхИзмерений.Количество() > 0 Тогда

                КоллизийныйМенеджерЗаписи.Прочитать();

                Если КоллизийныйМенеджерЗаписи.Выбран() Тогда

                    МенеджерЗаписи.Прочитать();

                    МассивКоллекцийРеквизитов = Новый Массив;

                    МассивКоллекцийРеквизитов.Добавить(СтрокаТаблицы.Метаданные.Ресурсы);

                    МассивКоллекцийРеквизитов.Добавить(СтрокаТаблицы.Метаданные.Реквизиты);

                    Если Не СтруктураКоллизий.Свойство(СтрокаТаблицы.Метаданные.Имя) Тогда

                        ТаблицаЗаписей = РегистрыСведений[СтрокаТаблицы.Метаданные.Имя].СоздатьНаборЗаписей().Выгрузить();

                        ТаблицаЗаписей.Колонки.Добавить(«МенеджерЗамены»);

                        ТаблицаЗаписей.Колонки.Добавить(«МенеджерОригинала»);

                        Для Каждого КоллекцияРеквизитов Из МассивКоллекцийРеквизитов Цикл

                            Для Каждого МетаРеквизит Из КоллекцияРеквизитов Цикл

                                ИмяКолонки = МетаРеквизит.Имя;

                                ПредставлениеКолонки = МетаРеквизит.Представление();

                                КолонкаОригинала = ТаблицаЗаписей.Колонки[ИмяКолонки];

                                КолонкаОригинала.Имя       = «Оригинал»   + ИмяКолонки;

                                КолонкаОригинала.Заголовок = «Оригинал: » + ПредставлениеКолонки;

                                КолонкаЗамены = ТаблицаЗаписей.Колонки.Вставить(ТаблицаЗаписей.Колонки.Индекс(КолонкаОригинала),

                                    «Замена» + ИмяКолонки, , «Замена: » + ПредставлениеКолонки);

                                ЗаполнитьЗначенияСвойств(КолонкаЗамены, КолонкаОригинала, , «Имя, Заголовок»);

                            КонецЦикла;

                        КонецЦикла;

                        ТаблицаЗаписей.Колонки.Вставить(0, «Заменить», Новый ОписаниеТипов(«Булево»), «Заменить»);

                        СтруктураКоллизий.Вставить(СтрокаТаблицы.Метаданные.Имя, ТаблицаЗаписей);

                    КонецЕсли;

                    НоваяКоллизийнаяЗапись = СтруктураКоллизий[СтрокаТаблицы.Метаданные.Имя].Добавить();

                    Для Каждого КоллекцияРеквизитов Из МассивКоллекцийРеквизитов Цикл

                        Для Каждого МетаРеквизит Из КоллекцияРеквизитов Цикл

                            ИмяКолонки = МетаРеквизит.Имя;

                            ЗначениеРеквизита = МенеджерЗаписи[ИмяКолонки];

                            НоваяКоллизийнаяЗапись[«Оригинал» + ИмяКолонки] = КоллизийныйМенеджерЗаписи[ИмяКолонки];

                            Если ЗначениеРеквизита = Ссылка Тогда

                                НоваяКоллизийнаяЗапись[«Замена» + ИмяКолонки] = ПравильныйЭлемент;

                            Иначе

                                НоваяКоллизийнаяЗапись[«Замена» + ИмяКолонки] = ЗначениеРеквизита;

                            КонецЕсли;

                            КоллизийныйМенеджерЗаписи[ИмяКолонки] = НоваяКоллизийнаяЗапись[«Замена» + ИмяКолонки];

                            Если НоваяКоллизийнаяЗапись[«Оригинал» + ИмяКолонки] <> НоваяКоллизийнаяЗапись[«Замена» + ИмяКолонки] Тогда

                                БылаКоллизия = Истина;

                            КонецЕсли;

                        КонецЦикла;

                    КонецЦикла;

                    Если БылаКоллизия Тогда

                        ЗаполнитьЗначенияСвойств(НоваяКоллизийнаяЗапись, КоллизийныйМенеджерЗаписи);

                        Для Каждого ИмяКолонки Из МассивИзмененныхИзмерений Цикл

                            НоваяКоллизийнаяЗапись[ИмяКолонки] = МенеджерЗаписи[ИмяКолонки];

                        КонецЦикла;

                        НоваяКоллизийнаяЗапись.МенеджерЗамены    = КоллизийныйМенеджерЗаписи;

                        НоваяКоллизийнаяЗапись.МенеджерОригинала = МенеджерЗаписи;

                    Иначе

                        СтруктураКоллизий[СтрокаТаблицы.Метаданные.Имя].Удалить(НоваяКоллизийнаяЗапись);

                        МенеджерЗаписи.Удалить();

                        БылаКоллизия = Истина;

                    КонецЕсли;

                КонецЕсли;

            КонецЕсли;

            
            Если БылаКоллизия Тогда

                БылиИсключения = Ложь;

            Иначе

                БылиИсключения = Не ОбработатьЗаписьРегистра(МенеджерЗаписи, Заменяемые);

            КонецЕсли;

            
            Если Истина

                И БылиИсключения

                И ВыполнятьВТранзакции

            Тогда

                Перейти ~ОТКАТ;

            КонецЕсли;

        Иначе

            Сообщить(«Ссылки типа «+СтрокаТаблицы.Метаданные+» не заменяются!!»);

        КонецЕсли;

        ОбработкаПрерыванияПользователя();

        Если мФормаИндикатора <> Неопределено Тогда

            мФормаИндикатора.Значение = мФормаИндикатора.Значение + 1;

        Иначе

            Состояние(«Выполнено » + Формат(100 * ТаблицаСсылок.Индекс(СтрокаТаблицы) + 1 / ТаблицаСсылок.Количество(), «ЧЦ=5; ЧДЦ=2») + «%»);

        КонецЕсли;

    КонецЦикла;

    
    Если Параметры.Объект <> Неопределено Тогда

        Если ОтключатьКонтрольЗаписи Тогда

            Параметры.Объект.ОбменДанными.Загрузка = Истина;

        КонецЕсли;

        Попытка

            Параметры.Объект.Записать();

            Если ОтключатьКонтрольЗаписи Тогда

                ЗаписьЖурналаРегистрации(«Запись с флагом Загрузка», УровеньЖурналаРегистрации.Информация, СтрокаТаблицы.Метаданные,

                    СтрокаТаблицы.Данные, «»);

            КонецЕсли;

        Исключение

            Сообщить(ИнформацияОбОшибке().Описание, СтатусСообщения.Важное);

            БылиИсключения = Истина;

            Если ВыполнятьВТранзакции Тогда

                Перейти ~ОТКАТ;

            КонецЕсли;

        КонецПопытки;

    КонецЕсли;

    
    МассивЭлементовКУдалению = Новый Массив;

    Для Каждого ЭлементТаблицыРегистра Из СтруктураКоллизий Цикл

        Если ЭлементТаблицыРегистра.Значение.Количество() = 0 Тогда

            МассивЭлементовКУдалению.Добавить(ЭлементТаблицыРегистра.Ключ);

        КонецЕсли;

    КонецЦикла;

    Для Каждого ЭлементКУдалению Из МассивЭлементовКУдалению Цикл

        СтруктураКоллизий.Удалить(ЭлементКУдалению);

    КонецЦикла;

    Если СтруктураКоллизий.Количество() > 0 Тогда

        ФормаЗамещенияВНезависимыхРегистрахСведений = ПолучитьФорму(«ФормаЗамещенияВНезависимыхРегистрахСведений»);

        ФормаЗамещенияВНезависимыхРегистрахСведений.СтруктураКоллизий = СтруктураКоллизий;

        ФормаЗамещенияВНезависимыхРегистрахСведений.ОткрытьМодально();

    КонецЕсли;

~ОТКАТ:

    Если ВыполнятьВТранзакции Тогда

        Если БылиИсключения Тогда

            ОтменитьТранзакцию();

        Иначе

            ЗафиксироватьТранзакцию();

        КонецЕсли;    

    КонецЕсли;

    Возврат Не БылиИсключения;

   vicof

15 — 16.10.13 — 23:49

На первый взгляд все нормуль. Может какие обязательные реквизиты не заполнены в документе.

   vicof

16 — 16.10.13 — 23:49

Поковыряйся перед записью и при записи этого дока

   3axap_4

17 — 16.10.13 — 23:50

да вроде нет вручную делаю абсолютно те же действия (меняю значения, перепровожу) все ок, ничего лишнего…

   3axap_4

18 — 16.10.13 — 23:50

(16) в том то и дело что выскакивает на всех доках

   3axap_4

19 — 16.10.13 — 23:51

(16) а хотя ты знаешь, не всех, есть опредеенная группа, действительно пойду в этом направлении спасибо!

   Apokalipsec

20 — 17.10.13 — 00:07

посмотри в ЖР ошибки и так какую ошибку он тебе говорит?

  

3axap_4

21 — 17.10.13 — 00:22

(20) чёт в жр ничего про ошибки нет, если делать в транзакции то у нее статус — отменено, если без — то завершено, но документ не в том ни в другом случае не сохраняется

В платформе 1С сообщения об ошибках бывают достаточно запутаны, и без должных навыков разобраться в причинах достаточно сложно. Вот и сообщение об ошибке при вызове контекста может ввести в ступор начинающего разработчика. Однако в подавляющем большинстве случаев мы видим подобное сообщение, если разработчик допустил ошибку в своем коде. Причем речь зачастую идет не об орфографических ошибках, а о логических.

Исправляем ситуацию

Чтобы избавиться от этого неприятного сообщения об ошибке при вызове метода контекста, следует понимать, что контекстом называют методы платформы 1С. Значит в определенной строке кода воспользовались методом с неверными параметрами или вызвали его не от того владельца. Всегда внимательно и полностью читайте сообщения об ошибках – часто в них содержится указание на строку и метод, вызвавший ошибку. Это поможет сэкономить время на отладку и поиск проблемного места в коде.

Рассмотрим действия разработчика на примере со специально допущенной ошибкой. Мы запускаем на исполнение нижеприведенный кусок кода с запросом, в котором забыли дописать условие отбора. Компилятор 1С пропускает такую процедуру, так как орфографических ошибок в написании команд мы не допустили. Однако в режиме предприятия нас ждет такое сообщение об ошибке:


	 Запрос = Новый Запрос;
	 Запрос.Текст =
	         "ВЫБРАТЬ
	          |        Номенклатура.Ссылка КАК Ссылка,
	          |        Номенклатура.ВерсияДанных КАК ВерсияДанных,
	          |        Номенклатура.ПометкаУдаления КАК ПометкаУдаления,
	          |        Номенклатура.Родитель КАК Родитель,
	          |        Номенклатура.ЭтоГруппа КАК ЭтоГруппа,
	          |        Номенклатура.Код КАК Код,
	          |        Номенклатура.Наименование КАК Наименование,
	          |        Номенклатура.Артикул КАК Артикул,
	          |        Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
	          |        Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры,
	          |        Номенклатура.Предопределенный КАК Предопределенный,
	          |        Номенклатура.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных
	          |ИЗ
	          |        Справочник.Номенклатура КАК Номенклатура
	          |ГДЕ
	          |         ";
	 РезультатЗапроса = Запрос.Выполнить();
	 ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	 Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
	 КонецЦикла;
Рис.1 Запускаем на исполнение нижеприведенный кусок кода с запросом, в котором забыли дописать условие отбора
Рис.1 Запускаем на исполнение нижеприведенный кусок кода с запросом, в котором забыли дописать условие отбора

Приведенный текст ошибки программисту 1С скажет, что в модуле формы обработки «ЧтениеЗаписьXML на 152 строчке кода не может выполниться запрос. Причина в том, что на 17 строчке запроса нет чего-то, что ждал компилятор. Таким образом, чтобы убрать подобное сообщение, необходимо выяснить, что там должно быть и написать недостающий код.

Увидев вышеприведенный кусок кода, разработчик заметит, что в запросе есть служебное слово «ГДЕ», дающее сигнал 1С, что дальше будет условие. Но мы забыли дописать его и, естественно, система с помощью сообщения об ошибке спрашивает нас – «а где условие?». Чтобы исправить эту ситуацию необходимо либо убрать оператор «ГДЕ» из запроса, либо добавить условие.

Но ошибки могут быть не только в текстах запросов. Допустим, мы хотим выбрать всю номенклатуру и узнать, входит ли она в определенную группу. Проверка происходит с помощью метода «ПринадлежитЭлементу» и его параметра, который должен быть типа СправочникСсылка. Мы опять допускаем ошибку и вместо ссылки в параметр метода помещаем строку, содержащую имя переменной.


	 Запрос = Новый Запрос;
	            Запрос.Текст =
	                       "ВЫБРАТЬ
	                        |          Номенклатура.Ссылка КАК Ссылка,
	                        |          Номенклатура.ВерсияДанных КАК ВерсияДанных,
	                        |          Номенклатура.ПометкаУдаления КАК ПометкаУдаления,
	                        |          Номенклатура.Родитель КАК Родитель,
	                        |          Номенклатура.ЭтоГруппа КАК ЭтоГруппа,
	                        |          Номенклатура.Код КАК Код,
	                        |          Номенклатура.Наименование КАК Наименование,
	                        |          Номенклатура.Артикул КАК Артикул,
	                        |          Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
	                        |          Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры,
	                        |          Номенклатура.Предопределенный КАК Предопределенный,
	                        |          Номенклатура.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных
	                        |ИЗ
	                        |          Справочник.Номенклатура КАК Номенклатура
	                        |ГДЕ
	                        |          НЕ Номенклатура.ЭтоГруппа ";
	 НужнаяГруппаЭлементов = Справочники.Номенклатура.НайтиПоНаименованию("Мебель");
	 РезультатЗапроса = Запрос.Выполнить();
	 ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	 Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
	 Сообщить(ВыборкаДетальныеЗаписи.Ссылка.ПринадлежитЭлементу("НужнаяГруппаЭлементов"));
	 КонецЦикла;
Рис.2 Мы опять допускаем ошибку и вместо ссылки в параметр метода помещаем строку, содержащую имя переменной
Рис.2 Мы опять допускаем ошибку и вместо ссылки в параметр метода помещаем строку, содержащую имя переменной

1С выдает настолько же информативное сообщение, из которого мы понимаем, что на 158 строке у 1 параметра неправильный тип. Но что же делать, если мы не знаем, какой тип должен быть? В этом нам поможет Синтакс-помощник, встроенный в платформу 1С.

Рис.3 Синтакс-помощник
Рис.3 Синтакс-помощник

В конфигураторе находим строку и метод, на который указывало сообщение об ошибке, и нажимаем на него правой кнопкой мыши. Выбираем пункт «Поиск в синтакс-помощнике» и платформа самостоятельно ищет справочную информацию по выделенному методу. В справке мы видим не только подробное описание параметров и самого метода, но и пример. Сверив пример с нашим кодом, приходит понимание, что кавычки не нужны и без них все работает.

Рис.4 Сверив пример с нашим кодом, приходит понимание, что кавычки не нужны и без них все работает
Рис.4 Сверив пример с нашим кодом, приходит понимание, что кавычки не нужны и без них все работает

Чаще всего причиной подобных ошибок выступают следующие факторы:

  1. Невнимательность;
  2. Отсутствие опыта или знаний;
  3. Несогласованность действий разработчиков друг с другом;
  4. Изменения в методах контекста в новых версиях платформы.

Но ошибки при разработке ПО случаются постоянно, поскольку иногда ошибаются даже специалисты с многолетним опытом. Самое главное – уметь исправлять их и учиться на них. Постепенно вы будете видеть сообщения об ошибках все реже и научитесь замечать подобные «опечатки» еще до запуска 1С.

Ошибка Записать(РежимЗаписиДокумента.ОтменаПроведения)

Автор dimanuga, 31 окт 2018, 18:14

0 Пользователей и 1 гость просматривают эту тему.

К кнопке на форме привязана отмена проведения:

&НаКлиенте
Процедура ОтменитьПроведение(Команда)
   ПоказатьВопрос(Новый ОписаниеОповещения(«ПередОтменойПроведения», ЭтотОбъект),
                                                        «Отменить проведение документов?», РежимДиалогаВопрос.ДаНет);
КонецПроцедуры

&НаКлиенте
Процедура ПередОтменойПроведения(Результат, Отказ) Экспорт
   Если Результат = КодВозвратаДиалога.Да Тогда
      ВызовОтменыПроведения();
      КонецЕсли;
КонецПроцедуры 

&НаСервере
Процедура ВызовОтменыПроведения()Экспорт
   ЭтаФорма.Записать(РежимЗаписиДокумента.ОтменаПроведения);
        ЭтаФорма.Модифицированность = Ложь;
        Закрыть();
КонецПроцедуры 

Ошибка:
{Документ.ПоступлениеЖивотных.Форма.ФормаДокумента.Форма(242)}: Ошибка при вызове метода контекста (Записать)
      ЭтаФорма.Записать(РежимЗаписиДокумента.ОтменаПроведения);
по причине:
Несоответствие типов (параметр номер ‘1’)
Несоответствие типов (параметр номер ‘1’)

В чем моя ошибка?


Скорее всего, потому что у формы записать может быть только так ЭтаФорма.Записать();
Если передавать какой либо параметр, то только через структуру, а не как обычно с объектами.
Читайте справку.

Помог, нажми спасибо. Не помог, нажми спасибо 🙂
Если у Вас есть проблема, то её уже кто то решил @Yandex, @Google


Ну хорошо, а как передать РежимЗаписи.ОтменаРедактирования ?
Можно на примере ?


Цитата: dimanuga от 31 окт 2018, 19:42
Ну хорошо, а как передать РежимЗаписи.ОтменаРедактирования ?
Можно на примере ?

Ни разу не делал, попробуй так
Структура.Вставить(«РежимЗаписиДокумента», РежимЗаписиДокумента.ОтменаПроведения);

Помог, нажми спасибо. Не помог, нажми спасибо 🙂
Если у Вас есть проблема, то её уже кто то решил @Yandex, @Google


Почему и зачем ЭтаФорма, а не ЭтотОбъект?
Ну да ладно.

ЭтаФорма.Записать(Новый Структура("РежимЗаписи", РежимЗаписиДокумента.ОтменаПроведения));


ЭтаФорма.Записать(Новый Структура(«РежимЗаписи», РежимЗаписиДокумента.ОтменаПроведения));

{Документ.ПоступлениеЖивотных.Форма.ФормаДокумента.Форма(262)}: Поле объекта недоступно для записи (РежимЗаписиДокумента)
   РежимЗаписиДокумента = ПараметрыЗаписи;

Или так:

ПараметрыФ = Новый Структура(«РежимЗаписиДокумента», РежимЗаписиДокумента.ОтменаПроведения);
      ЭтаФорма.Записать(ПараметрыФ);

{Документ.ПоступлениеЖивотных.Форма.ФормаДокумента.Форма(266)}: Поле объекта недоступно для записи (РежимЗаписиДокумента)
   РежимЗаписиДокумента = ПараметрыЗаписи;


РежимЗаписиДокумента = ПараметрыЗаписи;
Ты уверен, что этого нигде не писал? Например в строке 262 или 266 :kmtu:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
Процедура ВыполнитьФормированиеПлан()
        //Состояние("Выборка данных (план)...");
    Запр = Новый Запрос;
    Запр.Текст = 
    "ВЫБРАТЬ
    |   осиПЭОПриказ1.Наименование КАК НоменклатураПЭО,
    |   осиПЭОПриказ1.Количество * осиПЭОПриказ1.Цена * 1000 КАК Сумма,
    |   осиПЭОПриказ1.Подразделение КАК ПодразделениеПЭО,
    |   ВЫБОР
    |       КОГДА осиПЭОПриказ1.Пассив = &Строительство
    |           ТОГДА &Счет106
    |       КОГДА осиПЭОПриказ1.Пассив = &Приобретение
    |           ТОГДА &Счет107
    |       КОГДА осиПЭОПриказ1.Пассив = &ИнвестПроекты
    |           ТОГДА &Счет108
    |   КОНЕЦ КАК СчетПЭО,
    |   ВЫБОР
    |       КОГДА осиПЭОПриказ1.Пассив = &Строительство
    |           ТОГДА NULL
    |       ИНАЧЕ осиПЭОПриказ1.Количество
    |   КОНЕЦ КАК Количество
    |ИЗ
    |   РегистрСведений.осиПЭОПриказ1 КАК осиПЭОПриказ1
    |ГДЕ
    |   осиПЭОПриказ1.Период МЕЖДУ &НачДата И &КонДата
    |   И (осиПЭОПриказ1.Пассив = &Приобретение
    |           ИЛИ осиПЭОПриказ1.Пассив = &Строительство ИЛИ осиПЭОПриказ1.Пассив = &ИнвестПроекты)
    |   И осиПЭОПриказ1.Приоритет = 0";
    Запр.УстановитьПараметр("НачДата", НачалоМесяца(Объект.ЗаПериод));
    Запр.УстановитьПараметр("КонДата", КонецМесяца(Объект.ЗаПериод));
    Запр.УстановитьПараметр("Приобретение", ПолучитьЭлементСправочникаПоРеквизиту("осиПЭОПассив", "Наименование", "_Приобретение оборудования"));
    Запр.УстановитьПараметр("Строительство", ПолучитьЭлементСправочникаПоРеквизиту("осиПЭОПассив", "Наименование", "Капитальное строительство"));
    Запр.УстановитьПараметр("ИнвестПроекты", ПолучитьЭлементСправочникаПоРеквизиту("осиПЭОПассив", "Наименование", "_Инвестиционные проекты"));
    Запр.УстановитьПараметр("Счет106", ПолучитьЭлемент("ПланСчетов", "Инт_Управленческий2", "Код", "106"));
    Запр.УстановитьПараметр("Счет107", ПолучитьЭлемент("ПланСчетов", "Инт_Управленческий2", "Код", "107"));
    Запр.УстановитьПараметр("Счет108", ПолучитьЭлемент("ПланСчетов", "Инт_Управленческий2", "Код", "108"));
    
    ТЗ=Запр.Выполнить().Выгрузить();
 
    Выборка = Запр.Выполнить().Выбрать();
    
    
    //Состояние("Формирование проводок (план)...");
    Сценарий = ПолучитьЭлемент("Справочник", "Инт_Сценарии", "Наименование", "План");
    
    ЦФО = ПолучитьЭлемент("Справочник", "Инт_ЦФО", "Наименование", "ЦЗ ""Оренбургские минералы""");
    ВидСубконтоНоменклатураПЭО = ПолучитьЭлемент("ПланВидовХарактеристик", "ИНТ_Аналитика", "Код", "00000000042");//Номенклатура ПЭО
    ВидСубконтоПодразделенияПЭО = ПолучитьЭлемент("ПланВидовХарактеристик", "ИНТ_Аналитика", "Код", "00000000053");//Подразделения ПЭО
    
    Счет00 = ПолучитьЭлемент("ПланСчетов", "Инт_Управленческий2", "Код", "0"); 
    
    Проформа = ПолучитьПроформу(Сценарий).ПолучитьОбъект();
    ДвиженияУпр2 = Проформа.Движения.Инт_Управленческий2;
     ДвиженияУпр2.Очистить();
    
    Пока Выборка.Следующий() Цикл
        Проводка = ДвиженияУпр2.Добавить();
        Проводка.Период = КонецМесяца(Объект.ЗаПериод);
        Проводка.Содержание = "авт.загр.";
        Проводка.СчетДт = Выборка.СчетПЭО;
        Проводка.СчетКт = Счет00;
        Проводка.Сценарий = Сценарий;
        Проводка.Сумма = Выборка.Сумма;
        Проводка.ЦФОДт = ЦФО;
        Если Выборка.Количество<> 0  Тогда
            Проводка.КоличествоДт = Выборка.Количество;
        КонецЕсли;
                
        Проводка.Субконто1Дт= Выборка.НоменклатураПЭО;
        Проводка.Субконто2Дт = Выборка.ПодразделениеПЭО;                   
    КонецЦикла;
    
    ДвиженияУпр2.Записать();
            //Состояние();
    
КонецПроцедуры

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

А вот еще интересные материалы:

  • Яшка сломя голову остановился исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • Ошибка при включении мультиварки е1
  • Ошибка при выборе метода активации кошелек