|
Ввод на основании в УФ | ☑ | ||
---|---|---|---|---|
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
|
Ты сделал совершенно не правильно.
Нужно создать свою команду ввода на основании. В модуле команды вызвать серверную процедуру, которая возвращает ссылку если док существует. И затем создавать новый или открывать существующий. Ссылка = СуществующийДок(Основание);
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |