Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

РегСведений в ДС (произвольный запрос) обновление (УФ)

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

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

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

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

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

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

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

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

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

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

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

Оповещение вообще не попадало в эту процедуру, уходит куда-то в свои (выше написал). Подставлял и там код обработки оповещения как у меня выше - не реагирует.
   1с-кин
 
19 - 02.11.20 - 12:12
(16) вызов модуля менеджера:
&НаСервере
Процедура ЗагрузитьДокументНаСервере()
    ПараметрыКоманды = Новый Структура;
    ПараметрыКоманды.Вставить("Ссылка",     Объект.Ссылка);
    ПараметрыКоманды.Вставить("ПутьКФайлу", ПутьКФайлу);
    //

        Документы.ТоварыSIM.ВыполнитьКомандуЗагрузка(, ПараметрыКоманды);
КонецПроцедуры;
   1с-кин
 
20 - 02.11.20 - 12:14
&НаКлиенте
Процедура ЗагрузитьДокумент(Команда)
    //

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

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

&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
    //

    Если ИмяСобытия = "ИзменениеДокумента" Тогда
        // 1 вариант:

        ОповеститьОбИзменении(Параметр);    //Объект.Ссылка

        // 2 вариант:

        Элементы.дсТоварыSIM.Обновить();
        // 3 вариант:

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

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

//Модуль Менеджера

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

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

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


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.