Имя: Пароль:
1C
1C 7.7
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С и не даёт на неё переключиться.
Что касается отслеживания "когда закрыли", то у пользователя на экране две формы - одна форма документа, которая показывает, что документ есть и может правится, а другая - форма обработки с таблицей, которая вызывается из документа чтобы наглядно что-то поправить в документе.
При закрытии документа проверяется, что форма обработки открыта, и она закрывается. При закрытии формы обработки документу сообщают, что его обработка закрыта.
Кстати, если просто открыть таблицу из формы, то можно получать события от редактирования таблицы в форму, только нет возможности узнать, закрыта таблица или нет.