Имя: Пароль:
1C
1С v8
Значение не является значением объектного типа
,
0 Vbifers
 
03.07.17
22:06
Добрый вечер! Учусь по книге Радченко, застрял на 23 занятии. Все делал по книге. При попытке выполнить обмен, выдает ошибку:
{Обработка.ОбменДанными.Форма.Форма.Форма(18)}: Значение не является значением объектного типа (ПрочитатьСообщениеСИзменениями)
            
Объект.ПрочитатьСообщениеСИзменениями();
&НаКлиенте
Процедура ВыполнитьОбмен(Команда)
    ВыполнитьОбменНаСервере();
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ВыполнитьОбменНаСервере() Экспорт
    ВыборкаУзлов = ПланыОбмена.Филиалы.Выбрать();
    
    Пока ВыборкаУзлов.Следующий() Цикл
        
        // Произвести обмен данными со всеми узлами, кроме текущего (ЭтотУзел).
        Если ВыборкаУзлов.Ссылка <> ПланыОбмена.Филиалы.ЭтотУзел() Тогда
            Объект = ВыборкаУзлов.ПолучитьОбъект();
            
            // Получить сообщение.
            Объект.ПрочитатьСообщениеСИзменениями();  //здесь отладчик выбрасывает, выдает тип Неопределено
            
            // Сформировать сообщение.
            Объект.ЗаписатьСообщениеСИзменениями();
            
        КонецЕсли;
        
    КонецЦикла;
    
КонецПроцедуры

В чем может быть ошибка?
1 AlvlSpb
 
03.07.17
22:11
Объект = ВыборкаУзлов.ПолучитьОбъект();
Объект - назови по другому, НашОбъект например.
2 Vbifers
 
03.07.17
22:31
Извиняюсь, не тот код скинул. Это я уже пытался по-другому переменную назвать, не помогло. Вот, как по книге:


&НаКлиенте
Процедура ВыполнитьОбмен(Команда)
    ВыполнитьОбменНаСервере();
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ВыполнитьОбменНаСервере() Экспорт
    ВыборкаУзлов = ПланыОбмена.Филиалы.Выбрать();
    
    Пока ВыборкаУзлов.Следующий() Цикл
        
        // Произвести обмен данными со всеми узлами, кроме текущего (ЭтотУзел).
        Если ВыборкаУзлов.Ссылка <> ПланыОбмена.Филиалы.ЭтотУзел() Тогда
            УзелОбъект = ВыборкаУзлов.ПолучитьОбъект();
            
            // Получить сообщение.
            УзелОбъект.ПрочитатьСообщениеСИзменениями();
            
            // Сформировать сообщение.
            УзелОбъект.ЗаписатьСообщениеСИзменениями();
            
        КонецЕсли;
        
    КонецЦикла;
    
КонецПроцедуры

Ошибка та же(
3 AlvlSpb
 
03.07.17
22:36
(2) УзелОбъект.ПрочитатьСообщениеСИзменениями();
Посмотри существует ли процедура ПрочитатьСообщениеСИзменениями() в модуле объекта и, если существует, стоит ли Экспорт
4 AlvlSpb
 
03.07.17
22:39
Стоп. Вот кажется ошибка:
УзелОбъект = ВыборкаУзлов.ПолучитьОбъект();
Скорей всего должно быть УзелОбъект = ВыборкаУзлов.Ссылка.ПолучитьОбъект();
5 Vbifers
 
04.07.17
07:33
Подставил ССылка, теперь пишет: Объект не найден

Да, ПрочитатьСообщениеСИзменениями() в модуле объекта ПланыОбмена.Филиалы существует, вот :

    Процедура ПрочитатьСообщениеСИзменениями() Экспорт
        
        Каталог = КаталогВременныхФайлов();
        
        // Сформировать имя файла.
        ИмяФайла = Каталог + ?(Прав(Каталог, 1) = "\", "", "\") + "Message" + СокрЛП(Ссылка.Код) + "_" +
                                    СокрЛП(ПланыОбмена.Филиалы.ЭтотУзел().Код) + ".xml";
                                    
        Файл = Новый Файл(ИмяФайла);
        Если Не Файл.Существует() Тогда
            Возврат;
        КонецЕсли;
        
        // *** Чтение документов XML
        // Попытаться открыть файл.
        ЧтениеXML = Новый ЧтениеXML;
        Попытка
            ЧтениеXML.ОткрытьФайл(ИмяФайла);
            
        Исключение
            Сообщение = Новый СообщениеПользователю;
            Сообщение.Текст = "Невозможно открыть файл обмена данными.";
            Сообщение.Сообщить();
            
            Возврат;
            
        КонецПопытки;
        
        Сообщение = Новый СообщениеПользователю;
        Сообщение.Текст = "-------- Загрузка из " + Строка(ЭтотОбъект) + " ------------";
        Сообщение.Сообщить();
        Сообщение = Новый СообщениеПользователю;
        Сообщение.Текст = " – Считывается файл " + ИмяФайла;
        Сообщение.Сообщить();
        
        // Загрузить из найденного файла
        // *** Инфраструктура сообщений.
        ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();   //ПланыОбмена-менеджер этой процедуры. Создает объект, с помощью которого может быть произведено чтение одного или нескольких сообщений обмена данными.
        
        // Читать заголовок сообщения обмена данными – файла XML.
        ЧтениеСообщения.НачатьЧтение(ЧтениеXML); //НачатьЧтение-метод объекта СоздатьЧтениеСообщения
        
        // Сообщение предназначено не для этого узла.
        Если ЧтениеСообщения.Отправитель <> Ссылка Тогда //Ссылка - это нужный нам отправитель
            ВызватьИсключение "Неверный узел";
        КонецЕсли;
        
        // Удаляем регистрацию изменений для узла отправителя сообщения.
        // *** Служба регистрации изменений.
        ПланыОбмена.УдалитьРегистрациюИзменений(ЧтениеСообщения.Отправитель,
                    ЧтениеСообщения.НомерПринятого);
                    
        // Читаем данные из сообщения *** XML-сериализация.
        Пока ВозможностьЧтенияXML(ЧтениеXML) Цикл   //определяет, имеется ли соответствующий тип 1С:Предприятия
            
            // Читаем очередное значение.
            Данные = ПрочитатьXML(ЧтениеXML); //ПрочитатьXML() метод глобального контекста
                                              //Данные - это переменная
                                              
            // Не переносим изменение, полученное в главный из неглавного,
            // если есть регистрация изменения.
            Если Не ЧтениеСообщения.Отправитель.Главный И
                    ПланыОбмена.ИзменениеЗарегистрировано(
                                        ЧтениеСообщения.Отправитель, Данные) Тогда
                    Сообщение = Новый СообщениеПользователю;
                    Сообщение.Текст = " – Изменения отклонены";
                    Сообщение.Сообщить();
                
                    Продолжить;
            КонецЕсли;                                      
            
            // Записать полученные данные.
            Данные.ОбменДанными.Отправитель = ЧтениеСообщения.Отправитель;
            Данные.ОбменДанными.Загрузка = Истина;
            Данные.Записать();

        КонецЦикла;                    
            
        ЧтениеСообщения.ЗакончитьЧтение();        
        ЧтениеXML.Закрыть();
        УдалитьФайлы(ИмяФайла);
                
        Сообщение = Новый СообщениеПользователю;
        Сообщение.Текст = "-------- Конец загрузки ------------";
        Сообщение.Сообщить();
        
КонецПроцедуры
6 Альбатрос
 
04.07.17
07:59
ВыборкаУзлов = неопределено?
7 Dvoe4nik
 
04.07.17
08:43
(2) а без контекста на сервере видит план обмена?
8 Vbifers
 
04.07.17
09:36
ВыборкаУзлов определяет
УзелОбъект - Неопределено
9 Vbifers
 
04.07.17
10:58
(7) Не понял вопроса
10 sFAQer
 
04.07.17
11:06
(5) >> Подставил ССылка, теперь пишет: Объект не найден
Прав нет на узел?
11 Dvoe4nik
 
04.07.17
11:09
(9) а что в  ВыборкаУзлов.Ссылка? какое значение?
12 Vbifers
 
04.07.17
11:30
(11) Ошибка при вызове метода контекста (ПолучитьОбъект)
13 Альбатрос
 
04.07.17
11:33
(10) проверил?
14 lera01
 
04.07.17
11:41
процедура ПрочитатьСообщениеСИзменениями() судя по всему недоступна при вызове из серверной процедуры, вот и пишет ошибку.
15 Vbifers
 
04.07.17
11:44
(10) если вы про права в Ролях, то да, есть
16 Dvoe4nik
 
04.07.17
11:44
(12) попробуй заменить "&НаСервереБезКонтекста" на "&НаСервере"
17 Vbifers
 
04.07.17
11:46
(16) пробовал, не помогло
18 h-sp
 
04.07.17
22:18
(17) случайно не на учебной версии учитесь?