Имя: Пароль:
1C
1С v8
Ввод на основании в УФ
,
0 Gobo
 
25.06.13
09:17
Доброе время суток !

8.2, Бухгалтерия, Управляемые приложения.
Из документа "Акт" с помощью стандартной кнопки "Создать на основании" создается документ "СФ".
На один документ "Акт" должен соответствовать только один документ "СФ".
Как сделать чтобы при нажатии "Создать на основании", открыл имеющийся документ если такой существует.
Пытался сделать так:
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
   Если Не ДанныеЗаполнения.Проведен Тогда            
       Сообщить("Документ не проведен !");
       СтандартнаяОбработка = Ложь;
       Возврат;
   КонецЕсли;    
   
   Запрос = Новый Запрос;
   Запрос.Текст =
   "ВЫБРАТЬ РАЗРЕШЕННЫЕ
   |    Док.Ссылка
   |ИЗ
   |    Документ.СФ Как Док
   |
   |ГДЕ
   |    Док.ДокументОснование = &ДокументОснование";
   
   Запрос.УстановитьПараметр("ДокументОснование", ДанныеЗаполнения);
   
   Результат = Запрос.Выполнить();
   Если Не Результат.Пустой() Тогда
       СтандартнаяОбработка = Ложь;
       Выборка = Результат.Выбрать();
       Выборка.Следующий();
       СсылкаНаДокумент = Выборка.Ссылка;
       Форма = СсылкаНаДокумент.ПолучитьФорму();
       Форма.Открыть();
       Возврат;
   КонецЕсли;
           
       
   //{{__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ
   // Данный фрагмент построен конструктором.
   // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

...
   //}}__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ
КонецПроцедуры


Получаю ошибку: Интерактивные операции недоступны

Помогите пожалуйста.
1 Cube
 
25.06.13
09:18
(0) "Форма.Открыть();" ...
Мда... И комы ты &НаСервере это показывать собираешься?
2 Cube
 
25.06.13
09:18
комы = кому
3 Cube
 
25.06.13
09:19
(0) "Как сделать чтобы при нажатии "Создать на основании", открыл имеющийся документ если такой существует."

Никак.
4 GROOVY
 
25.06.13
09:22
Ну почему же никак. Надо команду описать которая инициирует ввод на основании, можно даже заменить стандартную процедуру объекта, и там описать все что нужно. Но точно не в обработке заполнения.
5 Gobo
 
25.06.13
09:24
Как это сделать ?
Можно пример ?
6 Cube
 
25.06.13
09:28
(4) "Надо команду описать которая инициирует ввод на основании, можно даже заменить стандартную процедуру объекта, и там описать все что нужно."

Это что-то новенькое?...
7 Маратыч
 
25.06.13
09:30
В документе, вводимом на основании, добавить предопределенную процедуру ВводНаОсновании, в ней описать поиск документа, и если есть - открыть имеющийся. В чем проблема-то?
8 Cube
 
25.06.13
09:31
(7) "добавить предопределенную процедуру ВводНаОсновании"
И как к ней обратиться из стандартного ввода на основании?
9 Mitriy
 
25.06.13
09:32
(7) в том, что серверу на клиента глубоко начхать...
10 Gobo
 
25.06.13
09:38
Хорошо попробую через процедуру ВводНаОсновании в документе "СФ".
А в процедуре "ОбработкаЗаполнения" оставить только "КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ" ?
Там больше ничего добавить не надо ?
11 Gobo
 
25.06.13
09:51
Не нашел в списке процедур - ВводНаОсновании. В каком модуле он должен быть ?
12 Cube
 
25.06.13
09:51
(10) Не ведись на провокацию... ЭТО работать не будет 146%...
13 Cube
 
25.06.13
09:51
(11) Он, типа, предлагает самому её описать... Бред...
14 Gobo
 
25.06.13
10:00
Может (7) путает с обычными приложениями, у меня Управлямые Приложения.
(12) , Ваше предложение ?
15 Cube
 
25.06.13
10:02
(14) "Ваше предложение ?"
Озвучено в (3)
16 Allexe
 
25.06.13
10:18
&НаКлиенте
Процедура ПриОткрытии(Отказ)
   Если ЗначениеЗаполнено(Объект.ДокОснование) Тогда
       
       П = Новый Структура("Ключ",Объект.ДокОснование);
       ВыбФорма = ПолучитьФорму("Документ.ПриходнаяНакладная.ФормаОбъекта",П);
       ВыбФорма.Открыть();
       Закрыть();
   КонецЕсли;
КонецПроцедуры

Что-то типа подобного работает вместо докоснование получай документ который тебе надо открыть
17 Allexe
 
25.06.13
10:22
В обработке заполнения вводимого на основании пишешь

Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
   Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ПриходнаяНакладная") Тогда
       // Заполнение шапки
       ДокОснование = ДанныеЗаполнения;
   КонецЕсли;

КонецПроцедуры
18 Gobo
 
25.06.13
10:52
Применил (16), (17).
Открывается новый подчиненный документ.
Где тут указать поиск ранее введенного и использовать его результат ?
19 Allexe
 
25.06.13
11:16
(18) В ОбработкаЗаполнения ты получаешь докоснование, производишь поиск ранее введенного, можно сделать какой нибудь реквизит в доке типа ранеевведенныйсф, если есть ранее введенный заполняешь этот реквизит. Далее при открытии проверяешь если этот реквизит заполнен открываешь форму ранеевведенныйсф, а эту закрываешь
20 Поросенок Петр
 
25.06.13
11:28
Типовые конфигурации по этому поводу тупо открывают незаполненную форму с сообщением, почему нельзя заполнить. А вообще некрасивое место в платформе, коих хватает.
21 Desna
 
25.06.13
11:41
это должна быть обработка которая не портит типовую конфу
22 Trainee
 
25.06.13
11:50
(18) А почему нельзя, сделать поиск существующего(при наличии открыть форму по имеющейся ссылке), если не найден (17)?
23 Gobo
 
25.06.13
13:59
Сделал так:
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
   //{{__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ
   Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.Акт") Тогда
       ДокументОснование = ДанныеЗаполнения.Ссылка;
       РанееВведенныйДок=ОбщийСерверный.ПоискПодчДок(ДокументОснование, "СФ");
       
       // Заполнение шапки
       Клиент = ДанныеЗаполнения.Клиент;
       Организация = ДанныеЗаполнения.Организация;
       Для Каждого ТекСтрокаТаб Из ДанныеЗаполнения.ТабЧасть Цикл
           НоваяСтрока = ТабСФ.Добавить();
           НоваяСтрока.Количество = ТекСтрокаТаб.Тонн;
           НоваяСтрока.Цена = ТекСтрокаТаб.Цена;
       КонецЦикла;
   КонецЕсли;
   //}}__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ
КонецПроцедуры


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

Теперь открывается РанееВведеный документ.
Но теперь он не заполняется повторно, из основного документа.
Т.е. не работает - КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ.
24 Allexe
 
25.06.13
15:43
(23) Так тебе надо если уже был введен на основании не просто его открыть, а перезаполнить?
25 Allexe
 
25.06.13
15:50
После
РанееВведенныйДок=ОбщийСерверный.ПоискПодчДок(ДокументОснование, "СФ");

Тебе надо определить есть ли ранее введенный док или нет если есть тогда все реквизиты заполнять в нем, а если нет то в новом документе как у тебя идет дальше

Клиент = ДанныеЗаполнения.Клиент;
       Организация = ДанныеЗаполнения.Организация;
       Для Каждого ТекСтрокаТаб Из ДанныеЗаполнения.ТабЧасть Цикл
           НоваяСтрока = ТабСФ.Добавить();
           НоваяСтрока.Количество = ТекСтрокаТаб.Тонн;
           НоваяСтрока.Цена = ТекСтрокаТаб.Цена;
       КонецЦикла;
Т.е. у тебя по условию если уже был док то должено заполняться наподобие
РанееВведенныйДок = РанееВведенныйДок.ПолучитьОбъект();
РанееВведенныйДок.Клиент = ДанныеЗаполнения.Клиент;
... и т.д.
26 Gobo
 
25.06.13
16:13
Пробовал 2 варианта.
1 - вариант:
РанееВведенныйДок=ОбщийСерверный.ПоискПодчДок(ДокументОснование, "СФ");
Если ЗначениеЗаполнено(РанееВведенныйДок) Тогда
    РанееВведенныйДок=РанееВведенныйДок.ПолучитьОбъект();
    РанееВведенныйДок.Клиент=ДанныеЗаполнения.Клиент;
Иначе

Получил ошибку: Значение не является значением объектного типа (Клиент).

2- вариант:
       РанееВведенныйДок=ОбщийСерверный.ПоискПодчДок(ДокументОснование, "СФ");    
Если ЗначениеЗаполнено(РанееВведенныйДок) Тогда
    РанееВведенныйДокОб=РанееВведенныйДок.ПолучитьОбъект();
    РанееВведенныйДокОб.Клиент=ДанныеЗаполнения.Клиент;

    РанееВведенныйДок=РанееВведенныйДокОб.Ссылка;
Иначе

Ошибок не было, но изменения не сохранены.
Подскажите, пожалуйста.
27 Allexe
 
25.06.13
16:54
(25) РанееВведенныйДок.Записать()
28 Gobo
 
25.06.13
22:11
Allexe, Большое спасибо !

В итоге получилось так:
РанееВведенныйДок=ОбщийСерверный.ПоискПодчДок(ДокументОснование, "СФ");    
Если ЗначениеЗаполнено(РанееВведенныйДок) Тогда
    РанееВведенныйДокОб=РанееВведенныйДок.ПолучитьОбъект();
    РанееВведенныйДокОб.Клиент=ДанныеЗаполнения.Клиент;

    РанееВведенныйДокОб.Записать();
    РанееВведенныйДок=РанееВведенныйДокОб.Ссылка;
Иначе

Все работает.
Думаю нет подводных камней ?
29 Allexe
 
26.06.13
08:59
(28) Думаю нет :)
30 5 Элемент
 
26.06.13
09:50
Ты сделал совершенно не правильно.

Нужно создать свою команду ввода на основании.
В модуле команды вызвать серверную процедуру, которая возвращает ссылку если док существует.
И затем создавать новый или открывать существующий.

Ссылка = СуществующийДок(Основание);

Если Ссылка <> Неопределено Тогда
   ПараметрыФормы = Новый Структура("Ключ", Ссылка);
Иначе
   ПараметрыФормы = Новый Структура("Основание", Основание);
КонецЕсли;

ОткрытьФорму("Документ.ХХ.ФормаОбъекта", ПараметрыФормы);
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.