![]() |
![]() |
![]() |
|
ОбработкаПроведения() и СделатьНепроведенным() Ø (Волшебник 05.01.2005 23:09) |
☑ | ||
---|---|---|---|---|
0
vurr
04.01.05
✎
19:12
|
У меня простой вопрос.
Есть документ, который проводится. В модуле этого документа в процедуре ОбработкаПроведения() я проверяю документ на корректность заполненных строк и реквизитов, и в случае ошибок заполнения формы отменяю проведение документа: СтатусВозврата(0); Возврат; А как сделать, чтобы можно было отменить проведение документа? То есть чтобы изменения (некорректные), были записаны, а движения документа удалились? Нашел в описании языка процедуру СделатьНеПроведенным(), но там также написано, что «Метод нельзя использовать в теле предопределенной процедуры ОбработкаПроведения()». ??? |
|||
1
vS
04.01.05
✎
19:18
|
статусВозврата(0) в модуле проведения, отменяет проведение
что у тебя там пишется? если периодика справочников, стандартно, то она тоже не будет записана, это как транзакция, точнее это она и есть :) |
|||
2
vurr
04.01.05
✎
20:17
|
Наверно, меня не поняли… Например, есть документ с реквизитом Флаг
Если флаг=1, документ должен быть проведен и иметь движения по счетам. Если флаг=0, надо удалить все движения документа и сделать его непроведенным. Процедура, которая написана у меня, выглядит так: … Если Флаг=0 Тогда ОчиститьДвижения(); СтатусВозврата(0); Возврат; КонецЕсли; ….//здесь код проведения документа проблема в том, что если изначально документ был создан/сохранен/проведен с флагом=1, то если открыть его заново и изменить флаг на ноль, движения будут удалены, но документ останется проведенным – как это можно исправить? (самое интересное, что 1с при обработке такого документа пишет, что документ не проведен, но флаг проведения не снимает). PS: Здесь схема представлена несколько упрощенно, на самом деле надо сделать документ непроведенным не только при флаге=0, но и когда есть незаполненные/некорректно заполненные реквизиты формы и табличной части документа. |
|||
3
Warlock
04.01.05
✎
20:27
|
Используй НеПроводитьДокумент()
|
|||
4
vurr
04.01.05
✎
21:02
|
Я только одну вещь понять не могу.
У меня есть кнопка ОК с формулой #Записать Провести? Закрыть Если я, пользуясь последним советом, перепишу условие так: Если Флаг=0 Тогда НеПроводитьДокумент(); Возврат; КонецЕсли; ,то 1С-ка пишет «Документ не проведен!», а сам документ не сохраняет свои изменения. Его можно просто вручную закрыть, например, нажав на ту-же кнопку ОК и отказавшись от изменений, вручную сделать непроведенным и затем уже провести правильно (точнее, изменит флаг на нуль и документ сохраниться и останется непроведенным). В принципе, это тоже неплохой вариант, но может все же есть способ через модуль документа 1/ сделать непроведенным 2/ записать изменения 3/ закрыть без проведения и всю эту последовательность действий сделать программно, а не вручную? |
|||
5
vurr
04.01.05
✎
21:07
|
Я тут вспомнил, что в типовой бухии тоже нельзя изменить дату проведенного документа - надо опять же вручную отменить проведение и затем уже менять дату/проводить заново, хотя удобнее просто изменить дату и доверить документу сделать непроведенным/провести заново. Получается. это ограничение 1С?
|
|||
6
NiGMa
04.01.05
✎
21:44
|
(5) Да, это ограничение 1С (7.7)
В контексте модуля документа невозможно использование методов Провести() и СделатьНеПроведенным(). Однако, есть довольно хитрый обходной маневр, с использованием дополнительной обработки. Идея была в свое время опубликована в "умелых ручках" на hare.ru (теперь это можно найти на dead.hare.ru ). |
|||
7
Warlock
04.01.05
✎
21:58
|
vurr, вашу проблему можно было объяснить гораздо проще...
+6 вот та статья с hare.ru: <========cut========> Обход блокировок в открытых формах документов и справочников. Алексей Николаев (AlexNik) июнь 2002 -------------------------------------------------------------------------------- Иногда возникает необходимость изменения даты проведенного документа в момент, когда открыта форма этого документа. Пользователь хочет изменить дату документа, не открывая журнал и не закрывая форму документа. Проблема очевидна – пока открыта форма документа, он заблокирован, и программные действия (СделатьНеПроведенным, Записать и пр.) просто недопустимы. Необходимо придумать что-то такое, чтобы пользователь смог изменить дату проведенного документа, просто нажав на кнопку в открытой форме этого же документа. Та же самая ситуация возникает, когда мы хотим изменить родителя или владельца в открытой форме элемента справочника. Вопрос: а можно ли как-нибудь обойти блокировку некоторых методов объекта "Документ" или "Справочник", возникающуюю автоматически при открытии формы объекта? Ответ: "да, можно". Хотя ответ и не очивиден, но он именно таков. Механизм одинаков для всех случаев, для удобства рассмотрим пример решения задачи по изменению даты проведенного документа. Задача Пользователь открыл документ. Документ проведен. Пользователь меняет дату, жмет на кнопку (например, "Провести")… V7 не выдает сообщение "Изменена дата проведенного документа!", а молча отрабатывает действие пользователя. Решение Пытаемся переложить все программные манипуцляции с документом в обработку. Последовательность программных действий следующая. По кнопке в документе, например, по той же "ОК", открываем форму некоей обработки, в которую передаем необходимые параметры. В обработке, в процедуре ПриОткрытии, инициализируем переданные параметры, закрываем форму документа. В форме документа, в процедуре ПриЗакрытии, проверяем, что это "инициатива" служебной обработки, закрываем форму обработки. В форме обработки, в процедуре ПриЗакрытии, делаем необходимые манипуляции с документом, затем открываем его форму обратно. В результате наблюдаем эффект мелькания формы документа на экране. Если документ долго перепроводится, то открытое в этот момент окно формы обработки можно использовать для вывода сообщений, типа "wait please…". Что при этом происходит Oткрывается обработка, документ пока заблокирован закрывается документ (из обработки при ее открытии), документ еще заблокирован при закрытии документа вызываем закрытие обработки, документ пока заблокирован при закрытии обработки документ уже разблокирован (форма наконец-то закрыта), меняем его как угодно, открываем форму документа Программный код //В модуле формы документа Перем ПараПараметров; ... Процедура ПриЗакрытии() Если ТипЗначенияСтр(ПараПараметров) = "ГрупповойКонтекст" Тогда // форма обработки открыта ПараПараметров.Форма.Закрыть(); // закрываем форму обработки КонецЕсли; КонецПроцедуры // ПриЗакрытии Процедура Тест() // по кнопке ПараПараметров = СоздатьОбъект("СписокЗначений"); ПараПараметров.Установить("КонтекстДокумента", Контекст); // передаем контекст документа ПараПараметров.Установить("НоваяДата",ДатаДок-1); // передаем дополнительные параметры, например, новую дату документа ОткрытьФорму("Обработка.ТестИзмененияДаты", ПараПараметров); // открываем форму обработки КонецПроцедуры // Тест ... // Модуль формы обработки. Перем ТекДок, НоваяДата; // вспомогательные переменные, можно хранить в списке значений // здесь форма документа уже закрыта, блокировки нет // делаем необходимые манипуляции, // после которых открываем форму документа Процедура ПриЗакрытии() Док = СоздатьОбъект("Документ"); Если Док.НайтиДокумент(ТекДок) = 1 Тогда Если Док.Проведен() = 1 Тогда Док.СделатьНепроведенным(); КонецЕсли; Док.ДатаДок = НоваяДата; Док.Записать(); Док.Провести(); ОткрытьФорму(ТекДок); КонецЕсли; КонецПроцедуры // ПриЗакрытии // при открытии формы обработки запоминаем переданные параметры, // после чего закрываем форму документа (ставится "в очередь") Процедура ПриОткрытии() Если ТипЗначенияСтр(Форма.Параметр) = "СписокЗначений" Тогда КонтекстДокумента = Форма.Параметр.Получить("КонтекстДокумента"); НоваяДата = Форма.Параметр.Получить("НоваяДата"); ТекДок = КонтекстДокумента.ТекущийДокумент(); КонтекстДокумента.Форма.Закрыть(0); Иначе СтатусВозврата(0); КонецЕсли; КонецПроцедуры // ПриОткрытии Всё, готово дело. Задача решена. <========cut========> |
|||
8
Дурочка 1С
04.01.05
✎
22:03
|
Уроды. У (0) с азами плохо, а вы его всяким ненужным глупостям учите.
|
|||
9
Warlock
04.01.05
✎
22:33
|
(8)ИМХО ты слегка не разобралась...
Проанализируем (4) ... 1/ сделать непроведенным 2/ записать изменения 3/ закрыть без проведения ... Учитывая комбинацию пунктов 1 и 3 документ нужно сделать не проведенным из его модуля(формы). Вроде основная проблема была в этом, а не в азах построения правильного модуля проведения. |
|||
10
Дурочка 1С
04.01.05
✎
22:40
|
Почитай (0). Это ж бред сивой кобылы.
|
|||
11
Warlock
04.01.05
✎
22:48
|
(10)Не могу не согласится...
|
|||
12
NiGMa
04.01.05
✎
22:52
|
(10) Вот ему и написали много умных слов - может хоть какие-то на пользу пойдут...
Вот только в (7) зря процитировали - я надеялся, что автор исходного поста сам сходит к Никите. Заодно, глядишь, чего полезного бы себе поднакачал. |
|||
13
Дурочка 1С
04.01.05
✎
23:04
|
(12) Ты видел плакат "Спички детям не игрушка!"? Он еще не может разобраться с проведение/перепроведением, с флагами со своими, а вы ему суете ракетную установку с ласковыми словами "Ты только кнопочку нажми..."
|
|||
14
NiGMa
04.01.05
✎
23:07
|
(13) Это поклеп!!!
Я только отослал не сайт, где есть... хм... чертежи и инструкции по сборке ракет, их запуску и пр. А также и много умных мыслей. |
|||
15
vurr
04.01.05
✎
23:32
|
Спасибо, буду пробовать. Я конечно, не волшебник, но азы я, так-что грузите-подробности мне тоже интересны.
|
|||
16
vurr
04.01.05
✎
23:34
|
...но азы я знаю ;)), в смысле...
|
|||
17
Дурочка 1С
04.01.05
✎
23:38
|
Надпись в мужском туалете: "Не льсти себе - подойди поближе!"
|
|||
18
vurr
04.01.05
✎
23:53
|
А кстати, Дурочка 1С, эта он или она? А то язычок больно острый, на дэвушку не похоже ;))
|
|||
19
Zubr
05.01.05
✎
00:13
|
(15) Не надо ничего пробовать. Поверь, что даже если ты и достигнешь желаемого с помощью хитроумных ухищрений, это всеравно будет неправильно - в первую очередь, с методологической точки зрения.
Лично я придерживаюсь такой методики, что проведенные документы открываются только для чтения, т.е. хочешь чего нибудь изменить, (даже если это может быть и не повлияет на проводки/движения) - будь добр сделай док непроведенным. |
|||
20
Warlock
05.01.05
✎
00:36
|
(19)Черезвычайно умное решение. В нем есть офигенные грабли: пока документ редачится - все движения и проводки отменены. Представь ситуацию: решил бухгалтер подкорректировать описание проводки документа, введенного в начале месяца, отменил документ, а в другом конце здания директор в это время сформировал отчет и, мягко говоря, удивился...
|
|||
21
vurr
05.01.05
✎
01:47
|
Zubr, а мне идея понравилась - наверно, попробую ее реализовать для некоторых типов документов.
|
|||
22
Ёжик в тумане
05.01.05
✎
05:23
|
(19) Ну хоть кто-то ещё следует здравому смыслу!
Даже как-то неожиданно :) |
|||
23
Кофеин
05.01.05
✎
07:05
|
(17)Если ты не мужик, то что делала в мужском туалете? :)
|
|||
24
Zubr
05.01.05
✎
10:39
|
(20) Грабли есть везде и во всем.
В даном случае я бы не называл их офигенно большими... |
|||
25
Warlock
05.01.05
✎
19:22
|
(24)Пока грабли лежат - кажутся маленькими. Но стоит наступить...
|
|||
26
Парижская фанера
05.01.05
✎
19:29
|
(0) А не проще не записывать кривой документ? Тем более если он делается интерактивно? Чего огород городить...
|
|||
27
NiGMa
05.01.05
✎
19:30
|
(25) OFF: Лучше трижды наступить на взрослые грабли, чем однажды - на детские ;)
|
|||
28
Парижская фанера
05.01.05
✎
19:36
|
(20) А потом бухгалтер провела документ, директор сформировал новый отчет и опять удивился... (М)удак ваш директор...
|
|||
29
Warlock
05.01.05
✎
19:45
|
(28)Во-первых, не наш, а клиентский :). Во-вторых директор видит перед собой три отчета(кстати, это были отчеты по движению денежных средств), сформированные, скажем, в 12:00 12:30 и в 13:00, и в том, что в 12:30 не хватает несколько десятков-сотен тысчонок... И кто по его мнению (М)удак?!
ЗЫ Маленькое примечание директор всегда прав ЗЫЫ Если всеж он не прав - смотри выше... |
|||
30
Парижская фанера
05.01.05
✎
19:56
|
(29)Понятно... Не горячись... Директора все такие :)
|
|||
31
Warlock
05.01.05
✎
20:00
|
В том то и дело, что директора накладывают определенные ограничения...
|
|||
32
Zubr
05.01.05
✎
22:54
|
Было время, я очень гордился, когда мне удавалось реализовать то или иное "безумное" (по)желание заказчика - ведь в 1С можно почти все !
Теперь я без сожаления расстаюсь с заказчиками, желающими изобретать велосипед в смысле метологогии. Даже если платят много. Практика показала, что в будущем это оборачивается только геммороем и кучей проблем, когда заказчик начинает сам понимать, что он был неправ. |
|||
33
Дурочка 1С
05.01.05
✎
23:07
|
(32) Приводи их ко мне. Как грится:
"Выполним любые работы по переводу Ваших денег в наши... " |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |