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