Имя: Пароль:
1C
1С v8
РегСведений в ДС (произвольный запрос) обновление (УФ)
,
0 1с-кин
 
30.10.20
15:52
В УТ11: ДинамическийСписок на форме документа "Товары". ДС подключен к РС "Товары" (методом "произвольный запрос"). Основная таблица заполнена (несмотря на произвольный запрос).
Из МодуляФормы документа вызываем процедуру МодуляМенеджера, там меняем номер и дату документа (т.е. ссылку), возвращаемся обратно на форму - отображение РС в ДС не обновляется.
И не хочет рефрешится после изменения никак, перепробовал всё. Только закрытие и открытие документа помогает увидеть данные по РС.
Что применял в разных вариантах в модуле формы:

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

Пробовал оповещение:
Но тут 'ОбработкаОповещения' не отрабатывает в моём перехватчике 'ОбработкаОповещения' - а перекидывает сразу либо в справочник 'Новости', ФормаПросмотраНовостейРабочийСтол, либо - в общую форму 'ПодключениеИнтернетПоддержки'

    Оповестить("Запись_ИзменениеДокумента" , Объект.Ссылка , ЭтаФорма);

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

Что делать? Не получается заставить УФ работать, и рефрешить данные отбора по РС на форме.
1 Kassern
 
30.10.20
16:15
ОбновитьИнтерфейс(); не пробовал?
2 Жан Пердежон
 
30.10.20
16:44
ОповеститьОбИзменении() - ДС сразу обновляется
проверь свойство таблицы формы "ОбновлениеПриИзмененииДанных"
3 Timon1405
 
30.10.20
16:49
ОповеститьОбИзменении(Тип("ДокументСсылка.ТотМДКоторыйПоменялся"));
4 1с-кин
 
30.10.20
17:21
>>проверь свойство таблицы формы "ОбновлениеПриИзмененииДанных"
Установлено в Авто, не помогает.
5 1с-кин
 
30.10.20
17:23
>>ОбновитьИнтерфейс(); не пробовал?
Не помогает, даже реквизиты шапки не обновляет.
6 1с-кин
 
30.10.20
17:24
>>ОповеститьОбИзменении(Тип("ДокументСсылка.ТотМДКоторыйПоменялся"));
Это уже пробовал, равно как и:
<code>ОповеститьОбИзменении(Тип("РегистрСведенийКлючЗаписи.Товары"));</code>
7 Kassern
 
30.10.20
17:32
(0)"там меняем номер и дату документа..." Я правильно понял, вы в модуле менеджера меняете дату и номер документа, чья форма у вас открыта? А при этом документ то записывается? Если нет, то откуда РС узнает об изменении номера документа, если в базе данный номер еще не записался?
8 1с-кин
 
02.11.20
09:34
>>вы в модуле менеджера меняете дату и номер документа, чья форма у вас открыта
Да, так и есть.
И нет никакой возможности передать ссылку обратно из модуля менеджера.
9 1с-кин
 
02.11.20
09:37
Как-бы нормальный объектный язык сам отслеживает, какая-где ссылка.
Но только не 1С, где программист должен скакать между "клиентом" и "сервером", указывая принудительно, что инструкции, приписанные к серверу (платформой же) - выполнять на сервере, а на клиенте нет - ну, никак и не получишь.
10 Жан Пердежон
 
02.11.20
09:44
(9) нормальный - это какой?
во-первых, у тебя ссылка нигде не меняется, меняется её представление
во-вторых, ОповеститьОбИзменении() для твоего случая как раз и придумано, работает отлично, смотри свой г-код внимательней
11 ДенисЧ
 
02.11.20
09:45
(9) Пиши на нормальных языках. Чего ты в 1с впёрся?
12 1с-кин
 
02.11.20
09:51
(11) ну давай, расскажи, как в такой ситуации быть?
(9) не работает ОповеститьОбИзменении()! От слова "совсем".
Именно оповещение, именно того самого РС, данные которого нужно отобразить, именно в форме документа, куда выполнение возвращается после модуля менеджера. Результат - ничего, пустой документ.
С привязанным РС работает, с произвольным запросом - нет. Так что это еще у кого го-код, в платформе или где.
13 ДенисЧ
 
02.11.20
09:59
(12) Исчо раз. Пиши на нормальных языках.
14 1с-кин
 
02.11.20
10:11
(13) ну так что не расскажешь, каким таким г-дом это исправить? Не знаешь?
Вот тебе и "исчо раз".
15 Андроны едут
 
02.11.20
10:43
>>Пробовал оповещение:
Но тут 'ОбработкаОповещения' не отрабатывает в моём перехватчике 'ОбработкаОповещения'

В обработке оповещения должна быть команда

ЭтаФорма.ОбновитьОтображениеДанных(Элементы.дсТовары);

а у вас её нет.
16 Жан Пердежон
 
02.11.20
11:09
(12)
дано б уже выложил:
код вызова своей мега-полезной процедуры менеджера;
текст процедуры;
текст запроса ДС и имя основной таблицы;
структуру РС и документа (с типами)

и да, называть РС и Док просто "Товары" - это уже где-то за гранью
17 1с-кин
 
02.11.20
12:03
(16)>>и да, называть РС и Док просто "Товары" - это уже где-то за гранью
А разница? Для упрощения же я привел как "Товары". Док и РС называются "ТоварыSIM" - это ничего не меняет по факту вопроса.
18 1с-кин
 
02.11.20
12:08
(15) ЭтаФорма.ОбновитьОтображениеДанных(Элементы.дсТовары);
применялась непосредственно в модуле формы - безрезультатно. В процедуре оповещения было так:
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
    //    
    Если ИмяСобытия = "Изменение_ТоварыSIM" Тогда
        ОповеститьОбИзменении(Параметр);
        Элементы.дсТоварыSIM.Обновить();
    КонецЕсли;
КонецПроцедуры

вызов: Оповестить("Изменение_ТоварыSIM", Объект.Ссылка, ЭтаФорма);

Оповещение вообще не попадало в эту процедуру, уходит куда-то в свои (выше написал). Подставлял и там код обработки оповещения как у меня выше - не реагирует.
19 1с-кин
 
02.11.20
12:12
(16) вызов модуля менеджера:
&НаСервере
Процедура ЗагрузитьДокументНаСервере()
    ПараметрыКоманды = Новый Структура;
    ПараметрыКоманды.Вставить("Ссылка",     Объект.Ссылка);
    ПараметрыКоманды.Вставить("ПутьКФайлу", ПутьКФайлу);
    //
        Документы.ТоварыSIM.ВыполнитьКомандуЗагрузка(, ПараметрыКоманды);
КонецПроцедуры;
20 1с-кин
 
02.11.20
12:14
&НаКлиенте
Процедура ЗагрузитьДокумент(Команда)
    //
    ЗагрузитьДокументНаСервере();
...
Оповестить("Изменение_ТоварыSIM" , Объект.Ссылка , ЭтаФорма);
//
КонецПроцедуры;
21 1с-кин
 
02.11.20
12:20
(16) произвольный запрос ДС:
ВЫБРАТЬ
    РегистрСведенийТоварыSIM.ДокументТоварыSIM,
    РегистрСведенийТоварыSIM.Номенклатура,
    РегистрСведенийТоварыSIM.Характеристика,
    РегистрСведенийТоварыSIM.КодСтроки,
    РегистрСведенийТоварыSIM.Количество,
    РегистрСведенийТоварыSIM.Упаковка,
    РегистрСведенийТоварыSIM.Штрихкод,
    РегистрСведенийТоварыSIM.КоллекцияНоменклатуры,
    РегистрСведенийТоварыSIM.Бренд
ИЗ
    РегистрСведений.ТоварыSIM КАК РегистрСведенийТоварыSIM
ГДЕ
    ВЫБОР
      КОГДА НЕ &ЭтоНовый
        ТОГДА РегистрСведенийТоварыSIM.ДокументТоварыSIM = &ТекущийДок
      ИНАЧЕ ЛОЖЬ
    КОНЕЦ

Основная таблица:
РегистрСведений.ТоварыSIM

Только не понимаю, что это даст. Тут всё правильно, и работает, если РС к ДС подключен напрямую. Если как произвольный запрос - не работает.
22 Жан Пердежон
 
02.11.20
12:35
у тебя "объект" не меняется в форме и вообще форма становится "невалидной" (при записи из формы стандартными функциями кнопками будет ругаться):

пробуй:
Документы.ТоварыSIM.ВыполнитьКомандуЗагрузка(, ПараметрыКоманды);
Прочитать();
23 Жан Пердежон
 
02.11.20
12:48
Короче, у тебя скорее всего параметры ДС &ЭтоНовый и &ТекущийДок старые значения имеют - и тут хоть обобновляйся
24 hhhh
 
02.11.20
13:28
(18) но вообще, эта процедура ОбработкаОповещения привязана к событию ОбработкаОповещения формы ?
25 1с-кин
 
02.11.20
13:35
(18)>>эта процедура ОбработкаОповещения привязана к событию ОбработкаОповещения формы
Да походу, не привязана... Я её уже в типовых ловил...
26 1с-кин
 
02.11.20
13:36
(23)>>всего параметры ДС &ЭтоНовый и &ТекущийДок старые значения имеют
Так как вернуть из модуля менеджера новое значение ссылки? Ни реквизиты, ничего не доступно.
27 hhhh
 
02.11.20
13:41
(25) что значит "ловил"?
28 Жан Пердежон
 
02.11.20
14:05
(26)
ещё раз: у тебя ссылка _не_ изменяется, меняется сам объект
правильно будет переделать твою функцию, чтобы она и с объектом могла работать, и тогда

ДокОбъект = РеквизитФормыВЗначение("Объект");
ПараметрыКоманды.Вставить("Источник", ДокОбъект);
Документы.ТоварыSIM.ВыполнитьКомандуЗагрузка(, ПараметрыКоманды);
ЗначениеВРеквизитФормы(ДокОбъект, "Объект");
29 1с-кин
 
02.11.20
14:13
(15) обработка оповещения тут ни причём:
не работает ни в одном из случаев:

&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
    //
    Если ИмяСобытия = "ИзменениеДокумента" Тогда
        // 1 вариант:
        ОповеститьОбИзменении(Параметр);    //Объект.Ссылка
        // 2 вариант:
        Элементы.дсТоварыSIM.Обновить();
        // 3 вариант:
        ЭтаФорма.ОбновитьОтображениеДанных(Элементы.дсТоварыSIM);
        // 4 вариант:
        Элементы.дсТоварыSIM.ОбновлениеПриИзмененииДанных = ОбновлениеПриИзмененииДанных.Авто;
    КонецЕсли;
КонецПроцедуры    //ОбработкаОповещения()
30 hhhh
 
02.11.20
14:46
(29) ну она и не должна работать если не привязана к событию формы. Это уже выяснили.
31 1с-кин
 
03.11.20
12:52
(30) да это понятно, тут все проверил уже, все равно не работает.
Надо вариант с передачей объекта потестить - да и единственный он остался)
32 Kassern
 
05.11.20
11:43
Только что проверил, все работает, как надо, все обновляется...
//Модуль формы
&НаКлиенте
Процедура ТвояМегаПроцедура(Команда)
    ТвояМегаПроцедураСервер();
    Прочитать();
    ОбновитьИнтерфейс();
КонецПроцедуры
Процедура ТвояМегаПроцедураСервер()
    Документы.Товары.ИзменитьНомерДату(Объект);
КонецПроцедуры

//Модуль Менеджера
Процедура ИзменитьНомерДату(Объект) экспорт

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

КонецПроцедуры
33 Kassern
 
05.11.20
11:47
(0) Вот тебе тест база, написанная на коленке, где это все работает. Только вот зачем использовать тут модуль менеджера и выводить ссылку документа в самом документе мне не понятно...
https://yadi.sk/d/ZG2tpTz-vtzDnw
34 Жан Пердежон
 
05.11.20
18:38
(32) очевидно, что работать не будет, если документа нет в базе
35 Kassern
 
06.11.20
09:11
(34) Что работать не будет? Я скинул базу с одним документом и с одной записью РС. При изменении даты документа по кнопке, на форме автоматически обновляются данные, что и просил автор поста. Если документа нет в базе, то понятно, что ты его не привяжешь к РС.
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн