|
ОписаниеОповещения | ☑ | ||
---|---|---|---|---|
0
uytreq
13.02.17
✎
17:21
|
Добрый день!
Платформа: 1С:Предприятие 8.3 (8.3.9.1850) Помогите победить такую проблему. Есть форма документа с табличной частью. При редактировании табличной части открывается ФормаРедактирования следующим кодом: &НаКлиенте Процедура ИзменениеСтрокиРаспределения(ЭтоНовый = Ложь, Копирование = Ложь) ОповещениеФормы = Новый ОписаниеОповещения("ОбработчикЗакрытияФормыРедактирования", ЭтаФорма); ОткрытьФорму("Документ.МойДокумент.Форма.ФормаРедактирования",СтруктураПараметров, ЭтаФорма,,,,ОповещениеФормы,); КонецПроцедуры В процедуре код закомментирован, можно читать &НаКлиенте Процедура ОбработчикЗакрытияФормыРедактирования(ФормаРедактированияСтроки, СтруктураПараметров) Экспорт //вообще тут код перезаполнения строки тч, но неработает и так КонецПроцедуры; Первый раз открываешь документ, редактируешь строку в форме редактирования, сохраняешь документ. Второй раз открываешь документ и он заблокирован для изменения. Убираю ОповещениеФормы блокировки нет. Кто может сталкивался, помогите... |
|||
1
uytreq
13.02.17
✎
17:32
|
То есть...
Не надо говорить, что дело в чем-то другом. Конечно там более сложный код. Я уже все перерыл и закомментил. Не работает конкретно из-за оповещения. |
|||
2
uytreq
13.02.17
✎
17:37
|
"Закомменчено" уже до того, что при редактировании ТЧ просто открывается ФормаРедактирования без всяких передач параметров, просто закрывается, срабатывает пустое оповещение без перезаполнений всяких. Документ сохраняется и при открытии повторно документ "заблокирован". Это не кэш, проверено на разных компах и платформах.
|
|||
3
Fragster
гуру
13.02.17
✎
17:43
|
не надо редактировать сам документ через ссылку в двух формах, надо передать ДанныеФормыОбъект в открываемую форму, там выполнить КопироватьДанныеФормы(Параметры.Объект,Объект), при закрытии передать Объект в параметр закрытия и в обработке оповещения о закрытии - копироватьДанныеФормы обратно (из параметра закрытия в реквизит Объект исходной формы)
|
|||
4
Fragster
гуру
13.02.17
✎
17:44
|
в открываемой форме с данными базы ничего не делать
|
|||
5
Fragster
гуру
13.02.17
✎
17:44
|
ну и при обратном копировании взводить модифицированность, чтобы при закрытии задался платформенный диалог о сохранении
|
|||
6
uytreq
13.02.17
✎
18:04
|
(3) Сам документ не редактируется в ФормеРедактирования. Форма редактирования не привязана к объекту никак. Если бы было так, то без Оповещения тоже бы блокировалось.
|
|||
7
uytreq
13.02.17
✎
18:05
|
в процедуре ОбработчикЗакрытияФормыРедактирования как раз и перезаполняется строка ТЧ документа, если там код раскомментировать...
|
|||
8
Fragster
гуру
13.02.17
✎
18:07
|
(6)(7) учитывая, что код в (0) явно не полный (например не раскрыто, что такое "СтруктураПараметров"), могу сказать только одно - подход (3) работает.
|
|||
9
uytreq
13.02.17
✎
18:11
|
(8) Структура параметров действительно заполняется, но она не участвует в оповещении. В оповещении участвует другая структура. ну то есть можно так:
&НаКлиенте Процедура ИзменениеСтрокиРаспределения(ЭтоНовый = Ложь, Копирование = Ложь) ОповещениеФормы = Новый ОписаниеОповещения("ОбработчикЗакрытияФормыРедактирования", ЭтаФорма, СТРУКТУРАОПОВЕЩЕНИЯ); ОткрытьФорму("Документ.МойДокумент.Форма.ФормаРедактирования",СтруктураПараметров, ЭтаФорма,,,,ОповещениеФормы,); КонецПроцедуры &НаКлиенте Процедура ОбработчикЗакрытияФормыРедактирования(ФормаРедактированияСтроки, СТРУКТУРАОПОВЕЩЕНИЯ) Экспорт //вообще тут код перезаполнения строки тч, но неработает и так КонецПроцедуры; Это разные структуры. Просто пи вызове оповещения я СТРУКТУРУОПОВЕЩЕНИЯ удалил, тк код в ОбработчикЗакрытияФормыРедактирования заккоментирован |
|||
10
Fragster
гуру
13.02.17
✎
18:15
|
что такое СтруктураПараметров? блокируется - это "версия объекта изменена или удалена"? так нефиг в открываемой форме ничего делать с данными базы.
или что такое "блокируется"? |
|||
11
uytreq
13.02.17
✎
18:20
|
(10) Вот полный код двух процедур:
&НаКлиенте Процедура ИзменениеСтрокиРаспределения(ЭтоНовый = Ложь, Копирование = Ложь) ДанныеЗаполнения = ?(Не ЭтоНовый ИЛИ Копирование, ПолучитьСтруктуруТабличнойЧастиРаспределения(), Новый Структура); ДанныеЗаполнения.Вставить("Дата", Объект.Дата); ДанныеЗаполнения.Вставить("Владелец" ,Объект.Контрагент); ДанныеЗаполнения.Вставить("ВнутренняяЦентрализация",Объект.ВнутренняяЦентрализация); СтруктураПараметров = Новый Структура; СтруктураПараметров.Вставить("ЭтоНовый", ЭтоНовый); СтруктураПараметров.Вставить("Копирование", Копирование); СтруктураПараметров.Вставить("ДанныеЗаполнения", ДанныеЗаполнения); ОповещениеФормы = Новый ОписаниеОповещения("ОбработчикЗакрытияФормыРедактирования", ЭтаФорма); ОткрытьФорму("Документ.МойДокумент.Форма.ФормаРедактирования",СтруктураПараметров, ЭтаФорма,,,,ОповещениеФормы,); КонецПроцедуры &НаКлиенте Процедура ОбработчикЗакрытияФормыРедактирования(ФормаРедактированияСтроки, СтруктураПараметров) Экспорт //Если ФормаРедактированияСтроки = Неопределено Тогда // Возврат; //КонецЕсли; // //Если СтруктураПараметров.ЭтоНовый Тогда // СтрокаТаблицы = Объект.Распределение.Добавить(); //Иначе // СтрокаТаблицы = Объект.Распределение.НайтиПоИдентификатору(Элементы.Распределение.ТекущаяСтрока); //КонецЕсли; // //ЗаполнитьЗначенияСвойств(СтрокаТаблицы, ФормаРедактированияСтроки); // //Модифицированность= Истина; // //ОбновитьИтоги(ЭтаФорма); КонецПроцедуры Блокировка - ошибка блокировки объекта, объект уже заблокирован (моим сеансом) |
|||
12
Fragster
гуру
13.02.17
✎
18:21
|
убери галочку основной реквизит у реквизита "объект" открываемой формы
|
|||
13
Fragster
гуру
13.02.17
✎
18:23
|
ну и вообще непонятно, это у тебя только для нового должно работать? воспользуйся подходом (3), без передачи всякого левака в открываемую форму
|
|||
14
Fragster
гуру
13.02.17
✎
18:23
|
только "Объект"
|
|||
15
uytreq
13.02.17
✎
18:24
|
(12) Нет основного реквизита у формы ФормаРедактирования.
|
|||
16
uytreq
13.02.17
✎
18:25
|
просто набор реквизитов формы не привязанных к объекту
|
|||
17
Fragster
гуру
13.02.17
✎
18:25
|
тогда кто-то врет, что ничего не делает в открываемой форме...
|
|||
18
uytreq
13.02.17
✎
18:28
|
(17) в откурываемую форму передается СтруктураПараметров, которыми заполняются ее не привязанные к объекту реквизиты. В процедуре ОбработчикЗакрытияФормыРедактирования заполняется строка из не привязанных к объекту данных формы в строку табличной части
|
|||
19
Fragster
гуру
13.02.17
✎
18:36
|
(18) указанные действия не ведут к указанному сообщению об ошибке. либо редактируется "основной реквизит", либо вызывается Заблокировать, ЗаблокироватьДанныеДляРедактирования или ЗаблокироватьДанныеФормыДляРедактирования
|
|||
20
Fragster
гуру
13.02.17
✎
18:38
|
при этом ....ДанныеФормы... - опять же для основного реквизита. Используется, например, в Зацените канбан доску на 1с при открытии формы подбора задач в итерацию
|
|||
21
Fragster
гуру
13.02.17
✎
18:43
|
не подход из (3), а открытие формы и оповещение при закрытии
|
|||
22
uytreq
13.02.17
✎
18:48
|
Все вырезал, оставил вот такой код так блокирует:
&НаКлиенте Процедура ИзменениеСтрокиРаспределения(ЭтоНовый = Ложь, Копирование = Ложь) ОповещениеФормы = Новый ОписаниеОповещения("ОбработчикЗакрытияФормыРедактирования", ЭтаФорма); ОткрытьФорму("Документ.ИмСтруктураРаспределенияПрофвзносов.Форма.ФормаРедактирования",, ЭтаФорма,,,,ОповещениеФормы,); КонецПроцедуры &НаКлиенте Процедура ОбработчикЗакрытияФормыРедактирования(ФормаРедактированияСтроки, СтруктураПараметров) Экспорт КонецПроцедуры |
|||
23
uytreq
13.02.17
✎
18:49
|
Из открытия формы убираю оповещение так нет блокировки:
&НаКлиенте Процедура ИзменениеСтрокиРаспределения(ЭтоНовый = Ложь, Копирование = Ложь) ОповещениеФормы = Новый ОписаниеОповещения("ОбработчикЗакрытияФормыРедактирования", ЭтаФорма); ОткрытьФорму("Документ.ИмСтруктураРаспределенияПрофвзносов.Форма.ФормаРедактирования",, ЭтаФорма,,,,,); КонецПроцедуры &НаКлиенте Процедура ОбработчикЗакрытияФормыРедактирования(ФормаРедактированияСтроки, СтруктураПараметров) Экспорт КонецПроцедуры |
|||
24
uytreq
13.02.17
✎
18:50
|
Напомню блокировка работает так:
1. Открываем документ 2. открываем ФормуРедактирования 3. ЗАкрываем формуРедактирования 4. Сохраняем документ (проведение закомментировано) 5. Открываем его повторно 6. Меняем ему например дату - выходит сообщение о блокировке объекта |
|||
25
uytreq
13.02.17
✎
18:51
|
у меня счас крыша поедет)
|
|||
26
Fragster
гуру
13.02.17
✎
18:53
|
(24) значит где-то висит кольцевая ссылка, из-за которой исходная форма документа остается висеть в памяти
|
|||
27
Fragster
гуру
13.02.17
✎
18:53
|
и форма по факту не закрывается
|
|||
28
Fragster
гуру
13.02.17
✎
18:54
|
на этапе (4). ты же в (0-23) не написал, что переоткрываешь форму
|
|||
29
uytreq
13.02.17
✎
18:57
|
(28) Да я не сразу заметил, при повторном открытии форму редактирования уже можно не открывать, объект уже заблокирован на любое изменение.
|
|||
30
uytreq
13.02.17
✎
18:58
|
(26) как мне отследить кольцевую ссылку, в формуредактирования ничего уже не передается, ссылок на форму документа нет, на объект нет. Код в формередактирования минимальный.
Почему при оповещении работает а без оповещения нет понять не могу. |
|||
31
uytreq
13.02.17
✎
18:59
|
(30) крыша едет, "без оповещения нет блокировки, с оповещением - есть" понять не могу.
|
|||
32
Fragster
гуру
13.02.17
✎
19:02
|
ПолучитьСтруктуруТабличнойЧастиРаспределения() нигде ссылки на что-нибудь из формы не возвращает?
|
|||
33
Fragster
гуру
13.02.17
✎
19:03
|
хотя если блокирует (22) дело в открываемой форме может быть
|
|||
34
uytreq
13.02.17
✎
19:05
|
(32) нет у меня такого ничего
|
|||
35
uytreq
13.02.17
✎
19:17
|
(33) В форме редактирования закомментил все кроме
&НаКлиенте Процедура ЗаписатьИЗакрыть(Команда) Модифицированность = Ложь; Закрыть(ЭтаФорма); КонецПроцедуры Ничего не изменилось! Где тут смайл бьющегося о стену головой человека? |
|||
36
uytreq
13.02.17
✎
20:22
|
Вот короче к чему пришел. Кто хочет попробуйте, конфа БП 3.0.
1. Сделал новый документ - ИМДокументТест 2. Сделал у документа ТЧ - Распределение 3. Добавил в ТЧ поле "процент" числовое. 4. Добавил ФормуДокумента, вытащил все что есть на форму. 5. ТЧ на форме добавил свойство Выбор - (РаспределениеВыбор) 6. Код в форме документа: &НаКлиенте Процедура РаспределениеВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) ИзменениеСтрокиРаспределения(); КонецПроцедуры &НаКлиенте Процедура ИзменениеСтрокиРаспределения(ЭтоНовый = Ложь, Копирование = Ложь) ОповещениеФормы = Новый ОписаниеОповещения("ОбработчикЗакрытияФормыРедактирования", ЭтаФорма); ОткрытьФорму("Документ.ИМДокументТест.Форма.ФормаРедактирования",,,,,,ОповещениеФормы,); КонецПроцедуры &НаКлиенте Процедура ОбработчикЗакрытияФормыРедактирования(ФормаРедактированияСтроки, СтруктураПараметров) Экспорт КонецПроцедуры 7. Добавил ФормуРедактирования (ПРОИЗВОЛЬНУЮ), добавил на нее команду "ЗаписатьИЗакрыть". 8. Код модуля ФормыРедактирования: &НаКлиенте Процедура ЗаписатьИЗакрыть(Команда) Модифицированность = Ложь; Закрыть(ЭтаФорма); КонецПроцедуры Все примитивно! На создание ушло 3 минуты, если кто решит попробовать. Работает также, то есть: 1. Добавляете в тч строку. Сохраняете. 2. Открываете второй раз - шелкайте по строке, открывается форма редактирования, закрываете и записываете документ. 3. Открываете 2 раз. Пытаетесь поменять например дату. Получаете ошибку блокировки. Никаких передач параметров, ничего. Тупо не работает!!! |
|||
37
mc79
13.02.17
✎
21:59
|
Проблема была в процедуре ФормыРедактирования:
Процедура ЗаписатьИЗакрыть(Команда) Модифицированность = Ложь; Закрыть(ЭтаФорма); КонецПроцедуры Проблема в том, что команда "Закрыть(ЭтаФорма)" возвращает ФормуРедактирования в основную ФормуДокумента. Если вместо этого написать "Закрыть()", то блокировки не будет. Если ФормуРедактирования таки необходимо вернуть, то можно в обработчике закрытия "ОбработчикЗакрытияФормыРедактирования" написать "ФормаРедактированияСтроки.ОписаниеОповещенияОЗакрытии = Неопределено;" Я так понимаю, что это недоработка механизма ОписаниеОповещения и порядка уничтожения объектов. Из-за чего возникают перекрестные ссылки и объекты остаются в памяти. |
|||
38
Fragster
гуру
13.02.17
✎
23:32
|
(37) нет, надо вместо ЭтаФорма в Закрыть() передавать то, что ты хочешь вернуть. Например структуру с данными или ДанныеФормыОбъект....
|
|||
39
Fragster
гуру
13.02.17
✎
23:34
|
(37) там ссылка РезультатЗакрытия - это открываемая форма. у нее есть свойство .Владелец - это твоя исходная форма
|
|||
40
uytreq
14.02.17
✎
10:57
|
Fragster, mc79 большое профессиональное спасибо!
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |