Имя: Пароль:
1C
 
Не открывается УФ
0 ugra-86
 
01.11.23
09:17
Подскажите пожалуйста, что на(ш)кодил неправильно? Программа зависает на строке ОткрытьФорму, и соответственно форма не открывается

&НаКлиенте
Процедура ПриОткрытии(Отказ)
    Ключ = Новый Структура;
    Ключ.Вставить("Ключ", ОткрытьДок(Объект.ДокументОснование));
    ОткрытьФорму("Документ.КарточкаРемонта.Форма.ФормаДокумента",Ключ);
КонецПроцедуры


Функция ОткрытьДок (ДокументОснование);
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    КарточкаРемонта.Ссылка КАК Ссылка,
    |    КарточкаРемонта.ДокументОснование КАК ДокументОснование
    |ИЗ
    |    Документ.КарточкаРемонта КАК КарточкаРемонта
    |ГДЕ
    |    КарточкаРемонта.ДокументОснование = &ДокументОснование";
    Запрос.УстановитьПараметр("ДокументОснование", ДокументОснование);
    РезультатЗапроса = Запрос.Выполнить();
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        КарточкаРемонта = ВыборкаДетальныеЗаписи.Ссылка;
    КонецЦикла;
    Возврат КарточкаРемонта;
КонецФункции
1 vicof
 
01.11.23
09:23
Ключ переименуй, по-дурацки смотрится.
Хрен знает, что там в этой форме написано при чтении и создании.
Плюс карточка ремонта не всегда будет ссылкой.
2 breezee
 
01.11.23
09:26
Пройдись через f10 отладкой. В какой момент не открывает?
3 Timon1405
 
01.11.23
09:28
выделить в переменную
КарточкаРемонта = ОткрытьДок(Объект.ДокументОснование);
проверить возвращается ли что-то в нее и какого типа
попробовать ОткрытьЗначение(КарточкаРемонта) - если открылось то дело в ОткрытьФорму, если нет то дело в ссылке
4 ugra-86
 
01.11.23
09:30
При чтении и создании ничего нет. Документ карточка ремонта создается обработкой заполнения.
То, что не всегда будет ссылкой это понятно, допишу позже.
Проверяю, когда "Возврат КарточкаРемонта" точно возвращает ссылку
5 ugra-86
 
01.11.23
09:33
(2) В момент перехода на строку ОткрытьФорму

(3) В отладчике: Свойство=Ключ, Значение = "Карточка ремонта....",Тип = ДокументСсылка.КарточкаРемонта
6 maxab72
 
01.11.23
10:30
А нет ли у нас дурного бесконечного цикла? При открытии открываем еще одну форму документа, при его открытии еще одного и так далее.
7 ugra-86
 
01.11.23
11:38
(6) Именно он и получается...
Переделал вот так:

Процедура ПриОткрытии(Отказ)
    //Парам = Новый Структура;
    //Парам.Вставить("Парам", ОткрытьДок(Объект.ДокументОснование));  
    //ОткрытьФорму("Документ.КарточкаРемонта.Форма.ФормаДокумента",Парам);
    П = Новый Структура("Ключ", ОткрытьДок(Объект.ДокументОснование));
    Форма = ПолучитьФорму("Документ.КарточкаРемонта.Форма.ФормаДокумента", П);
    Форма.Объект.Ссылка.Открыть();//теперь на этой строке выпадает ошибка "Метод объекта не обнаружен (Открыть)"
КонецПроцедуры
8 maxab72
 
01.11.23
11:40
У Ссылки нет метода Открыть, нужна форма к объекту.
9 Kigo_Kigo
 
01.11.23
11:46
А так?
ПоказатьЗначение(,Ссылка)
10 maxab72
 
01.11.23
11:57
Просто Форма.Открыть()
11 Gucci76
 
01.11.23
12:02
А замер производительности что показывает?
12 ugra-86
 
01.11.23
12:07
(10) Парам = Новый Структура;
    Парам.Вставить("Парам", ОткрытьДок(Объект.ДокументОснование));  
    Форма = ПолучитьФорму("Документ.КарточкаРемонта.Форма.ФормаДокумента",Парам);
    Форма.Открыть();  // вечный цикл
(9) Так открывает, но новый документ, а не уже записанный
13 maxab72
 
01.11.23
12:38
(12) Так получите форму конкретного записанного документа. Этот не запрещено.
14 Salimbek
 
01.11.23
13:31
(12) В самом начале "ПриОткрытии" проверяй

Флаг = Ложь;
Попытка
    Если Парам.Флаг Тогда
        Флаг=Истина;
    КонецЕсли;
Исключение
КонецПопытки

А дальше

Если НЕ Флаг Тогда
    Отказ = Истина;
    Парам = Новый Структура;
    Парам.Вставить("Флаг", Истина);
    Парам.Вставить("Парам", ОткрытьДок(Объект.ДокументОснование));  
    Форма = ПолучитьФорму("Документ.КарточкаРемонта.Форма.ФормаДокумента",Парам);
    Форма.Открыть();
КонецЕсли;
15 ugra-86
 
01.11.23
13:48
Народ, спасибо за попытки и предложения помочь, но все равно попадаю в вечный цикл...
16 maxab72
 
01.11.23
13:52
(16) так не заходи в него. Добавь Отказ = ИСТИНА, и в параметры при открытии какой-нибудь флаг, чтоб по нему проверять, надо открыть или проигнорировать открытие формы.
17 Мимохожий Однако
 
01.11.23
14:04
(0) Функция ОткрытьДок() удивляет. Посмотри для начала, что она возвращает
18 ugra-86
 
01.11.23
14:08
(17)
Свойство: ОткрытьДок(Объект.ДокументОснование)    
Значение: Карточка ремонта 000000001 от 01.11.2023 16:03:16    Тип:      ДокументСсылка.КарточкаРемонта
19 Мимохожий Однако
 
01.11.23
14:26
(0) Процедура ПриОткрытии()где размещена? В той же форме, которую открываешь? Вот тебе и цикл
20 Timon1405
 
01.11.23
14:26
(15) так сформулируйте должен делать ваш код. вот ваша первая строчка "ПриОткрытии()" - она написана в форме чего? документа КарточкаРемонта? если вы уже в ней, зачем открыть хотите еще одну?
21 ugra-86
 
01.11.23
14:39
© Вон оно чё, Михалыч...
(19) (20) Спасибо, теперь понял.
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn