Есть обработка по переносу данных из ТиС 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.Основание);
// ДокНН.Записать()
Возврат ДокНН.Ссылка;
КонецФункции
Подскажите пожалуйста, как правильно можно сделать подобное?
Спасибо.
С Уважением, Дмитрий.