// функция возвращает пустую таблицу значений под
// табличную часть документа основания.
//
функция ИнициализацияТаблицыСтрок()
Товары = новый ТаблицаЗначений();
Товары.Колонки.Добавить("Товар");
Товары.Колонки.Добавить("ТоварНаименование");
Товары.Колонки.Добавить("СтранаПроисхождения");
Товары.Колонки.Добавить("ПредставлениеСтраны");
Товары.Колонки.Добавить("НомерГТД");
Товары.Колонки.Добавить("ПредставлениеГТД");
Товары.Колонки.Добавить("Количество");
Товары.Колонки.Добавить("ЕдиницаИзмерения");
Товары.Колонки.Добавить("СуммаВключаетНДС");
Товары.Колонки.Добавить("Цена");
Товары.Колонки.Добавить("СтавкаНДС");
Товары.Колонки.Добавить("СуммаНДС");
Товары.Колонки.Добавить("Сумма");
возврат Товары;
конецфункции
// Проверяет правильность заполнения шапки документа.
// Проставляет прочерки в незаполненных полях печатной формы счета-фактуры.
//
процедура ПроставитьПрочеркиВПустыеПоля(ОбластьМакета)
для т = 0 по ОбластьМакета.Параметры.Количество() - 1 цикл
ТекПараметр = ОбластьМакета.Параметры.Получить(т);
если (Найти(ТекПараметр, "Продавец:") <> 0)
и (СокрЛП(ТекПараметр) = "Продавец:") тогда
ОбластьМакета.Параметры.Установить(т, "Продавец: ----");
иначеесли (Найти(ТекПараметр, "Адрес:") <> 0)
и (СокрЛП(ТекПараметр) = "Адрес:") тогда
ОбластьМакета.Параметры.Установить(т, "Адрес: ----");
иначеесли (Найти(ТекПараметр, "Идентификационный номер продавца (ИНН):") <> 0)
и (СокрЛП(ТекПараметр) = "Идентификационный номер продавца (ИНН):") тогда
ОбластьМакета.Параметры.Установить(т, "Идентификационный номер продавца (ИНН): ----");
иначеесли (Найти(ТекПараметр, "Грузоотправитель и его адрес:") <> 0)
и (СокрЛП(ТекПараметр) = "Грузоотправитель и его адрес:") тогда
ОбластьМакета.Параметры.Установить(т, "Грузоотправитель и его адрес: ----");
иначеесли (Найти(ТекПараметр, "Грузополучатель и его адрес:") <> 0)
и (СокрЛП(ТекПараметр) = "Грузополучатель и его адрес:") тогда
ОбластьМакета.Параметры.Установить(т, "Грузополучатель и его адрес: ----");
иначеесли (Найти(ТекПараметр, "К платежно-расчетному документу №") <> 0)
и (СокрЛП(ТекПараметр) = "К платежно-расчетному документу № от") тогда
ОбластьМакета.Параметры.Установить(т, "К платежно-расчетному документу № -- от --");
иначеесли (Найти(ТекПараметр, "Покупатель:") <> 0)
и (СокрЛП(ТекПараметр) = "Покупатель:") тогда
ОбластьМакета.Параметры.Установить(т, "Покупатель: ----");
иначеесли (Найти(ТекПараметр, "Идентификационный номер покупателя (ИНН):") <> 0)
и (СокрЛП(ТекПараметр) = "Идентификационный номер покупателя (ИНН):") тогда
ОбластьМакета.Параметры.Установить(т, "Идентификационный номер покупателя (ИНН): ----");
иначеесли не ЗначениеЗаполнено(ТекПараметр) тогда
ОбластьМакета.Параметры.Установить(т, "--");
конецесли;
конеццикла;
конецпроцедуры // ПроставитьПрочеркиВПустыеПоля()
// Функция собирает данные по документу основанию реализации и возвращает
// типизированную структуру с данными.
//
функция СобратьДанныеПоРеализацияТоваровУслуг(ДокОснование)
Запрос = новый Запрос;
Запрос.УстановитьПараметр("ДокументОснование", ДокОснование);
Запрос.УстановитьПараметр("ПустойКонтрагент", Справочники.Контрагенты.ПустаяСсылка());
Запрос.Текст = "
|ВЫБРАТЬ
| Организация,
| Организация КАК Поставщик,
| ВЫБОР
| КОГДА ЕСТЬNULL(Грузоотправитель, &ПустойКонтрагент) = &ПустойКонтрагент
| ТОГДА ""он же""
| ИНАЧЕ Грузоотправитель
| КОНЕЦ КАК Грузоотправитель,
| Подразделение КАК Подразделение,
| Контрагент КАК Покупатель,
| ВЫБОР
| КОГДА ЕСТЬNULL(Грузополучатель, &ПустойКонтрагент) = &ПустойКонтрагент
| ТОГДА Контрагент
| ИНАЧЕ Грузополучатель
| КОНЕЦ КАК Грузополучатель,
| СуммаДокумента КАК Сумма,
| ВалютаДокумента КАК Валюта,
| УчитыватьНДС КАК УчитыватьНДС,
| СуммаВключаетНДС КАК СуммаВключаетНДС
|ИЗ
| Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
|
|ГДЕ
| РеализацияТоваровУслуг.Ссылка = &ДокументОснование";
Шапка = Запрос.Выполнить().Выбрать();
Шапка.Следующий();
Запрос = новый Запрос;
Запрос.УстановитьПараметр("ДокументОснование", ДокОснование);
Запрос.УстановитьПараметр("ПустаяЕдиница", Справочники.ЕдиницыИзмерения.ПустаяСсылка());
Запрос.Текст = "
|ВЫБРАТЬ
| Номенклатура КАК Товар,
| ВЫРАЗИТЬ (Номенклатура.НаименованиеПолное КАК СТРОКА(200)) КАК ТоварНаименование,
| СерияНоменклатуры.СтранаПроисхождения КАК СтранаПроисхождения,
| СерияНоменклатуры.СтранаПроисхождения.НаименованиеПолное КАК ПредставлениеСтраны,
| СерияНоменклатуры.НомерГТД КАК НомерГТД,
| СерияНоменклатуры.НомерГТД.Представление КАК ПредставлениеГТД,
| ЕдиницаИзмерения.Представление КАК ЕдиницаИзмерения,
| Количество КАК Количество,
| Цена КАК Цена,
| СтавкаНДС КАК СтавкаНДС,
| СуммаНДС КАК СуммаНДС,
| Сумма КАК Сумма,
| ХарактеристикаНоменклатуры КАК Характеристика,
| СерияНоменклатуры КАК Серия,
| НомерСтроки КАК НомерСтроки,
| 1 КАК НомерТЧ
|ИЗ
| Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
|
|ГДЕ
| РеализацияТоваровУслугТовары.Ссылка = &ДокументОснование
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| Номенклатура КАК Товар,
| Содержание КАК ТоварНаименование,
| """" КАК СтранаПроисхождения,
| NULL КАК ПредставлениеСтраны,
| NULL КАК НомерГТД,
| """" КАК ПредставлениеГТД,
| Номенклатура.ЕдиницаХраненияОстатков.Представление КАК ЕдиницаИзмерения,
| ВЫБОР КОГДА Номенклатура.ЕдиницаХраненияОстатков = &ПустаяЕдиница
| ТОГДА 0 ИНАЧЕ Количество
| КОНЕЦ КАК Количество,
| Цена КАК Цена,
| СтавкаНДС КАК СтавкаНДС,
| СуммаНДС КАК СуммаНДС,
| Сумма КАК Сумма,
| NULL КАК Характеристика,
| NULL КАК Серия,
| НомерСтроки КАК НомерСтроки,
| 2 КАК НомерТЧ
|ИЗ
| Документ.РеализацияТоваровУслуг.Услуги КАК РеализацияТоваровУслугУслуги
|
|ГДЕ
| РеализацияТоваровУслугУслуги.Ссылка = &ДокументОснование
|
|УПОРЯДОЧИТЬ ПО
| НомерТЧ,
| НомерСтроки
|";
ВыборкаСтрокТовары = Запрос.Выполнить().Выбрать();
ДанныеДляПечати = новый Структура();
ДанныеДляПечати.Вставить("Организация", Шапка.Организация);
ДанныеДляПечати.Вставить("Номер", СсылкаНаОбъект.Номер);
ДанныеДляПечати.Вставить("Дата", СсылкаНаОбъект.Дата);
ДанныеДляПечати.Вставить("НомерПРД", СсылкаНаОбъект.НомерПлатежноРасчетногоДокумента);
ДанныеДляПечати.Вставить("ДатаПРД", СсылкаНаОбъект.ДатаПлатежноРасчетногоДокумента);
ДанныеДляПечати.Вставить("Поставщик", Шапка.Поставщик);
ДанныеДляПечати.Вставить("Грузоотправитель", Шапка.Грузоотправитель);
ДанныеДляПечати.Вставить("Подразделение", Шапка.Подразделение);
ДанныеДляПечати.Вставить("Покупатель", Шапка.Покупатель);
ДанныеДляПечати.Вставить("Грузополучатель", Шапка.Грузополучатель);
ДанныеДляПечати.Вставить("Сумма", Шапка.Сумма);
ДанныеДляПечати.Вставить("Валюта", Шапка.Валюта);
ДанныеДляПечати.Вставить("УчитыватьНДС", Шапка.УчитыватьНДС);
Руководители = РегламентированнаяОтчетность.ОтветственныеЛицаОрганизаций(Шапка.Организация, СсылкаНаОбъект.Дата,);
ДанныеДляПечати.Вставить(?(РегламентированнаяОтчетность.ЭтоПБОЮЛ(Шапка.Поставщик), "ФИОПБОЮЛ", "ФИОРуководителя"), Руководители.Руководитель);
ДанныеДляПечати.Вставить("ФИОГлавногоБухгалтера", Руководители.ГлавныйБухгалтер);
Товары = ИнициализацияТаблицыСтрок();
пока ВыборкаСтрокТовары.Следующий() = 1 цикл
Строчка = Товары.Добавить();
Строчка.Товар = ВыборкаСтрокТовары.Товар;
Строчка.ТоварНаименование = СокрЛП(ВыборкаСтрокТовары.ТоварНаименование) + ФормированиеПечатныхФорм.ПредставлениеСерий(ВыборкаСтрокТовары);
Строчка.СтранаПроисхождения = ВыборкаСтрокТовары.СтранаПроисхождения;
Строчка.ПредставлениеСтраны = ?(не ЗначениеЗаполнено(ВыборкаСтрокТовары.ПредставлениеСтраны), ВыборкаСтрокТовары.СтранаПроисхождения, ВыборкаСтрокТовары.ПредставлениеСтраны);
Строчка.НомерГТД = ВыборкаСтрокТовары.НомерГТД;
Строчка.ПредставлениеГТД = ВыборкаСтрокТовары.ПредставлениеГТД;
Строчка.Количество = ВыборкаСтрокТовары.Количество;
Строчка.ЕдиницаИзмерения = ВыборкаСтрокТовары.ЕдиницаИзмерения;
Строчка.СуммаВключаетНДС = Шапка.СуммаВключаетНДС;
Строчка.Цена = ?(ВыборкаСтрокТовары.Количество = 0, 0, (ВыборкаСтрокТовары.Сумма - ?(Шапка.СуммаВключаетНДС,ВыборкаСтрокТовары.СуммаНДС,0)) / ВыборкаСтрокТовары.Количество);
Строчка.СтавкаНДС = ?(Шапка.УчитыватьНДС, ВыборкаСтрокТовары.СтавкаНДС, Перечисления.СтавкиНДС.БезНДС);
Строчка.СуммаНДС = ВыборкаСтрокТовары.СуммаНДС;
Строчка.Сумма = ВыборкаСтрокТовары.Сумма;
конеццикла;
ДанныеДляПечати.Вставить("ТабличнаяЧасть", Товары);
возврат ДанныеДляПечати;
конецфункции // СобратьДанныеПоРеализацияТоваровУслуг()
// Функция создает табличный документ формы счета-фактуры.
//
функция ПечатьСчетаФактуры(ДанныеДляПечати)
ТабДокумент = новый ТабличныйДокумент;
если СсылкаНаОбъект.Дата < '20040216' тогда
ТабДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_СчетФактураВыданный_СчетФактура575";
Макет = ПолучитьОбщийМакет("СчетФактура575");
иначеесли СсылкаНаОбъект.Дата < '20060530' тогда
ТабДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_СчетФактураВыданный_СчетФактура84";
Макет = ПолучитьОбщийМакет("СчетФактура84");
иначе
ТабДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_СчетФактураВыданный_СчетФактура283";
Макет = ПолучитьОбщийМакет("СчетФактура283");
конецесли;
СведенияОбПокупателе = УправлениеКонтактнойИнформацией.СведенияОЮрФизЛице(ДанныеДляПечати.Покупатель, СсылкаНаОбъект.Дата);
СведенияОПоставщике = УправлениеКонтактнойИнформацией.СведенияОЮрФизЛице(ДанныеДляПечати.Поставщик, СсылкаНаОбъект.Дата);
СведенияОГрузоотправителе = УправлениеКонтактнойИнформацией.СведенияОЮрФизЛице(?(ДанныеДляПечати.Грузоотправитель = "он же", Неопределено, ДанныеДляПечати.Грузоотправитель), СсылкаНаОбъект.Дата);
СведенияОГрузополучателе = УправлениеКонтактнойИнформацией.СведенияОЮрФизЛице(ДанныеДляПечати.Грузополучатель, СсылкаНаОбъект.Дата);
ВыборкаПоТоварам = ДанныеДляПечати.ТабличнаяЧасть.Скопировать();
ВыборкаПоТоварам.Свернуть("Товар");
если ВыборкаПоТоварам.Количество() > 0 тогда
ТолькоУслуги = Истина;
для каждого СтрокаТовар из ВыборкаПоТоварам цикл
если (ТипЗнч(СтрокаТовар.Товар) = Тип("СправочникСсылка.Номенклатура")
и не СтрокаТовар.Товар.Услуга)
или ТипЗнч(СтрокаТовар.Товар) = Тип("СправочникСсылка.ОсновныеСредства") тогда
ТолькоУслуги = Ложь;
прервать;
конецесли;
конеццикла;
иначе
ТолькоУслуги = Ложь;
конецесли;
// Выводим шапку накладной
ОбластьМакета = Макет.ПолучитьОбласть("Шапка");
ОбластьМакета.Параметры.Заполнить(ДанныеДляПечати);
ОбластьМакета.Параметры.Номер = ОбщегоНазначения.СформироватьЗаголовокДокумента(ДанныеДляПечати, "Счет-фактура") + " г.";
ОбластьМакета.Параметры.ПредставлениеПоставщика = "Продавец: " + ФормированиеПечатныхФорм.ОписаниеОрганизации(СведенияОПоставщике, "ПолноеНаименование,");
ОбластьМакета.Параметры.АдресПоставщика = "Адрес: " + ФормированиеПечатныхФорм.ОписаниеОрганизации(СведенияОПоставщике, "ЮридическийАдрес,");
ОбластьМакета.Параметры.ПоДокументу = "К платежно-расчетному документу № " + СсылкаНаОбъект.НомерПлатежноРасчетногоДокумента + " от " + Формат(СсылкаНаОбъект.ДатаПлатежноРасчетногоДокумента, "ДФ=dd.MM.yyyy");
ОбластьМакета.Параметры.ПредставлениеПокупателя = "Покупатель: " + ФормированиеПечатныхФорм.ОписаниеОрганизации(СведенияОбПокупателе, "ПолноеНаименование,");
ОбластьМакета.Параметры.АдресПокупателя = "Адрес: " + ФормированиеПечатныхФорм.ОписаниеОрганизации(СведенияОбПокупателе, "ЮридическийАдрес,");
если СсылкаНаОбъект.Дата < '20040216' и ТолькоУслуги тогда
ОбластьМакета.Параметры.ПредставлениеГрузоотправителя = "Грузоотправитель и его адрес: " + "-";
ОбластьМакета.Параметры.ПредставлениеГрузополучателя = "Грузополучатель и его адрес: " + "-";
иначе
ОбластьМакета.Параметры.ПредставлениеГрузоотправителя = "Грузоотправитель и его адрес: " + ?(не ЗначениеЗаполнено(ДанныеДляПечати.Грузоотправитель), "", ?(ДанныеДляПечати.Грузоотправитель = "он же", ДанныеДляПечати.Грузоотправитель, ФормированиеПечатныхФорм.ОписаниеОрганизации(СведенияОГрузоотправителе, "ПолноеНаименование,ФактическийАдрес,")));
ОбластьМакета.Параметры.ПредставлениеГрузополучателя = "Грузополучатель и его адрес: " + ?(не ЗначениеЗаполнено(ДанныеДляПечати.Грузополучатель), "", ФормированиеПечатныхФорм.ОписаниеОрганизации(СведенияОГрузополучателе, "ПолноеНаименование,ФактическийАдрес,"));
конецесли;
если СсылкаНаОбъект.Дата < '20040216' тогда
ОбластьМакета.Параметры.ИННпоставщика = "Идентификационный номер продавца (ИНН): " + ФормированиеПечатныхФорм.ОписаниеОрганизации(СведенияОПоставщике, "ИНН,", Ложь);
ОбластьМакета.Параметры.ИННПокупателя = "Идентификационный номер покупателя (ИНН): " + ФормированиеПечатныхФорм.ОписаниеОрганизации(СведенияОбПокупателе, "ИНН,", Ложь);
иначе
КПП = ФормированиеПечатныхФорм.ОписаниеОрганизации(СведенияОПоставщике, "КПП,", Ложь);
если ЗначениеЗаполнено(КПП) тогда
КПП = "/" + КПП;
конецесли;
ОбластьМакета.Параметры.ИННпоставщика = "ИНН/КПП продавца: " + ФормированиеПечатныхФорм.ОписаниеОрганизации(СведенияОПоставщике, "ИНН,", Ложь) + КПП;
если не ТолькоУслуги
и ЗначениеЗаполнено(ДанныеДляПечати.Грузополучатель)
и не ДанныеДляПечати.Грузополучатель = ДанныеДляПечати.Покупатель
и ДанныеДляПечати.Грузополучатель.ГоловнойКонтрагент = ДанныеДляПечати.Покупатель
тогда
КПП = ФормированиеПечатныхФорм.ОписаниеОрганизации(СведенияОГрузополучателе, "КПП,", Ложь);
если не ЗначениеЗаполнено(КПП) тогда
КПП = ФормированиеПечатныхФорм.ОписаниеОрганизации(СведенияОбПокупателе, "КПП,", Ложь);
конецесли;
иначе
КПП = ФормированиеПечатныхФорм.ОписаниеОрганизации(СведенияОбПокупателе, "КПП,", Ложь);
конецесли;
если ЗначениеЗаполнено(КПП) тогда
КПП = "/" + КПП;
конецесли;
ОбластьМакета.Параметры.ИННПокупателя = "ИНН/КПП покупателя: " + ФормированиеПечатныхФорм.ОписаниеОрганизации(СведенияОбПокупателе, "ИНН,", Ложь) + КПП;
конецесли;
ПроставитьПрочеркиВПустыеПоля(ОбластьМакета);
ТабДокумент.Вывести(ОбластьМакета);
ОбластьМакета = Макет.ПолучитьОбласть("ЗаголовокТаблицы");
ОбластьМакета.Параметры.Заполнить(ДанныеДляПечати);
ТабДокумент.Вывести(ОбластьМакета);
ОбластьМакета = Макет.ПолучитьОбласть("Строка");
ИтогоСуммаНДС = 0;
ИтогоВсего = 0;
ВыборкаСтрокТовары = ДанныеДляПечати.ТабличнаяЧасть;
ВыборкаСтрокТовары.Колонки.Добавить("СуммаБезНДС");
ВыборкаСтрокТовары.Колонки.Добавить("СуммаСНДС");
для каждого Строчка из ВыборкаСтрокТовары цикл
Строчка.СуммаСНДС = Строчка.Сумма + ?(Строчка.СуммаВключаетНДС, 0, Строчка.СуммаНДС);
если (Строчка.СтавкаНДС = Перечисления.СтавкиНДС.НДС20_120)
или (Строчка.СтавкаНДС = Перечисления.СтавкиНДС.НДС18_118)
или (Строчка.СтавкаНДС = Перечисления.СтавкиНДС.НДС10_110) тогда
Строчка.СуммаБезНДС = Строчка.СуммаСНДС;
иначе
Строчка.СуммаБезНДС = Строчка.СуммаСНДС - Строчка.СуммаНДС;
конецесли;
конеццикла;
ВыборкаСтрокТовары.Свернуть("Товар, ТоварНаименование, СтранаПроисхождения, ПредставлениеСтраны, НомерГТД, ПредставлениеГТД, ЕдиницаИзмерения, Цена, СтавкаНДС", "Количество, Сумма, СуммаНДС, СуммаСНДС, СуммаБезНДС");
для каждого Строчка из ВыборкаСтрокТовары цикл
ОбластьМакета.Параметры.Заполнить(Строчка);
если Строка(Строчка.ПредставлениеСтраны) = "Россия" тогда
ОбластьМакета.Параметры.ПредставлениеСтраны = "----";
конецесли;
Количество = Строчка.Количество;
ОбластьМакета.Параметры.Количество = Количество;
если Строчка.Цена <> 0 тогда
ОбластьМакета.Параметры.Цена = ?(Количество = 0, 0, Строчка.СуммаБезНДС / Количество);
иначе
ОбластьМакета.Параметры.Цена = Строчка.Цена;
конецесли;
ОбластьМакета.Параметры.Стоимость = Строчка.СуммаБезНДС;
ОбластьМакета.Параметры.Всего = Строчка.СуммаСНДС;
ОбластьМакета.Параметры.СтавкаНДС = Строчка.СтавкаНДС;
ИтогоСуммаНДС = ИтогоСуммаНДС + Строчка.СуммаНДС;
ИтогоВсего = ИтогоВсего + Строчка.СуммаСНДС;
ПроставитьПрочеркиВПустыеПоля(ОбластьМакета);
ТабДокумент.Вывести(ОбластьМакета);
конеццикла;
ОбластьМакета = Макет.ПолучитьОбласть("Итого");
ОбластьМакета.Параметры.ИтогоСуммаНДС = ИтогоСуммаНДС;
ОбластьМакета.Параметры.ИтогоВсего = ИтогоВСего;
ПроставитьПрочеркиВПустыеПоля(ОбластьМакета);
ТабДокумент.Вывести(ОбластьМакета);
ОбластьМакета = Макет.ПолучитьОбласть("Подвал");
ОбластьМакета.Параметры.Заполнить(ДанныеДляПечати);
если не СсылкаНаОбъект.Дата < '20040216' тогда
ОбластьМакета.Параметры.Свидетельство = ФормированиеПечатныхФорм.ОписаниеОрганизации(СведенияОПоставщике, "Свидетельство,");
конецесли;
ПроставитьПрочеркиВПустыеПоля(ОбластьМакета);
ТабДокумент.Вывести(ОбластьМакета);
ТабДокумент.ПолеСверху = 0;
ТабДокумент.ПолеСлева = 0;
ТабДокумент.ПолеСнизу = 0;
ТабДокумент.ПолеСправа = 0;
ТабДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
возврат ТабДокумент;
конецфункции // ПечатьСчетаФактуры()
// Процедура осуществляет печать документа.
//
функция Печать() экспорт
для каждого док из СсылкаНаОбъект.ДокументыОснования цикл
если ТипЗнч (док.ДокументОснование) = Тип ("ДокументСсылка.РеализацияТоваровУслуг")
тогда
возврат ПечатьСчетаФактуры (СобратьДанныеПоРеализацияТоваровУслуг (док.ДокументОснование));
конецесли;
конеццикла;
возврат неопределено;
конецфункции