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