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