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