Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Счет-фактура в качестве договора?
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.2 > Программирование обычных форм 1С 8.2 и не интерфейсной логики
bizisoft
Здравствуйте.

Есть обработка по переносу данных из ТиС 7.7 в Бухгалтерия 8.2 (перенос документов Счет-Фактура, Расходные и Налоговые), через ОЛЕ подключение
Если в 7.7 с контрагентом заключен договор купли-продажи, то с этим проблем нет у меня получилось сделать перенос номера и даты этого договора, а вот если договора нет, то тут проблема в том, если в 8.2 не создавать договор, то НН не проводиться.

Узнал, что если нет договора, то в качестве договора выступает Счет-фактура, но как указать Счет-фактуру в качестве договора никак не получается.
Через ОЛЕ получаю из 7.7 для текущей НН документ основание, это строка вида "Счет-фактура № РР-0000222 от 01.02.13", разбиваю строку на три составляющих и получаю три переменные:
ДогНаименование - "Счет-фактура"
ДогНомер - "РР-0000222"
ДогДата - "01.02.2013"

Теперь остается их только вставить в нужную запись Справочника.ДоговорыКонтрагентов, да вот только запутался немножко.

Подскажите пожалуйста как это можно осуществить?

Не буду приводить весь код обработки - слишком много будет, расскажу примерный принцып его работы:
Процедура ЗагрузитьНажатие(), выполняет последовательно следующие действия:
Проходит попорядку списки документов в 7.7 и создает их в 8.2: Счета, Расходные и потом Налоговые.
При этом на каждом документе проверяет наличие контрагента и если нет создает его.

Вот мой код непосредственно отвечающий за Создание Контрагента и НН:
Это ф-ция производит поиск контрагента и если не найден, то создает его
//функция возвращает или найденную, или созданную карточку клиента 
//если включен флаг обновления справочников она также перезаполняет реквизиты
Функция НайтиСоздатьКонтрагента(Ссылка77)
    Перем Клиент;      
    Найден = 0;     
    ...    
// Создадим нового контрагента, если он не найден.  
    Если Найден = 0 Тогда
        Клиент = Справочники.Контрагенты.СоздатьЭлемент();    
    КонецЕсли;           
    //перезаполним данные в карточке    
    Клиент.Наименование  =  Ссылка77.Наименование;
    Клиент.НаименованиеПолное = Ссылка77.ПолнНаименование;
    Клиент.ИНН = СокрЛП(Ссылка77.ИНН);
    Клиент.КодПоЕДРПОУ = СокрЛП(Ссылка77.ЕГРПОУ);
    Клиент.НомерСвидетельства = СокрЛП(Ссылка77.НомерСвидетельства);
    Клиент.Родитель = Справочники.Контрагенты.НайтиПоНаименованию(Ссылка77.Родитель.Родитель.Наименование);
    Если Ссылка77.ВидКонтрагента.Идентификатор() = "ЧастноеЛицо" Тогда
        Клиент.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ФизЛицо;
        Клиент.ДокументУдостоверяющийЛичность = "Паспорт серия "+СокрЛП(Ссылка77.ДокументСерия)+" номер "+(Ссылка77.ДокументНомер) +
           " выдан "+СокрЛП(Ссылка77.ДокументДатаВыдачи)+""+СокрЛП(Ссылка77.ДокументКемВыдан);
    Иначе
        Клиент.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ЮрЛицо;
    КонецЕсли;         
    Клиент.Комментарий = "Импортирован из 7.7";    
    Клиент.Записать();
//------ добавляем адрес юридический    
// Сдесь заполняються Контактные данные, в данном контексте чтобы не засорять - убрано
//-------      
//Импортируем р/счета клиента - убрано

//Создадим договор, если нет ни одного договора по клиенту
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    ДоговорыКонтрагентов.Ссылка
    |ИЗ
    |    Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
    |ГДЕ
    |    ДоговорыКонтрагентов.Владелец = &Владелец";         
    Запрос.УстановитьПараметр("Владелец", Клиент.Ссылка);         
    ЕстьДоговор = 0;
    Если НЕ Запрос.Выполнить().Пустой() Тогда
        ЕстьДоговор = 1;
    КонецЕсли;
    //если в выборке строк нет, то создаем новый договор
    Если ЕстьДоговор = 0 Тогда
// Ниже условие проверяет на предмет отсутствия договора в 7.7 (т.е. в 7.7 переменные ДатаДог и НомДог пустые)
// При импорте ДатаДог содержит нулевую дату 31.12.1899 - корректно проверить у меня не получилось, поэтому сделал так
        Если (Ссылка77.ДатаДог > Дата(2000, 01, 01)) и (НЕ ПустаяСтрока(Ссылка77.НомДог)) Тогда  
            НовыйДоговор = Справочники.ДоговорыКонтрагентов.СоздатьЭлемент();  
            НовыйДоговор.Владелец = Клиент.Ссылка;
            НовыйДоговор.Номер = Ссылка77.НомДог;
            НовыйДоговор.Наименование = "Договір купівлі-продажу";
            НовыйДоговор.НаименованиеДляПечати = "Договір купівлі-продажу";          
            НовыйДоговор.ВалютаВзаиморасчетов = мВалютаРегламентированногоУчета;  
            НовыйДоговор.ВедениеВзаиморасчетов = Перечисления.ВедениеВзаиморасчетовПоДоговорам.ПоДоговоруВЦелом;
            НовыйДоговор.ВедениеВзаиморасчетовНУ = Перечисления.ВедениеВзаиморасчетовПоДоговорам.ПоДоговоруВЦелом;
            //заполним поле вида взаиморасчетов
            Запрос = Новый Запрос;
            Запрос.Текст =
            "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
            |    ВидыВзаиморасчетов.Ссылка КАК ВидыВзаиморасчетовСсылка
            |ИЗ
            |    Справочник.ВидыВзаиморасчетов КАК ВидыВзаиморасчетов
            |";
            Выборка = Запрос.Выполнить().Выбрать();
            Если Выборка.Следующий() Тогда
                НовыйДоговор.ВидВзаиморасчетов = Выборка.ВидыВзаиморасчетовСсылка;
            КонецЕсли;
            НовыйДоговор.СхемаНалоговогоУчета = Справочники.СхемыНалоговогоУчетаПоДоговорамКонтрагентов.ПоПервомуСобытию;
            НовыйДоговор.СрокОплаты = Константы.СрокОплатыПокупателей.Получить();         
            НовыйДоговор.ВидДоговора = Перечисления.ВидыДоговоровКонтрагентов.СПокупателем;
            //НовыйДоговор.Дата = ТекущаяДата();  // Если пустая дата, то ставим текущую
            НовыйДоговор.Дата = Ссылка77.ДатаДог;  // Иначе ставим имеющуюся дату договора        
            НовыйДоговор.Организация = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной("глТекущийПользователь"), "ОсновнаяОрганизация");
            Если НЕ ЗначениеЗаполнено(НовыйДоговор.Организация) Тогда                 
                Запрос = Новый Запрос;
                Запрос.Текст =
                "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
                |    Организации.Ссылка КАК ОрганизацияСсылка
                |ИЗ
                |    Справочник.Организации КАК Организации
                |";
                Выборка = Запрос.Выполнить().Выбрать();
                Если Выборка.Следующий() Тогда
                    НовыйДоговор.Организация = Выборка.ОрганизацияСсылка;
                КонецЕсли;               
            КонецЕсли;                
            НовыйДоговор.Комментарий = "Создан автоматически при импорте карточки клиента из 7.7";
            НовыйДоговор.Записать();             
            Клиент.ОсновнойДоговорКонтрагента = НовыйДоговор.Ссылка;    
            Клиент.Записать();
        Иначе
            Сообщить("     У контрагента " + Клиент.Наименование + " отсутствует договор. Будет создан договор на основе Счет-фактуры.");
        КонецЕсли;        
    КонецЕсли;            
    Возврат Клиент.Ссылка;      
КонецФункции

Т.е. исходя из кода этой ф-ции договор создается на этапе создания контрагента. Не знаю почему так - это то что мне досталось в "наследство " :-)
Но так как в ф-цию. передается значение содержащее ссылку на контрагента, то получить ДокументОснование из Налоговой в ней неполучиться, т.к. контрагент будет создан при переносе Счета или при переносе Расходной, т.е. до переноса Налоговой.
P.S. Ф-ция НайтиСоздатьКонтрагента() вызывается после получения ссылки из 7.7 но до создания документа в 8.2.

Тогда получается, что добавлять счет-фактуру в качестве договора купли-продажы нужно в ф-ции создания НН, а именно делать запрос типа
Запрос = Новый Запрос; 
    Запрос.Текст =
    "ВЫБРАТЬ
    |    ДоговорыКонтрагентов.Ссылка
    |ИЗ
    |    Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
    |ГДЕ
    |    ДоговорыКонтрагентов.Владелец = &Владелец";         
    Запрос.УстановитьПараметр("Владелец", Клиент.Ссылка);

и если результат пуст, то создавать новый договор и в нем указывать Номер счета, дату счета, и наименование Счет-заказ, после Записать и затем уже указать его в самой НН?

Вот ф-ция создает НН
Функция СформироватьНН(док77)      
    ИскомыйДокумент = Документы.РеализацияТоваровУслуг.ПустаяСсылка();          
    Если Док77.Вид() <> "НалоговаяНакладная" Тогда
        Возврат ИскомыйДокумент;
    КонецЕсли;         
    //ищем документ по дате и номеру
    ИскомыйДокумент = Документы.НалоговаяНакладная.НайтиПоНомеру(док77.НомерДок, док77.ДатаДок);     
    //если не пустой документ - значит найден
    Если ИскомыйДокумент.Пустая() = Ложь Тогда
        //если обновлять, то перезаписываем реквизиты шапки и табличной части
        Если ОбновлятьДокументы = Истина Тогда
            ДокНН = ИскомыйДокумент.ПолучитьОбъект();
            //очистим табличные части
            ДокНН.Товары.Очистить();
            ДокНН.ВозвратнаяТара.Очистить();
            ДокНН.Услуги.Очистить();
            ДокНН.СуммаДокумента = 0;
            ДокНН.СуммаНДСДокумента = 0;
        Иначе
            Возврат ИскомыйДокумент;
        КонецЕсли;    
    Иначе
        ДокНН = Документы.НалоговаяНакладная.СоздатьДокумент();          
        Часы    =0;
        Минуты    =0;
        Секунды    =0;
        док77.ПолучитьВремя(Часы,Минуты,Секунды);            
        ДокНН.Номер = док77.НомерДок;
        ДокНН.Дата = док77.ДатаДок;
    КонецЕсли;          
    //заполним стандарные реквизиты
    ЗаполнениеДокументов.ЗаполнитьШапкуДокумента(ДокНН, глЗначениеПеременной("глТекущийПользователь"), мВалютаРегламентированногоУчета, "Продажа");    
    ЗаполнениеДокументов.ЗаполнитьОбязательныеРеквизитыШапкиНовогоДокумента(ДокНН, глЗначениеПеременной("глТекущийПользователь"));    
    //заполним клиента
    ДокНН.Контрагент = НайтиСоздатьКонтрагента(Док77.Контрагент);       
    //заполним договор в счете
    ЗаполнениеДокументов.ПриИзмененииЗначенияКонтрагента(ДокНН,мСписокВидовДоговоров);     
    ДокНН.КурсВзаиморасчетов = 1;          
    ДокНН.ТипЦен = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной("глТекущийПользователь"), "ОсновнойТипЦенПродажи");
    ДокНН.СуммаВключаетНДС = Ложь;
    ДокНН.УчитыватьНДС = Истина;
    Если Док77.ЕРНН = 0 Тогда
        ДокНН.ВключенаВЕдиныйРеестрНалоговыхНакладных = Ложь;
    Иначе
        ДокНН.ВключенаВЕдиныйРеестрНалоговыхНакладных = Истина;    
    КонецЕсли;
    ДокНН.ВидДоговора = Справочники.ВидыДоговоровПоГК.НайтиПоНаименованию("Договір поставки", Истина);
    ДокНН.КтоВыписалНалоговуюНакладную = Справочники.ФизическиеЛица.НайтиПоНаименованию("Сдесь Ф.И.О.", Истина);    
        
    //заполним счета расходов
    СпособЗаполненияЦен = Перечисления.СпособыЗаполненияЦен.ПоЦенамНоменклатуры;
    // Зададим, какие реквизиты надо редактировать.
    СтруктураРеквизитовДокумента = Ценообразование.ПолучитьСтруктуруРеквизитовДокументаДляЦенообразования(ДокНН);
    ЗаполнениеДокументов.ПриИзмененииЗначенияДоговора(ДокНН, ДокНН.ВалютаДокумента, ДокНН.ВалютаДокумента, СпособЗаполненияЦен,
       СтруктураРеквизитовДокумента, "Продажа", "Товары", ДокНН.ДоговорКонтрагента);    
    

    СчетаУчета = БухгалтерскийУчетРасчетовСКонтрагентами.ПолучитьСчетаРасчетовСКонтрагентом(ДокНН.Организация, ДокНН.Контрагент, ДокНН.ДоговорКонтрагента);        
    СтруктураОбязательныхПолей = Новый Структура;
    СтруктураНеОбязательныхПолей = Новый Структура;        
    СтруктураОбязательныхПолей.Вставить("СчетУчетаРасчетовПоТаре", СчетаУчета.СчетУчетаТарыПокупателя);
    СтруктураНеОбязательныхПолей.Вставить("СчетУчетаРасчетовПоТареПоАвансам", СчетаУчета.СчетАвансовПоТареПокупателя);    
    СтруктураОбязательныхПолей.Вставить("СчетУчетаРасчетовСКонтрагентом", СчетаУчета.СчетРасчетовПокупателя);
    СтруктураНеОбязательныхПолей.Вставить("СчетУчетаРасчетовПоАвансам", СчетаУчета.СчетАвансовПокупателя);    
    СтруктураОбязательныхПолей.Вставить("СчетУчетаНДС", СчетаУчета.СчетУчетаНДСПродаж);          
    //заполнение табличной части
    Док77.ВыбратьСтроки();
    Пока Док77.ПолучитьСтроку()>0 Цикл
        //если пустая строка - пропускаем
        Если ПустаяСтрока(Строка(Док77.Товар.Наименование)) = Ложь Тогда                            
            Если  Док77.Товар.ВидТовара.Идентификатор() = "Услуга" Тогда                  
                НоваяСтрока = ДокНН.Услуги.Добавить();
                НоваяСтрока.СтавкаНДС = ПолучитьСтавкуНДС(док77.Товар.СтавкаНДС.Получить().Идентификатор());
                НоваяСтрока.СуммаНДС = док77.СуммаСНДС-док77.СуммаБезНДС;
                НоваяСтрока.СуммаБезСкидки = док77.СуммаБезСкидки;
                НоваяСтрока.СуммаСкидки = док77.СуммаСкидки;
            ИначеЕсли   Док77.Товар.ВидТовара.Идентификатор() = "Тара" Тогда    
                НоваяСтрока = ДокНН.ВозвратнаяТара.Добавить();                                  
            Иначе
                НоваяСтрока = ДокНН.Товары.Добавить();                   
                //НаимПоиска = СокрЛП(Док77.Товар.БазоваяЕдиница.ПолнНаименование);
                //ЕдИзм = Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию(НаимПоиска);
                //Если ЕдИзм.Пустая() = Ложь Тогда             
                //    НоваяСтрока.ЕдиницаИзмерения = ЕдИзм.Ссылка;        
                //КонецЕсли;
                НоваяСтрока.Коэффициент = док77.Коэффициент;
                НоваяСтрока.СтавкаНДС = ПолучитьСтавкуНДС(док77.Товар.СтавкаНДС.Получить().Идентификатор());
                НоваяСтрока.СуммаНДС = док77.СуммаСНДС-док77.СуммаБезНДС;                  
                НоваяСтрока.СуммаБезСкидки = док77.СуммаБезСкидки;
                НоваяСтрока.СуммаСкидки = док77.СуммаСкидки;
            КонецЕсли;                 
            НоваяСтрока.Номенклатура = НайтиСоздатьТМЦ(Док77.Товар);
            НоваяСтрока.ЕдиницаИзмерения = НоваяСтрока.Номенклатура.БазоваяЕдиницаИзмерения;//Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию(НаимПоиска);             
            Если  Док77.Товар.ВидТовара.Идентификатор() = "Услуга" Тогда
                 НоваяСтрока.Содержание =  НоваяСтрока.Номенклатура.НаименованиеПолное;
            КонецЕсли;             
            НоваяСтрока.Количество = док77.Количество;            
            НоваяСтрока.Цена  = док77.ЦенаБезНДС;
            НоваяСтрока.Сумма = док77.СуммаБезНДС;
            НоваяСтрока.СтатьяДекларацииНДСНалоговыеОбязательства = Справочники.СтатьиНалоговыхДеклараций.НДС_НОПоСтавке20;
            НоваяСтрока.КодУКТВЭД = НоваяСтрока.Номенклатура.КодУКТВЭД;
        КонецЕсли;                
    КонецЦикла;     
    ДокНН.Комментарий = "Импортирован из 7.7";
    ДокНН.Записать();     
// Может сдесь нужно выполнить этот запрос для поиска и вставки договора (счет-заказа).
// Возможно как ф-цию, которая вернет ссылку на договор и эту ссылку присвоить
// ДокНН.ДоговорКонтрагента = НайтиСоздатьДоговорПоСчетФактуре(док77.Контрагент, док77.Основание);
// ДокНН.Записать()
    Возврат ДокНН.Ссылка;     
КонецФункции


Подскажите пожалуйста, как правильно можно сделать подобное?
Спасибо.

С Уважением, Дмитрий.
rpodgornyy
Как по мне, я бы просто немного "допилил" Бухгалтерию 8.2, чтобы при отсутствии договора подставлялись данные счёта. А создавать каждый раз новый договор, это, ИМХО, некорректно.
bizisoft
Можно было конечно допилить, но она закрыта, т.к. находиться на поддержке.

Я правильно понимаю, что при импорте НН в реквизит ДокументОснование помещать Счет-фактуру с номером и датой, а потом уже в 8-ке при отсутствии договора подставлять уже в печатную форму и/или XML документ?
rpodgornyy
Цитата(bizisoft @ 06.08.13, 13:53) необходимо зарегистрироваться для просмотра ссылки
Можно было конечно допилить, но она закрыта, т.к. находиться на поддержке.


Не вижу в этом проблемы, изменения незначительные...

Цитата(bizisoft @ 06.08.13, 13:53) необходимо зарегистрироваться для просмотра ссылки
Я правильно понимаю, что при импорте НН в реквизит ДокументОснование помещать Счет-фактуру с номером и датой, а потом уже в 8-ке при отсутствии договора подставлять уже в печатную форму и/или XML документ?


Если по памяти не ошибаюсь, подставляются данные "Сделка".
bizisoft
Хорошо, спасибо за информацию, попробую поразмыслить в этом направлении.
С Уважением, Дмитрий.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.