Имя: Пароль:
1C
1C 7.7
v7: Как закрыть контекст открытой формы документа
, ,
0 ketonija
 
21.03.13
17:05
Суть вопроса такая:
Есть документ, в котором при нажатии на кнопку должны создаться несколько других документов, которые заполняются данными на основании текущего, но в табличных частях этих документов все строки удаляются и заполняются другими данными из подготовленной заранее таблицы значений. Не знаю как закрыть форму, чтоб она не блокировала возможность записи документа (ошибка выскакивает при записи: Объект заблокирован: Счет Мос-000184 (21.03.13)). Пробовал закрывать Конт.Форма.Закрыть();, но типзначения(конт) всеравно остается равным 100.
Вот пример кода, что вешается на кнопку:

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

Дока = СоздатьОбъект("Документ.Счет");
Дока.НайтиДокумент(Конт.ТекущийДокумент());
Конт.Форма.Закрыть();
Дока.УдалитьСтроки();
Пока СчетаПлан.ПолучитьСтроку() = 1 Цикл
   ТоварСчета = СчетаПлан.Товар;
   КоличествоСчета = СчетаПлан.ПолучитьЗначение(Строчка,"Отгрузка"+СокрЛП(1));
   Если Количество > 0 Тогда
       Дока.НоваяСтрока();
       Дока.Товар = ТоварСчета;
       Дока.Количество = КоличествоСчета;
       Дока.Единица = Спр.ТекущийЭлемент();
       Дока.Коэффициент = 1;
   КонецЕсли;
   
Строчка = Строчка+1;    
КонецЦикла;
Попытка
Дока.Записать();
Исключение
   Предупреждение("Не удалось записать счет");
Дока.Записать();
КонецПопытки;
КонецПроцедуры

В модуле формы документа Счет:

Процедура ПриОткрытии()
   Если Форма.Параметр="АвтоСчет" Тогда
        Записать();
        СтатусВозврата(1);
        Возврат;
   КонецЕсли;
КонецПроцедуры
1 StanLee
 
21.03.13
17:06
СтатусВозврата(0)
?
2 Ёпрст
 
21.03.13
17:08
(0)

//ОткрытьФорму("Документ.Счет", Конт, ТекущийДокумент());
Дока = СоздатьОбъект("Документ.Счет");
Дока.Новый();
//заполнение реквизитов..далее запись

//И никаких нахрен ОткрытьФорму в коде!!!!!!!!!!!!!!!!

//Дока.НайтиДокумент(Конт.ТекущийДокумент());
3 ketonija
 
21.03.13
17:22
Вариант
Дока = СоздатьОбъект("Документ.Счет");
Дока.Новый();

это другой вариант решения, т.к. не отработается заполнение реквизитов обработкой ввода на основании. Можно конечно каждый реквизит прописывать вручную, но интересует вариант решения с использованием предопределенной процедуры ВводНаОсновании(ДокОснование) в модуле формы документа Счет.
4 ДенисЧ
 
21.03.13
17:24
толи 1с++, толи формекс имеют методы StartBatch()/EndBatch() которые обходють эту проблему.
5 Mikeware
 
21.03.13
17:29
(4) 1cплюсплюсом каждый может... :-)
6 ДенисЧ
 
21.03.13
17:32
(5) ну, положим, не каждый... :-)
7 ketonija
 
21.03.13
17:42
ДенисЧ, можешь пример на формексе привести? Что в исходном коде надо подправить?
8 ДенисЧ
 
21.03.13
17:45
(7) Да я не помню уже...
9 ДенисЧ
 
21.03.13
17:46
что-то типа
10 ДенисЧ
 
21.03.13
17:46
11 Ёпрст
 
21.03.13
18:18
(3) на, развлекайся:

http://infostart.ru/public/16514/
12 aka MIK
 
21.03.13
18:23
(0)
Док="";
ОткрытьФорму("Документ.ЦенообразованиеНовый",Док);
Док.ЗагрузитьТабличнуюЧасть(ТЗВыб);
Док.ВводНаОсновании(ДокОсн);
13 ketonija
 
21.03.13
18:59
Док.ВводНаОсновании(ДокОсн);
Поле агрегатного объекта не обнаружено (ВводНаОсновании)
Не работает.
14 ketonija
 
21.03.13
19:19
В (11) эта задача не решается, т.к. там создается новый документ, а не тот, что создавался при вызове
Вид = "СчетФактура";
       ОткрытьФорму("Документ."+Вид,КонтекстФормы,Док.ТекущийДокумент());
Тут делается полный перебор реквизитов и переброска их из КонтекстФормы в новый документ ДокНа в процедуре ОбработатьФорму(КонтекстФормы,Вид).

Это фактически тоже самое, даже немного сложнее чем в (2).
15 Ёпрст
 
22.03.13
08:39
(14) та ну ?!
16 Ёпрст
 
22.03.13
08:39
там именно то, что тебе нужно - штатный вызов ВВодНаОсновании
17 Ёпрст
 
22.03.13
08:40
и заполнение всех реквизитов формы.
18 ketonija
 
22.03.13
18:57
В конце концов чтоб не терять время я (2) дополнил кодом из ВВодНаОсновании что в модуле формы документа Счет, а от метода ОткрытьФорму("Документ.Счет", Конт, ТекущийДокумент()); отказался.