|
v7: Проблема с номером документа при создании нового документа в 7.7 | ☑ | ||
---|---|---|---|---|
0
es3000
04.02.14
✎
08:37
|
Есть простой код:
пДок = СоздатьОбъект("Документ.РасходнаяНакладная"); пДок.Новый(); пДок.ДатаДок = пДата; пДок.УстановитьНовыйНомер(); пНовыйНомер = пДок.НомерДок; Возврат пНовыйНомер; При первом вызове этого кода номер нового документа сразу становится больше последнего номера в базе на 2. Мистика какая-то. Если пощелкать кнопками, которые вызывают этот код, и сделать дату прошлого периода а потом снова первоначальную дату - то номер становится на место. Из-за чего это происходит? |
|||
1
DrZombi
гуру
04.02.14
✎
08:44
|
(0) Волшебство переходного периода.
Ты, милок, в какой Год документы пишешь? А рабочая дата в каком? |
|||
2
es3000
04.02.14
✎
08:48
|
(1)
1) первый раз когда срабатывает код - дата равна сегодняшней рабочей дате 04.02.2014, 2) второй раз - меняю дату на прошлый период на 2013-й год, 3) а потом опять на 04.02.2014. в первом случае номер сразу на 2 увеличивается, а во втором и в третьем случаях - номер как положено увеличивается на 1 |
|||
4
Мимохожий Однако
04.02.14
✎
08:51
|
Установи рабочую дату перед формированием документа равной дате документа.
По окончании обработки восстанови рабочую дату в исходную |
|||
5
DrZombi
гуру
04.02.14
✎
08:52
|
(2) Ты про дату документа скажи :)
Я так понимаю, ты сегодня пишешь документы в прошлый период. А команда "УстановитьНовыйНомер" устанавливает новый номер исходя из "Рабочей даты", а не из даты документа :) В итоге, ты пишешь документ в 2013-тый год, но номер документов берется из 2014-го :) Странно, что ты еще не напоролся на "Номер доумента не уникален" :) |
|||
6
es3000
04.02.14
✎
09:01
|
(3) ща гляну
|
|||
7
es3000
04.02.14
✎
09:03
|
(5) вообще я хочу документ сегодня записать в сегодня, но программно.
с прошлым периодом это я стал экспериментировать когда обнаружил, что сегодня он мне пропускает один номер |
|||
8
Масянька
04.02.14
✎
09:09
|
(7) Дык не меняй дату - ТекущаяДата()
|
|||
9
dedmoroz777
04.02.14
✎
09:11
|
(7) если стоит автонумерация, то Док.Новый() уже новый номер присвоил. УстановитьНовыйНомер() установил более новый. Что непонятного?
|
|||
10
Масянька
04.02.14
✎
09:12
|
(9) Прав :)
|
|||
11
DrZombi
гуру
04.02.14
✎
09:14
|
(9) Ну все, ты Убил волшебство :)
|
|||
12
es3000
04.02.14
✎
09:15
|
(9),(10) спасибо, сейчас попробую
|
|||
13
dedmoroz777
04.02.14
✎
09:17
|
Извините! )
|
|||
14
es3000
04.02.14
✎
09:29
|
а куда ответ (3) про типовые пропал?
в общем ничего особенного в типовых не нашел. вот пример: ДокПоступление = СоздатьОбъект("Документ.ПоступлениеТМЦ"); ДокПоступление.Новый(); ДокПоступление.ДатаДок = ДатаДок; ДокПоступление.АвтоВремяТекущее(); ДокПоступление.Фирма = ФирмаПокупателя; ДокПоступление.УстановитьНовыйНомер(ФирмаПокупателя.ЮрЛицо.ПрефиксНомеровДокументов); |
|||
15
Масянька
04.02.14
✎
09:33
|
(14) У тебя СП украли?
|
|||
16
es3000
04.02.14
✎
09:43
|
(15) чего-чего украли?
|
|||
17
oslokot
04.02.14
✎
09:49
|
(16) это староверы так шутят :) Синтаксис-помощник (СП)
Давно заметил, надо заниматься одним - или клюшками или восьмерой. Я полгода на КА, и в 7.7 стал тупить, хотя раньше шпарил тока в путь ) |
|||
18
oslokot
04.02.14
✎
09:50
|
(14) есть там в типовых, ищи. Где-непомню (
|
|||
19
Масянька
04.02.14
✎
09:50
|
(16) Чего-чего... Того.
Установи курсор на букву "н" в слове "УстановитьНовыйНомер" и нажми кнопочку "F1". Справа должно открыться окошко. В нем будет написато много буков. Это окошко называется "Синтаксис-помощник" (сокращенно СП). Иногда - помогает :))) |
|||
20
DeiMos
04.02.14
✎
09:54
|
(9): Не прав.
|
|||
21
Wobland
04.02.14
✎
09:56
|
(19) синтакс-помощник - это то, что внутри окна синтакс-помощника, а не само окно синтакс-помощника
|
|||
22
Масянька
04.02.14
✎
09:59
|
(21) Не придирайся :)
|
|||
23
Wobland
04.02.14
✎
10:05
|
(22) я заигрываю
|
|||
24
КонецЦикла
04.02.14
✎
10:06
|
(9) Феерчичная теория квантового вакуумного контимиума 1С.
|
|||
25
КонецЦикла
04.02.14
✎
10:08
|
(0) Возможно это не весь код. А, возможно, ты не монопольно сидишь :)
|
|||
26
es3000
04.02.14
✎
10:34
|
(19) Легче стало!!
А я уж такое про СП подумал, и "совместное предприятие" и "семейное положение" и "спид" :) И совсем забыл про "синтаксис-помощник" |
|||
27
es3000
04.02.14
✎
10:34
|
(25) не монопольно, но один в отладочной базе
|
|||
28
es3000
04.02.14
✎
10:38
|
(20) в чем не прав, конкретнее, пожалуйста
|
|||
29
es3000
04.02.14
✎
11:00
|
Ничего не помогает.
просто две строки кода: пДок = СоздатьОбъект("Документ.РасходнаяНакладная"); пДок.Новый(); И номер сразу становится 000188, хотя в базе последний 000186. Что еще можно попробовать?? |
|||
30
КонецЦикла
04.02.14
✎
11:02
|
Переиндексация?
|
|||
31
es3000
04.02.14
✎
11:04
|
(30) тогда почему когда датой играюсь номер становится правильным? как я в (2) писал.
переиндексацию сейчас попробую |
|||
32
es3000
04.02.14
✎
17:07
|
нашел косяк...
Обработка запускается из предопределенной процедуры ВводНового() документа "РасходнаяНакладная". А потом устанавливается код ошибки СтатусВозврата(0). Таким способом вместо формы документа запускается форма обработки. И эта обработка "эмулирует" документ. А при записи она программно создает документ и пишет в него данные. И получается что когда формируется номер документа указанным в (0) способом один созданный документ уже есть (это документ из которого запустилась обработка). Поэтому код возвращает номер больше на 2. Как от этого избавиться? |
|||
33
Ёпрст
04.02.14
✎
17:08
|
закрыть форму документа из которого запущена обработка.. если он не нужен, конечно.
|
|||
34
es3000
04.02.14
✎
17:17
|
(33) так форма документа даже и не открывается...
ты наверно чуток не допонял. 1) в журнале документов выполняем команду "создать новый документ" 2) в процедуре "ВводНового" этого документа выполняется: ОткрытьФорму("Обработка.РасходнаяНакладнаяОбр"); СтатусВозврата(0); Возврат; То есть документ, который мы создаем не открывается, но вместо него открывается обработка 3) В процедуре ПриОткрытии обработки выполняется код, приведенный в (0), который определяет номер нового документа. Но поскольку эта процедура вызывается из "ВводНового" документа, то документ в этот момент еще не закрыт. Получается в этот момент создано два новых документа "РасходнаяНакладная" |
|||
35
Torquader
04.02.14
✎
17:30
|
(32) Ну, самый простой способ - это запомнить номер того документа, который был создан.
Чтобы документ "разрушился" придётся из формы документа запускать какую-то другую обработку или ставить в ней ложное закрытие, чтобы присвоения и инициализацю документа делать тогда, когда создаваемый документ уже будет разрушен, а ссылка на номер - свободна. То, что мы пишем в ПриОткрытии обработки, исполняется ещё до того, как будет отработан СтатусВозврата(0), а нам нужно, чтобы он отработал и вернул управление системе. В обработке: Перем мчЛожноеЗакрытие; Процедура ПриОткрытии() мчЛожноеЗакрытие=1; Форма.Закрыть(0); КонецПроцедуры Процедура ПриЗакрытии() Если мчЛожноеЗакрытие=1 Тогда СтатусВозврата(0); // выполняем необходимые действия Возврат; КонецЕсли; // далее обработка стандартного закрытия КонецПроцедуры Где-то так. |
|||
36
es3000
04.02.14
✎
17:30
|
как-нибудь можно этот эффект обойти?
|
|||
37
es3000
04.02.14
✎
17:32
|
(35) спасибо, попробую
в (36) не успел |
|||
38
Масянька
04.02.14
✎
17:34
|
(37) А что ты вообще делаешь? Как-то всё заморочено....
|
|||
39
viktor_vv
04.02.14
✎
17:35
|
А вариант закрытия формы из обработки интересно прокатит.
Передавай контекст нового документа в обработку и закрывай из обработки до запуска присвоения номера. Что-то типа в документе. Функция ВзятьКонтекст(Конт) // ее вроде как в глобальник надо Возврат Конт ; КонецФункции Процедура ВводНового() Конт = ВзятьКонтекст(Контекст) ОткрытьФорму("Обработка.РасходнаяНакладнаяОбр", Конт); СтатусВозврата(0); Возврат; КонецПроцедуры В обработке Форма.Параметр.Форма.Закрыть(0); ДокПоступление = СоздатьОбъект("Документ.ПоступлениеТМЦ"); ДокПоступление.Новый(); ДокПоступление.ДатаДок = ДатаДок; ДокПоступление.АвтоВремяТекущее(); |
|||
40
Torquader
04.02.14
✎
17:35
|
(38) Подменяет форму документа какой-то другой формой, судя по (34)
|
|||
41
Torquader
04.02.14
✎
17:36
|
(39) Закрытие будет отработано после окончания исполнения кода, насколько я помню, были там грабли с этим.
|
|||
42
es3000
04.02.14
✎
17:37
|
(40) Правильно,
только понять не могу зачем это было сделано. |
|||
43
Torquader
04.02.14
✎
17:39
|
(42) Видимо, чтобы не править стандартные объекты и обновляться на ура.
Иногда, правда, для разных "зверей" разные формы, чтобы гарантированно не могли что-то испоганить. Но, всё равно, это неправильное решение. |
|||
44
viktor_vv
04.02.14
✎
17:39
|
(41) Тоже несколько засомневался. в плане того когда это отработает для документа. Типа сначала все равно процедура вводнового() в документе до конца дойдет.
|
|||
45
Масянька
04.02.14
✎
17:40
|
(43) Решение чего? Автор, опиши задачу!
|
|||
46
Ёпрст
04.02.14
✎
17:40
|
(34) я всё допонял.
Пока форма обработки не выполнится, новый док заблокирован. Надо отдать событие извне, например, в ложном закрытии формы, еще как.. |
|||
47
Torquader
04.02.14
✎
17:42
|
(46) Не форма не выполнится, а её процедура ПриОтрытии - мы из ОткрытьФорму не вернёмся назад, как бы мы этого не хотели.
|
|||
48
Масянька
04.02.14
✎
17:43
|
Блин! Я щас обижусь....
Чё, трудно задачу описать? |
|||
49
Torquader
04.02.14
✎
17:44
|
В общем - ложное закрытие или обработка ожидания спасут решение.
А я пошёл - дискету бухи не туда влимонили, чтоб им пусто было. |
|||
50
es3000
04.02.14
✎
17:44
|
(45),(48) ну я ж писал...
Вместо формы нового документа надо открыть форму обработки, которая заменяет собой документ. В ней есть все те же поля, что и в документе. В том числе есть поле "Номер" в которое надо вставить номер нового документа |
|||
51
es3000
04.02.14
✎
17:45
|
(49) что такое "обработка ожидания"?
|
|||
52
Масянька
04.02.14
✎
17:45
|
(50) Создай документ, запиши, да и запускай свою нетленку.
|
|||
53
Масянька
04.02.14
✎
17:46
|
+(52) Забыла спросить - а зачем?
|
|||
54
Torquader
04.02.14
✎
17:46
|
(52) А кто потом базу чистить будет от того, что пользователи "потеряли" - я так делал, когда терялись номера документов - потом быстро сказали, что лучше потерять номер, чем документ.
|
|||
55
Масянька
04.02.14
✎
17:47
|
(54) См. (53).
|
|||
56
Torquader
04.02.14
✎
17:47
|
(51) С 25 платформы у формы есть команда
Форма.ОбработкаОжидания(ИмяПроцедуры,ЧерезСколькоВыполнять) позволяющая периодически "дёргать" процедуру из модуля формы, чтобы она что-то делала. |
|||
57
Масянька
04.02.14
✎
17:47
|
Я просто пока не ухватываю, зачем обработка вместо док-а?
|
|||
58
Torquader
04.02.14
✎
17:48
|
Ладно - беседуйте без меня - у вас хорошо получается - может быть - очередную нетленку напишете совместно.
(57) Например, чтобы можно было "листать" документы как это в Access реализовано, есть люди, которые если этого нельзя, говорят, что система "г.вно". |
|||
59
Масянька
04.02.14
✎
17:50
|
(58) "Листать" - это как?
|
|||
60
es3000
04.02.14
✎
17:50
|
(52) не понял как это
(53) сам толком не знаю, зачем так было сделано (57) вроде бы вместо ТЧ документа в обработке рисуется Таблица, но ведь и в документ можно сделать таблицу, короче не знаю, было сделано лет 5 назад, а я уже как три года эту конфигурацию поддерживаю, но с этим документом раньше вопросов не было |
|||
61
Масянька
04.02.14
✎
17:53
|
(60) Пока ты не поймешь зачем "весь этот огород" - толку не будет. Да, раньше проблем не было, а теперь есть. Можно проблему решить, а можно "поставить заплатку". Во втором случае - рано или поздно проблемы опять вылезут.
|
|||
62
Torquader
04.02.14
✎
17:54
|
(59) Ну, как в таблице - следующий, предыдущий, первый за день и т.п. В общем - некое подобие формы журнала документа с данными самого документа на ней.
Приходится делать через обработку, чтобы вставленная таблица растягивалась на весь экран. |
|||
63
Torquader
04.02.14
✎
17:54
|
(61) Если он поймёт, боюсь, что переписать всю конфигурацию придётся.
|
|||
64
viktor_vv
04.02.14
✎
17:54
|
(60) Наверное хотели хитромудрую таблицу, типа двух табличных частей, или с подчиенением строк одной к строкам другой.
|
|||
65
Масянька
04.02.14
✎
17:55
|
(63) Зато - толк будет :)
|
|||
66
es3000
04.02.14
✎
17:55
|
(61)-(65) да, наверно все-таки из-за таблицы.
В этом документе сложная табличная часть. Ее надо выводить не в виде обычной ТЧ а в виде Таблицы. В документе Таблица не работает. Поэтому и пришлось использовать обработку. Причина в этом на 100% |
|||
67
Масянька
04.02.14
✎
17:55
|
(63) Ты ж уходить собрался? :))))
|
|||
68
Масянька
04.02.14
✎
17:56
|
(66) И в чем сложность?
|
|||
69
es3000
04.02.14
✎
17:59
|
(68) Ну сложность возникла в том, что в этой обработке нужно показать номер нового документа.
Номер нового документа получали кодом (0). При этом оказалось, что этот номер перескакивает через 1 максимального номера в базе. Причина этого описана в (32). Решение предложили в (35) через ложное закрытие. |
|||
70
Масянька
04.02.14
✎
18:01
|
(69) Не делай из меня дурочку.
Сложность таблицы в чем? |
|||
71
es3000
04.02.14
✎
18:07
|
(70) я не хотел обидеть, извиняюсь,
просто вопрос был неточный сложность таблицы в переменном количестве столбцов, причем информация в столбцах этих как бы многоуровневая строки - контрагенты заголовки столбцов - номенклатура, подзаголовки - розничные и закупочные цены, в ячейках - количество и сумма |
|||
72
Масянька
04.02.14
✎
18:12
|
(71) Прикольно. А почему нельзя прямо в форме док-та это делать? Таб. часть убрать, подсунуть свою таблицу - при открытии док-а ее заполнять.
|
|||
73
es3000
04.02.14
✎
18:23
|
(72) Таблица есть только в обработках и отчетах, в документах ее нету. Имеется ввиду объект "Таблица", а не "ТаблицаЗначений"
|
|||
74
ЧеловекДуши
04.02.14
✎
18:25
|
(34) Зачем такие сложности? :)
|
|||
75
ЧеловекДуши
04.02.14
✎
18:26
|
(34) Открывай свою обработку при закрытии :)
|
|||
76
es3000
04.02.14
✎
18:26
|
(75) при закрытии чего?
|
|||
77
ЧеловекДуши
04.02.14
✎
18:27
|
(76) Документа, который не должен быть :)
|
|||
78
es3000
04.02.14
✎
18:30
|
(77) хм... надо попробовать
так все равно он в это время еще будет не закрыт, все равно придется в обработке делать ложное закрытие, чем это будет проще? |
|||
79
Масянька
04.02.14
✎
18:32
|
(78) А зачем делать новый? Используй этот.
А Таблица - это что? |
|||
80
Torquader
05.02.14
✎
00:18
|
В общем, если хочется таблицу на форме, то проще из документа открыть форму с таблицей, привязанную к нашему документу, только нужно будет отслеживать, когда и что закрыли.
У меня так вообще один документ в нескольких формах жил, пока "осла" к 1С не прикрутил. P.S. всё-таки, "осёл" он Web и можно делать всё, что душа пожелает, а то, что окно "осла" закрывает 1С, так после "осла" пользователи не хотят в 1С работать - там неправильные параметры красным не подсвечиваются. |
|||
81
es3000
05.02.14
✎
03:51
|
(79) "А зачем делать новый? Используй этот"
ни че не понял, что "делать"? и кто "этот"? Таблица - это то что обычно мы видим в отчетах. Только кроме отчетов ее можно использовать и в форме. Иногда в типовых конфигурациях тоже так делают |
|||
82
es3000
05.02.14
✎
03:53
|
(80) "В общем, если хочется таблицу на форме, то проще из документа открыть форму с таблицей, привязанную к нашему документу, только нужно будет отслеживать, когда и что закрыли."
Так ведь именно этот сценарий и обсуждается в этой теме. Разве нет? Что такое "осел"? |
|||
83
es3000
05.02.14
✎
09:45
|
(75),(77) так не работает - проверил,
остается только вариант с вызовом обработки (с ложным закрытием) из "ВводНового" |
|||
84
КонецЦикла
05.02.14
✎
09:51
|
Вот зараза, я ж говорил не весь код :)
|
|||
85
AAP
05.02.14
✎
10:23
|
(83) а может так?
Процедура ВводНового() ОткрытьФорму("Обработка.РасходнаяНакладнаяОбр", ДатаДок); КонецПроцедуры В обработке ДокПоступление = СоздатьОбъект("Документ.ПоступлениеТМЦ"); ДокПоступление.Новый(); ДокПоступление.ДатаДок = Форма.Параметр; |
|||
86
AAP
05.02.14
✎
10:23
|
(85) Точнее ДокПоступление.НомерДок = Форма.Параметр;
опечатка |
|||
87
es3000
05.02.14
✎
10:28
|
(84) да что-то ты вообще ничего понятного не сказал
|
|||
88
Torquader
05.02.14
✎
14:11
|
(82) "Осёл" это InternetExplorer.Application - он прекрасно открывается поверх 1С и не даёт на неё переключиться.
Что касается отслеживания "когда закрыли", то у пользователя на экране две формы - одна форма документа, которая показывает, что документ есть и может правится, а другая - форма обработки с таблицей, которая вызывается из документа чтобы наглядно что-то поправить в документе. При закрытии документа проверяется, что форма обработки открыта, и она закрывается. При закрытии формы обработки документу сообщают, что его обработка закрыта. Кстати, если просто открыть таблицу из формы, то можно получать события от редактирования таблицы в форму, только нет возможности узнать, закрыта таблица или нет. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |