Имя: Пароль:
1C
1С v8
Отличия программного записи элемента от интерактивного.
,
0 antihacker
 
17.01.19
08:41
Всем привет !

Есть справочник Спр1 с  реквизитом справочника Рек1. И Рек1 ссылается на другой справочник Спр2. Вот. Когда программно меняешь наименование Спр2, то в Спр1 все еще видится старое наименование Спр2. Надо открыть интерактивно и перевыбарть. Что не так ?
1 craxx
 
17.01.19
08:42
(0) Видимо обработка ПриИзменении в поле формы
2 antihacker
 
17.01.19
08:45
В этой обработке ничего нету. Она вообще не создавалась
3 catena
 
17.01.19
08:46
Где видится старое наименование? Если запросом до перевыбора выбрать, что будет в рек1? Формы о/у?
4 zak555
 
17.01.19
08:47
Номер платформы?
Представление справочника какое?
5 Лодырь
 
17.01.19
08:47
Надо перечитать данные однако. Потому что форма ничего не знает о факте изменения данных которые она отображает.
6 antihacker
 
17.01.19
08:49
Платформа - 1С:Предприятие 8.3 (8.3.12.1469). Управляемая форма.
7 antihacker
 
17.01.19
09:15
Пробовал вот так

&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
    ЭтаФорма.Прочитать();
КонецПроцедуры


не работает
8 antihacker
 
17.01.19
09:22
Даже пробовал ЭтаФорма.ОбновитьОтображениеДанных();

Не работает.
9 Мимохожий Однако
 
17.01.19
09:32
(0) Открываешь интерактивно Спр1, а меняешь программно Спр2.
Добавь изменение представления программно в этом реквизите.
10 craxx
 
17.01.19
09:32
(7) В модуле объекта аналогичную функцию проверь
11 DrWatson
 
17.01.19
10:14
(0)
ОповеститьОбИзменении(<Ссылка>)
Также осуществляется очистка закэшированных данных на клиенте. В частности, очищается кэш представлений ссылок, кэш данных через точку, кэш данных быстрого выбора, кэш ограничений по типу, кэш форм выбора.
12 DrWatson
 
17.01.19
10:16
+(11) Возможно даже сначала ОповеститьОбИзменении, потом ОбновитьОтображениеДанных. Потому что само ОповеститьОбИзменении обновляет только динамические списки.
13 antihacker
 
17.01.19
10:39
DrWatson проблема не с динамическим списком
14 Мимохожий Однако
 
17.01.19
11:11
(13) Оповестить() есть
15 DrWatson
 
17.01.19
11:19
(13) Я понял. Пост (11) дальше первого слова не читал? ОповеститьОбИзменении - это не только динамический список, но и очистка кэша. А откуда клиент берет представление ссылки?
16 antihacker
 
17.01.19
13:19
Ребята. Проблема том что, элемент записывается программно. По этому никакие функции на форме само по себе не срабатывает.
17 VladZ
 
17.01.19
13:23
(16) Пусть список обновляет обработчик ожидания.
18 antihacker
 
17.01.19
13:24
Можно как то вызвать процедуру формы при записи или перед записью ?
19 antihacker
 
17.01.19
13:24
VladZ. какой еще список ?
20 mistеr
 
17.01.19
13:54
(16) Тут нужно еще уточнить, а как инииируется программное изменение Спр2? Из формы Спр1 или как-то иначе?
21 ssh2006
 
17.01.19
13:57
(8)

&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
    
    Если Врег(ИмяСобытия) = Врег("Запись_ЕдиницыИзмерения") Тогда

         ПодключитьОбработчикОжидания("ОбновитьДанныеНаФорме", 0.1, Истина);
        
    КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ОбновитьДанныеНаФорме()
    
    ОбновитьОтображениеДанных();    
    
КонецПроцедуры
22 antihacker
 
17.01.19
13:58
Нет. С другого места. С документа.
23 ssh2006
 
17.01.19
14:00
(22) там вызывай


Оповестить("Запись_ЕдиницыИзмерения");
24 mistеr
 
17.01.19
14:10
(22) В документе реквизит типа Спр2 или Спр1?
25 antihacker
 
17.01.19
14:15
ssh2006

А отловить как на справочнике ?


Вот так ?


&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)    
    
      Если ИмяСобытия = "НаименованиеСобытия" Тогда
            // код выполняемых действий при возникновении события
      КонецЕсли;     
        
КонецПроцедуры
26 ssh2006
 
17.01.19
14:22
(25) да, только эту процедуру надо подцепить к форме в ее палитре свойств
27 DrWatson
 
17.01.19
14:27
(22) С формы документы, с события модуля документы, с события менеджера документы? Другими словами, там вызов клиента есть?
28 antihacker
 
17.01.19
14:39
Делаю так. Вот с формы документа

&НаКлиенте
Процедура Сопоставить(Команда)

     ссылканаспр = ссылканаспр();    
     ОповеститьОбИзменении(ссылканаспр);      

КонецПроцедуры

&НаСервере
Функция ссылканаспр()
        возврат Справочники.КлассификацияПоступлений.ПустаяСсылка();
КонецФункции    

А на форме справочника

&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)    
    
      Если ИмяСобытия = "НаименованиеСобытия" Тогда
            // код выполняемых действий при возникновении события
      КонецЕсли;     
        
КонецПроцедуры

И не работает !
29 antihacker
 
17.01.19
14:40
Пробовал даже так
ОповеститьОбИзменении(Тип("СправочникСсылка.КлассификацияПоступлений"));

Все равно не работает.
30 DrWatson
 
17.01.19
14:55
(29)
.Справку невнимательно читал. Решил сам проверить. 8.3.13.1513.
Достаточно только ОповеститьОбИзменении. Не надо передавать управление в форму обновляемого справочника, не надо обновлять отображение. Всё само работает.
Вот как выглядит изменение из документа:

&НаСервереБезКонтекста
Процедура УстановитьНовоеНаименованиеНаСервере(Спр2Ссылка)
    Спр2Объект = Спр2Ссылка.ПолучитьОбъект();
    Спр2Объект.Наименование = ТекущаяДата();
    Спр2Объект.Записать();
КонецПроцедуры

&НаКлиенте
Процедура УстановитьНовоеНаименование(Команда)
    УстановитьНовоеНаименованиеНаСервере(Объект.Реквизит1);
    ОповеститьОбИзменении(Объект.Реквизит1);
КонецПроцедуры
31 DrWatson
 
17.01.19
15:00
+(30) Это если считать, что Спр2 ты меняешь из команды документа. Потому что на (27) так и не ответил.
32 antihacker
 
17.01.19
15:02
DrWatson. сорри не заметил. Да так и есть.
33 antihacker
 
17.01.19
15:04
Пытался вот так

&НаКлиенте
Процедура Сопоставить(Команда)


     Для Каждого ТекСтрока Из Объект.ТЧИмпортированныеДанные Цикл
        
         Форма1 = ТекСтрока.КПиКР.ПолучитьФорму();
         Форма1.ОбновитьФорму();
        
     КонецЦикла;    

КонецПроцедуры


пишет Метод объекта не обнаружен (ПолучитьФорму)
34 antihacker
 
17.01.19
15:08
Пробовал вот так

Для Каждого ТекСтрока Из Объект.ТЧИмпортированныеДанные Цикл
ОповеститьОбИзменении(ТекСтрока.КПиКР);        
КонецЦикла;    


Не реагирует.
35 DrWatson
 
17.01.19
15:15
(34) Не знаю. Я сделал готовый пример - работает. Вероятно, в твоём случае есть ещё какие-нибудь детали, о которых ты не рассказал.
Вот работающий пример:
https://drive.google.com/open?id=11-9FqJaK2qiHtwnov5ammtPa3znXQJ9E
36 antihacker
 
17.01.19
15:23
Вот так мне удалось запустить процедуру на форме


     Для Каждого ТекСтрока Из Объект.ТЧИмпортированныеДанные Цикл
        
         Форма1 = ПолучитьФорму("Справочник.КлассификацияПоступлений.Форма.ФормаЭлемента", новый Структура("Ключ",ТекСтрока.КПиКР));
         Форма1.ОбновитьФорму();  
             
     КонецЦикла;

Отладчиком вижу что ОбновитьФорму() срабатывает.

Вот код

&НаКлиенте
Процедура ОбновитьФорму() Экспорт
    
    ОбновитьОтображениеДанных();    
    
КонецПроцедуры

Но ничего не меняется.
37 antihacker
 
17.01.19
15:29
У тебя формат конфиши выше чем у меня ( У тя 8,3,13 у меня 8,3,12
38 DrWatson
 
17.01.19
15:31
(39) Этот код ничего и не меняет.
ОбновитьОтображениеДанных
Полезен при изменении значений реквизитов формы вне формы, в тот момент, когда форма отображается на экране.

Твоя форма только что открыта, её реквизиты никто не менял. Ничего и не должно было измениться.
39 antihacker
 
17.01.19
15:31
Тема закрыта.

Получилось вот так.

&НаКлиенте
Процедура ОбновитьФорму() Экспорт

    ОповеститьОбИзменении(Объект.КатегорияПоступления);
КонецПроцедуры
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший