|
Проведение документа программно и "руками" | ☑ | ||
---|---|---|---|---|
0
Soulseller76
09.10.18
✎
17:57
|
Всем привет.
У меня есть обработка, которая загружает данные в документ ПКО. Так вот, наткнулась на странную особенность. 1. Если в момент создания документа создать к нему Контрагента, то документ не проведется программно. Но записать себя даст. 2. Руками проводится без каких-либо ошибок. 3. При повторной загрузки данного документа (контрагент уже в системе есть, он не создается), документ проводится без вопросов. Блин, что я не так делаю?! Сравнивала реквизиты документа ДО и ПОСЛЕ проведения - ничего не меняется. Нашла что ошибка возникает при попытке сделать запись в РегистрНакопления.РасчетыСКлиентами (где именно в коде - пока не нашла, тьма окон открывается). Но опять же, тут же руками проводишь - все отлично. |
|||
1
AlvlSpb
09.10.18
✎
17:59
|
(0) А Контрагент создаваемый программно Записывается? Если ДА, то раньше чем проведение ПКО?
|
|||
2
Soulseller76
09.10.18
✎
18:00
|
(1) Обижаешь. Конечно. )
|
|||
3
Timon1405
09.10.18
✎
18:00
|
а точно в документ подставляется ссылка а не объект контрагента?
|
|||
4
Soulseller76
09.10.18
✎
18:01
|
Это КА 2.2
Создаю сначала Партнера, потом Контрагента, у него устанавливаю реквизит Партнер. |
|||
5
Soulseller76
09.10.18
✎
18:02
|
(3) Точно. Иначе бы не встала. Реквизит же имеет Тип Справочник.Ссылка
А в документе Реквизит Контрагент - заполнен. И Партнер тоже заполнен. |
|||
6
Soulseller76
09.10.18
✎
18:04
|
Причем, перезапись контрагента в справочнике Контрагенты - никак не влияет на последующую загрузку документа. То есть, если перезаписать контрагента, а потом заново сделать документ - не запишется. А вот если предыдущий руками провести... Тогда запишется.
У меня есть ОЧЕНЬ большой подозрение, что при проведении ПКО делается какая-то запись в какой-то регистр... Но вот куда?! И как это попытаться найти. |
|||
7
AlvlSpb
09.10.18
✎
18:05
|
(2) Какую дату указываешь при создании ПКО? Если никакой, то может по умолчанию подтягивается текущая с временем 00.00, а при создании полностью текущая? Посмотри отладчиком
|
|||
8
AlvlSpb
09.10.18
✎
18:06
|
блииин читать "а при создании справочника Контрагента - полностью текущая"
|
|||
9
Soulseller76
09.10.18
✎
18:08
|
(7) Дата 100% прописывается по алгоритму. Всегда при проблемах при записи документа - именно дату проверяю.
|
|||
10
Soulseller76
09.10.18
✎
18:09
|
(8) Тогда не понятно, почему не проводится при втором прогоне (если не провести предыдущий).
Нет, не в дате тут дело. (((((( |
|||
11
Soulseller76
09.10.18
✎
18:11
|
Капец!
Ради эксперимента сделала сначала записать (ну, раз уж записывается), а потом тут же! Провести. И все провелось... Что это было?!!!!!!!!!!!!!!!!!!!!! |
|||
12
AlvlSpb
09.10.18
✎
18:15
|
(11) Не понял, а код можно как проводила. Потому что Док.Записать(РежимЗаписиДокумента.Проведение) - это и есть запись и проведение
|
|||
13
AlvlSpb
09.10.18
✎
18:15
|
При это естественно Док - это документ объект
|
|||
14
lodger
09.10.18
✎
18:17
|
(11) ну так загляни в код проведения в подписки там всякие.
еще прикольно включить в отладке "остановка по ошибке". и смотреть откуда ноги растут. |
|||
15
lodger
09.10.18
✎
18:18
|
(11) вангую - дело в наличии валидной ссылки на документ.
в самом документе это как-то обыграно, а у вас нет. |
|||
16
Soulseller76
09.10.18
✎
18:21
|
(15) Но почему тогда все реквизиты до и после проведения документа одинаковые. Это первый вопрос.
Второй. Я же каждый раз УДАЛЯЮ предыдущий документ и создаю новый. |
|||
17
Soulseller76
09.10.18
✎
18:21
|
НачатьТранзакцию();
Попытка НовыйПКО.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный); ЗафиксироватьТранзакцию(); //Возврат Истина; Исключение ОтменитьТранзакцию(); НеПровелось = Истина; КонецПопытки; |
|||
18
Soulseller76
09.10.18
✎
18:23
|
(14) Остановка по ошибке срабатывает только когда вываливается в процедуру мной созданную, а именно:
НовыйПКО.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный); Говорит - не могу провести! |
|||
19
AlvlSpb
09.10.18
✎
18:27
|
(17) Это НЕ рабочий код? Попробуй убрать НачатьТранзакцию и ЗафиксироватьТранзакцию. Может проблема как раз в блокировках?
|
|||
20
AlvlSpb
09.10.18
✎
18:30
|
И почему режим проведения Неоперативный? Как раз в данном случае нужен Оперативный (текущее время)
|
|||
21
Soulseller76
09.10.18
✎
18:30
|
(19) ок. Сейчас попробую.
|
|||
22
AlvlSpb
09.10.18
✎
18:31
|
Я бы упростил код.
Попытка НовыйПКО.Записать(РежимЗаписиДокумента.Проведение); Исключение Сообщить("Не проведено"); КонецПопытки; |
|||
23
Cyberhawk
09.10.18
✎
18:35
|
(22) Не надо "Сообщить". Надо "СообщениеПользователю" :)
|
|||
24
Soulseller76
09.10.18
✎
18:44
|
(22) Исправила.
Но все равно, результат тот же (((((((((( |
|||
25
rphosts
09.10.18
✎
18:46
|
(2) когда ручками делаешь у тебя куча кода дорм элемента справочника, документа отрабатывает - туда и копай
|
|||
26
rphosts
09.10.18
✎
18:47
|
*дорм = форм
|
|||
27
Soulseller76
09.10.18
✎
18:49
|
(26) Блин, видимо, это остался единственный вариант...
А сроки пожимают ((((((((((((( |
|||
28
rphosts
09.10.18
✎
18:51
|
(27) если поджимают - начни с формы элемента справочника Контрагенты
|
|||
29
Soulseller76
09.10.18
✎
18:55
|
(28) Не понимаю, почему там копать?
Ведь при перезаписи контрагента проблема не решается. Только проведение созданного документа. |
|||
30
rphosts
09.10.18
✎
18:56
|
(29) я-бы начал с той стороны
|
|||
31
rphosts
09.10.18
✎
18:57
|
ну или промежуточный вариант: создаю ручками контрагента, а документ программно... если проводится - дело в справочнике, если нет - в документе
|
|||
32
Soulseller76
09.10.18
✎
18:59
|
(31) Сейчас так и попробую.
Спасибо за идею. |
|||
33
Soulseller76
09.10.18
✎
19:04
|
(31) Руками завела контрагента. Программно документ. Контрагент в списке нашелся, но документ не провелся.
Но Записался. А Потом провелся. |
|||
34
AlvlSpb
09.10.18
✎
19:16
|
(33) РежимПроведенияДокумента.Неоперативный остался?
|
|||
35
AlvlSpb
09.10.18
✎
19:22
|
Неоперативный режим проведения предусматривает, проведение задним числом, т.е. док должен быть минимум записан, чтобы появилась дата которой и надо неоперативно проводить. У вас создается док, не записан, дата не установлена. Может поэтому и не проводит?
|
|||
36
breezee
09.10.18
✎
20:11
|
(17) Прочитайе, пожалуйста, зачм нужна явная транзакция в 1с
|
|||
37
Soulseller76
10.10.18
✎
09:17
|
(34) нет, удалила.
|
|||
38
Soulseller76
10.10.18
✎
09:17
|
(35) Дата устанавливается принудительно при создании документа. Второй строкой идет после СоздатьДокумент()
|
|||
39
Soulseller76
10.10.18
✎
09:21
|
(36) Да, спасибо. Я вижу теперь свою ошибку с транзакциями.
Удалила. |
|||
40
Cyberhawk
10.10.18
✎
09:32
|
(39) Так нет никакой ошибки
|
|||
41
unregistered
10.10.18
✎
09:36
|
(0) Попробуйте разделить транзакции.
Сначала - создавайте и записывайте все новые объекты, которые понадобятся для вашего документа (в т.ч. контрагентов и партнёров). Завершаете эту транзакцию. Потом - создаёте документ и заполняете его ссылками на ранее созданные элементы. Завершаете вторую транзакцию. Или вообще откажитесь от явного использования транзакций. |
|||
42
unregistered
10.10.18
✎
09:38
|
(0) > ошибка возникает при попытке сделать запись в РегистрНакопления.РасчетыСКлиентами
Возможно, что при записи контрагента вы забываете установить какие-либо критичные реквизиты. Вы там случайно не делаете запись контрагента в режиме ОбменДанными.Загрузка = Истина ? |
|||
43
unregistered
10.10.18
✎
09:39
|
У вас два вариант:
1. Показать тут весь код. 2. Научиться пользоваться отладчиком. |
|||
44
Soulseller76
10.10.18
✎
09:47
|
(43) Я умею им пользоваться. Проблема в том, что КА + БитФинанс ужасно сложная конфигурация, которая своей запутанностью ставит меня просто в ступор. )))))
|
|||
45
Soulseller76
10.10.18
✎
09:49
|
(40) Я про другое.
Я не завершала Транзакцию, когда документ не проводился, а продолжала попытки его записать. И у меня появлялись записи "В этой транзакции уже происходили ошибки". ) Это слегка озадачивало. |
|||
46
dmpl
10.10.18
✎
09:54
|
(0) Скорее всего не все регистры заполняются при программном создании контрагента.
|
|||
47
Soulseller76
10.10.18
✎
09:55
|
Как-то так:
НовыйПКО = Документы.ПриходныйКассовыйОрдер.СоздатьДокумент(); НовыйПКО.Дата = ДатаЧека; НовыйПКО.Касса = КассаДокумента; Организация = Справочники.Организации.НайтиПоНаименованию("ООО ""ЧЧЧЧ""", Истина); НовыйПКО.Организация = Организация; НовыйПКО.ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ПоступлениеОплатыОтКлиента; НовыйПКО.СуммаДокумента = СуммаДокумента; НовыйПКО.Валюта = ВалютаРегламентированногоУчета; НовыйПКО.Подразделение = НовыйПКО.Касса.Подразделение; КонтрагентСуществует = НайтиКонтрагентаПоИННКПП(ИННКонтрагента, КППКонтрагента); Если КонтрагентСуществует <> Неопределено Тогда ПартнерСуществует = КонтрагентСуществует.Партнер; Иначе ПартнерСуществует = НайтиПартнераПоКодуИзКис(КодКонтрагентаИзКис); Если ПартнерСуществует <> Неопределено Тогда КонтрагентСуществует = НайтиКонтрагентаПоПартнеру(ПартнерСуществует); КонецЕсли; КонецЕсли; Если КонтрагентСуществует = Неопределено и ПартнерСуществует = Неопределено Тогда ОбъектБылСоздан = СоздатьПартнераНаСервере(ТаблицаДанныхДляДокумента[0], ПризнакЗагружаемыхДанных, Организация); Если ОбъектБылСоздан <> Неопределено Тогда КонтрагентСуществует = ОбъектБылСоздан; ПартнерСуществует = КонтрагентСуществует.Партнер; Иначе КонтрагентСуществует = Справочники.Контрагенты.ПустаяСсылка(); ПартнерСуществует = Справочники.Партнеры.ПустаяСсылка(); КонецЕсли; КонецЕсли; НовыйПКО.Контрагент = КонтрагентСуществует; //НовыйПКО.Комментарий = "Выручка за "+Формат(ДатаНовогоДокумента, "ДЛФ=Д"); НовыйПКО.ПринятоОт = Строка(НовыйПКО.Контрагент); НовыйПКО.Основание = "Доставка корреспонденции от юридических лиц"; НовыйПКО.Приложение = "Суточный отчет с гашением от "+Формат(ДатаЧека, "ДЛФ=Д"); РасшифровкаПлатежа = НовыйПКО.РасшифровкаПлатежа.Добавить(); РасшифровкаПлатежа.Партнер = ПартнерСуществует; РасшифровкаПлатежа.СтатьяДвиженияДенежныхСредств = Справочники.СтатьиДвиженияДенежныхСредств.ПоступлениеОплатыОтКлиента; РасшифровкаПлатежа.Подразделение = НовыйПКО.Касса.Подразделение; РасшифровкаПлатежа.СтавкаНДС = Перечисления.СтавкиНДС.НДС18; СуммаНДС = СуммаДокумента*18/118; РасшифровкаПлатежа.СуммаНДС = Окр(СуммаНДС, 2); РасшифровкаПлатежа.Сумма = СуммаДокумента; КонецЕсли; НеПровелось = Ложь; Попытка НовыйПКО.Записать(РежимЗаписиДокумента.Проведение); Возврат Истина; Исключение НеПровелось = Истина; КонецПопытки; Если НеПровелось Тогда Попытка НовыйПКО.Записать(РежимЗаписиДокумента.Запись); Исключение ЕмайлОтветственного = ПолучитьЕМайлОтветственногоПоКассе(НовыйПКО.Касса); ПисьмоОтправлено = ОтправитьПисьмоРугательное(НовыйПКО, ЕмайлОтветственного); Возврат Ложь; КонецПопытки; КонецЕсли; |
|||
48
Cyberhawk
10.10.18
✎
09:56
|
(45) "когда документ не проводился, а продолжала попытки его записать" // Так в том коде нет этого. В том коде если документ не проводится, то код уходит в исключение с отменой транзакции. Где там повторение попытки записи?
|
|||
49
Cyberhawk
10.10.18
✎
09:57
|
А, у тебя видимо начао транзакции было до первой попытки записи, а фиксация/отмена - после второй
|
|||
50
Soulseller76
10.10.18
✎
09:57
|
Это код создания Партнера/Контрагента
Функция СоздатьПартнераНаСервере(МассивСДанными, ПризнакЗагружаемыхДанных, ТекОрганизация) Ошибка = Ложь; НачатьТранзакцию(РежимУправленияБлокировкойДанных.Управляемый); НовыйПартнер = Справочники.Партнеры.СоздатьЭлемент(); НовыйПартнер.Клиент = Истина; НовыйПартнер.Наименование = МассивСДанными.Customers; НовыйПартнер.НаименованиеПолное = МассивСДанными.Customers; ДопРеквизиты = НовыйПартнер.ДополнительныеРеквизиты.Добавить(); ДопРеквизиты.Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Код из КИС"); ДопРеквизиты.Значение = МассивСДанными.CustomerNumber; НовыйПартнер.ЮрФизЛицо = Перечисления.КомпанияЧастноеЛицо.Компания; НовыйПартнер.Комментарий = "Создан выгрузкой из КИС"; Попытка НовыйПартнер.Записать(); ТекущийПартнер = НовыйПартнер.Ссылка; Исключение Ошибка = Истина; КонецПопытки; НовыйКонтрагент = Справочники.Контрагенты.СоздатьЭлемент(); НовыйКонтрагент.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ЮрЛицо; НовыйКонтрагент.Наименование = МассивСДанными.Customers; НовыйКонтрагент.НаименованиеПолное = МассивСДанными.Customers; НовыйКонтрагент.ИНН = МассивСДанными.CustomerINN; НовыйКонтрагент.Кпп = МассивСДанными.CustomerKPP; НовыйКонтрагент.Партнер = ТекущийПартнер; Попытка НовыйКонтрагент.Записать(); ТекущийКонтрагент = НовыйКонтрагент.Ссылка; Исключение Ошибка = Истина; КонецПопытки; НовыеКлючиАналитики = Справочники.КлючиАналитикиУчетаПоПартнерам.СоздатьЭлемент(); НовыеКлючиАналитики.Наименование = Строка(ТекущийКонтрагент)+"; "+Строка(ТекОрганизация)+";"+Строка(ТекущийПартнер); НовыеКлючиАналитики.Партнер = ТекущийПартнер; НовыеКлючиАналитики.Организация = ТекОрганизация; НовыеКлючиАналитики.Контрагент = ТекущийКонтрагент; Попытка НовыеКлючиАналитики.Записать(); ТекущийКлючАналитки = НовыеКлючиАналитики.Ссылка; Исключение Ошибка = Истина; КонецПопытки; МенеджерЗаписи = РегистрыСведений.АналитикаУчетаПоПартнерам.СоздатьМенеджерЗаписи(); МенеджерЗаписи.Партнер = ТекущийПартнер; МенеджерЗаписи.Организация = ТекОрганизация; МенеджерЗаписи.Контрагент = ТекущийКонтрагент; МенеджерЗаписи.КлючАналитики= ТекущийКлючАналитки; Попытка МенеджерЗаписи.Записать(); Исключение Ошибка = Истина; КонецПопытки; ЗафиксироватьТранзакцию(); Если НЕ Ошибка Тогда Возврат ТекущийКонтрагент; Иначе Возврат Неопределено; КонецЕсли; КонецФункции |
|||
51
Soulseller76
10.10.18
✎
09:58
|
(49) Да ) Не учла особенности )
|
|||
52
Михаил Козлов
10.10.18
✎
10:24
|
Может быть из-за какая-то "бяки" с созданием ключей аналитики по партнерам и записью в РС Аналитика учета по партнерам.
|
|||
53
Soulseller76
10.10.18
✎
13:00
|
(52) Да вроде нет. Хотя, надо вот что посмотреть - при проведении документа - не появляется ли новая запись в РС Аналитика учета.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |