Имя: Пароль:
1C
1C 7.7
v7: Не обновляется форма элемента справочника
,
0 andrew76
 
13.01.22
10:31
Добрый день !

Не обновляется форма элемента справочника, после редактирования реквизита
На форме элемента справочника есть реквизит должность(ссылка на штатное расписание).
Редактируется должность следующим образом,т.е.открывается форма эл-та справочника штатное расписание.
Все редактируется,только данные формы эл-та справочника не обновляются.

ОткрытьФорму(МестоРаботы.ТекущийЭлемент(),ТекущийЭлемент(),0);
1 Builder
 
13.01.22
10:45
(0) Ну потому что первая форма не знает ты уже отредактировал или нет.
Как вариант
ОткрытьФормуМодально(...)
Форма.Обновить()

Вроде так.
2 Злопчинский
 
13.01.22
10:47
Или передавай в открываемую форму ШР контекст родительской обработки и там ПриЗакрытии делай
Конт.Форма.Обновить(); // только или в попытку оборачивай или проверяй что Конт еще существует
3 andrew76
 
13.01.22
10:52
Builder
Ваши варианты не срабатывают
4 Злопчинский
 
13.01.22
10:55
ща проверим
5 Злопчинский
 
13.01.22
11:02
ну и я не стал бы так "грубо" писать (и зачем ты в пером параметре объект актуализируешь):
Конт = глВзятьКонтекст(Контекст);
ОткрытьФорму(МестоРаботы,Конт,0);
6 Builder
 
13.01.22
11:03
(3) Возможно. Ты же внес изменения в базу, тебе надо из базы вычитать обновленный элемент.
7 Злопчинский
 
13.01.22
11:05
ну и контексть родительской формы это совсем не ТекущийЭлемент()
8 Злопчинский
 
13.01.22
11:07
мдя.. не катит напрямую форму обновить...
9 Builder
 
13.01.22
11:10
(3) Тут видимо надо все таки перечитать из базы реквизит как то так
ОткрытьФормуМодально(...)
Спр = СоздатьЭлемент(ТвойСправочник);
Спр.НайтиЭлемент(ТвойРеквизит)
ТвойРеквизит = Спр.ТекущийЭлемент();

Ну или просто попробовать
ТвойРеквизит = ТвойРеквизит.ТекущийЭлемент();
10 Злопчинский
 
13.01.22
11:10
Можно так извернуться:
если ты в родительской форме редактируешь реквизит посредством открытия формы его элемента (дочерняя форма)
то положи в род.форме просто текстовое представление реквизита (а не сам реквизит на форму) и кнопку по которой ты открываешь дочернуюю форму... и все. текстовое представление на род.форме актуализируй/отображай как тебе надо...
11 Злопчинский
 
13.01.22
11:18
(9) так тоже не получается.
12 Злопчинский
 
13.01.22
11:19
сделать как (2) и не мучаться ;-)
13 Злопчинский
 
13.01.22
11:19
тьфу, как в (10)
14 Злопчинский
 
13.01.22
11:21
По сути когда открыта форма - то значения на ней "закэшированы" и просто так не получится, только переоткрытием формы
15 Ёпрст
 
13.01.22
11:23
(14) Да ты шо ?
:)))
16 Ёпрст
 
13.01.22
11:29
(0)
на вот

//******************************************************************************
// глОткрытьКарточкуРеквизита(Конт, ИмяРеквизита) Экспорт
//
// Параметры:
//  Конт (Глобальный контекст) - контекст формы.
//  ИдРеквизита (строка) - идентификатор реквизита.
//
// ВозвращаемоеЗначение:
//    0 - элемент не модифицирован
//  1 - элемент модифицирован
//
// Описание:
//  Если реквизит заполнен - открывает модально форму элемента справочника для
//  редактирования.
//
Функция глОткрытьКарточкуРеквизита(Конт, ИдРеквизита) Экспорт
    
    СтарыйРеквизит = Конт.ПолучитьАтрибут(ИдРеквизита);
    
    Если СтарыйРеквизит.Выбран() = 1 Тогда  
        //ОткрытьФормуМодально(СтарыйРеквизит, , 0);
        ОткрытьФормуМодально(СтарыйРеквизит, , Конт.Форма.ТолькоПросмотр());

    Иначе
        Возврат 0;
    КонецЕсли;
    
    НовыйРеквизит  = СтарыйРеквизит.ТекущийЭлемент();
    
    // если элемент изменился (его отредактировали), Контекст об этом не знает
    МодифицировалиЭлемент = глСравнитьЭлементыСправочника(НовыйРеквизит, СтарыйРеквизит);
    
    
    Если МодифицировалиЭлемент=1 Тогда
        // обновляем реквизит в форме
        Конт.УстановитьАтрибут(ИдРеквизита, "");
        Конт.ПолучитьАтрибут(ИдРеквизита);
        Конт.УстановитьАтрибут(ИдРеквизита, НовыйРеквизит);
    КонецЕсли;
    
    Возврат МодифицировалиЭлемент;
    
КонецФункции // глОткрытьКарточкуРеквизита()
17 andrew76
 
13.01.22
11:30
Спр.НайтиЭлемент(ТвойРеквизит)
ТвойРеквизит = Спр.ТекущийЭлемент();
18 Злопчинский
 
13.01.22
11:31
Я так и знал Что Епрст придет и не применёт нас всех окунуть в грязь ;-)
19 andrew76
 
13.01.22
11:31
хотел написать, что такой код тоже не работает

Спр.НайтиЭлемент(ТвойРеквизит)
ТвойРеквизит = Спр.ТекущийЭлемент();
20 Злопчинский
 
13.01.22
11:32
(17) так не прокатит.
21 Злопчинский
 
13.01.22
11:33
смотри в сторону (16), Ёпрст знает что говорит
22 Злопчинский
 
13.01.22
11:36
вот так норм (по 16)
Процедура ПоКнопке()

    Конт = глВзятьКонтекст(Контекст);
    ОткрытьФормуМодально(Производитель,Конт,0);    

    Спр = СоздатьОбъект("Справочник.Производители");
    Спр.НайтиЭлемент(Производитель);
    
    УстановитьАтрибут("Производитель", "");
    ПолучитьАтрибут("Производитель");
    УстановитьАтрибут("Производитель", Спр.ТекущийЭлемент());

КонецПроцедуры // ПоКнопке()
23 Злопчинский
 
13.01.22
11:39
одна "бяка" - форма получится модифицированной, а это не всегда бывает удобно.
вот лично я бы сделал как в (10), потому что нахрена на форме лежит реквизит (ссылочный), который не выбирается по педальке....
24 Ёпрст
 
13.01.22
11:54
(18) ну а ты думал, в сказку попал ?
:)
25 Ёпрст
 
13.01.22
11:55
ну при желании, кому религия позволяет, можно формексом поменять отображение реквизита, если склероз не подводит
26 Калиостро
 
13.01.22
12:06
(16), (23) Раз пошла такая пьянка, здесь задам похожий вопрос, чтобы новую тему не заводить.
Тис доработанная.
Из номенклатуры форма списка единиц открывается модально, подчиненная элементу номенклатуры.
Надо ввести подряд несколько новых единиц.
Вводится новый элемент, форма элемента открывается, соответственно, тоже модально.
Для оптимизации в форме элемента единицы сделана кнопка "ОК+", которая должна делает следующее: Записать() Закрыть(), в процедуре ПриЗакрытии() открывает форму нового элемента единицы.
Все работает, но есть проблема.
Пока не закрыт последний элемент, визуально в форме списка не видны сохраненные элементы, что затрудняет контроль.

Подключение формекс и перенос открытия формы нового элемента в процедуру ПослеЗакрытия() не решил проблему.
27 Ёпрст
 
13.01.22
12:08
(26) выкинь модальность, это самое простое
28 Калиостро
 
13.01.22
12:11
(27) Тогда возникают другие заморочки. Надо запретить одновременно открывать форму списка единиц одновременно для разных номенклатур. Или контролировать в каждой форме владельца с запретом изменения иерархии и т.п.
29 Калиостро
 
13.01.22
12:13
(27) Полагаю, проще форму элемента единиц заменить обработкой. Пользователь и не заметит. А все управление делать из формы списка.
30 andrew76
 
13.01.22
13:17
А если реквизит еще и периодический ?
31 Злопчинский
 
13.01.22
13:23
Можно открывать форму не модально, а обычным образом, эмулируя модальность. И всё будет ок.
.
Тот же Епрст показывал как это делать. Жалко, по пряли мы джедая, перешёл Епрст на тёмную сторону силы снеговика...
32 Kigo_Kigo
 
13.01.22
13:38
(26) В форму списка единиц разместить все реквизиты для ввода новой единицы и от туда вводить, не открывая формы нового элемента справочника
33 Kigo_Kigo
 
13.01.22
13:39
(32) Благо там реквизитов то а гулькин х...
34 Злопчинский
 
13.01.22
13:48
Ну, с реквизитов 9-10 для норм работы я точно назову... :-)
35 Злопчинский
 
13.01.22
13:52
И кстати пофиг что там где-то список единиц своевременно не обновляется чтобы посмотреть реть. Зачем посмотреть? Ввёл пользуа единицу - при записи проверил что не дубль/есть такая уже - и норм...
36 Злопчинский
 
13.01.22
13:53
Или псевдо модальность как выше написал
37 Калиостро
 
13.01.22
14:27
ОК, всем спасибо. Вариант (32) я не рассматривал, возможно, еще лучше будет.
38 Злопчинский
 
13.01.22
18:10
(37) тогда уже сделать ввод по строке... хотя это еще то гуано, подходит без извращений для простых справочников типа классификаторов
39 Калиостро
 
13.01.22
20:26
(38) В текущем объеме работ по набиванию 100500 новых элементов руками в каждом вводятся три значения: Число, Строка и флажок. Что ты имеешь в виду под вводом по строке не знаю, но здесь, наверное, не пойдет.
40 Злопчинский
 
13.01.22
20:53
(39) ввод по строке - когда для редактирования элемента не открывается отдельная форма элемента.
41 MWWRuza
 
гуру
14.01.22
01:05
Я сильно не вникал в тему, но, "ложное закрытие" в данном случае не поможет?
42 Arbuz
 
14.01.22
17:24
(36) Покажи как эту псевдомодальность сделать, что-то такое припоминаю, со стилями окна, но не могу найти.
43 Злопчинский
 
14.01.22
21:04
(42) не, там были использование формексовских ПриДеактивацииОкна и ПриАктивацииОкна, подробно - это надо в файлопомойке своей рыться... типа вот так:
.
Перем Расш;

//*******************************************
Процедура Инициализация()
    Расш.ОбработкаОжидания("",0);
    Сообщить(СимволТабуляции+" - и вот хрен вам");
    ОткрытьФорму("Отчет",,РасположениеФайла());
КонецПроцедуры

//*******************************************
Процедура ПриДеактивацииОкна()
    Сообщить(ТекущееВремя()+" попытка удрать из окна обработки");
    Расш.ОбработкаОжидания("Инициализация",100);
КонецПроцедуры

//*******************************************
Процедура ПослеОткрытия()
    Расш = СоздатьОбъект("РасширениеФормы");
КонецПроцедуры
44 Злопчинский
 
14.01.22
21:24
(26) ..плюс к предыдущему6 проще надо делать, проще.
ну если надо ввести несколько единиц последовательно - ну пусть пользюк вводит конвеером по кнопкочке - нажал кнопочку - ввел - нажал кнопочку ввел - нажал кнопочку ввел - нахрена изобретать тяжелые процедуры/процессы? ладно если бы миллион вводов - тогда лишнее нажатие критично было бы...
.
опять же - из формы элемента можно инициализировать ОО родительской формы списка которая при закрытии формы элемента откроет следующий новый ввод, а перед этим форма и обновится... если не получается нормально
.
(27) "Тогда возникают другие заморочки. Надо запретить одновременно открывать форму списка единиц одновременно для разных номенклатур"
- штатно при открытии формы списка единиц для другой номенклатуры - если уже открыта форма списка единиц - при перепозционировании родителя в списке родителя открытая форма списк аединиц просто перерисуется. чтобы открыть несколько форм списка единиц для разных номенклатур - это надо специально прописать...
45 Злопчинский
 
14.01.22
21:25
Плюс открытие формы модально - получается кривое (обрезанное окно формы) если на форму назначен шрифт не по умолчанию...
46 Злопчинский
 
14.01.22
21:25
так что надо ка кЕпрст - откажись от модальности. проблема в чем - так и осталось непонятно...
47 Злопчинский
 
14.01.22
21:52
(26) "Для оптимизации в форме элемента единицы сделана кнопка "ОК+", которая должна делает следующее: Записать() Закрыть(), в процедуре ПриЗакрытии() открывает форму нового элемента единицы."
- фигня получится, т.к. форма элемента открыта модально то конструкция типа

  ОткрытьФорму("Элемент.Единицы",,,,Владелец);
КонецПроцедуры // ПриЗакрытии()

приведет к тому что формы новых единиц будут открываться !!поверх!! предыдущих !!еще незакрытых!! форм элемента единиц.
так что хз как у тебя там кодом как сделано. Открывать форму следующего элемента тогда уже лучше в ПослеЗакрытия()
.
но это все
"Пока не закрыт последний элемент, визуально в форме списка не видны сохраненные элементы, что затрудняет контроль."
контроль чего? даже если форма будет обновляться норм как ты хочешь - запрсото м.б. ситуация что введенные элементы лежать за пределами страницы списка и чтобы было видно (что?) для контроля (последний введенный элемент в списке?) - то надо принудительно например на него позиционироваться...
48 Злопчинский
 
14.01.22
21:52
короче - дохрена хрени...
49 Злопчинский
 
14.01.22
22:07
(26) вот так как ты хочешь - у меня работает:
1. Спр.Номенклатура.ФормаСписка - кнопка "Единицы модально" - жмак!
Процедура ЕдиницыСписокМодально()
    ОткрытьФормуМодально("Справочник.Единицы.ФормаСписка");
КонецПроцедуры //ЕдиницыСписокМодально

2. Открывается Спр.Единицы.ФормаСписка в модальном режиме, кнопка "ввести много новых единиц" - жмак!
Процедура ВвестиНовыхМного()
    Конт = глВзятьКонтекст(Контекст);
    ОткрытьФорму("Элемент.Единицы",Конт,,,Владелец); // откроется модально, т.к. вызывается из модальной формы
КонецПроцедуры //ВвестиНовыхМного()

3. Открывается Спр.Единицы.ФормаЭлемента
Перем КонтРодитель;
Процедура ПриОткрытии()
  КонтРодитель = Форма.Параметр;
  ...
КонецПроцедуры // ПриОткрытии()

    Если ПустоеЗначение(WMS_Выгружен) = 1 Тогда
        //Сообщить("вызов события");
        глСервис.ВнешнееСобытие("FAKIR", "WMSВЫГРУЗИТЬНОМЕНКЛАТУРУ", ЗначениеВСтрокуВнутр(Владелец));
    КонецЕсли;

КонецПроцедуры // ПриЗакрытии()

//*****************************************************************
//
Процедура ПослеЗакрытия()
  Если Выбран() = 0 Тогда Возврат; КонецЕсли; // конец ввода много новых - форму нового элемента закрыли без записи
  КонтРодитель.АктивизироватьОбъект(ТекущийЭлемент());
  ОткрытьФорму("Элемент.Единицы",КонтРодитель,,,Владелец); // следующий новый
КонецПроцедуры // ПослеЗакрытия()
50 Злопчинский
 
14.01.22
22:08
но даже так я не стал бы делать.. на всякий случай...
51 Калиостро
 
15.01.22
01:02
(49) В этом же направлении копнул немного по-другому, но не работает.
Сделал глобальную переменную глСпрЕдиницыФормаСписка.
При открытии формы списка присваиваю ей контекст, при закрытии обнуляю.
Форма единицы может быть открыта в режиме просмотра, а может быть в режиме ввода нового элемента кнопкой Ins (Именно для этого случая изврат через глоб.переменную).
В форме единицы в процедуре по кнопке ОКПлюс выполняется
    Записать();  
    
    Если ТипЗначения(глСпрЕдиницыФормаСписка) = 100 Тогда
        глСпрЕдиницыФормаСписка.Форма.Обновить();
    КонецЕсли;

    Форма.Закрыть();


В процедуре ПослеЗакрытия делается открытие формы нового элемента.

Все равно, эта форма закрывается, на ее месте открывается новый элемент, а в форме списка никаких изменений, пока не закроется форма последнего введенного элемента.

Попробую еще сделать через кнопку на форме списка с процедурой ВвестиНовыхМного.
52 серый КТУЛХУ
 
15.01.22
03:55
(28): " Надо запретить одновременно открывать форму списка единиц одновременно для разных номенклатур. Или контролировать в каждой форме владельца с запретом изменения иерархии и т.п." - ничего такого не надо. можно открывать для каждой номенклатуры свою форму списка единиц. проникнись знаниями суффикса "#чтоугодно" (например в данном случае чтоугодно=конвладельца) для имени открываемой формы.
53 Djelf
 
15.01.22
12:28
(42) Злоп все перепутал, Ёпрст такой ерундой не стал бы заниматься ;)
Вот конфа с примером этой псевдомодальности: https://cloud.mail.ru/public/vBdL/v4NHTSM7b
54 Калиостро
 
15.01.22
15:10
(28) "можно открывать для каждой номенклатуры свою форму списка единиц" - несколько одновременно открытых форм списков подчиненного справочника - это зло похлеще режима модальности.
Такого точно не надо!
Периодически приходится тупить, почему перестает работать быстрый поиск по первым символам в форме списка справочника.
Когда соображаешь, что при этом открыта форма подчиненного справочника, становится понятно, в чем дело.
А уж если будет одновременно открыто несколько форм подчиненного справочника, обезьяны будут нервничать.
55 Калиостро
 
15.01.22
16:20
(54) -> (52)
56 Злопчинский
 
15.01.22
22:31
(51) в (49) рабочий вариант стопудово. Прогал и проверял перед выкладыванием.
57 Злопчинский
 
15.01.22
22:34
(53) кто знает.. кто знает.. может Ёпрст вечерами пьет бурбон и грустит по 7.7...
58 Злопчинский
 
15.01.22
22:34
(51) если что - стучись в ВСКРесенье, сделаем ;-)
59 Злопчинский
 
15.01.22
22:38
(54) чем меньше у пользюка открыто форм на экране - тем лучше.
про несколько форм через # - можно, но не нужно... это как ты правильно заметил - трэш...
тут народ в истерику впал когда открыты две формы родительского справочника (обычная и подбор из документа) и подчиненная форма цен и она - подчиненная "не показывала цены, цены исчезают!!!" - эта ситуация даже проще чем несколько одинаковых дочерних форм... и то трэш и угар... Это мне/тебе/ктулхе с нексколькими формами поянтно что можно/нужно/ненужно делать, а юзверям не до этого, им трясти надо!
60 Злопчинский
 
15.01.22
23:00
(53) Принцип тот же. Вернее - мой пример на принципе из этого примера.
разница - в том, как активируется деактивированное окно... ;-)
61 Калиостро
 
16.01.22
22:06
(58) Спасибо, пока сам поковыряюсь. Будут вопросы, стукнусь.
62 Arbuz
 
17.01.22
17:42
(43) (53) Возможно у меня какое-то ложное воспоминание, но, кажется, что-то я такое видел у Ёпрста вроде установка стилей окну так, что на фоне остальных максимизированых окон оное было не максимизировано и вроде даже поверх остальных (хотя фокус можно было перевести), сайд-эффектом было отсутствие заголовка. Хотя теперь я уже не уверен, и может быть путаю с ПлавающимОкном ))
63 Ёпрст
 
17.01.22
18:48
(62) это был скринсейвер
64 Злопчинский
 
17.01.22
21:40
(62) ну, заголок окна это не проблема убрать, регулярно такое применяю
65 Arbuz
 
18.01.22
17:28
(63) Эмм... и как можно сделать одно из MDI окон немаксимизированным оставив другие соответственно максимизированными?
66 Злопчинский
 
18.01.22
22:58
(65) тоже не знаю...
67 Ёпрст
 
19.01.22
00:35
(65) наеборот же, в моей поделке, одео окно поверх всего на весь экран. На нимфостарте валяется за даром, без всяких фантиков.
68 Злопчинский
 
19.01.22
00:40
Так вопрос как раз в том
Как открыть окно немаксимизированным при прочих максимизированнвх открытых окнах...
69 Ёпрст
 
19.01.22
00:51
(68) можно получить список всех окошек, сделать их не максимизированными, но задать максимальные размеры, разве что принудительно. Я не помню, но вроде как, максимум, модальное окошко можно растянуть, если все остальное максимизировано.