1c7. ввод на основании

KiR

НЕ шибка опытный програмер)
11.09.2007
1 581
0
#1
Бухи поставили задачу - из экселевского файла закачивать данные по которым формируются три документа:Счет, Акт и СФ. Все это я сделал - все создается, проверяется на уникальность, вообщем все вроде классно. Но не учли одного.... Сегодня при попытке формировать Книгу продаж и заполнять автоматически бухи не увидели СФ выданных. Начали разбираться - оказалось что причина в том что в СФ не указан Акт (в Акте естесвенно не указан счет, но это по моему не так важно ибо счета все равно ведь не проводятся). Теперь мне по-идее нужно переписывать код. Создание каждого документа у меня реализованно отдельной процедурой.
Подскажите пожалуйста как луче всего переписывать код? чем создание программно нового документа отличается от создания документа введенного на основании? Какие есть нюансы чтобы потом не всплыли?
 

puh14

Well-Known Member
11.07.2008
1 412
0
#2
Создавай не всё скопом,а сначала док основание,запись его в отдельную переменную а потом простановка его в реквизит документа через ту-же переменную. и посмотри в модуле проведения - мож без акта возврат идёть.
 

KiR

НЕ шибка опытный програмер)
11.09.2007
1 581
0
#3
Создавай не всё скопом,а сначала док основание,запись его в отдельную переменную а потом простановка его в реквизит документа через ту-же переменную. и посмотри в модуле проведения - мож без акта возврат идёть.
А что значит не все скопом? у мя создание вот как происходит:
Код:
Если ТЗ.СуммаДокумента > 0 Тогда
СформироватьДокумент(ДатаСчета, 0, ТЗ.СуммаДокумента, ТЗ.Контрагент, КодДепо);
СформироватьСФ(ТЗ.ДатаДок, 0, ТЗ.СуммаДокумента, ТЗ.Контрагент, КодДепо);
СформироватьАкт(ТЗ.ДатаДок, ТЗ.СуммаДокумента, ТЗ.Контрагент, КодДепо);
КонецЕсли;
И не совсем понял что ты имел в виду "посмотри в модуле проведения - мож без акта возврат идёть"
 

puh14

Well-Known Member
11.07.2008
1 412
0
#4
Акт впереди счета-фактуры поставь,да?плюс не видно как в формирование счета - фактуры передается док-основание. процедуру сформироватьсф покажи

возврат это что-тотипа
Если пустоеЗначение(ДокОснование) = 1 Тогда
СтатусВозврата(0);
Возврат;

в модуле документа а не формы.

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

vbs

Well-Known Member
18.02.2007
1 708
3
#5
Еще одна причина, по которой СФ не попадает в Книгу продаж - может, надо включить флажок в реквизите
Договор.АвтоОбработкаНДС

Я вот так примерно автоматически делаю СФ на основании расходной накладной, посмотри, может, пригодится,
работает уже 5 лет (пост сокращаю в целях экономии)

Function FillSF(ДокОсн)
SFc = CreateObject("Document.СчетФактура");
if Const.МетодОпределенияВыручки.Получить(SFc.DocDate) = глПоОтгрузке then
SFc.СчетНДС = 1;
else
SFc.СчетНДС = 2;
endif;
SFc.ВерсияОбъекта = Const.НомерРелиза;
SFc.Договор = ДокОсн.Договор;
SFc.Контрагент = ДокОсн.Контрагент;
SFc.Грузополучатель = ДокОсн.Контрагент;
SFc.СчетАкциза = 1;
SFc.Курс = 1;
SFc.Валюта = Const.ОсновнаяВалюта;
SFc.ВариантОтправки = 1;
SFc.ДокументОснование = ДокОсн;
SFc.Грузоотправитель = GetEmptyValue();
SFc.Комментарий = "Введен на основании: "+ГлПредставлениеДокумента(ДокОсн)
// далее заполняем строки
endFunction
//**********************************************************
Procedure SF()
SFc.New();
SFc.DocDate = Doc.DocDate;
SFc.DocNum = NumSF;
if FillSF(Doc.CurrentDocument()) = 0 then
Message("Счет-фактура не создан !");
Return
endif;
SFc.Write();
SFc.MakeActions();
Message("создан документ ""cчет-фактура"" "+SFc.DocNum+" от "+SFc.DocDate);
EndProcedure // ввод Счета-Фактуры
//**********************************************************
 

puh14

Well-Known Member
11.07.2008
1 412
0
#6
Кстати - там при проведении счета-фактуры он ссылается на переменную из формы в которой ссылка на номер релиза.А при использовании внешней обработки эта константа пустая! Поправил в модуле документа добавив переменную и записав в неё номер релиза. Спасибо за SFc.ВерсияОбъекта = Const.НомерРелиза - это оно и есть, обязательно попробую!
 

vbs

Well-Known Member
18.02.2007
1 708
3
#7
А если версиюОбъекта не проставить, это может аукнуться. Кое-где есть проверки на старые версии, а если она не проставлена (а при автосоздании дока будет пустой), то сравнивается как НОЛЬ и будут проблемы. Сам столкнулся когда-то
 

KiR

НЕ шибка опытный програмер)
11.09.2007
1 581
0
#8
2 puh14 .
Ситуация такая - формирование каждого документа - это отдельная процедура. А ДокОснование я не прередавал ибо не знал что это нужно (возможно позор мне в этом). Вот сейчас и думаю как мне передать этот ДокОснование между процедурами? формирование акта уже сделал Процедурой так что ДокОсн уже возвращает значение. не пойму только как передать его в следующую процедуру
 

KiR

НЕ шибка опытный програмер)
11.09.2007
1 581
0
#9
SFc.ДокументОснование = ДокОсн;
А что содержиться в ДокОсн? Попытался сделать так - дает ошибку
ДокНовый.ДокументОснование = ДокОсн;
{V:\СЧЕТА.ERT(376)}: Неверное присвоение значения. Используйте: .ТекущийДокумент()
 

vbs

Well-Known Member
18.02.2007
1 708
3
#10
2 KiR
В моем примере ДокОсн - параметр функции, а в него и передается текущийдокумент()
смотри внимательнее
 

KiR

НЕ шибка опытный програмер)
11.09.2007
1 581
0
#11
2 KiR
В моем примере ДокОсн - параметр функции, а в него и передается текущийдокумент()
смотри внимательнее
Да. точно. А вот со своей траблой не могу разобраться:
Код:
СформироватьДокумент(ДатаСчета, 0, ТЗ.СуммаДокумента, ТЗ.Контрагент, КодДепо);
ДокОсн = СформироватьАкт(ТЗ.ДатаДок, ТЗ.СуммаДокумента, ТЗ.Контрагент, КодДепо);
СформироватьСФ(ТЗ.ДатаДок, 0, ТЗ.СуммаДокумента, ТЗ.Контрагент, КодДепо, ДокОсн);
Выдает ошибку ДокНовый.ДокументОснование = ДокОсн;
{V:\СЧЕТА.ERT(356)}: Неверное присвоение значения. Используйте: .ТекущийДокумент()
Че можете присоветовать?
 

puh14

Well-Known Member
11.07.2008
1 412
0
#12
в начале модуля создай переменные типа докоснованиеак, докоснованиесчет - в процессе формирования документов присваивай им значения текущийдокумент() - и можешь вызывать в других модулях.

или передавать в качестве значения. При таком раскладе надо, чтобы документы-основания формировались раньше.
 

KiR

НЕ шибка опытный програмер)
11.09.2007
1 581
0
#13
в начале модуля создай переменные типа докоснованиеак, докоснованиесчет - в процессе формирования документов присваивай им значения текущийдокумент() - и можешь вызывать в других модулях.

или передавать в качестве значения. При таком раскладе надо, чтобы документы-основания формировались раньше.
А можешь все тоже самое только кодом?
 

puh14

Well-Known Member
11.07.2008
1 412
0
#14
в начале модуля

перем ДокОснДок
Перем ДокОснАкт
перем ДокОснСФ


потом в процедуре

Если ТЗ.СуммаДокумента > 0 Тогда
СформироватьДокумент(ДатаСчета, 0, ТЗ.СуммаДокумента, ТЗ.Контрагент, КодДепо);
СформироватьАкт(ТЗ.ДатаДок, ТЗ.СуммаДокумента, ТЗ.Контрагент, КодДепо);
СформироватьСФ(ТЗ.ДатаДок, 0, ТЗ.СуммаДокумента, ТЗ.Контрагент, КодДепо);
КонецЕсли;

внутри каждой процедуры после записи документа соответственно
в документе
ДокОснДок = Док.ТекущийДокумент();//ну как у тебя ссылка на документ оформлена я не знаю
в акте
ДокОснАкт = Док.ТекущийДокумент();
и в СФ
вызываешь если документ-основание акт
СФ.ДокОснование = ДокОснАкт;
 

KiR

НЕ шибка опытный програмер)
11.09.2007
1 581
0
#15
2 puh14 приблизительно так и сделал. вот что выдало:
ДокОсн = ДокНовый.ТекущийДокмумент();
{V:\СЧЕТА.ERT(506)}: Поле агрегатного объекта не обнаружено (ТекущийДокмумент)
 

KiR

НЕ шибка опытный програмер)
11.09.2007
1 581
0
#17
ОЙ... спасибо огромное! истинно ПОНЕДЕЛЬНИК ДЕНЬ ТЯЖЕЛЫЙ. лови свой плюсег