Значение не является значением объектного типа (УдалитьСообщения) (ЗУП)

1. perepetulichka 912 26.01.16 09:19 Сейчас в теме
При ночном обмене с периферийными узлами (базы серверные, обмен через подключение к базе, система ЗУП ред. 2.5.98.2, платформа 8.2.19.68) возникает ошибка проведения:

Ошибка при вызове метода контекста (Записать): Ошибка при выполнении обработчика - 'ОбработкаПроведения': {Документ.КадровоеПеремещениеОрганизаций.МодульОбъекта(2160)}: Значение не является значением объектного типа (УдалитьСообщения)

Редактирование модуля в каждом отдельном объекте - не вариант.
Если кто-то сталкивался и решил проблему - подскажите пожалуйста "как".
Вознаграждение за ответ
Показать полностью
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. omut 26.01.16 12:15 Сейчас в теме
Роль ВыполнениеСинхронизацииДанных или ПолныеПрава у пользователя для обмена задана?
3. perepetulichka 912 26.01.16 12:17 Сейчас в теме
4. omut 26.01.16 12:24 Сейчас в теме
Может быть конфигурацию переписывали? Можно проверить:
Модуль ОбщегоНазначенияЗК, экспортная функция ПолучитьЗначениеПеременной. Строки кода:
ИначеЕсли ВРег(ИмяПараметра) = ВРег("глОбработкаСообщений") Тогда
			НайденноеЗначение = Обработки.СообщенияВыполняемыхДействий.Создать();

Вряд ли кто-то что-то наделал, но мало ли. Могли и обработку подменить. Следующим шагом убедиться, что вызываемой обработке есть экспортная процедура:
Процедура УдалитьСообщения() Экспорт
5. perepetulichka 912 26.01.16 12:29 Сейчас в теме
(4) omut, все там на месте, конфигурацию никто не менял.

По этой теме уже давно просмотрены топики:

Ссылка 1
Ссылка 2
Ссылка 3

Нужно реальное решение проблемы.
6. perepetulichka 912 26.01.16 12:32 Сейчас в теме
(4) omut, повторюсь, решение вида:

#Если Клиент Тогда


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

Вопросы типа "изменили обработку", "а есть ли права"... давайте не тратить время друг друга.
Хотелось бы получить ответ от человека, понимающего проблему.
7. stash_84 26.01.16 13:43 Сейчас в теме
(6) perepetulichka, переведите сервер в режим отладки, запустите отладку и установите "остановка по ошибке". Утром конфигуратор будет Вас ждать на ошибке.
8. perepetulichka 912 26.01.16 14:14 Сейчас в теме
Где именно ошибка, известно.
Она находится в модуле объекта всех документов:
Процедура ОбработкаПроведения(Отказ, Режим)
	
	ОбработкаКомментариев = глЗначениеПеременной("глОбработкаСообщений");
	ОбработкаКомментариев.УдалитьСообщения();
...

Решается просто:
Процедура ОбработкаПроведения(Отказ, Режим)
	#Если Клиент Тогда
		ОбработкаКомментариев = глЗначениеПеременной("глОбработкаСообщений");
		ОбработкаКомментариев.УдалитьСообщения();
...


Но нам такой вариант не подходит. Эту проверку нужно добавить в каждый модуль объекта. Не проводятся документы всех типов.
10. Xershi 1551 26.01.16 14:44 Сейчас в теме
(8) perepetulichka, а почему не подходит. Выгрузили конфигурацию в файле, заменили текст, загрузили. Вот и весь фокус покус.
allgorhythm; +1 1 Ответить
9. omut 26.01.16 14:40 Сейчас в теме
Видимо, остается только вносить изменения в модуль ОбщегоНазначенияЗК. Что-то типа

ИначеЕсли ВРег(ИмяПараметра) = ВРег("глОбработкаСообщений") Тогда
#Если ТолстыйКлиентОбычноеПриложение Тогда
НайденноеЗначение = Обработки.СообщенияВыполняемыхДействий.Создать();
#Иначе
НайденноеЗначение = Константы.МояЗаглушка.СоздатьМенеджерЗначения();
#КонецЕсли

Создать Константу с именем "МояЗаглушка", права на чтение выдать и в модуль менеджера добавить парочку экспортных методов. На вскидку: УдалитьСообщения и ПоказатьСообщения, которые вообще ничего не будут делать. Тип константы и прочие тонкости значения не имеют. Хоть булево.
11. perepetulichka 912 26.01.16 15:15 Сейчас в теме
(9) omut, не сработало.
Нашли решение в старой базе, обмен был с УТ.

Решение следующее:

В общем модуле "ОбщегоНазначенияЗК":

Функция ПолучитьЗначениеПеременной(ИмяПараметра, Кэш = Неопределено, КэшИзменен = Ложь) Экспорт
	
	Если Кэш = Неопределено Тогда
		// Кэш не был проинициализирован
		Кэш = Новый Структура;
	Иначе
		// Ищем значение в структуре
		НайденноеЗначение = Неопределено;
		Если Кэш.Свойство(ИмяПараметра, НайденноеЗначение) Тогда
			
			// вставляем отсюда
			Если ВРег(ИмяПараметра) = ВРег("глОбработкаСообщений") и    НайденноеЗначение = Неопределено Тогда 
				НайденноеЗначение = Обработки.ОбработкаОтложенногоПроведенияНаСервере.Создать();
			КонецЕсли;
			//сюда

			Возврат НайденноеЗначение;
		КонецЕсли;
	КонецЕсли;
Показать



Обработка без формы.
В модуле объекта обработки две пустые процедуры:

Процедура УдалитьСообщения() Экспорт
    
КонецПроцедуры


Процедура ПоказатьСообщения(ЗаголовокФормы = Неопределено) Экспорт
    
КонецПроцедуры
Показать
12. omut 26.01.16 15:18 Сейчас в теме
(11) perepetulichka, ну да, логично. Поздравляю :)
13. perepetulichka 912 27.01.16 10:04 Сейчас в теме
После ночного обмена в регистре по-прежнему остались отложенные движения, возможно меньше, но тем не менее они там есть.
Дополнительным решением является увеличение попыток обмена, но баз слишком много, такой вариант тоже не очень приемлем.

Я добавила внешнюю обработку, запускаемую по регламенту, для очистки РС "Отложенные движения": обработка проводит документы и удаляет записи из регистра.
Но, до вставки кода, который я указала выше, обработка также выдавала ошибку: "Значение не является значением объектного типа (УдалитьСообщения)".

В ней установила привилегированный режим.
И еще добавила вот это:
	НаборЗаписейДоступа = РегистрыСведений.ОбъектыДоступаДокументов.СоздатьНаборЗаписей();
	НаборЗаписейДоступа.Отбор.ДокументСсылка.Установить(Запись.Документ);
	НаборЗаписейДоступа.Записать(Истина);

Не смотря на то, что РЛС у нас нет, этот регистр мешал проведению документов.

И теперь все работает как надо :)
omut; config; +2 Ответить
14. yasar 04.02.16 14:47 Сейчас в теме
ну да, логично. Поздравляю :)
15. VivaBrunko 09.02.16 13:23 Сейчас в теме
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот