Вход | Регистрация


1С:Предприятие :: 1С:Предприятие 8 общая

Проведение документа программно и "руками"

Проведение документа программно и "руками"
Я
   Soulseller76
 
09.10.18 - 17:57
Всем привет.
У меня есть обработка, которая загружает данные в документ ПКО.
Так вот, наткнулась на странную особенность.
1. Если в момент создания документа создать к нему Контрагента, то документ не проведется программно. Но записать себя даст.
2. Руками проводится без каких-либо ошибок.
3. При повторной загрузки данного документа (контрагент уже в системе есть, он не создается), документ проводится без вопросов.

Блин, что я не так делаю?!
Сравнивала реквизиты документа ДО и ПОСЛЕ проведения - ничего не меняется.
Нашла что ошибка возникает при попытке сделать запись в РегистрНакопления.РасчетыСКлиентами (где именно в коде - пока не нашла, тьма окон открывается). Но опять же, тут же руками проводишь - все отлично.
 
 
   AlvlSpb
 
1 - 09.10.18 - 17:59
(0) А Контрагент создаваемый программно Записывается? Если ДА, то раньше чем проведение ПКО?
   Soulseller76
 
2 - 09.10.18 - 18:00
(1) Обижаешь. Конечно. )
   Timon1405
 
3 - 09.10.18 - 18:00
а точно в документ подставляется ссылка а не объект контрагента?
   Soulseller76
 
4 - 09.10.18 - 18:01
Это КА 2.2
Создаю сначала Партнера, потом Контрагента, у него устанавливаю реквизит Партнер.
   Soulseller76
 
5 - 09.10.18 - 18:02
(3) Точно. Иначе бы не встала. Реквизит же имеет Тип Справочник.Ссылка
А в документе Реквизит Контрагент - заполнен. И Партнер тоже заполнен.
   Soulseller76
 
6 - 09.10.18 - 18:04
Причем, перезапись контрагента в справочнике Контрагенты - никак не влияет на последующую загрузку документа. То есть, если перезаписать контрагента, а потом заново сделать документ - не запишется. А вот если предыдущий руками провести... Тогда запишется.
У меня есть ОЧЕНЬ большой подозрение, что при проведении ПКО делается какая-то запись в какой-то регистр... Но вот куда?!
И как это попытаться найти.
   AlvlSpb
 
7 - 09.10.18 - 18:05
(2) Какую дату указываешь при создании ПКО? Если никакой, то может по умолчанию подтягивается текущая с временем 00.00, а при создании полностью текущая? Посмотри отладчиком
   AlvlSpb
 
8 - 09.10.18 - 18:06
блииин читать "а при создании справочника Контрагента - полностью текущая"
   Soulseller76
 
9 - 09.10.18 - 18:08
(7) Дата 100% прописывается по алгоритму. Всегда при проблемах при записи документа - именно дату проверяю.
   Soulseller76
 
10 - 09.10.18 - 18:09
(8) Тогда не понятно, почему не проводится при втором прогоне (если не провести предыдущий).
Нет, не в дате тут дело. ((((((
 
 Рекламное место пустует
   Soulseller76
 
11 - 09.10.18 - 18:11
Капец!
Ради эксперимента сделала сначала записать (ну, раз уж записывается), а потом тут же! Провести.
И все провелось...
Что это было?!!!!!!!!!!!!!!!!!!!!!
   AlvlSpb
 
12 - 09.10.18 - 18:15
(11) Не понял, а код можно как проводила. Потому что Док.Записать(РежимЗаписиДокумента.Проведение) - это и есть запись и проведение
   AlvlSpb
 
13 - 09.10.18 - 18:15
При это естественно Док - это документ объект
   lodger
 
14 - 09.10.18 - 18:17
(11) ну так загляни в код проведения в подписки там всякие.
еще прикольно включить в отладке "остановка по ошибке".
и смотреть откуда ноги растут.
   lodger
 
15 - 09.10.18 - 18:18
(11) вангую - дело в наличии валидной ссылки на документ.
в самом документе это как-то обыграно, а у вас нет.
   Soulseller76
 
16 - 09.10.18 - 18:21
(15) Но почему тогда все реквизиты до и после проведения документа одинаковые. Это первый вопрос.
Второй. Я же каждый раз УДАЛЯЮ предыдущий документ и создаю новый.
   Soulseller76
 
17 - 09.10.18 - 18:21
НачатьТранзакцию();
            Попытка
                НовыйПКО.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный);
                ЗафиксироватьТранзакцию();
                //Возврат Истина;

            Исключение
                ОтменитьТранзакцию();
                НеПровелось = Истина;            
            КонецПопытки;
   Soulseller76
 
18 - 09.10.18 - 18:23
(14) Остановка по ошибке срабатывает только когда вываливается в процедуру мной созданную, а именно:

НовыйПКО.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный);

Говорит - не могу провести!
   AlvlSpb
 
19 - 09.10.18 - 18:27
(17) Это НЕ рабочий код? Попробуй убрать НачатьТранзакцию и ЗафиксироватьТранзакцию. Может проблема как раз в блокировках?
   AlvlSpb
 
20 - 09.10.18 - 18:30
И почему режим проведения Неоперативный? Как раз в данном случае нужен Оперативный (текущее время)
   Soulseller76
 
21 - 09.10.18 - 18:30
(19) ок. Сейчас попробую.
   AlvlSpb
 
22 - 09.10.18 - 18:31
Я бы упростил код.
 Попытка
             НовыйПКО.Записать(РежимЗаписиДокумента.Проведение); 

            Исключение
               Сообщить("Не проведено");            
            КонецПопытки;
   Cyberhawk
 
23 - 09.10.18 - 18:35
(22) Не надо "Сообщить". Надо "СообщениеПользователю" :)
   Soulseller76
 
24 - 09.10.18 - 18:44
(22) Исправила.
Но все равно, результат тот же ((((((((((
   rphosts
 
25 - 09.10.18 - 18:46
(2) когда ручками делаешь у тебя куча кода дорм элемента справочника, документа отрабатывает - туда и копай
   rphosts
 
26 - 09.10.18 - 18:47
*дорм = форм
   Soulseller76
 
27 - 09.10.18 - 18:49
(26) Блин, видимо, это остался единственный вариант...

А сроки пожимают (((((((((((((
   rphosts
 
28 - 09.10.18 - 18:51
(27) если поджимают - начни с формы элемента справочника Контрагенты
   Soulseller76
 
29 - 09.10.18 - 18:55
(28) Не понимаю, почему там копать?
Ведь при перезаписи контрагента проблема не решается. Только проведение созданного документа.
   rphosts
 
30 - 09.10.18 - 18:56
(29) я-бы начал с той стороны
   rphosts
 
31 - 09.10.18 - 18:57
ну или промежуточный вариант: создаю ручками контрагента, а документ программно... если проводится - дело в справочнике, если нет - в документе
   Soulseller76
 
32 - 09.10.18 - 18:59
(31) Сейчас так и попробую.
Спасибо за идею.
   Soulseller76
 
33 - 09.10.18 - 19:04
(31) Руками завела контрагента. Программно документ. Контрагент в списке нашелся, но документ не провелся.
Но Записался. А Потом провелся.
 
 
   AlvlSpb
 
34 - 09.10.18 - 19:16
(33) РежимПроведенияДокумента.Неоперативный остался?
   AlvlSpb
 
35 - 09.10.18 - 19:22
Неоперативный режим проведения предусматривает, проведение задним числом, т.е. док должен быть минимум записан, чтобы появилась дата которой и надо неоперативно проводить. У вас создается док, не записан, дата не установлена. Может поэтому и не проводит?
   breezee
 
36 - 09.10.18 - 20:11
(17) Прочитайе, пожалуйста, зачм нужна явная транзакция в 1с
   Soulseller76
 
37 - 10.10.18 - 09:17
(34) нет, удалила.
   Soulseller76
 
38 - 10.10.18 - 09:17
(35) Дата устанавливается принудительно при создании документа. Второй строкой идет после СоздатьДокумент()
   Soulseller76
 
39 - 10.10.18 - 09:21
(36) Да, спасибо. Я вижу теперь свою ошибку с транзакциями.
Удалила.
   Cyberhawk
 
40 - 10.10.18 - 09:32
(39) Так нет никакой ошибки
   unregistered
 
41 - 10.10.18 - 09:36
(0) Попробуйте разделить транзакции.
Сначала - создавайте и записывайте все новые объекты, которые понадобятся для вашего документа (в т.ч. контрагентов и партнёров). Завершаете эту транзакцию.
Потом - создаёте документ и заполняете его ссылками на ранее созданные элементы. Завершаете вторую транзакцию.

Или вообще откажитесь от явного использования транзакций.
   unregistered
 
42 - 10.10.18 - 09:38
(0) > ошибка возникает при попытке сделать запись в РегистрНакопления.РасчетыСКлиентами

Возможно, что при записи контрагента вы забываете установить какие-либо критичные реквизиты. Вы там случайно не делаете запись контрагента в режиме ОбменДанными.Загрузка = Истина ?
   unregistered
 
43 - 10.10.18 - 09:39
У вас два вариант:
1. Показать тут весь код.
2. Научиться пользоваться отладчиком.
   Soulseller76
 
44 - 10.10.18 - 09:47
(43) Я умею им пользоваться. Проблема в том, что КА + БитФинанс ужасно сложная конфигурация, которая своей запутанностью ставит меня просто в ступор. )))))
   Soulseller76
 
45 - 10.10.18 - 09:49
(40) Я про другое.
Я не завершала Транзакцию, когда документ не проводился, а продолжала попытки его записать. И у меня появлялись записи "В этой транзакции уже происходили ошибки". )
Это слегка озадачивало.
   dmpl
 
46 - 10.10.18 - 09:54
(0) Скорее всего не все регистры заполняются при программном создании контрагента.
   Soulseller76
 
47 - 10.10.18 - 09:55
Как-то так:

НовыйПКО = Документы.ПриходныйКассовыйОрдер.СоздатьДокумент();
НовыйПКО.Дата  = ДатаЧека;
НовыйПКО.Касса = КассаДокумента;
Организация = Справочники.Организации.НайтиПоНаименованию("ООО ""ЧЧЧЧ""", Истина);
НовыйПКО.Организация  = Организация;
НовыйПКО.ХозяйственнаяОперация  = Перечисления.ХозяйственныеОперации.ПоступлениеОплатыОтКлиента;
НовыйПКО.СуммаДокумента         = СуммаДокумента;
НовыйПКО.Валюта = ВалютаРегламентированногоУчета;                
НовыйПКО.Подразделение = НовыйПКО.Касса.Подразделение;
                
КонтрагентСуществует = НайтиКонтрагентаПоИННКПП(ИННКонтрагента, КППКонтрагента);

Если КонтрагентСуществует <> Неопределено Тогда
    ПартнерСуществует = КонтрагентСуществует.Партнер;    
Иначе
    ПартнерСуществует = НайтиПартнераПоКодуИзКис(КодКонтрагентаИзКис);
    
    Если ПартнерСуществует <> Неопределено Тогда
        КонтрагентСуществует    = НайтиКонтрагентаПоПартнеру(ПартнерСуществует);
    КонецЕсли; 
КонецЕсли; 
                
Если КонтрагентСуществует = Неопределено и ПартнерСуществует = Неопределено Тогда
    ОбъектБылСоздан = СоздатьПартнераНаСервере(ТаблицаДанныхДляДокумента[0], ПризнакЗагружаемыхДанных, Организация);
    Если ОбъектБылСоздан <> Неопределено Тогда
        КонтрагентСуществует    =  ОбъектБылСоздан;
        ПартнерСуществует       =  КонтрагентСуществует.Партнер;
    Иначе
        КонтрагентСуществует    =  Справочники.Контрагенты.ПустаяСсылка();
        ПартнерСуществует       =  Справочники.Партнеры.ПустаяСсылка();
    КонецЕсли; 
КонецЕсли;

НовыйПКО.Контрагент     = КонтрагентСуществует;                    
//НовыйПКО.Комментарий            = "Выручка за "+Формат(ДатаНовогоДокумента, "ДЛФ=Д");


НовыйПКО.ПринятоОт              = Строка(НовыйПКО.Контрагент);
НовыйПКО.Основание              = "Доставка корреспонденции от юридических лиц";
НовыйПКО.Приложение             = "Суточный отчет с гашением от "+Формат(ДатаЧека, "ДЛФ=Д");

РасшифровкаПлатежа                                  = НовыйПКО.РасшифровкаПлатежа.Добавить();
РасшифровкаПлатежа.Партнер                          = ПартнерСуществует;
РасшифровкаПлатежа.СтатьяДвиженияДенежныхСредств    = Справочники.СтатьиДвиженияДенежныхСредств.ПоступлениеОплатыОтКлиента;
РасшифровкаПлатежа.Подразделение                    = НовыйПКО.Касса.Подразделение;
РасшифровкаПлатежа.СтавкаНДС                        = Перечисления.СтавкиНДС.НДС18;

СуммаНДС                                            = СуммаДокумента*18/118;
РасшифровкаПлатежа.СуммаНДС                         = Окр(СуммаНДС, 2);
РасшифровкаПлатежа.Сумма                            = СуммаДокумента;
КонецЕсли; 

НеПровелось = Ложь;

Попытка
    НовыйПКО.Записать(РежимЗаписиДокумента.Проведение);
Возврат Истина;
Исключение
    НеПровелось = Истина;            
КонецПопытки;    

Если НеПровелось Тогда
    Попытка
        НовыйПКО.Записать(РежимЗаписиДокумента.Запись);
    Исключение
        ЕмайлОтветственного = ПолучитьЕМайлОтветственногоПоКассе(НовыйПКО.Касса);
        ПисьмоОтправлено = ОтправитьПисьмоРугательное(НовыйПКО, ЕмайлОтветственного);                
        Возврат Ложь;
    КонецПопытки;
КонецЕсли;
   Cyberhawk
 
48 - 10.10.18 - 09:56
(45) "когда документ не проводился, а продолжала попытки его записать" // Так в том коде нет этого. В том коде если документ не проводится, то код уходит в исключение с отменой транзакции. Где там повторение попытки записи?
   Cyberhawk
 
49 - 10.10.18 - 09:57
А, у тебя видимо начао транзакции было до первой попытки записи, а фиксация/отмена - после второй
 
 Рекламное место пустует
   Soulseller76
 
50 - 10.10.18 - 09:57
Это код создания Партнера/Контрагента

Функция СоздатьПартнераНаСервере(МассивСДанными, ПризнакЗагружаемыхДанных, ТекОрганизация)
    
    Ошибка = Ложь;
    
    НачатьТранзакцию(РежимУправленияБлокировкойДанных.Управляемый);
    
    НовыйПартнер                    = Справочники.Партнеры.СоздатьЭлемент();
    НовыйПартнер.Клиент             = Истина;
    НовыйПартнер.Наименование       = МассивСДанными.Customers;
    НовыйПартнер.НаименованиеПолное = МассивСДанными.Customers;
    
    ДопРеквизиты = НовыйПартнер.ДополнительныеРеквизиты.Добавить();
    ДопРеквизиты.Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Код из КИС");
    ДопРеквизиты.Значение =    МассивСДанными.CustomerNumber;
    
    НовыйПартнер.ЮрФизЛицо      = Перечисления.КомпанияЧастноеЛицо.Компания;
    
    НовыйПартнер.Комментарий        = "Создан выгрузкой из КИС";
    
    Попытка
        НовыйПартнер.Записать();    
        ТекущийПартнер = НовыйПартнер.Ссылка;
    Исключение
        Ошибка = Истина;
    КонецПопытки;
    
    НовыйКонтрагент         = Справочники.Контрагенты.СоздатьЭлемент();    
    
    НовыйКонтрагент.ЮрФизЛицо           = Перечисления.ЮрФизЛицо.ЮрЛицо;
    НовыйКонтрагент.Наименование        = МассивСДанными.Customers;
    НовыйКонтрагент.НаименованиеПолное  = МассивСДанными.Customers;
    НовыйКонтрагент.ИНН                 = МассивСДанными.CustomerINN;
    НовыйКонтрагент.Кпп                 = МассивСДанными.CustomerKPP;
    НовыйКонтрагент.Партнер             = ТекущийПартнер;        
    
    Попытка
        НовыйКонтрагент.Записать();
        ТекущийКонтрагент = НовыйКонтрагент.Ссылка;
    Исключение
        Ошибка = Истина;
    КонецПопытки;  
    
    НовыеКлючиАналитики = Справочники.КлючиАналитикиУчетаПоПартнерам.СоздатьЭлемент();
    НовыеКлючиАналитики.Наименование = Строка(ТекущийКонтрагент)+"; "+Строка(ТекОрганизация)+";"+Строка(ТекущийПартнер);
    НовыеКлючиАналитики.Партнер      = ТекущийПартнер;
    НовыеКлючиАналитики.Организация  = ТекОрганизация;
    НовыеКлючиАналитики.Контрагент   = ТекущийКонтрагент;
    
    Попытка
        НовыеКлючиАналитики.Записать();
        ТекущийКлючАналитки = НовыеКлючиАналитики.Ссылка;
    Исключение
        Ошибка = Истина;
    КонецПопытки; 
    
    МенеджерЗаписи = РегистрыСведений.АналитикаУчетаПоПартнерам.СоздатьМенеджерЗаписи();
    
    МенеджерЗаписи.Партнер      = ТекущийПартнер;
    МенеджерЗаписи.Организация  = ТекОрганизация;
    МенеджерЗаписи.Контрагент   = ТекущийКонтрагент;
    МенеджерЗаписи.КлючАналитики= ТекущийКлючАналитки;
    
    Попытка
        МенеджерЗаписи.Записать();
    Исключение
        Ошибка = Истина;
    КонецПопытки;
    
    ЗафиксироватьТранзакцию();
    
    Если НЕ Ошибка Тогда
        Возврат ТекущийКонтрагент;
    Иначе
        Возврат Неопределено;
    КонецЕсли; 
    
КонецФункции
   Soulseller76
 
51 - 10.10.18 - 09:58
(49) Да ) Не учла особенности )
   Михаил Козлов
 
52 - 10.10.18 - 10:24
Может быть из-за какая-то "бяки" с созданием ключей аналитики по партнерам и записью в РС Аналитика учета по партнерам.
   Soulseller76
 
53 - 10.10.18 - 13:00
(52) Да вроде нет. Хотя, надо вот что посмотреть - при проведении документа - не появляется ли новая запись в РС Аналитика учета.


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует