|
Как проконтролировать уникальность создания док-ов один на основании другого? | ☑ | ||
---|---|---|---|---|
0
EarthsSoul
11.05.12
✎
07:33
|
Здрасвуйте
Имеется документ "Приемка автомобиля" на его основании создается документ "Продвинутая требование накладная" Задача: НА основании "приемки автомобиля" пользователь должен иметь возможность создать только один документ "Продвинутая требование накладная". Реализация: В документе "Приемка автомобиля" создал реквизит "Продвинутая требование накладная". Пользователь всегда создает документ "Продвинутая требование накладная" через механизм ввод на основании документа "Приемка автомобиля". Предполагается при заполнении документа приемка автомобиля "Продвинутая требование накладная", автоматически у документа основания ("Приемка автомобиля") заполнять реквизит "Продвинутая требование накладная". В обработке заполнения документа "Продвинутая требование накладаная": Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ПриемкаАвтомобиля") Тогда Если ДанныеЗаполнения.ПродвинутаяТребованиеНакладаная=Документы.ПродвинутаяТребованиеНакладная.ПустаяСсылка() Тогда Приемка=ДанныеЗаполнения.ПолучитьОбъект(); НовыйGUID =Новый УникальныйИдентификатор; ССылкаНовая= Документы.ПродвинутаяТребованиеНакладная.ПолучитьСсылку(НовыйGUID); ЭтотОбъект.УстановитьСсылкуНового(ССылкаНовая); // этот метод ссылку не меняет что делать? Приемка.ПродвинутаяТребованиеНакладаная=ССылкаНовая; Приемка.Записать(); // Заполняем остальные реквизиты нового документа "Продвинутая //требование накладаная" Иначе // Сообщаем пользователю что документ //уже создан и не заполняем КонецЕсли; 1) Подскажите либо другую методику решения задачи? 2) Или быть может ошибка в коде? |
|||
1
EarthsSoul
11.05.12
✎
07:34
|
*Здравствуйте
|
|||
2
Анатолий Никитин
11.05.12
✎
07:39
|
НовыйGUID =Новый УникальныйИдентификатор;
ССылкаНовая= Документы.ПродвинутаяТребованиеНакладная.ПолучитьСсылку(НовыйGUID); ЭтотОбъект.УстановитьСсылкуНового(ССылкаНовая); зачем все это? |
|||
3
Lazy Cat
11.05.12
✎
07:39
|
Как-то на мой взгляд неудачно.... Основание перезаписывать у тебя придется, это раз - если доки оперативно проводятся, начнется хаос.
В ОбработкеЗаполения второго дока: Запрос.Текст = " выбрать ПродвНакл.ссылка КАК ПриемАвто Из Документ.ПродвинутаяТребованиеНакладная КАК ПродвНакл ГДЕ ПродвНакл.документОснование = &НашеОснование"; Запрос.УстановитьПараметр("НашеОснование",ДокументОснование); Если НЕ Запрос.Выполнить().Пустой() Тогда // есть другие документы КонецЕсли; |
|||
4
EarthsSoul
11.05.12
✎
07:48
|
(2) потому что, когда заполняешь документ "Продвинутая требование накладная" то тогда у него еще ссылки нет. Вот и пытаюсь установить ему ссылку.
(3) так конечно тожэ можно но мне кажется это приведет к запросу в БД который по сути перебирает все документы ПродвинутаяТребованиеНакладная что мне кажется через начнет медленно работать... |
|||
5
EarthsSoul
11.05.12
✎
07:49
|
*через год )
|
|||
6
Живой Ископаемый
11.05.12
✎
08:03
|
2(4) "Вот и пытаюсь установить ему ссылку. " Чувак, это все равно что ответить на вопрос "зачем ты сжег чучело масленницы" типа "ну я типа поджег, огонь он повышает температуру, весна наступит раньше" То есть не более чем имитационная магия.
С точки зрения здравого смысла - абсолютная хрень. Ты пытаешься зачем-то в докумнт-родитель ссылку на документ-потомок. Но этого делать совусем не обязательно. Нужно просто проверять в процедуре - есть ли уже в базе данных документ-потомок с таким документом-основанием, и если есть - сообщать пользователю и выходить из процедуры. ==== "оторый по сути перебирает все документы" что значит перебирает? в цикле что ли? а индекс на что? |
|||
7
Lazy Cat
11.05.12
✎
08:04
|
???????????? Сам понял, что сказал??? Запросы - основной механизм получения данных в 1С, это раз. Во вторых: "Вот и пытаюсь установить ему ссылку. " - на не записанный документ??? В третьих: почитай, как работают запросы...
|
|||
8
Lazy Cat
11.05.12
✎
08:06
|
Запросом ты просто проверяешь наличие документа с таким же основанием, и если он есть - тупо выкидываешь пользователя. Никакого перебора там нет!
|
|||
9
Живой Ископаемый
11.05.12
✎
08:07
|
Ну, и во-вторых вместо этого:
НовыйGUID =Новый УникальныйИдентификатор; ССылкаНовая= Документы.ПродвинутаяТребованиеНакладная.ПолучитьСсылку(НовыйGUID); ЭтотОбъект.УстановитьСсылкуНового(ССылкаНовая); Писать так: СсылкаНового=Документы.ПродвинутаяТребованиеНакладная.ПолучитьСсылку(); ЭтотОбъект.УстановитьСсылкуНового(СсылкаНового); |
|||
10
Живой Ископаемый
11.05.12
✎
08:08
|
2(7) Во вторых: "Вот и пытаюсь установить ему ссылку. " - на не записанный документ? - да, а что не так?
|
|||
11
ASU_Diamond
11.05.12
✎
08:09
|
(10) ну тут у меня сразу возник вопрос: а если пользователь передумал вводить документ?
|
|||
12
Живой Ископаемый
11.05.12
✎
08:10
|
2(11) поэтому я и написал в (6), что так делать не надо.
|
|||
13
Живой Ископаемый
11.05.12
✎
08:13
|
2(0) Еще момент, если ты УстановитСсылкуНового не может поменять ссылку у уже существующего (записанного в базу) объекта. Но заполнить на основании повторно можно. Поэтому там еще должно быть условие
Если НЕ ЗначениеЗаполнено(Ссылка) Тогда СсылкаНового=Документы.ПродвинутаяТребованиеНакладная.ПолучитьСсылку(); ЭтотОбъект.УстановитьСсылкуНового(СсылкаНового); КонецЕсли; Приемка.ПродвинутаяТребованиеНакладаная=Ссылка; ==== Но все равно, не нужно так делать |
|||
14
ASU_Diamond
11.05.12
✎
08:18
|
особенно весело будет если документ-основание будет уже в закрытом периоде...
|
|||
15
Живой Ископаемый
11.05.12
✎
08:19
|
2(14) ОбменДанными.Загрузка=Истина, и никакого веселья
|
|||
16
IKSparrow
11.05.12
✎
08:30
|
Госеоди, а что ж вы такие сложные...? При создании нового документа на основании акта приемки авто проверяй запросом с ВЫБРАТЬ ПЕРВЫЕ 1 - есть ли по документу-основанию уже введенные подчиненные документы и если есть то давай тказ ввода.
|
|||
17
Lazy Cat
11.05.12
✎
08:32
|
(16) вот и я про то же...
|
|||
18
Ranger_83
11.05.12
✎
08:34
|
Я что-то не понял смысл этой задачи.А если каких-то запчастей не будет на складе и потребуется второй документ требование-накладная?
|
|||
19
Мимохожий Однако
11.05.12
✎
08:48
|
(18)А нет смысла. Однако можно было отказаться от режима Ввод на основании и сделать кнопку Ввести на основании внутри документа. При заполненном реквизите эту кнопку можно сделать невидимой (недоступной).
|
|||
20
Lazy Cat
11.05.12
✎
08:50
|
(19) +5! Как раз для такого случая ;)
|
|||
21
Ranger_83
11.05.12
✎
08:52
|
(19)Тоже сомнительно,слишком узко ТС мыслит.Т.е в ремонт можно списывать запчасти по нескольким приемкам,почему нет.
Можно сделать как в типовых:внутри требования-накладной сделать кнопки заполнить(в т.ч. понескольким)/дополнить из приемки |
|||
22
EarthsSoul
11.05.12
✎
09:12
|
Решу отпишусь...
|
|||
23
EarthsSoul
12.05.12
✎
10:39
|
В списке документов "ПриемкаАвтомобиля" добавил кнопку которая проверяет реквизит "ПродвинутаяТребованиеНакладная" документа ПриемкаАвтомобиля. И если он заполнен то его открывает, если нет то создает документ "ПродвинутаяТребованиеНакладная", заполняет, записывает, открывает форму документа и заполняет реквизит "ПродвинутаяТребованиеНакладная" документа ПриемкаАвтомобиля. ПриемкаАвтомобиля не делает движений, так что его перезапись не столь критична.
Не стал использовать в документе ПродвинутаяТребованиеНакладная реквизит "основание" и запрос к нему,хотя он есть и заполняется так как думаю что с ростом количества документов ПродвинутаяТребованиеНакладная такой подход приведет к тормозам. - как вы считатет это обоснованное мнение или нет? (Со временем документов ПродвинутаяТребованиеНакладная станет значительно больше) Есть ли причины отказаться предложенного решения? |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |