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