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

Тема в разделе "1C и всё что с ней связано", создана пользователем KiR, 18 июл 2008.

  1. KiR

    KiR НЕ шибка опытный програмер)
    1C Team

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

    puh14 Well-Known Member
    1C Team

    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    Создавай не всё скопом,а сначала док основание,запись его в отдельную переменную а потом простановка его в реквизит документа через ту-же переменную. и посмотри в модуле проведения - мож без акта возврат идёть.
     
  3. KiR

    KiR НЕ шибка опытный програмер)
    1C Team

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

    puh14 Well-Known Member
    1C Team

    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    Акт впереди счета-фактуры поставь,да?плюс не видно как в формирование счета - фактуры передается док-основание. процедуру сформироватьсф покажи

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

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

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

    vbs Well-Known Member

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

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

    puh14 Well-Known Member
    1C Team

    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    Кстати - там при проведении счета-фактуры он ссылается на переменную из формы в которой ссылка на номер релиза.А при использовании внешней обработки эта константа пустая! Поправил в модуле документа добавив переменную и записав в неё номер релиза. Спасибо за SFc.ВерсияОбъекта = Const.НомерРелиза - это оно и есть, обязательно попробую!
     
  7. vbs

    vbs Well-Known Member

    Регистрация:
    18 фев 2007
    Сообщения:
    1.708
    Симпатии:
    3
    А если версиюОбъекта не проставить, это может аукнуться. Кое-где есть проверки на старые версии, а если она не проставлена (а при автосоздании дока будет пустой), то сравнивается как НОЛЬ и будут проблемы. Сам столкнулся когда-то
     
  8. KiR

    KiR НЕ шибка опытный програмер)
    1C Team

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

    KiR НЕ шибка опытный програмер)
    1C Team

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

    vbs Well-Known Member

    Регистрация:
    18 фев 2007
    Сообщения:
    1.708
    Симпатии:
    3
    2 KiR
    В моем примере ДокОсн - параметр функции, а в него и передается текущийдокумент()
    смотри внимательнее
     
  11. KiR

    KiR НЕ шибка опытный програмер)
    1C Team

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

    puh14 Well-Known Member
    1C Team

    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    в начале модуля создай переменные типа докоснованиеак, докоснованиесчет - в процессе формирования документов присваивай им значения текущийдокумент() - и можешь вызывать в других модулях.

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

    KiR НЕ шибка опытный програмер)
    1C Team

    Регистрация:
    11 сен 2007
    Сообщения:
    1.581
    Симпатии:
    0
    А можешь все тоже самое только кодом?
     
  14. puh14

    puh14 Well-Known Member
    1C Team

    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    в начале модуля

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


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

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

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

    KiR НЕ шибка опытный програмер)
    1C Team

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

    puh14 Well-Known Member
    1C Team

    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    Докмумент говоришь? - а не документ?
     
  17. KiR

    KiR НЕ шибка опытный програмер)
    1C Team

    Регистрация:
    11 сен 2007
    Сообщения:
    1.581
    Симпатии:
    0
    ОЙ... спасибо огромное! истинно ПОНЕДЕЛЬНИК ДЕНЬ ТЯЖЕЛЫЙ. лови свой плюсег
     
Загрузка...

Поделиться этой страницей