• 🔥 Бесплатный курс от Академии Кодебай: «Анализ защищенности веб-приложений»

    🛡 Научитесь находить и использовать уязвимости веб-приложений.
    🧠 Изучите SQLi, XSS, CSRF, IDOR и другие типовые атаки на практике.
    🧪 Погрузитесь в реальные лаборатории и взломайте свой первый сайт!
    🚀 Подходит новичкам — никаких сложных предварительных знаний не требуется.

    Доступ открыт прямо сейчас Записаться бесплатно

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

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

KiR

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

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

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

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

Я вот так примерно автоматически делаю СФ на основании расходной накладной, посмотри, может, пригодится,
работает уже 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 // ввод Счета-Фактуры
//**********************************************************
 
Кстати - там при проведении счета-фактуры он ссылается на переменную из формы в которой ссылка на номер релиза.А при использовании внешней обработки эта константа пустая! Поправил в модуле документа добавив переменную и записав в неё номер релиза. Спасибо за SFc.ВерсияОбъекта = Const.НомерРелиза - это оно и есть, обязательно попробую!
 
А если версиюОбъекта не проставить, это может аукнуться. Кое-где есть проверки на старые версии, а если она не проставлена (а при автосоздании дока будет пустой), то сравнивается как НОЛЬ и будут проблемы. Сам столкнулся когда-то
 
2 puh14 .
Ситуация такая - формирование каждого документа - это отдельная процедура. А ДокОснование я не прередавал ибо не знал что это нужно (возможно позор мне в этом). Вот сейчас и думаю как мне передать этот ДокОснование между процедурами? формирование акта уже сделал Процедурой так что ДокОсн уже возвращает значение. не пойму только как передать его в следующую процедуру
 
SFc.ДокументОснование = ДокОсн;
А что содержиться в ДокОсн? Попытался сделать так - дает ошибку
ДокНовый.ДокументОснование = ДокОсн;
{V:\СЧЕТА.ERT(376)}: Неверное присвоение значения. Используйте: .ТекущийДокумент()
 
2 KiR
В моем примере ДокОсн - параметр функции, а в него и передается текущийдокумент()
смотри внимательнее
 
2 KiR
В моем примере ДокОсн - параметр функции, а в него и передается текущийдокумент()
смотри внимательнее
Да. точно. А вот со своей траблой не могу разобраться:
Код:
СформироватьДокумент(ДатаСчета, 0, ТЗ.СуммаДокумента, ТЗ.Контрагент, КодДепо);
ДокОсн = СформироватьАкт(ТЗ.ДатаДок, ТЗ.СуммаДокумента, ТЗ.Контрагент, КодДепо);
СформироватьСФ(ТЗ.ДатаДок, 0, ТЗ.СуммаДокумента, ТЗ.Контрагент, КодДепо, ДокОсн);
Выдает ошибку ДокНовый.ДокументОснование = ДокОсн;
{V:\СЧЕТА.ERT(356)}: Неверное присвоение значения. Используйте: .ТекущийДокумент()
Че можете присоветовать?
 
в начале модуля создай переменные типа докоснованиеак, докоснованиесчет - в процессе формирования документов присваивай им значения текущийдокумент() - и можешь вызывать в других модулях.

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

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

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


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

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

внутри каждой процедуры после записи документа соответственно
в документе
ДокОснДок = Док.ТекущийДокумент();//ну как у тебя ссылка на документ оформлена я не знаю
в акте
ДокОснАкт = Док.ТекущийДокумент();
и в СФ
вызываешь если документ-основание акт
СФ.ДокОснование = ДокОснАкт;
 
2 puh14 приблизительно так и сделал. вот что выдало:
ДокОсн = ДокНовый.ТекущийДокмумент();
{V:\СЧЕТА.ERT(506)}: Поле агрегатного объекта не обнаружено (ТекущийДокмумент)
 
ОЙ... спасибо огромное! истинно ПОНЕДЕЛЬНИК ДЕНЬ ТЯЖЕЛЫЙ. лови свой плюсег
 
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab