#Область ОбработчикиСобытийФормы
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.Свойство("АвтоТест") Тогда
Возврат;
КонецЕсли;
Параметры.Свойство("Организация", Организация);
Параметры.Свойство("Контрагент", Контрагент);
Параметры.Свойство("Договор", Договор);
Параметры.Свойство("СчетФактура", СчетФактура);
Параметры.Свойство("СчетФактураОснование", СчетФактураОснование);
Параметры.Свойство("Исправление", Исправление);
Параметры.Свойство("НомерИсправления", НомерИсправления);
Параметры.Свойство("ВалютаВзаиморасчетов", ВалютаВзаиморасчетов);
Параметры.Свойство("ДокументОснование", ДокументОснование);
Параметры.Свойство("СуммаКОплате", СуммаВзаиморасчетов);
Параметры.Свойство("СуммаРучногоВосстановленияАванса", СуммаРучногоВосстановленияАванса);
Если Параметры.Свойство("АдресВХранилище") Тогда
ПлатежноРасчетныеДокументы.Загрузить(ПолучитьИзВременногоХранилища(Параметры.АдресВХранилище));
КонецЕсли;
ВалютаРегламентированногоУчета = ЗначениеНастроекПовтИсп.ВалютаРегламентированногоУчетаОрганизации(Организация);
ЗаполнитьТаблицыЗачетаАвансов();
УправлениеЭлементамиФормы();
СобытияФорм.ПриСозданииНаСервере(ЭтотОбъект, Отказ, СтандартнаяОбработка);
КонецПроцедуры
&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
Если ПринудительноЗакрытьФорму Или ЗавершениеРаботы Тогда
Возврат;
КонецЕсли;
Если Модифицированность Тогда
Отказ = Истина;
ПоказатьВопрос(
Новый ОписаниеОповещения("ПередЗакрытиемВопросЗавершение", ЭтотОбъект),
НСтр("ru = 'Данные зачета авансов были изменены. Сохранить изменения?'"),
РежимДиалогаВопрос.ДаНетОтмена);
Возврат;
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытийЭлементовТаблицыФормыЗачтено
&НаКлиенте
Процедура ЗачтеноПередНачаломИзменения(Элемент, Отказ)
ТекущиеДанные = Элементы.Зачтено.ТекущиеДанные;
СуммаПередРедактированием = ТекущиеДанные.СуммаЗачтено;
КонецПроцедуры
&НаКлиенте
Процедура ЗачтеноПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)
ТекущиеДанные = Элементы.Зачтено.ТекущиеДанные;
Если ТекущиеДанные.СуммаЗачтено <> СуммаПередРедактированием Тогда
ОчиститьСообщения();
Отказ = Ложь;
ИзменениеСуммы = СуммаПередРедактированием - ТекущиеДанные.СуммаЗачтено;
Если ИзменениеСуммы < 0 Тогда
ТекущиеДанные.СуммаЗачтено = СуммаПередРедактированием;
ТекстПредупреждения = НСтр("ru = 'Зачтенная сумма не может быть увеличена'");
ПоказатьПредупреждение(, ТекстПредупреждения);
Возврат;
КонецЕсли;
СтрокаТаблицы = Элементы.Зачтено.ТекущаяСтрока;
СоответствиеСписания = Новый Соответствие;
СоответствиеСписания.Вставить(СтрокаТаблицы, ИзменениеСуммы);
ОтменитьЗачетНаСервере(СоответствиеСписания, , Отказ);
Если Отказ Тогда
ТекущиеДанные.СуммаЗачтено = СуммаПередРедактированием;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ЗачтеноВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
Если Поле.Имя = "ЗачтеноДокументОплаты" И ЗначениеЗаполнено(Элемент.ТекущиеДанные.ДокументОплаты) Тогда
ПоказатьЗначение(, Элемент.ТекущиеДанные.ДокументОплаты);
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытийЭлементовТаблицыФормыАвансы
&НаКлиенте
Процедура АвансыВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
Если Поле.Имя = "АвансыДокументОплаты" Тогда
СтрокаТаблицы = Элементы.Авансы.ТекущиеДанные;
Если СтрокаТаблицы <> Неопределено И ЗначениеЗаполнено(СтрокаТаблицы.ДокументОплаты) Тогда
ПоказатьЗначение(Неопределено, СтрокаТаблицы.ДокументОплаты);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиКомандФормы
&НаКлиенте
Процедура ЗачестьОплату(Команда)
ВыполнитьЗачетОплат();
КонецПроцедуры
&НаКлиенте
Процедура ЗачестьПлатеж(Команда)
ОчиститьСообщения();
МассивСтрок = Элементы.Авансы.ВыделенныеСтроки;
Если МассивСтрок.Количество() > 0 Тогда
ОчиститьСообщения();
ТекстОшибки = НСтр("ru='Сумма к оплате полностью зачтена.'");
Если Недостает <= 0 Тогда
ОбщегоНазначенияКлиент.СообщитьПользователю(ТекстОшибки);
Возврат;
КонецЕсли;
ЗачестьПлатежНаСервере(МассивСтрок);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура Обновить(Команда)
ОбновитьНаСервере();
КонецПроцедуры
&НаКлиенте
Процедура ОтменитьЗачет(Команда)
МассивСтрок = Элементы.Зачтено.ВыделенныеСтроки;
Если МассивСтрок.Количество() > 0 Тогда
ОчиститьСообщения();
СоответствиеСписания = Новый Соответствие;
Для Каждого Строка Из МассивСтрок Цикл
СоответствиеСписания.Вставить(Строка, 0);
КонецЦикла;
ОтменитьЗачетНаСервере(СоответствиеСписания, Ложь);
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
#Область ОбработчикиКоманд
&НаСервере
Процедура ЗачестьПлатежНаСервере(МассивСтрок)
СписокСтрок = Новый СписокЗначений;
Для Каждого НомерСтроки Из МассивСтрок Цикл
СтрокаТаблицы = Авансы.НайтиПоИдентификатору(НомерСтроки);
Если СтрокаТаблицы <> Неопределено Тогда
СписокСтрок.Добавить(СтрокаТаблицы, Авансы.Индекс(СтрокаТаблицы));
КонецЕсли;
КонецЦикла;
СписокСтрок.СортироватьПоПредставлению();
КоличествоОбработанныхДанных = 0;
Для Каждого Строка Из СписокСтрок Цикл
СтрокаТаблицы = Строка.Значение;
КоличествоОбработанныхДанных = КоличествоОбработанныхДанных + 1;
СуммаКЗачету = СтрокаТаблицы.ДоступноКЗачету;
СуммаКЗачетуРегл = СтрокаТаблицы.ДоступноКЗачетуРегл;
Если Недостает > 0 Тогда
СуммаБазиса = СтрокаТаблицы.ДоступноКЗачету;
СуммаКЗачету = ВзаиморасчетыСервер.СписатьСумму(СтрокаТаблицы.ДоступноКЗачету, Недостает);
СуммаКЗачетуРегл = ВзаиморасчетыСервер.СписатьСуммуПропорционально(
СтрокаТаблицы.ДоступноКЗачетуРегл,
СуммаКЗачету,
СуммаБазиса);
Иначе
СтрокаТаблицы.ДоступноКЗачету = 0;
КонецЕсли;
Если СуммаКЗачету = 0 Тогда
Прервать;
КонецЕсли;
СтруктураПоиска = Новый Структура("ОбъектРасчетов, ДокументОплаты", СтрокаТаблицы.ОбъектРасчетов, СтрокаТаблицы.ДокументОплаты);
ЗачтенныеСтроки = Зачтено.НайтиСтроки(СтруктураПоиска);
Если ЗачтенныеСтроки.Количество() = 0 Тогда
СтрокаЗачета = Зачтено.Добавить();
ЗаполнитьЗначенияСвойств(СтрокаЗачета, СтрокаТаблицы);
Иначе
СтрокаЗачета = ЗачтенныеСтроки[0];
КонецЕсли;
СтрокаЗачета.СуммаЗачтено = СтрокаЗачета.СуммаЗачтено + СуммаКЗачету;
СтрокаЗачета.СуммаЗачтеноРегл = СтрокаЗачета.СуммаЗачтеноРегл + СуммаКЗачетуРегл;
СтрокаЗачета.ДанныеИзменены = Истина;
Если СтрокаТаблицы.ДоступноКЗачету = 0 Тогда
Авансы.Удалить(СтрокаТаблицы);
Иначе
СтрокаТаблицы.ДанныеИзменены = Ложь;
КонецЕсли;
КонецЦикла;
РассчитатьСуммуЗачета();
Зачтено.Сортировать("ДокументОплаты");
КонецПроцедуры
&НаСервере
Процедура ОбновитьНаСервере()
ЗаполнитьТаблицыЗачетаАвансов();
КонецПроцедуры
&НаСервере
Процедура ОтменитьЗачетНаСервере(СоответствиеСтрок, СуммаСтрокиИзменена = Истина, Отказ = Ложь)
МассивСтрок = Новый Массив;
Для Каждого ЭлементСтроки Из СоответствиеСтрок Цикл
МассивСтрок.Добавить(ЭлементСтроки.Ключ);
КонецЦикла;
Для Каждого ЭлементСтроки Из СоответствиеСтрок Цикл
СтрокаТаблицы = Зачтено.НайтиПоИдентификатору(ЭлементСтроки.Ключ);
Если СтрокаТаблицы = Неопределено Тогда
Продолжить;
КонецЕсли;
СуммаКОтмене = ЭлементСтроки.Значение;
СуммаБазиса = СтрокаТаблицы.СуммаЗачтено + ?(СуммаСтрокиИзменена, СуммаКОтмене, 0);
Если СуммаКОтмене = 0 Тогда
СуммаКОтмене = СтрокаТаблицы.СуммаЗачтено;
СтрокаТаблицы.СуммаЗачтено = 0;
ИначеЕсли Не СуммаСтрокиИзменена Тогда
СтрокаТаблицы.СуммаЗачтено = СтрокаТаблицы.СуммаЗачтено - СуммаКОтмене;
КонецЕсли;
СуммаКОтменеРегл = ВзаиморасчетыСервер.СписатьСуммуПропорционально(
СтрокаТаблицы.СуммаЗачтеноРегл,
СуммаКОтмене,
СуммаБазиса);
СтруктураПоиска = Новый Структура("ДокументОплаты, ОбъектРасчетов");
ЗаполнитьЗначенияСвойств(СтруктураПоиска, СтрокаТаблицы);
НайденныеСтроки = Авансы.НайтиСтроки(СтруктураПоиска);
Если НайденныеСтроки.Количество() = 0 Тогда
СтрокаАванса = Авансы.Добавить();
ЗаполнитьЗначенияСвойств(СтрокаАванса, СтрокаТаблицы);
РеквизитыОплаты = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(СтрокаАванса.ОбъектРасчетов, "Валюта, Сумма");
СтрокаАванса.Валюта = РеквизитыОплаты.Валюта;
СтрокаАванса.СуммаДокумента = РеквизитыОплаты.Сумма;
Иначе
СтрокаАванса = НайденныеСтроки[0];
КонецЕсли;
СтрокаАванса.ДоступноКЗачету = СтрокаАванса.ДоступноКЗачету + СуммаКОтмене;
СтрокаАванса.ДоступноКЗачетуРегл = СтрокаАванса.ДоступноКЗачетуРегл + СуммаКОтменеРегл;
СтрокаАванса.НесохраненныеДанные = Истина;
Если СтрокаТаблицы.СуммаЗачтено = 0 Тогда
Зачтено.Удалить(СтрокаТаблицы);
СтрокаАванса.ДанныеИзменены = Истина;
Иначе
СтрокаТаблицы.ДанныеИзменены = Истина;
СтрокаАванса.ДанныеИзменены = Ложь;
КонецЕсли;
КонецЦикла;
РассчитатьСуммуЗачета();
Авансы.Сортировать("ДокументОплаты");
КонецПроцедуры
#КонецОбласти
&НаСервере
Процедура ЗаполнитьТаблицыЗачетаАвансов()
Авансы.Очистить();
Зачтено.Очистить();
Запрос = Новый Запрос;
ИнициализироватьЗапрос(Запрос);
Запрос.Текст = "ВЫБРАТЬ
| РасчетыСКлиентами.РасчетныйДокумент КАК РасчетныйДокумент,
| ВЫБОР
| КОГДА ДанныеПервичныхДокументов.Номер = """"
| ТОГДА ДанныеПервичныхДокументов.НомерРегистратора
| ИНАЧЕ
| ДанныеПервичныхДокументов.Номер
| КОНЕЦ КАК НомерПлатежноРасчетногоДокумента,
| ВЫБОР
| КОГДА ДанныеПервичныхДокументов.Дата = ДАТАВРЕМЯ(1,1,1,0,0,0)
| ТОГДА ДанныеПервичныхДокументов.ДатаРегистратора
| ИНАЧЕ
| ДанныеПервичныхДокументов.Дата
| КОНЕЦ КАК ДатаПлатежноРасчетногоДокумента,
| РасчетыСКлиентами.ОбъектРасчетов КАК ОбъектРасчетов,
| РасчетыСКлиентами.ПредоплатаОстаток КАК Предоплата,
| РасчетыСКлиентами.ПредоплатаРеглОстаток КАК ПредоплатаРегл
|ПОМЕСТИТЬ НезачтенныеАвансыПредварительная
|ИЗ
| РегистрНакопления.РасчетыСКлиентамиПоСрокам.Остатки(
| &ДатаОтгрузки,
| АналитикаУчетаПоПартнерам В
| (ВЫБРАТЬ
| ВтАналитикаУчетаПоПартнерам.КлючАналитики КАК КлючАналитики
| ИЗ
| ВтАналитикаУчетаПоПартнерам КАК ВтАналитикаУчетаПоПартнерам
| ГДЕ
| ВтАналитикаУчетаПоПартнерам.Организация В (&Организация))
| И Валюта = &Валюта
| И НЕ(ТИПЗНАЧЕНИЯ(РасчетныйДокумент) = ТИП(Документ.КорректировкаРеализации)
| И ВЫРАЗИТЬ(РасчетныйДокумент КАК Документ.КорректировкаРеализации).ХозяйственнаяОперация = ЗНАЧЕНИЕ(Перечисление.ХозяйственныеОперации.ПереходПраваСобственности))) КАК РасчетыСКлиентами
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ДанныеПервичныхДокументов КАК ДанныеПервичныхДокументов
| ПО (ДанныеПервичныхДокументов.Организация = &Организация)
| И РасчетыСКлиентами.РасчетныйДокумент = ДанныеПервичныхДокументов.Документ
|ГДЕ
| РасчетыСКлиентами.ПредоплатаОстаток > 0
|;
|
|
|ВЫБРАТЬ
| АвансыПоСчетамФактурамНаОтгрузку.ДокументОплаты КАК РасчетныйДокумент,
| АвансыПоСчетамФактурамНаОтгрузку.ОбъектРасчетов КАК ОбъектРасчетов,
| АвансыПоСчетамФактурамНаОтгрузку.СуммаБезНДСОстаток + АвансыПоСчетамФактурамНаОтгрузку.НДСОстаток КАК Предоплата,
| АвансыПоСчетамФактурамНаОтгрузку.СуммаБезНДСОстаток + АвансыПоСчетамФактурамНаОтгрузку.НДСОстаток КАК ПредоплатаРегл
|ПОМЕСТИТЬ втАвансыПолученныеПоСчетамФактурамНаОтгрузку
|ИЗ
| РегистрНакопления.НДСАвансыПолученные.Остатки(
| &ДатаОтгрузки,
| Организация = &Организация
| И Контрагент = &Контрагент
| И ТИПЗНАЧЕНИЯ(ДокументОплаты) = ТИП(Документ.СчетФактураВыданный)
| И ДокументОплаты <> &Ссылка
| И ВЫРАЗИТЬ(ДокументОплаты КАК Документ.СчетФактураВыданный).НачислениеНДСПриОтгрузке) КАК АвансыПоСчетамФактурамНаОтгрузку
|;
|
|
|ВЫБРАТЬ
| НезачтенныеАвансыПредварительная.РасчетныйДокумент КАК РасчетныйДокумент,
| НезачтенныеАвансыПредварительная.НомерПлатежноРасчетногоДокумента КАК НомерПлатежноРасчетногоДокумента,
| НезачтенныеАвансыПредварительная.ДатаПлатежноРасчетногоДокумента КАК ДатаПлатежноРасчетногоДокумента,
| НезачтенныеАвансыПредварительная.ОбъектРасчетов КАК ОбъектРасчетов,
| НезачтенныеАвансыПредварительная.Предоплата КАК Предоплата,
| НезачтенныеАвансыПредварительная.ПредоплатаРегл КАК ПредоплатаРегл
|ПОМЕСТИТЬ НезачтенныеАвансы
|ИЗ
| НезачтенныеАвансыПредварительная КАК НезачтенныеАвансыПредварительная
|ГДЕ
| ТИПЗНАЧЕНИЯ(НезачтенныеАвансыПредварительная.РасчетныйДокумент) <> ТИП(Документ.ВзаимозачетЗадолженности)
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| НезачтенныеАвансыПредварительная.РасчетныйДокумент КАК РасчетныйДокумент,
| НезачтенныеАвансыПредварительная.НомерПлатежноРасчетногоДокумента КАК НомерПлатежноРасчетногоДокумента,
| НезачтенныеАвансыПредварительная.ДатаПлатежноРасчетногоДокумента КАК ДатаПлатежноРасчетногоДокумента,
| НезачтенныеАвансыПредварительная.ОбъектРасчетов КАК ОбъектРасчетов,
| НезачтенныеАвансыПредварительная.Предоплата КАК Предоплата,
| НезачтенныеАвансыПредварительная.ПредоплатаРегл КАК ПредоплатаРегл
|ИЗ
| НезачтенныеАвансыПредварительная КАК НезачтенныеАвансыПредварительная
|ГДЕ
| ТИПЗНАЧЕНИЯ(НезачтенныеАвансыПредварительная.РасчетныйДокумент) = ТИП(Документ.ВзаимозачетЗадолженности)
| И НезачтенныеАвансыПредварительная.РасчетныйДокумент.ВидОперации = ЗНАЧЕНИЕ(Перечисление.ВидыОперацийВзаимозачетаЗадолженности.ОтражениеОплатыЧерезКомиссионера)
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ЗачетыАвансов.РасчетныйДокумент,
| ЗачетыАвансов.РасчетныйДокумент.Номер,
| ЗачетыАвансов.РасчетныйДокумент.Дата,
| ЗачетыАвансов.ОбъектРасчетов,
| -ЗачетыАвансов.СуммаОборот,
| -ЗачетыАвансов.СуммаРеглОборот
|ИЗ
| РегистрНакопления.ЗачетыАвансовСчетамиФактурами.Обороты(
| ,
| ,
| ,
| Договор = &Договор
| И Контрагент = &Контрагент
| И РасчетныйДокумент В
| (ВЫБРАТЬ
| втАвансыПолученныеПоСчетамФактурамНаОтгрузку.РасчетныйДокумент КАК РасчетныйДокумент
| ИЗ
| втАвансыПолученныеПоСчетамФактурамНаОтгрузку КАК втАвансыПолученныеПоСчетамФактурамНаОтгрузку)) КАК ЗачетыАвансов
|;
|
|
|ВЫБРАТЬ
| СчетФактураВыданныйИсправление.Ссылка КАК СчетФактура
|ПОМЕСТИТЬ втДокументыЦепочкиИсправлений
|ИЗ
| Документ.СчетФактураВыданный КАК СчетФактураВыданныйИсправление
|ГДЕ
| СчетФактураВыданныйИсправление.Ссылка В (&ИсправляемыйСчетФактура)
| И СчетФактураВыданныйИсправление.Проведен
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| СчетФактураВыданный.Ссылка
|ИЗ
| Документ.СчетФактураВыданный КАК СчетФактураВыданный
|ГДЕ
| СчетФактураВыданный.Ссылка В (&Ссылка)
| И СчетФактураВыданный.Исправление
| И СчетФактураВыданный.Проведен
|;
|
|
|ВЫБРАТЬ
| ВложенныйЗапрос.ОбъектРасчетов КАК ОбъектРасчетов,
| ВложенныйЗапрос.РасчетныйДокумент КАК РасчетныйДокумент,
| СУММА(ВложенныйЗапрос.Сумма) КАК Сумма,
| Сумма(ВложенныйЗапрос.СуммаРегл) КАК СуммаРегл
|ПОМЕСТИТЬ втТаблицаЗачтенныхАвансов
|ИЗ
|(ВЫБРАТЬ
| ЗачетыАвансовСчетамиФактурамиОбороты.ОбъектРасчетов КАК ОбъектРасчетов,
| ЗачетыАвансовСчетамиФактурамиОбороты.РасчетныйДокумент КАК РасчетныйДокумент,
| ЗачетыАвансовСчетамиФактурамиОбороты.СуммаОборот КАК Сумма,
| ЗачетыАвансовСчетамиФактурамиОбороты.СуммаРеглОборот КАК СуммаРегл
|ИЗ
| РегистрНакопления.ЗачетыАвансовСчетамиФактурами.Обороты(
| ,
| ,
| ,
| Договор = &Договор
| И Контрагент = &Контрагент
| И РасчетныйДокумент В
| (ВЫБРАТЬ РАЗЛИЧНЫЕ
| НезачтенныеАвансы.РасчетныйДокумент КАК РасчетныйДокумент
| ИЗ
| НезачтенныеАвансы КАК НезачтенныеАвансы)) КАК ЗачетыАвансовСчетамиФактурамиОбороты
|ГДЕ
| ЗачетыАвансовСчетамиФактурамиОбороты.СуммаОборот > 0
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ЗачетыАвансовСчетамиФактурамиОбороты.ОбъектРасчетов КАК ОбъектРасчетов,
| ЗачетыАвансовСчетамиФактурамиОбороты.РасчетныйДокумент КАК РасчетныйДокумент,
| -ЗачетыАвансовСчетамиФактурамиОбороты.Сумма КАК Сумма,
| -ЗачетыАвансовСчетамиФактурамиОбороты.СуммаРегл КАК СуммаРегл
|ИЗ
| РегистрНакопления.ЗачетыАвансовСчетамиФактурами КАК ЗачетыАвансовСчетамиФактурамиОбороты
|ГДЕ
| ЗачетыАвансовСчетамиФактурамиОбороты.Активность
| И ЗачетыАвансовСчетамиФактурамиОбороты.Регистратор В
| (ВЫБРАТЬ РАЗЛИЧНЫЕ
| втДокументыЦепочкиИсправлений.СчетФактура КАК СчетФактура
| ИЗ
| втДокументыЦепочкиИсправлений КАК втДокументыЦепочкиИсправлений)
| И ЗачетыАвансовСчетамиФактурамиОбороты.РасчетныйДокумент В
| (ВЫБРАТЬ РАЗЛИЧНЫЕ
| НезачтенныеАвансы.РасчетныйДокумент КАК РасчетныйДокумент
| ИЗ
| НезачтенныеАвансы КАК НезачтенныеАвансы)
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ПлатежныеДокументы.ОбъектРасчетов,
| ПлатежныеДокументы.РасчетныйДокумент,
| ПлатежныеДокументы.Сумма,
| ПлатежныеДокументы.СуммаРегл
|ИЗ
| Документ.СчетФактураВыданный.ПлатежноРасчетныеДокументы КАК ПлатежныеДокументы
|ГДЕ
| ПлатежныеДокументы.Ссылка = &Ссылка
| И (НЕ ПлатежныеДокументы.Ссылка.Проведен
| ИЛИ ПлатежныеДокументы.Ссылка.Исправление)) КАК ВложенныйЗапрос
|
|СГРУППИРОВАТЬ ПО
| ВложенныйЗапрос.ОбъектРасчетов,
| ВложенныйЗапрос.РасчетныйДокумент
|;
|
|
|ВЫБРАТЬ
| ЗачетыАвансов.РасчетныйДокумент КАК ДокументОплаты,
| ДанныеПервичныхДокументов.Номер КАК НомерПлатежноРасчетногоДокумента,
| ДанныеПервичныхДокументов.Дата КАК ДатаПлатежноРасчетногоДокумента,
| ЗачетыАвансов.ОбъектРасчетов КАК ОбъектРасчетов,
| &Контрагент КАК Контрагент,
| &Договор КАК Договор,
| ЗачетыАвансов.Сумма КАК СуммаЗачтено,
| ЗачетыАвансов.СуммаРегл КАК СуммаЗачтеноРегл
|ПОМЕСТИТЬ АвансыЗачтено
|ИЗ
| втТаблицаЗачтенныхАвансов КАК ЗачетыАвансов
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ДанныеПервичныхДокументов КАК ДанныеПервичныхДокументов
| ПО (ДанныеПервичныхДокументов.Организация = &Организация)
| И ЗачетыАвансов.РасчетныйДокумент = ДанныеПервичныхДокументов.Документ
|;
|
|
|ВЫБРАТЬ
| ДоступныеАвансы.РасчетныйДокумент КАК ДокументОплаты,
| ДоступныеАвансы.НомерПлатежноРасчетногоДокумента КАК НомерПлатежноРасчетногоДокумента,
| ДоступныеАвансы.ДатаПлатежноРасчетногоДокумента КАК ДатаПлатежноРасчетногоДокумента,
| ДоступныеАвансы.ОбъектРасчетов КАК ОбъектРасчетов,
| ЕСТЬNULL(РеестрДокументов.Валюта, ЕСТЬNULL(СпрОбъектРасчетов.Валюта, ЗНАЧЕНИЕ(Справочник.Валюты.ПустаяСсылка))) КАК Валюта,
| ЕСТЬNULL(РеестрДокументов.Сумма, ЕСТЬNULL(СпрОбъектРасчетов.Сумма, 0)) КАК СуммаДокумента,
| СУММА(ДоступныеАвансы.Предоплата) КАК ДоступноКЗачету,
| СУММА(ДоступныеАвансы.ПредоплатаРегл) КАК ДоступноКЗачетуРегл
|ИЗ
| (ВЫБРАТЬ
| НезачтенныеАвансы.РасчетныйДокумент КАК РасчетныйДокумент,
| НезачтенныеАвансы.НомерПлатежноРасчетногоДокумента КАК НомерПлатежноРасчетногоДокумента,
| НезачтенныеАвансы.ДатаПлатежноРасчетногоДокумента КАК ДатаПлатежноРасчетногоДокумента,
| НезачтенныеАвансы.ОбъектРасчетов КАК ОбъектРасчетов,
| НезачтенныеАвансы.Предоплата КАК Предоплата,
| НезачтенныеАвансы.ПредоплатаРегл КАК ПредоплатаРегл
| ИЗ
| НезачтенныеАвансы КАК НезачтенныеАвансы
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| АвансыЗачтено.ДокументОплаты,
| АвансыЗачтено.НомерПлатежноРасчетногоДокумента,
| АвансыЗачтено.ДатаПлатежноРасчетногоДокумента,
| АвансыЗачтено.ОбъектРасчетов,
| -АвансыЗачтено.СуммаЗачтено,
| -АвансыЗачтено.СуммаЗачтеноРегл
| ИЗ
| АвансыЗачтено КАК АвансыЗачтено
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ НезачтенныеАвансы КАК НезачтенныеАвансы
| ПО АвансыЗачтено.ДокументОплаты = НезачтенныеАвансы.РасчетныйДокумент
| И АвансыЗачтено.ОбъектРасчетов = НезачтенныеАвансы.ОбъектРасчетов) КАК ДоступныеАвансы
|
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ОбъектыРасчетов КАК СпрОбъектРасчетов
| ПО ДоступныеАвансы.ОбъектРасчетов = СпрОбъектРасчетов.Ссылка
|
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РеестрДокументов КАК РеестрДокументов
| ПО ДоступныеАвансы.РасчетныйДокумент = РеестрДокументов.Ссылка
|
|СГРУППИРОВАТЬ ПО
| ДоступныеАвансы.РасчетныйДокумент,
| ДоступныеАвансы.НомерПлатежноРасчетногоДокумента,
| ДоступныеАвансы.ДатаПлатежноРасчетногоДокумента,
| ДоступныеАвансы.ОбъектРасчетов,
| ЕСТЬNULL(РеестрДокументов.Валюта, ЕСТЬNULL(СпрОбъектРасчетов.Валюта, ЗНАЧЕНИЕ(Справочник.Валюты.ПустаяСсылка))),
| ЕСТЬNULL(РеестрДокументов.Сумма, ЕСТЬNULL(СпрОбъектРасчетов.Сумма, 0))
|
|ИМЕЮЩИЕ
| СУММА(ДоступныеАвансы.Предоплата) > 0";
УстановитьПривилегированныйРежим(Истина);
Результат = Запрос.ВыполнитьПакет();
УстановитьПривилегированныйРежим(Ложь);
КоличествоЗапросов = Результат.ВГраница();
ВыборкаДоступныеАвансы = Результат[КоличествоЗапросов].Выбрать();
Пока ВыборкаДоступныеАвансы.Следующий() Цикл
НоваяСтрока = Авансы.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, ВыборкаДоступныеАвансы);
КонецЦикла;
Для Каждого СтрокаЗачтено Из ПлатежноРасчетныеДокументы Цикл
НоваяСтрока = Зачтено.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаЗачтено);
НоваяСтрока.ДокументОплаты = СтрокаЗачтено.РасчетныйДокумент;
НоваяСтрока.СуммаЗачтено = СтрокаЗачтено.Сумма;
НоваяСтрока.СуммаЗачтеноРегл = СтрокаЗачтено.СуммаРегл;
КонецЦикла;
РассчитатьСуммуЗачета();
КонецПроцедуры
&НаСервере
Процедура ИнициализироватьЗапрос(Запрос)
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.УстановитьПараметр("Организация", Организация);
Запрос.УстановитьПараметр("Контрагент", Контрагент);
Запрос.УстановитьПараметр("Договор", Договор);
Запрос.УстановитьПараметр("Валюта", ВалютаВзаиморасчетов);
Запрос.УстановитьПараметр("Ссылка", СчетФактура);
ПараметрыСчетаФактуры = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(СчетФактура, "Исправление, Корректировочный, СчетФактураОснование, ДокументОснование, Дата");
ПараметрыСчетаФактуры.Вставить("Период", ПараметрыСчетаФактуры.Дата);
ПараметрыСчетаФактуры.Удалить("Дата");
Запрос.УстановитьПараметр("ДатаОтгрузки", Новый Граница(Документы.СчетФактураВыданный.ОпределитьДатуОтгрузки(ПараметрыСчетаФактуры), ВидГраницы.Включая));
Запрос.УстановитьПараметр("СчетФактураОснование", СчетФактураОснование);
Запрос.УстановитьПараметр("Исправление", Исправление);
Запрос.УстановитьПараметр("НомерИсправления", НомерИсправления);
УстановитьПараметрЗапросаИсправляемыйСчетФактура(Запрос);
Запрос.Текст = "ВЫБРАТЬ
| АналитикаПоПартнерам.КлючАналитики КАК КлючАналитики,
| АналитикаПоПартнерам.Партнер КАК Партнер,
| АналитикаПоПартнерам.Организация КАК Организация,
| АналитикаПоПартнерам.Контрагент КАК Контрагент,
| АналитикаПоПартнерам.Договор КАК Договор
|ПОМЕСТИТЬ ВтАналитикаУчетаПоПартнерам
|ИЗ
| РегистрСведений.АналитикаУчетаПоПартнерам КАК АналитикаПоПартнерам
|ГДЕ
| АналитикаПоПартнерам.Организация В(&Организация)
| И АналитикаПоПартнерам.Договор В(&Договор)
| И АналитикаПоПартнерам.Контрагент В(&Контрагент)
|
|ИНДЕКСИРОВАТЬ ПО
| КлючАналитики";
Запрос.Выполнить();
КонецПроцедуры
&НаСервере
Процедура УправлениеЭлементамиФормы()
Элементы.АвансыДоступноКЗачетуРегл.Видимость = ВалютаВзаиморасчетов <> ВалютаРегламентированногоУчета;
Элементы.ЗачтеноСуммаЗачтеноРегл.Видимость = ВалютаВзаиморасчетов <> ВалютаРегламентированногоУчета;
Элементы.СуммаРучногоВосстановленияАванса.Доступность = Исправление Или СуммаВзаиморасчетов < 0;
Элементы.АвансыДоступноКЗачету.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Доступно (%1)'"),
Строка(ВалютаВзаиморасчетов));
Элементы.ЗачтеноСуммаЗачтено.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Зачтено (%1)'"),
Строка(ВалютаВзаиморасчетов));
КонецПроцедуры
&НаСервере
Процедура РассчитатьСуммуЗачета()
СуммаЗачета = Зачтено.Итог("СуммаЗачтено");
Если СуммаЗачета < СуммаВзаиморасчетов Тогда
Недостает = СуммаВзаиморасчетов - СуммаЗачета;
Превышение = 0;
ИначеЕсли СуммаЗачета > 0 Тогда
Недостает = 0;
Превышение = СуммаЗачета - СуммаВзаиморасчетов;
Иначе
Недостает = 0;
Превышение = 0;
КонецЕсли;
СуммаКОплате = ?(СуммаВзаиморасчетов < 0, 0, СуммаВзаиморасчетов);
ОбновитьИнформационнуюНадписьИтогов();
КонецПроцедуры
&НаКлиенте
Процедура ВыполнитьЗачетОплат()
ЕстьОшибки = Ложь;
ОчиститьСообщения();
ЗаполнитьПлатежноРасчетныеДокументы(ЕстьОшибки);
Если Не ЕстьОшибки Тогда
Модифицированность = Ложь;
ПринудительноЗакрытьФорму = Истина;
Закрыть(ПоместитьПлатежноРасчетныеДокументыВХранилище());
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьПлатежноРасчетныеДокументы(ЕстьОшибки)
ПроверитьЗаполнениеТабличнойЧасти(ЕстьОшибки);
Если Не ЕстьОшибки Тогда
ПлатежноРасчетныеДокументы.Очистить();
Для Каждого СтрокаЗачета Из Зачтено Цикл
НоваяСтрока = ПлатежноРасчетныеДокументы.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаЗачета, "НомерПлатежноРасчетногоДокумента, ДатаПлатежноРасчетногоДокумента, ОбъектРасчетов");
НоваяСтрока.РасчетныйДокумент = СтрокаЗачета.ДокументОплаты;
НоваяСтрока.Сумма = СтрокаЗачета.СуммаЗачтено;
НоваяСтрока.СуммаРегл = СтрокаЗачета.СуммаЗачтеноРегл;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПроверитьЗаполнениеТабличнойЧасти(Отказ)
Для ТекИндекс = 0 По Зачтено.Количество()-1 Цикл
Если ПустаяСтрока(Зачтено[ТекИндекс].НомерПлатежноРасчетногоДокумента) Тогда
ТекстОшибки = НСтр("ru='Не заполнен номер документа в строке %НомерСтроки%'");
ТекстОшибки = СтрЗаменить(ТекстОшибки,"%НомерСтроки%",ТекИндекс+1);
ОбщегоНазначения.СообщитьПользователю(
ТекстОшибки,
,
ОбщегоНазначенияКлиентСервер.ПутьКТабличнойЧасти("Зачтено", ТекИндекс+1, "НомерПлатежноРасчетногоДокумента"),
,
Отказ);
КонецЕсли;
Если Зачтено[ТекИндекс].ДатаПлатежноРасчетногоДокумента = Дата('00010101') Тогда
ТекстОшибки = НСтр("ru='Не заполнена дата документа в строке %НомерСтроки%'");
ТекстОшибки = СтрЗаменить( ТекстОшибки,"%НомерСтроки%",ТекИндекс+1);
ОбщегоНазначения.СообщитьПользователю(
ТекстОшибки ,
,
ОбщегоНазначенияКлиентСервер.ПутьКТабличнойЧасти("Зачтено", ТекИндекс+1, "ДатаПлатежноРасчетногоДокумента"),
,
Отказ);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
&НаСервере
Функция ПоместитьПлатежноРасчетныеДокументыВХранилище()
СтруктураВозврата = Новый Структура;
СтруктураВозврата.Вставить("ПлатежноРасчетныеДокументы", ПоместитьВоВременноеХранилище(ПлатежноРасчетныеДокументы.Выгрузить()));
СтруктураВозврата.Вставить("СуммаРучногоВосстановленияАванса", СуммаРучногоВосстановленияАванса);
Возврат СтруктураВозврата;
КонецФункции
&НаСервере
Процедура ОбновитьИнформационнуюНадписьИтогов()
МассивСтрок = Новый Массив;
МассивСтрок.Добавить(НСтр("ru = '<span style=""color: %1; font: %2"">Сумма к оплате %3.</span>'"));
МассивСтрок.Добавить(НСтр("ru = '<span style=""color: %1; font: %2"">Зачтено на сумму %4.</span>'"));
ШаблонИнформационнойНадписи = СтрСоединить(МассивСтрок, " ");
ИнформационнаяНадпись = СтроковыеФункции.ФорматированнаяСтрока(
ШаблонИнформационнойНадписи,
Метаданные.ЭлементыСтиля.ГиперссылкаЦвет.Имя,
Метаданные.ЭлементыСтиля.ЖирныйШрифт.Имя,
ФормированиеПечатныхФорм.ФорматСумм(СуммаКОплате, ВалютаВзаиморасчетов, "0,00"),
ФормированиеПечатныхФорм.ФорматСумм(СуммаЗачета, ВалютаВзаиморасчетов, "0,00"));
Если Недостает > 0 Тогда
ШаблонСтрокиПревышение = НСтр("ru = '<span style=""color: %1; font: %2"">Недостает %3.</span>'");
ИнформационнаяНадписьПревышение = СтроковыеФункции.ФорматированнаяСтрока(
ШаблонСтрокиПревышение,
Метаданные.ЭлементыСтиля.ПросроченныеДанныеЦвет.Имя,
Метаданные.ЭлементыСтиля.ЖирныйШрифт.Имя,
ФормированиеПечатныхФорм.ФорматСумм(Недостает, ВалютаВзаиморасчетов, "0,00"));
ИначеЕсли Превышение > 0 Тогда
ШаблонСтрокиПревышение = НСтр("ru = '<span style=""color: %1; font: %2"">Превышение на %3.</span>'");
ИнформационнаяНадписьПревышение = СтроковыеФункции.ФорматированнаяСтрока(
ШаблонСтрокиПревышение,
Метаданные.ЭлементыСтиля.ПросроченныеДанныеЦвет.Имя,
Метаданные.ЭлементыСтиля.ЖирныйШрифт.Имя,
ФормированиеПечатныхФорм.ФорматСумм(Превышение, ВалютаВзаиморасчетов, "0,00"));
Иначе
ИнформационнаяНадписьПревышение = "";
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПередЗакрытиемВопросЗавершение(ОтветНаВопрос, ДополнительныеПараметры) Экспорт
Если ОтветНаВопрос = КодВозвратаДиалога.Да Тогда
ВыполнитьЗачетОплат();
ИначеЕсли ОтветНаВопрос = КодВозвратаДиалога.Нет Тогда
ПринудительноЗакрытьФорму = Истина;
Закрыть();
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция СчетФактураПредыдущееИсправление(СчетФактураОснование, НомерИсправления)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СчетФактура.Ссылка КАК ИсправленныйСчетФактура,
| СчетФактура.НомерИсправления КАК НомерИсправления
|ИЗ
| Документ.СчетФактураВыданный КАК СчетФактура
|ГДЕ
| СчетФактура.СчетФактураОснование = &СчетФактураОснование
| И СчетФактура.Проведен
| И СчетФактура.Исправление
| И СчетФактура.НомерИсправления <> &НомерИсправления
|";
Запрос.УстановитьПараметр("СчетФактураОснование", СчетФактураОснование);
Запрос.УстановитьПараметр("НомерИсправления", НомерИсправления);
ПредыдущийНомер = 0;
ИсправленныйСчетФактура = Неопределено;
НомерИсправленияЧислом = ?(ЗначениеЗаполнено(НомерИсправления),Число(НомерИсправления),1);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
НомерИзВыборки = Число(Выборка.НомерИсправления);
Если НомерИзВыборки < НомерИсправленияЧислом
И НомерИзВыборки > ПредыдущийНомер Тогда
ПредыдущийНомер = НомерИзВыборки;
ИсправленныйСчетФактура = Выборка.ИсправленныйСчетФактура;
КонецЕсли;
КонецЦикла;
Возврат ИсправленныйСчетФактура;
КонецФункции
&НаСервере
Процедура УстановитьПараметрЗапросаСчетФактураПредыдущееИсправление(Запрос)
Если Запрос.Параметры.Свойство("СчетФактураПредыдущееИсправление") Тогда
Возврат;
КонецЕсли;
Запрос.УстановитьПараметр("СчетФактураПредыдущееИсправление", ?(Запрос.Параметры.Исправление,
СчетФактураПредыдущееИсправление(Запрос.Параметры.СчетФактураОснование, Запрос.Параметры.НомерИсправления),
Неопределено));
КонецПроцедуры
&НаСервере
Процедура УстановитьПараметрЗапросаИсправляемыйСчетФактура(Запрос)
Если Запрос.Параметры.Свойство("ИсправляемыйСчетФактура") Тогда
Возврат;
КонецЕсли;
УстановитьПараметрЗапросаСчетФактураПредыдущееИсправление(Запрос);
Запрос.УстановитьПараметр("ИсправляемыйСчетФактура", ?(
Не Запрос.Параметры.Свойство("СчетФактураПредыдущееИсправление") Или Запрос.Параметры.СчетФактураПредыдущееИсправление = Неопределено,
Запрос.Параметры.СчетФактураОснование,
Запрос.Параметры.СчетФактураПредыдущееИсправление));
КонецПроцедуры
#КонецОбласти