Программное создание и проведение документа.

1. Prisian 10.08.15 14:54 Сейчас в теме
Есть конфигурация(самописная). При интерактивном создании документа и его заполнении (В форме документа есть кнопки по заполнению табличных частей) документ заполняется и проводится. Процедуры заполнения документа вызываются из модуля менеджера. При программном создании и заполнении документа и его проведении документ создается, шапка заполняется, но табличная часть не заполняется и сам документ остается не проведен. Хотя в отладчике видно что они (табличные части) заполняются данными и формируются движения по регистрам. Пробовал отключить проведение документа, закоментировав вызов процедур записи в регистры - данные в табличных частях не сохраняются. Возникает вопрос, почему данные в документе не сохраняются.
+
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. spezc 782 10.08.15 14:56 Сейчас в теме
смотрите что именно (какие именно табчасти) передаются в модуль менеджера при заполнении из формы, и что именно передается при программном заполнении.
+
3. Prisian 10.08.15 14:59 Сейчас в теме
Вот код обработки:
ДокументРасчета = Документы.Расчет.СоздатьДокумент();
ДокументРасчета.Дата			 = ДатаДокумента;
ДокументРасчета.УстановитьНовыйНомер();
ДокументРасчета.Организация		 = Организация;
ДокументРасчета.ЛицевойСчет		 = ЛицевойСчет;
ДокументРасчета.Автор	 		 = Пользователь;
				
ДокументРасчета.Записать();

Документы.Расчет.ЗаполнитьТабличнуюЧастьИнформациейНеобходимойДляРасчетов(ДокументРасчета);	
Документы.Расчет.РасчитатьНачисления(ДокументРасчета);
	
Документы.Расчет.ОтразитьДанныеТабличнойЧастиРасчетыВРегистрахРасчетов(ДокументРасчета);
Документы.Расчет.РасчитатьЛьготы(ДокументРасчета);
Документы.Расчет.ОчиститьДвиженияПоРегиструРасчетаНеобходимыхДляРасчетаЛьгот(ДокументРасчета);
			
ДокументРасчета.Записать(РежимЗаписиДокумента.Проведение);
Показать
+
4. starjevschik 10.08.15 15:52 Сейчас в теме
(3) Prisian, кривовато, конечно. Надо смотреть, что именно заполняется в процедурах Документы.Расчет.х, скорее всего, там заполняется другой документ.
Для начала надо переименовать переменные, чтобы хотя бы понимать, где объект, а где ссылка. Не
ДокументРасчета = Документы.Расчет.СоздатьДокумент();

а
ДокументРасчетаОбъект = Документы.Расчет.СоздатьДокумент();

потом смотреть в процедуры, что там происходит.
+
6. Serega-artem 16 10.08.15 16:50 Сейчас в теме
(3) Prisian, Как я понял из вашего кода, вы:

1. Создаете программно документ и записываете его.

2. Заполняете ТЧ в записанном документе.

Мне кажется, что проблема в том, что вы не получаете объект документа. Надо что-то типа

ОбъектДока = ВашаССылкаНаДокумент.ПолучитьОбъект();

 Документы.Расчет.ОтразитьДанныеТабличнойЧастиРасчетыВРегистрахРасчетов(ДокументРасчета);

ОбъектДока.Записать(РежимЗаписиДокумента.Проведение);
+
7. Prisian 10.08.15 17:14 Сейчас в теме
(6) У меня уже после записи есть объект. Но попробовал так как Вы подсказали. Результат тот же.
+
8. Serega-artem 16 10.08.15 17:28 Сейчас в теме
(7) Prisian, Вы пишите, что документ не проводится. Если при выполнении кода:

ДокументРасчета.Записать(РежимЗаписиДокумента.Проведение);


нет ошибки, значит "проводится" какой-то другой документ. Соответственно проблема именно в некорректном получении объекта.

Можно попробовать при создании документа устанавливать ссылку нового, а потом по этой ссылке получать документ, получать его объект и проводить.
+
5. Prisian 10.08.15 16:06 Сейчас в теме
Так при интерактивном создании и заполнении вызываются те же процедуры, но там все работает. Вот код из процедуры формы для расчета табличных частей.
ДокументОбъект = РеквизитФормыВЗначение("Объект");
	
	Документы.Расчет.РасчитатьНачисления(ДокументОбъект);
	Документы.Расчет.ОтразитьДанныеТабличнойЧастиРасчетыВРегистрахРасчетов(ДокументОбъект);
	Документы.Расчет.РасчитатьЛьготы(ДокументОбъект);
	Документы.Расчет.ОчиститьДвиженияПоРегиструРасчетаНеобходимыхДляРасчетаЛьгот(ДокументОбъект); 
	
	ЗначениеВРеквизитФормы(ДокументОбъект, "Объект");
+
12. starjevschik 10.08.15 19:27 Сейчас в теме
(5) Prisian, все, что остается, это воспользоваться отладчиком. Похоже, без этого не понять.
+
9. Prisian 10.08.15 17:58 Сейчас в теме
Ну, если как-то не так получаю объект документа, уже код по-другому переписал:
ОбъектДокументРасчета = ДокументРасчета.Ссылка.ПолучитьОбъект();
	
Документы.Расчет.ЗаполнитьТабличнуюЧастьИнформациейНеобходимойДляРасчетов(ДокументРасчета);	
Документы.Расчет.РасчитатьНачисления(ДокументРасчета);
	
Документы.Расчет.ОтразитьДанныеТабличнойЧастиРасчетыВРегистрахРасчетов(ДокументРасчета);
Документы.Расчет.РасчитатьЛьготы(ДокументРасчета);
Документы.Расчет.ОчиститьДвиженияПоРегиструРасчетаНеобходимыхДляРасчетаЛьгот(ДокументРасчета);
	
ОбъектДокументРасчета.Расчеты.Загрузить(ДокументРасчета.Расчеты.Выгрузить());
ОбъектДокументРасчета.Льготы.Загрузить(ДокументРасчета.Льготы.Выгрузить());
	
ОбъектДокументРасчета.Записать(РежимЗаписиДокумента.Проведение);
Показать


Но результат тот же. В отладчике видно, что табличные части заполнены, но после выхода из процедуры - документ есть, но табличные части пустые.
+
10. Serega-artem 16 10.08.15 19:06 Сейчас в теме
(9) Prisian, Написал код, аналогичный вашему, попробовал воспроизвести ошибку - не получилось. Все проводится. Скажите, а если оставить вот такой-вот код:

ДокументРасчета = Документы.Расчет.СоздатьДокумент();
ДокументРасчета.Дата             = ДатаДокумента;
ДокументРасчета.УстановитьНовыйНомер();
ДокументРасчета.Организация         = Организация;
ДокументРасчета.ЛицевойСчет         = ЛицевойСчет;
ДокументРасчета.Автор              = Пользователь;
                
ДокументРасчета.Записать();
            
ДокументРасчета.Записать(РежимЗаписиДокумента.Проведение);
Показать



Документ будет проводится? Если да, то попробуйте добавлять по одой процедуре из модуля менеджера, чтобы понять на какой возникает проблема.
+
11. Serega-artem 16 10.08.15 19:10 Сейчас в теме
(9) Prisian, Вы бы еще выложили код обработки проведения. б.м. в ней не выполняется какое-то условие и устанавливается отказ на проведение. Это можно еще проверить изменив ДокументРасчета.Записать(РежимЗаписиДокумента.Проведение) на ДокументРасчета.Записать(РежимЗаписиДокумента.Запись) и посмотреть будет ли документ сохраняться с измененными таблицами.
+
13. Prisian 10.08.15 19:43 Сейчас в теме
(11) Я и так пробовал и в Попытку... Исключение ставил - Постоянно одно и то же: в отладчике все отлично, но когда выхожу из отладчика - только заполненная шапка документа и все - табличные части пусты. Поэтому я и тему создал. Пробовал и в реквизит обработки ссылку на документ добавлять и потом получать объект. И уже эти же процедуры в модуль объекта добавлял и оттуда вызывал - в отладчике показывает все нормально, но после того как-бы документ вообще не заполнял. :(
+
14. Serega-artem 16 10.08.15 20:21 Сейчас в теме
(13) Prisian, Если мыслить логически - раз таблица заполняется, а потом вы видите пустой документ значит либо не то заполняется, либо заполняется но не охраняется.

Трудно разбираться в проблеме не видя всего когда, но есть такая мысль.

Если я правильно понимаю логику, то:

// Вот тут заполняется ТЧ документа
Документы.Расчет.ЗаполнитьТабличнуюЧастьИнформациейНеобходимойДляРасчетов(ДокументРасчета);  

// Начиная отсюда начинается работа с данными ТЧ.    
Документы.Расчет.РасчитатьНачисления(ДокументРасчета);
    
Документы.Расчет.ОтразитьДанныеТабличнойЧастиРасчетыВРегистрахРасчетов(ДокументРасчета);


Попробуйте записать документ после заполнения ТЧ т.е.

Документы.Расчет.РасчитатьНачисления(ДокументРасчета);
ДокументРасчета.Записать();
Документы.Расчет.ОтразитьДанныеТабличнойЧастиРасчетыВРегистрахРасчетов(ДокументРасчета);
+
15. Prisian 17.08.15 10:23 Сейчас в теме
Решение найдено. Хотя это не сильно оптимальный вариант решения по скорости выполнения, но он работает, в отличии от более быстрых:
1. Получение объекта документа и обработка его в модуле менеджера:
&НаСервере
Процедура РасчитатьАбонента(ДатаРасчета, НомерДокумента = Неопределено) Экспорт

// Проверяем не было ли в этом периоде расчета
ДокументРасчетаСсылка = РаботаСРасчетами.ПолучитьДокументРасчета(ЛицевойСчет, ДатаДокумента);
			
ДокументРасчетаОбъект = Документы.Расчет.СоздатьДокумент();
ДокументРасчетаОбъект.Дата			 = ДатаДокумента;
ДокументРасчетаОбъект.УстановитьНовыйНомер();
ДокументРасчетаОбъект.Организация		 = Организация;
ДокументРасчетаОбъект.ЛицевойСчет		 = ЛицевойСчет;
ДокументРасчетаОбъект.Автор	 		 = Пользователь;
	
ДокументРасчетаОбъект.Записать();

Документы.Расчет.ЗаполнитьТабличнуюЧастьИнформациейНеобходимойДляРасчетов(ДокументРасчетаОбъект);	
Документы.Расчет.РасчитатьНачисления(ДокументРасчетаОбъект);
	
Документы.Расчет.ОтразитьДанныеТабличнойЧастиРасчетыВРегистрахРасчетов(ДокументРасчетаОбъект);
Документы.Расчет.РасчитатьЛьготы(ДокументРасчетаОбъект);
Документы.Расчет.ОчиститьДвиженияПоРегиструРасчетаНеобходимыхДляРасчетаЛьгот(ДокументРасчетаОбъект);

ДокументРасчетаОбъект.Записать(РежимЗаписиДокумента.Проведение);
КонецПроцедуры
Показать


2. Получение Обекта документа и обработка его в модуле объекта:
&НаСервере
Процедура РасчитатьАбонента(ДатаРасчета, НомерДокумента = Неопределено) Экспорт

// Проверяем не было ли в этом периоде расчета
ДокументРасчетаСсылка = РаботаСРасчетами.ПолучитьДокументРасчета(ЛицевойСчет, ДатаДокумента);
			
ДокументРасчетаОбъект = Документы.Расчет.СоздатьДокумент();
ДокументРасчетаОбъект.Дата			 = ДатаДокумента;
ДокументРасчетаОбъект.УстановитьНовыйНомер();
ДокументРасчетаОбъект.Организация		 = Организация;
ДокументРасчетаОбъект.ЛицевойСчет		 = ЛицевойСчет;
ДокументРасчетаОбъект.Автор	 		 = Пользователь;
	
ДокументРасчетаОбъект.Записать();

ДокументРасчетаОбъект.ЗаполнитьТабличнуюЧастьИнформациейНеобходимойДляРасчетов();	
ДокументРасчетаОбъект.РасчитатьНачисления();
	
ДокументРасчетаОбъект.ОтразитьДанныеТабличнойЧастиРасчетыВРегистрахРасчетов();
ДокументРасчетаОбъект.РасчитатьЛьготы();
ДокументРасчетаОбъект.ОчиститьДвиженияПоРегиструРасчетаНеобходимыхДляРасчетаЛьгот();

ДокументРасчетаОбъект.Записать(РежимЗаписиДокумента.Проведение);
КонецПроцедуры
Показать


Как ни странно в отладчике, при выполнении данного кода, табличные части заполнялись, документ делал движения по регистрам, но после завершения обработки кода - в базе данных создавались документы, заполнялись реквизиты шапки и больше ничего...
Но когда я вызывал данные процедуры заполнения табличной части из формы документа, все заполнялось и документ делал движения по регистрам.
&НаСервере
Процедура ЗаполнитьТабличнуюЧастьИнформацияДляРасчетов()
	
	ДокументОбъект = РеквизитФормыВЗначение("Объект");
	Документы.Расчет.ЗаполнитьТабличнуюЧастьИнформациейНеобходимойДляРасчетов(ДокументОбъект);
	ЗначениеВРеквизитФормы(ДокументОбъект, "Объект");
	Модифицированность = Истина;
	
КонецПроцедуры // ЗаполнитьТабличнуюЧастьИнформацияДляРасчетов()
Показать


После этого я подумал, а что если я буду получать форму нужного мне документа и заполнять из нее табличные части документа. Понимаю, что данное решение не оптимально, но попробовал. В итоге получился код, который работает и хоть намного медленнее.
Первое что я сделал разделил процедуры получения объекта и формы, так как с сервера форму получить невозможно, то основная процедура была на клиенте. На сервере я создавал документ и передавал ссылку на него назад в "основную процедуру". После этого получаю форму нужного мне документа, присваиваю переменной основной реквизит формы - объект, далее заполняю табличные части, вызывая процедуры заполнения из модуля менеджера. После этого у меня получается заполненная переменная типа "ДанныеФормыСтруктура" из нее заполняю реквизит документа "объект" такого же типа и провожу документ в форме:
&НаКлиенте
Процедура РасчитатьАбонента(ДатаДокумента)

        ДокументРасчетаСсылка = СоздатьДокументРасчет(ДатаДокумента);
	ПровестиВФормеДокументаРасчет(ДокументРасчетаСсылка);

КонецПроцедуры // РасчитатьАбонента()

&НаСервере
Функция СоздатьДокументРасчет(ДатаДокумента)
	
	ДокументРасчетаОбъект = Документы.Расчет.СоздатьДокумент();
	ДокументРасчетаОбъект.Дата			 = ДатаДокумента;
	ДокументРасчетаОбъект.УстановитьНовыйНомер();
	ДокументРасчетаОбъект.Организация		 = Организация;
	ДокументРасчетаОбъект.ЛицевойСчет		 = ЛицевойСчет;
	ДокументРасчетаОбъект.Автор	 		 = Пользователь;
	
	ДокументРасчетаОбъект.Записать();	
	
	Возврат ДокументРасчетаОбъект.Ссылка;
	
КонецФункции

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

&НаСервере
Процедура ЗаполнитьОбъектДокументаРасчет(ДокументОбъектИзФормы)
	
	ДокументОбъектИзФормы.Расчеты.Очистить();
	ДокументОбъектИзФормы.Льготы.Очистить();
	 	
	Документы.Расчет.ЗаполнитьТабличнуюЧастьИнформациейНеобходимойДляРасчетов(ДокументОбъектИзФормы);	
	Документы.Расчет.РасчитатьНачисления(ДокументОбъектИзФормы);
	
	Документы.Расчет.ОтразитьДанныеТабличнойЧастиРасчетыВРегистрахРасчетов(ДокументОбъектИзФормы);
	Документы.Расчет.РасчитатьЛьготы(ДокументОбъектИзФормы);
	Документы.Расчет.ОчиститьДвиженияПоРегиструРасчетаНеобходимыхДляРасчетаЛьгот(ДокументОбъектИзФормы);
		
КонецПроцедуры

Показать

В итоге такой метод работает. Может кому и в дальнейшем пригодится.
П.С. Может кто из гуру объяснит почему при получении и заполнении объекта документа данные не сохранялись, а при получении и заполнении типа "ДанныеФормыСтруктура" все работает?
+
16. helenachekman 20.07.17 16:39 Сейчас в теме
Я тоже столкнулась с такой ситуацией: конфигурация не типовая, программно создаю документы в шапке данные есть, а в табличной части пусто, в отладчике данные вижу. Долго голову ломала. В итоге решила перед тем как записать документ открыть его. И его табличная часть оказалась заполненной! После этого я в отладчике просмотрела два документа: один, который создавала программно, и второй, который создала обычно вручную. Нашла отличия и проанализировала. В моем случае дело было в флагах, которые автоматом определялись при обычном вводе документов, а программно я не ставила. Может кому-нибудь поможет.
+
Внимание! Тема сдана в архив

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот