#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
#Область ОбработчикиСобытий
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Автор = Пользователи.ТекущийПользователь();
ТипДанныхЗаполнения = ТипЗнч(ДанныеЗаполнения);
Если ТипДанныхЗаполнения = Тип("Структура")
И ДанныеЗаполнения.Свойство("ДанныеОперации") Тогда
ЗаполнитьПоДаннымЯндексКассы(ДанныеЗаполнения);
ИначеЕсли ТипДанныхЗаполнения = Тип("ДокументСсылка.ОперацияПоЯндексКассе") Тогда
ЗаполнитьПоОперацииПоЯндексКассе(ДанныеЗаполнения, ДанныеЗаполнения);
ИначеЕсли ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка." + Метаданные().Имя) Тогда
ИсправлениеДокументов.ЗаполнитьИсправление(ЭтотОбъект, ДанныеЗаполнения);
КонецЕсли;
ЗаполнениеОбъектовПоСтатистике.ЗаполнитьРеквизитыОбъекта(ЭтотОбъект, ДанныеЗаполнения);
ИнициализироватьДокумент(ДанныеЗаполнения);
Если Не ЗначениеЗаполнено(Ответственный) Тогда
Ответственный = Пользователи.ТекущийПользователь();
КонецЕсли;
ПараметрыВыбораСтатейИАналитик = Документы.ОперацияПоЯндексКассе.ПараметрыВыбораСтатейИАналитик();
ДоходыИРасходыСервер.ОбработкаЗаполнения(ЭтотОбъект, ПараметрыВыбораСтатейИАналитик);
ВзаиморасчетыСервер.ОбработкаЗаполнения(ЭтотОбъект, ДанныеЗаполнения);
КонецПроцедуры
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Если ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
ОбновлениеИнформационнойБазы.ПроверитьОбъектОбработан(ЭтотОбъект);
ИсправлениеДокументов.ПередЗаписью(ЭтотОбъект, Отказ, РежимЗаписи, РежимПроведения);
ПроведениеДокументов.ПередЗаписьюДокумента(ЭтотОбъект, РежимЗаписи, РежимПроведения);
Если Не ЗначениеЗаполнено(Номер) Тогда
УстановитьНовыйНомер();
КонецЕсли;
ДополненныеПараметры = ВзаиморасчетыСервер.ДополненныеПараметрыМеханизма(ЭтотОбъект);
Если ЭтотОбъект.ЭтоНовый() Тогда
СсылкаНового = ЭтотОбъект.ПолучитьСсылкуНового();
Если Не ЗначениеЗаполнено(СсылкаНового) Тогда
СсылкаНового = ОбщегоНазначения.МенеджерОбъектаПоСсылке(Ссылка).ПолучитьСсылку();
ЭтотОбъект.УстановитьСсылкуНового(СсылкаНового);
КонецЕсли;
КонецЕсли;
Если ЗначениеЗаполнено(ОбъектРасчетов) Тогда
ОбъектРасчетовПлатеж = ОбъектыРасчетовСервер.ПолучитьОбъектРасчетовПоСсылке(Ссылка);
Если ЗначениеЗаполнено(ОбъектРасчетовПлатеж) И ОбъектРасчетов <> ОбъектРасчетовПлатеж Тогда
ОбъектыРасчетовСервер.ПроверитьУдалитьОбъектРасчетов(ОбъектРасчетовПлатеж, Отказ, Истина);
КонецЕсли;
Иначе
ПараметрыМеханизма = ДополненныеПараметры.МассивПараметров[0];
Если ЭтотОбъект.ЭтоНовый() Тогда
ПараметрыМеханизма.Вставить("СсылкаНового", СсылкаНового);
КонецЕсли;
Если РежимЗаписи = РежимЗаписиДокумента.Проведение
ИЛИ (РежимЗаписи = РежимЗаписиДокумента.Запись
И ОбщегоНазначенияУТКлиентСервер.ДанныеПоПути(ЭтотОбъект, "Объект.Проведен")) Тогда
ОбъектРасчетовПлатеж = ОбъектыРасчетовСервер.ПроверитьЗаполнитьОбъектРасчетовПоСтруктуре(ЭтотОбъект, ПараметрыМеханизма,,РежимЗаписи);
ОбъектРасчетов = ОбъектРасчетовПлатеж;
КонецЕсли;
КонецЕсли;
Если ВестиУчетКомиссииВоВзаиморасчетах Тогда
Подразделение = Справочники.СтруктураПредприятия.ПустаяСсылка();
СтатьяРасходов = ПланыВидовХарактеристик.СтатьиРасходов.ПустаяСсылка();
АналитикаРасходов = Неопределено;
Иначе
ОбъектРасчетовКомиссии = Справочники.ОбъектыРасчетов.ПустаяСсылка();
КонецЕсли;
ОбщегоНазначенияУТ.ЗаполнитьИдентификаторыДокумента(ЭтотОбъект);
Если Не ПроведениеДокументов.СвойстваДокумента(ЭтотОбъект).ЭтоНовый Тогда
Документы.ОперацияПоЯндексКассе.ПровестиДиагностикуПередЗаписью(ЭтотОбъект, Ссылка);
КонецЕсли;
ПараметрыВыбораСтатейИАналитик = Документы.ОперацияПоЯндексКассе.ПараметрыВыбораСтатейИАналитик();
ДоходыИРасходыСервер.ПередЗаписью(ЭтотОбъект, ПараметрыВыбораСтатейИАналитик);
Если Не ЗначениеЗаполнено(Автор) И ЭтоНовый() Тогда
Автор = Пользователи.ТекущийПользователь();
КонецЕсли;
КонецПроцедуры
Процедура ПриЗаписи(Отказ)
Если ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
ПроведениеДокументов.ПриЗаписиДокумента(ЭтотОбъект, Отказ);
КонецПроцедуры
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
МассивНепроверяемыхРеквизитов = Новый Массив;
Если СуммаКомиссии = 0 Тогда
МассивНепроверяемыхРеквизитов.Добавить("СтатьяРасходов");
МассивНепроверяемыхРеквизитов.Добавить("ОбъектРасчетовКомиссии");
ИначеЕсли ВестиУчетКомиссииВоВзаиморасчетах Тогда
МассивНепроверяемыхРеквизитов.Добавить("СтатьяРасходов");
Иначе
МассивНепроверяемыхРеквизитов.Добавить("ОбъектРасчетовКомиссии");
КонецЕсли;
Если ДополнительныеСвойства.Свойство("ИсключитьПроверкуЗаполненияОбъектРасчетовКомиссии")
И ДополнительныеСвойства.ИсключитьПроверкуЗаполненияОбъектРасчетовКомиссии Тогда
МассивНепроверяемыхРеквизитов.Добавить("ОбъектРасчетовКомиссии");
КонецЕсли;
Если ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ПоступлениеОплатыОтКлиента Тогда
МассивНепроверяемыхРеквизитов.Добавить("ТипОперацииВозврата");
ИначеЕсли ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ВозвратОплатыКлиенту Тогда
МассивНепроверяемыхРеквизитов.Добавить("СпособОплаты");
КонецЕсли;
ИсправлениеДокументов.ОбработкаПроверкиЗаполнения(ЭтотОбъект, Отказ, ПроверяемыеРеквизиты);
ОбщегоНазначения.УдалитьНепроверяемыеРеквизитыИзМассива(
ПроверяемыеРеквизиты,
МассивНепроверяемыхРеквизитов);
ПараметрыВыбораСтатейИАналитик = Документы.ОперацияПоЯндексКассе.ПараметрыВыбораСтатейИАналитик();
ДоходыИРасходыСервер.ОбработкаПроверкиЗаполнения(ЭтотОбъект, Отказ, ПроверяемыеРеквизиты, ПараметрыВыбораСтатейИАналитик);
КонецПроцедуры
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
ВыполнитьКонтрольЗаполненияПередПроведением(Отказ);
ПроведениеДокументов.ОбработкаПроведенияДокумента(ЭтотОбъект, Отказ);
КонецПроцедуры
Процедура ОбработкаУдаленияПроведения(Отказ)
ПроведениеДокументов.ОбработкаУдаленияПроведенияДокумента(ЭтотОбъект, Отказ);
КонецПроцедуры
Процедура ПриКопировании(ОбъектКопирования)
ИсправлениеДокументов.ПриКопировании(ЭтотОбъект, ОбъектКопирования);
ВзаиморасчетыСервер.ПриКопировании(ЭтотОбъект);
ОбщегоНазначенияУТ.ОчиститьИдентификаторыДокумента(ЭтотОбъект);
Автор = Пользователи.ТекущийПользователь();
Ответственный = Пользователи.ТекущийПользователь();
Если Не ЗначениеЗаполнено(ОбъектРасчетов) Тогда
ОснованиеПлатежа = Неопределено;
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
#Область Проверки
Процедура ВыполнитьКонтрольЗаполненияПередПроведением(Отказ)
Если ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ВозвратОплатыКлиенту Тогда
СуммаОплачено = ОплаченоПоОбъектуРасчета();
Если СуммаОплачено < СуммаДокумента Тогда
ТекстСообщения = НСтр("ru = 'Сумма возврата не должна превышать сумму поступившей оплаты'");
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения, ЭтотОбъект, ,, Отказ);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область ИнициализацияИЗаполнение
Процедура ИнициализироватьДокумент(ДанныеЗаполнения = Неопределено)
Если ТипЗнч(ДанныеЗаполнения) = Тип("Структура") Тогда
ЗаполнитьЗначенияСвойств(ЭтотОбъект, ДанныеЗаполнения);
КонецЕсли;
Если ТипЗнч(ДанныеЗаполнения) <> Тип("Структура") Или НЕ ДанныеЗаполнения.Свойство("Организация") Тогда
Организация = ЗначениеНастроекПовтИсп.ПолучитьОрганизациюПоУмолчанию(Организация);
КонецЕсли;
Если ТипЗнч(ДанныеЗаполнения) <> Тип("Структура") Или НЕ ДанныеЗаполнения.Свойство("Валюта") Тогда
ВалютаРубль = Справочники.Валюты.НайтиПоКоду("643");
Если ЗначениеЗаполнено(ВалютаРубль) Тогда
Валюта = ВалютаРубль;
Иначе
Валюта = ЗначениеНастроекПовтИсп.ВалютаРегламентированногоУчетаОрганизации(Организация);
КонецЕсли;
Если ЗначениеЗаполнено(ВалютаРубль) Тогда
ВалютаКомиссии = ВалютаРубль;
Иначе
ВалютаКомиссии = ЗначениеНастроекПовтИсп.ВалютаРегламентированногоУчетаОрганизации(Организация);
КонецЕсли;
КонецЕсли;
Если ТипЗнч(ДанныеЗаполнения) = Тип("Структура") И ДанныеЗаполнения.Свойство("ДанныеОперации") Тогда
Если ДанныеЗаполнения.ДанныеОперации.Свойство("БанковскийСчет") Тогда
БанковскийСчет = ДанныеЗаполнения.ДанныеОперации.БанковскийСчет;
КонецЕсли;
КонецЕсли;
Если ЗначениеЗаполнено(Организация) Тогда
ПараметрыОтбора = Справочники.ДоговорыЭквайринга.ПараметрыОтбораДоговораЭквайринга();
ПараметрыОтбора.Организация = Организация;
ПараметрыОтбора.СпособПроведенияПлатежа = Перечисления.СпособыПроведенияПлатежей.ИнтернетЭквайринг;
ПараметрыОтбора.БанковскийСчет = ?(ЗначениеЗаполнено(БанковскийСчет), БанковскийСчет, ПараметрыОтбора.БанковскийСчет);
ПараметрыОтбора.Валюта = ?(ЗначениеЗаполнено(Валюта), Валюта, ПараметрыОтбора.Валюта);
ДоговорЭквайринга = Справочники.ДоговорыЭквайринга.ДоговорЭквайрингаПоУмолчанию(ПараметрыОтбора);
КонецЕсли;
Если ЗначениеЗаполнено(ДоговорЭквайринга) Тогда
ПараметрыДоговора = Справочники.ДоговорыЭквайринга.РеквизитыДоговора(ДоговорЭквайринга);
Если ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ПоступлениеОплатыОтКлиента Тогда
ОтражатьКомиссию = ПараметрыДоговора.СпособОтраженияКомиссии = Перечисления.СпособыОтраженияЭквайринговойКомиссии.ВоВремяТранзакции;
Иначе
ОтражатьКомиссию = ПараметрыДоговора.СпособОтраженияКомиссии = Перечисления.СпособыОтраженияЭквайринговойКомиссии.ВоВремяТранзакции
И ПараметрыДоговора.ВзимаетсяКомиссияПриВозврате;
КонецЕсли;
Если ОтражатьКомиссию
Или СуммаКомиссии <> 0 Тогда
СтатьяРасходов = ПараметрыДоговора.СтатьяРасходов;
АналитикаРасходов = ПараметрыДоговора.АналитикаРасходов;
Подразделение = ПараметрыДоговора.ПодразделениеРасходов;
ВестиУчетКомиссииВоВзаиморасчетах = ПараметрыДоговора.ВестиУчетКомиссииВоВзаиморасчетах;
ОбъектРасчетовКомиссии = ПараметрыДоговора.ОбъектРасчетовКомиссии;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура ЗаполнитьПоДаннымЯндексКассы(ДанныеЗаполнения)
ДанныеОперации = ДанныеЗаполнения.ДанныеОперации;
ХозяйственнаяОперация = ДанныеЗаполнения.ХозяйственнаяОперация;
СтатьяДвиженияДенежныхСредств = ДанныеЗаполнения.СтатьяДвиженияДенежныхСредств;
Если ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ПоступлениеОплатыОтКлиента Тогда
ДанныеПоУИП = Документы.ОперацияПоЯндексКассе.ОснованиеПлатежаПоУИП(ДанныеЗаполнения.Организация,
ДанныеОперации.ИдентификаторПлатежа);
Дата = ДанныеОперации.ДатаОплаты;
Если ДанныеПоУИП = Неопределено Тогда
ЕстьПроблемы = Истина;
ИнформацияОПроблеме = СтрШаблон(
НСтр("ru = 'Не найден документ основание по идентификатору платежа: %1.
|Для устранения этой проблемы следует указать документ основание платежа вручную.'"),
ДанныеОперации.ИдентификаторПлатежа);
КодПроблемы = 5;
Иначе
ЗаполнитьЗначенияСвойств(ЭтотОбъект, ДанныеПоУИП, "ОснованиеПлатежа, Контрагент, Партнер, ОбъектРасчетов");
КонецЕсли;
ЗаполнитьЗначенияСвойств(ЭтотОбъект, ДанныеОперации);
СуммаКомиссии = СуммаДокумента - ДанныеОперации.СуммаКЗачислениюНаСчетОрганизации;
Документы.ОперацияПоЯндексКассе.ПересчитатьНДС(ЭтотОбъект);
ВалютаКомиссии = Валюта;
ИначеЕсли ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ВозвратОплатыКлиенту Тогда
ОплатыПоУИП = Документы.ОперацияПоЯндексКассе.ОплатыПоУИП(ДанныеОперации.ИдентификаторПлатежа);
Дата = ДанныеОперации.ДатаИсполненияЗапросаНаВозврат;
ЗаполнитьЗначенияСвойств(ЭтотОбъект, ДанныеОперации);
Если ОплатыПоУИП = Неопределено Тогда
ЕстьПроблемы = Истина;
ИнформацияОПроблеме = СтрШаблон(
НСтр("ru = 'Не найден документ оплаты через Яндекс.Кассу по идентификатору платежа: %1.
|Для устранения этой проблемы следует указать документ основание платежа вручную.'"),
ДанныеОперации.ИдентификаторПлатежа);
КодПроблемы = 6;
Иначе
ЗаполнитьЗначенияСвойств(ЭтотОбъект, ОплатыПоУИП, "ОснованиеПлатежа, Контрагент, Партнер, ОбъектРасчетов, ВалютаКомиссии");
Если КонецДня(ОплатыПоУИП.Дата) = КонецДня(Дата) Тогда
ТипОперацииВозврата = Перечисления.ТипыОперацийВозвратаЧерезЯндексКассу.Отмена;
Документы.ОперацияПоЯндексКассе.ВычислитьСуммуКомиссииПоСуммеВозврата(ЭтотОбъект, ОплатыПоУИП);
Иначе
ТипОперацииВозврата = Перечисления.ТипыОперацийВозвратаЧерезЯндексКассу.Возврат;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура ЗаполнитьПоОперацииПоЯндексКассе(Знач ДокументОснование, ДанныеЗаполнения)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| &ТекущаяДата КАК Дата,
| ДанныеДокумента.Организация КАК Организация,
| ДанныеДокумента.Партнер КАК Партнер,
| ДанныеДокумента.Эквайер КАК Эквайер,
| ДанныеДокумента.ДоговорЭквайринга КАК ДоговорЭквайринга,
| ДанныеДокумента.Валюта КАК ВалютаВзаиморасчетов,
| ДанныеДокумента.БанковскийСчет КАК БанковскийСчет,
| ДанныеДокумента.БанковскийСчет.ВалютаДенежныхСредств КАК Валюта,
| ДанныеДокумента.СуммаДокумента КАК СуммаДокумента,
| ЗНАЧЕНИЕ(Перечисление.ХозяйственныеОперации.ВозвратОплатыКлиенту) КАК ХозяйственнаяОперация,
| &Ссылка КАК ОснованиеПлатежа,
| ДанныеДокумента.СтатьяДвиженияДенежныхСредств КАК СтатьяДвиженияДенежныхСредств,
| ДанныеДокумента.СтатьяРасходов КАК СтатьяРасходов,
| ДанныеДокумента.АналитикаРасходов КАК АналитикаРасходов,
| ДанныеДокумента.Подразделение КАК Подразделение,
| ДанныеДокумента.Контрагент КАК Контрагент,
| ДанныеДокумента.ОбъектРасчетов КАК ОбъектРасчетов,
| ВЫБОР
| КОГДА КОНЕЦПЕРИОДА(&ТекущаяДата, ДЕНЬ) = КОНЕЦПЕРИОДА(ДанныеДокумента.Дата, ДЕНЬ)
| ТОГДА ЗНАЧЕНИЕ(Перечисление.ТипыОперацийВозвратаЧерезЯндексКассу.Отмена)
| ИНАЧЕ ЗНАЧЕНИЕ(Перечисление.ТипыОперацийВозвратаЧерезЯндексКассу.Возврат)
| КОНЕЦ КАК ТипОперацииВозврата,
| ДанныеДокумента.НастройкаЯндексКассы КАК НастройкаЯндексКассы,
| ДанныеДокумента.ВалютаКомиссии КАК ВалютаКомиссии,
| ДанныеДокумента.СуммаКомиссии КАК СуммаКомиссии,
| ДанныеДокумента.СуммаНДСОбщаяСтавка КАК СуммаНДСОбщаяСтавка,
| ДанныеДокумента.СуммаНДС10 КАК СуммаНДС10,
| ДанныеДокумента.СуммаНДС7 КАК СуммаНДС7,
| ДанныеДокумента.СуммаНДС5 КАК СуммаНДС5
|ИЗ
| Документ.ОперацияПоЯндексКассе КАК ДанныеДокумента
|ГДЕ
| ДанныеДокумента.Ссылка = &Ссылка
| И ДанныеДокумента.ХозяйственнаяОперация = ЗНАЧЕНИЕ(Перечисление.ХозяйственныеОперации.ПоступлениеОплатыОтКлиента)";
Запрос.УстановитьПараметр("Ссылка", ДокументОснование);
Запрос.УстановитьПараметр("ТекущаяДата", ТекущаяДатаСеанса());
РезультатЗапроса = Запрос.Выполнить();
ДанныеЗаполнения = Новый Структура;
Для Каждого Колонка Из РезультатЗапроса.Колонки Цикл
ДанныеЗаполнения.Вставить(Колонка.Имя);
КонецЦикла;
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
ЗаполнитьЗначенияСвойств(ДанныеЗаполнения, Выборка,,"СуммаКомиссии");
Если ДанныеЗаполнения.ОснованиеПлатежа = Неопределено Тогда
Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Не требуется вводить Операцию по Яндекс.Кассе: Возврат оплаты клиенту на основании документа %1, поскольку ввод доступен только на основании операций Поступления оплаты от клиента'"),
ДокументОснование);
ВызватьИсключение Текст;
КонецЕсли;
Если ДанныеЗаполнения.ТипОперацииВозврата = Перечисления.ТипыОперацийВозвратаЧерезЯндексКассу.Отмена Тогда
Документы.ОперацияПоЯндексКассе.ВычислитьСуммуКомиссииПоСуммеВозврата(ДанныеЗаполнения, Выборка);
КонецЕсли;
КонецПроцедуры
#КонецОбласти
Функция ОплаченоПоОбъектуРасчета()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РасчетыСКлиентамиОбороты.СуммаРасход КАК СуммаРасход
|ИЗ
| РегистрНакопления.РасчетыСКлиентами.Обороты(, &НаДату, , ОбъектРасчетов = &ОбъектРасчета) КАК РасчетыСКлиентамиОбороты";
Запрос.УстановитьПараметр("НаДату", Дата);
Запрос.УстановитьПараметр("ОбъектРасчета", ОбъектРасчетов);
УстановитьПривилегированныйРежим(Истина);
РезультатЗапроса = Запрос.Выполнить().Выбрать();
УстановитьПривилегированныйРежим(Ложь);
Если РезультатЗапроса.Следующий() Тогда
Возврат РезультатЗапроса.СуммаРасход;
КонецЕсли;
Возврат 0;
КонецФункции
#КонецОбласти
#КонецЕсли