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