Имя: Пароль:
1C
1С v8
ОписаниеОповещения
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 большое профессиональное спасибо!