• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

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

  • Автор темы KiR
  • Дата начала
K

KiR

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

puh14

Создавай не всё скопом,а сначала док основание,запись его в отдельную переменную а потом простановка его в реквизит документа через ту-же переменную. и посмотри в модуле проведения - мож без акта возврат идёть.
 
K

KiR

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

puh14

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

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

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

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

vbs

Еще одна причина, по которой СФ не попадает в Книгу продаж - может, надо включить флажок в реквизите
Договор.АвтоОбработкаНДС

Я вот так примерно автоматически делаю СФ на основании расходной накладной, посмотри, может, пригодится,
работает уже 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 // ввод Счета-Фактуры
//**********************************************************
 
P

puh14

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

vbs

А если версиюОбъекта не проставить, это может аукнуться. Кое-где есть проверки на старые версии, а если она не проставлена (а при автосоздании дока будет пустой), то сравнивается как НОЛЬ и будут проблемы. Сам столкнулся когда-то
 
K

KiR

2 puh14 .
Ситуация такая - формирование каждого документа - это отдельная процедура. А ДокОснование я не прередавал ибо не знал что это нужно (возможно позор мне в этом). Вот сейчас и думаю как мне передать этот ДокОснование между процедурами? формирование акта уже сделал Процедурой так что ДокОсн уже возвращает значение. не пойму только как передать его в следующую процедуру
 
K

KiR

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

vbs

2 KiR
В моем примере ДокОсн - параметр функции, а в него и передается текущийдокумент()
смотри внимательнее
 
K

KiR

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

puh14

в начале модуля создай переменные типа докоснованиеак, докоснованиесчет - в процессе формирования документов присваивай им значения текущийдокумент() - и можешь вызывать в других модулях.

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

KiR

в начале модуля создай переменные типа докоснованиеак, докоснованиесчет - в процессе формирования документов присваивай им значения текущийдокумент() - и можешь вызывать в других модулях.

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

puh14

в начале модуля

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


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

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

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

KiR

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

puh14

Докмумент говоришь? - а не документ?
 
K

KiR

ОЙ... спасибо огромное! истинно ПОНЕДЕЛЬНИК ДЕНЬ ТЯЖЕЛЫЙ. лови свой плюсег
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!