1. Сцена первая "Условия и факторы возникновения проблемы".
Крупная организация, приобретающая большое количество основных средств (допустим, это автотранспорт) в лизинг и имеющая некоторое количество удалённых филиалов (обособленных подразделений) иногда приходит к такому организационному решению: Из числа своих хозяйствующих субъектов выделяет (или создаёт) одного, имеющего функционал приобретения основных средств в лизинг. Затем, эти приобретённые объекты лизинга сдаются уже для непосредственной эксплуатации в прочие филиалы и подразделения уже на правах субаренды.
Такая модель управления упрощает процессы первоначального приобретения, контроля за лизинговыми платежами и прочие управленческие удобства. С учетом того, что такой хозяйствующий субъект, занимающийся только приобретением и последующим владением основных средств, сам их не эксплуатирует и напрашивается соответствующее отражение этих объектов в бухгалтерском учёте как "Доходные вложения в материальные ценности" на счете "03.01". Ничего особо уникального в таком учётном действе нет, более того, масса организаций, имеющих своим основным видом деятельности именно сдачу в аренду своего имущества, как раз на этом счете и должна учитывать то самое имущество. И если бы бухгалтера, имеющие привычку любое ОС сваливать на привычный счет учета "01", слегка разнообразили свои учетные традиции, то гораздо чаще упирались бы в интересный казус, до сих пор "живущий" в типовой конфигурации БП (думаю, что в остальных конфигурациях - тоже).
Мне повезло. Моя подведомственная организация приобрела в лизинг и учла приобретение на счете "03.01". И я познакомился с "казусом".
2. Сцена вторая "Место возникновения первой проблемы".
В общем модуле "Учёт ОС" есть экспортная функция
Функция ПодготовитьТаблицуАрендныхПлатежей(ТаблицаОС, Реквизиты, Отказ)
Эта функция вызывается как при проведении некоторых документов по учету ОС и лизинговых операций с ними, так и при закрытии периода в регламентной операции. Задача функции следующая - рассчитать значения сумм начисленных арендных платежей по показателям бухгалтерского и налогового учёта для каждого арендованного ОС. И вот что отсутствует в этой функции.
СчетаУчетаСобственныхОС = Новый Массив;
СчетаУчетаСобственныхОС.Добавить(ПланыСчетов.Хозрасчетный.ОСвОрганизации); // 01.01
СчетаУчетаСобственныхОС.Добавить(ПланыСчетов.Хозрасчетный.ОСБезГосРегистрации); // 01.08
// +++ Климушкин Д.Ю. 31.07.2024
// Добавлю счет 03.01 в массив счетов учета собственных ОС организации
СчетаУчетаСобственныхОС.Добавить(ПланыСчетов.Хозрасчетный.МЦвОрганизации); // 03.01
// --- Климушкин Д.Ю. 31.07.2024
При формировании массива счетов учета ОС, понимаемых, как "счета учета собственных ОС", счет "03.01" не подразумевается. Да, в этом счете нет прямого отсыла именно к основным средствам, но это не означает какого-то запрета или невозможности учета ОС именно по этому счету. У меня нет другого объяснения, почему этот счет как-то позабыли включить в массив и по этой причине ОС, числящиеся на счете "03.01" вообще не участвовали в расчетах при закрытии периода или проведении документов. Сами понимаете, бухгалтеров это не радовало. Это я исправил сразу.
3. Сцена третья "Замена одной проблемы на несколько других".
Радость была недолгой. Участие в ОС, числящихся на счёте "03.01" в расчетах дало удивительные результаты. Дело в том, что в практике делового оборота моей организации вполне часто применяется досрочный выкуп предмета лизинга. Сама эта процедура штатными возможностями программы выполнялась и вопросов не вызывала. Но затем при закрытии периода бухгалтеры начинали видеть совершенно непонятные цифры арендных платежей по оставшимся в лизинге ОС. Причём, сначала начислялась сумма "краснотой", которая следующей проводкой приводилась в некую "норму" уже проводкой с положительной суммой. При этом ни сумма "красным", ни последующая корректирующая суммы никак не коррелировались с размерами фактических арендных начислений и отличались даже не на проценты, а в разы.
Эту причину я разбирал чуть дольше. Нашёл её вот здесь.
"... ВЫБРАТЬ
| ПервоначальныеСведенияОС.ОсновноеСредство КАК ОсновноеСредство,
| ПервоначальныеСведенияОС.Контрагент КАК Контрагент,
| ПервоначальныеСведенияОС.ДоговорКонтрагента КАК ДоговорКонтрагента,
| ПервоначальныеСведенияОС.ИнвентарныйНомер КАК ИнвентарныйНомер,
| ПервоначальныеСведенияОС.ПервоначальнаяСтоимость КАК ПервоначальнаяСтоимость
|ПОМЕСТИТЬ АрендованныеОС
|ИЗ
| РегистрСведений.ПервоначальныеСведенияОСБухгалтерскийУчет.СрезПоследних(
| &КонецПериодаГраница,
| Организация = &Организация
// Вот здесь формируется описываемая проблема
| И СпособПоступления В (ЗНАЧЕНИЕ(Перечисление.СпособыПоступленияАктивов.ПоДоговоруЛизинга), ЗНАЧЕНИЕ(Перечисление.СпособыПоступленияАктивов.ПоДоговоруАренды))) КАК ПервоначальныеСведенияОС
//////////////////////////////////
|
|ИНДЕКСИРОВАТЬ ПО
| Контрагент,
| ДоговорКонтрагента...."
Изначально таблица ОС понимаемых, как "Арендованные" исходит из способа приобретения.
Соответственно, несложное решение - раз приобрели по договору лизинга или аренды, стало быть - арендованное. В первом приближении - логично и для лабораторного эксперимента вполне работает. Но с учётом разнообразия управленческих зигзагов, не мешает проверять - а арендовано ли это ОС на текущий период? То, что когда-то это ОС приобрели в лизинг никак не мешает тому обстоятельству, что на третий месяц это ОС вполне оказывается в перечне собственных "выкупленных". Так и продолжают выкупленные ОС фигурировать в расчетах общих сумм. Кратко выглядит следующим образом. Имеется договор лизинга на 100 автомобилей сроком на 60 месяцев. Организация- лизингополучатель через два месяца начинает процедуры досрочного выкупа авто по 10 единиц в месяц. И пока весь договор лизинга не закроется расчет арендных платежей оставшихся в лизинге (аренде) ОС будет производиться с учетом всех объектов ОС, проходивших по этому договору. Отсюда удивительные цифры "красным" с последующей корректировкой "черным".
4. Финал "Решение проблемы".
Кардинально поменял текст запроса, формирующий данные для расчетной таблицы. Кратко можно так описать мой подход. Он, сугубо - бухгалтерский. Я предпочёл не ворошить "судьбы и истории" имеющихся в учёте ОС. По ФСБУ 25 есть внятная методика учета арендных платежей и арендных обязательств. Есть понятные (прежде всего - бухгалтеру) места формирования итогов, которые несложно контролируются и опрашиваются. Есть счет "01.К" и группа счетов под общим заголовком "76.07" По логике учета я не могу (не имею прав и возможностей!) начислять арендные платежи больше, чем осталось на счете "01.К" (показатель НУ, собственно только в этом показателе данный счет и учитывается) И уже не важна история приобретения - я изначально беру в расчет только те ОС, для которых вообще есть основания для начисления арендных платежей. И даже если по какому-то ОС не будет такого начисления , бухгалтеру сразу будет понятно - почему это не случилось и он просто посмотрит карточку счета "01.К", чтобы увидеть точку (момент) в котором исчезли основания для начисления арендных платежей. Он (бухгалтер) точно сможет обойтись в этом случае без программиста.
Резюме.
После внесения изменений огромная организация с лизингом в сотни единиц за месяц закрывает еже пятый период. ОС на счете "03.01" стало участвовать в расчетах. Цифры пришли в здравый размер и стали понятны, т.е без несуразных оборотов по обеим сторонам корреспонденции "красным и чёрным".
Вот код запроса, которым я заменил штатный текст. Счёл удобным вытащить его в отдельную функцию
// +++ Климушкин Д.Ю. 10.08.2024
// Текущий вариант запроса исходит из следующего алгоритма
// Обрабатывать в данной функции имеет смысл только те ОС
// у который есть дебетовый остаток счёта "01.К" по показателю НУ на конец периода
// Этот массив ОС и становится источником отбора для всех последующих запросов
Процедура ПодготовитьТаблицуАрендныхПлатежейТекстЗапроса(Запрос, ТаблицаОСНеЗаполнена)
ТекстЗапроса = "ВЫБРАТЬ
| ОстаткиРасходов.Субконто1 КАК ОсновноеСредство,
| ЕСТЬNULL(РасходыЗаПериод.СуммаНУКт, 0) - ЕСТЬNULL(РасходыПоДокументу.СуммаНУКт, 0) КАК ПризнаноРасходовСумма
|ПОМЕСТИТЬ РасходыЗаПериод
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.Остатки(&КонецПериода, Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.КорректировкаСтоимостиАрендованногоИмущества), &ВидСубконтоОС, Организация = &Организация) КАК ОстаткиРасходов
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто(
| ,
| ,
| Регистратор = &Регистратор
| И СчетКт = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.КорректировкаСтоимостиАрендованногоИмущества)
| И НЕ СчетДт В (&СчетаАрендныхОбязательств)
| И НЕ СчетДт В (&СчетаНДСПоАренднымОбязательствам)
| И НЕ СчетДт В (&СчетаУчетаСобственныхОС),
| ,
| ) КАК РасходыПоДокументу
| ПО (РасходыПоДокументу.СубконтоКт1 = ОстаткиРасходов.Субконто1)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто(
| &НачалоПериода,
| &КонецПериода,
| СчетКт = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.КорректировкаСтоимостиАрендованногоИмущества)
| И НЕ СчетДт В (&СчетаАрендныхОбязательств)
| И НЕ СчетДт В (&СчетаНДСПоАренднымОбязательствам)
| И НЕ СчетДт В (&СчетаУчетаСобственныхОС),
| ,
| ) КАК РасходыЗаПериод
| ПО (РасходыПоДокументу.СубконтоКт1 = РасходыЗаПериод.СубконтоКт1)
|ГДЕ
| ОстаткиРасходов.СуммаНУОстатокДт + ЕСТЬNULL(РасходыПоДокументу.СуммаНУКт, 0) > 0
|
|ИНДЕКСИРОВАТЬ ПО
| ОсновноеСредство
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| ПервоначальныеСведенияОС.Контрагент КАК Контрагент,
| ПервоначальныеСведенияОС.ДоговорКонтрагента КАК ДоговорКонтрагента
|ПОМЕСТИТЬ КонтрагентыДоговоры
|ИЗ
| РегистрСведений.ПервоначальныеСведенияОСБухгалтерскийУчет.СрезПоследних(
| &КонецПериодаГраница,
| Организация = &Организация
| И ОсновноеСредство В
| (ВЫБРАТЬ
| РасходыЗаПериод.ОсновноеСредство
| ИЗ
| РасходыЗаПериод)
| И СпособПоступления В (ЗНАЧЕНИЕ(Перечисление.СпособыПоступленияАктивов.ПоДоговоруЛизинга), ЗНАЧЕНИЕ(Перечисление.СпособыПоступленияАктивов.ПоДоговоруАренды))) КАК ПервоначальныеСведенияОС
|
|ОБЪЕДИНИТЬ
|
|ВЫБРАТЬ
| ДанныеПредметовАренды.Контрагент,
| ДанныеПредметовАренды.ДоговорКонтрагента
|ИЗ
| РегистрСведений.ДанныеПредметовАренды.СрезПоследних(
| &КонецПериодаГраница,
| Организация = &Организация
| И ПредметАренды В
| (ВЫБРАТЬ
| РасходыЗаПериод.ОсновноеСредство
| ИЗ
| РасходыЗаПериод)) КАК ДанныеПредметовАренды
|
|ИНДЕКСИРОВАТЬ ПО
| Контрагент,
| ДоговорКонтрагента
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ХозрасчетныйОстаткиИОбороты.Субконто1 КАК Контрагент,
| ХозрасчетныйОстаткиИОбороты.Субконто2 КАК ДоговорКонтрагента,
| ВЫБОР
| КОГДА ХозрасчетныйОстаткиИОбороты.Счет.Валютный
| ТОГДА ХозрасчетныйОстаткиИОбороты.ВалютнаяСуммаНачальныйОстатокКт
| ИНАЧЕ ХозрасчетныйОстаткиИОбороты.СуммаНачальныйОстатокКт
| КОНЕЦ КАК ВалютнаяСуммаНачальныйОстаток,
| ВЫБОР
| КОГДА ХозрасчетныйОстаткиИОбороты.Счет.Валютный
| ТОГДА ХозрасчетныйОстаткиИОбороты.ВалютнаяСуммаОборотДт
| ИНАЧЕ ХозрасчетныйОстаткиИОбороты.СуммаОборотДт
| КОНЕЦ КАК ВалютнаяСуммаОборотДт,
| ВЫБОР
| КОГДА ХозрасчетныйОстаткиИОбороты.Счет.Валютный
| ТОГДА ХозрасчетныйОстаткиИОбороты.ВалютнаяСуммаОборотКт
| ИНАЧЕ ХозрасчетныйОстаткиИОбороты.СуммаОборотКт
| КОНЕЦ КАК ВалютнаяСуммаОборотКт
|ПОМЕСТИТЬ ЗадолженностьПоАренде
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(
| &НачалоПериода,
| &КонецПериодаГраница,
| ,
| ,
| Счет В (&СчетаАрендныхОбязательств),
| &ВидыСубконтоКонтрагентыДоговоры,
| Организация = &Организация
| И (Субконто1, Субконто2) В
| (ВЫБРАТЬ
| КонтрагентыДоговоры.Контрагент,
| КонтрагентыДоговоры.ДоговорКонтрагента
| ИЗ
| КонтрагентыДоговоры)) КАК ХозрасчетныйОстаткиИОбороты
|
|ИНДЕКСИРОВАТЬ ПО
| Контрагент,
| ДоговорКонтрагента
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ХозрасчетныйОборотыДтКт.СубконтоДт1 КАК Контрагент,
| ХозрасчетныйОборотыДтКт.СубконтоДт2 КАК ДоговорКонтрагента,
| ХозрасчетныйОборотыДтКт.СуммаОборот КАК СуммаПлатежаБезНДС
|ПОМЕСТИТЬ АрендныеПлатежи
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.ОборотыДтКт(
| &НачалоПериода,
| &КонецПериодаГраница,
| ,
| СчетДт В (&СчетаАрендныхОбязательств),
| &ВидыСубконтоКонтрагентыДоговоры,
| СчетКт В (&СчетаАрендныхПлатежей),
| ,
| Организация = &Организация
| И (СубконтоКт1, СубконтоКт2) В
| (ВЫБРАТЬ
| КонтрагентыДоговоры.Контрагент,
| КонтрагентыДоговоры.ДоговорКонтрагента
| ИЗ
| КонтрагентыДоговоры)) КАК ХозрасчетныйОборотыДтКт
|ГДЕ
| ХозрасчетныйОборотыДтКт.СубконтоДт1 = ХозрасчетныйОборотыДтКт.СубконтоКт1
| И ХозрасчетныйОборотыДтКт.СубконтоДт2 = ХозрасчетныйОборотыДтКт.СубконтоКт2
|
|ИНДЕКСИРОВАТЬ ПО
| Контрагент,
| ДоговорКонтрагента
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ПервоначальныеСведенияОС.ОсновноеСредство КАК ОсновноеСредство,
| ПервоначальныеСведенияОС.Контрагент КАК Контрагент,
| ПервоначальныеСведенияОС.ДоговорКонтрагента КАК ДоговорКонтрагента,
| ПервоначальныеСведенияОС.ИнвентарныйНомер КАК ИнвентарныйНомер,
| ПервоначальныеСведенияОС.ПервоначальнаяСтоимость КАК ПервоначальнаяСтоимость
|ПОМЕСТИТЬ АрендованныеОС
|ИЗ
| РегистрСведений.ПервоначальныеСведенияОСБухгалтерскийУчет.СрезПоследних(
| &КонецПериодаГраница,
| Организация = &Организация
| И СпособПоступления В (ЗНАЧЕНИЕ(Перечисление.СпособыПоступленияАктивов.ПоДоговоруЛизинга), ЗНАЧЕНИЕ(Перечисление.СпособыПоступленияАктивов.ПоДоговоруАренды))) КАК ПервоначальныеСведенияОС
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РасходыЗаПериод КАК РасходыЗаПериод
| ПО ПервоначальныеСведенияОС.ОсновноеСредство = РасходыЗаПериод.ОсновноеСредство
|
|ИНДЕКСИРОВАТЬ ПО
| Контрагент,
| ДоговорКонтрагента
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ДанныеПредметовАренды.ПредметАренды КАК ОсновноеСредство,
| ДанныеПредметовАренды.Контрагент КАК Контрагент,
| ДанныеПредметовАренды.ДоговорКонтрагента КАК ДоговорКонтрагента,
| ДанныеПредметовАренды.СуммаВзаиморасчетов КАК СуммаВзаиморасчетов
|ПОМЕСТИТЬ ДанныеПредметовАренды
|ИЗ
| РегистрСведений.ДанныеПредметовАренды.СрезПоследних(&КонецПериодаГраница, Организация = &Организация) КАК ДанныеПредметовАренды
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РасходыЗаПериод КАК РасходыЗаПериод
| ПО ДанныеПредметовАренды.ПредметАренды = РасходыЗаПериод.ОсновноеСредство
|
|ИНДЕКСИРОВАТЬ ПО
| ОсновноеСредство,
| Контрагент,
| ДоговорКонтрагента
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| СпособыОтраженияРасходов.ОсновноеСредство КАК ОсновноеСредство,
| СпособыОтраженияРасходов.СпособОтраженияРасходовПоАренднымПлатежам КАК СпособОтраженияРасходов
|ПОМЕСТИТЬ СпособыОтраженияРасходов
|ИЗ
| РегистрСведений.СпособыОтраженияРасходовПоАренднымПлатежамОСНалоговыйУчет.СрезПоследних(&КонецПериодаГраница, Организация = &Организация) КАК СпособыОтраженияРасходов
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РасходыЗаПериод КАК РасходыЗаПериод
| ПО СпособыОтраженияРасходов.ОсновноеСредство = РасходыЗаПериод.ОсновноеСредство
|
|ИНДЕКСИРОВАТЬ ПО
| ОсновноеСредство
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| МестонахождениеОС.ОсновноеСредство КАК ОсновноеСредство,
| МестонахождениеОС.Местонахождение КАК Подразделение
|ПОМЕСТИТЬ МестонахождениеОС
|ИЗ
| РегистрСведений.МестонахождениеОСБухгалтерскийУчет.СрезПоследних(&КонецПериодаГраница, Организация = &Организация) КАК МестонахождениеОС
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РасходыЗаПериод КАК РасходыЗаПериод
| ПО МестонахождениеОС.ОсновноеСредство = РасходыЗаПериод.ОсновноеСредство
|
|ИНДЕКСИРОВАТЬ ПО
| ОсновноеСредство
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ЗадолженностьПоАренде.Контрагент КАК Контрагент,
| ЗадолженностьПоАренде.ДоговорКонтрагента КАК ДоговорКонтрагента,
| ЗадолженностьПоАренде.ВалютнаяСуммаНачальныйОстаток КАК ВалютнаяСуммаНачальныйОстаток,
| ЗадолженностьПоАренде.ВалютнаяСуммаОборотДт КАК ВалютнаяСуммаОборотДт,
| ЗадолженностьПоАренде.ВалютнаяСуммаОборотКт КАК ВалютнаяСуммаОборотКт,
| ЕСТЬNULL(АрендныеПлатежи.СуммаПлатежаБезНДС, 0) КАК СуммаПлатежаБезНДС,
| ЕСТЬNULL(АрендованныеОС.ОсновноеСредство, НЕОПРЕДЕЛЕНО) КАК ОсновноеСредство,
| ЕСТЬNULL(АрендованныеОС.ИнвентарныйНомер, """") КАК ИнвентарныйНомер,
| ВЫБОР
| КОГДА РасходыЗаПериод.ОсновноеСредство ЕСТЬ NULL
| ТОГДА 0
| ИНАЧЕ ЕСТЬNULL(ДанныеПредметовАренды.СуммаВзаиморасчетов, ЕСТЬNULL(АрендованныеОС.ПервоначальнаяСтоимость, 0))
| КОНЕЦ КАК ПервоначальнаяСтоимость,
| ЕСТЬNULL(СпособыОтраженияРасходов.СпособОтраженияРасходов, ЗНАЧЕНИЕ(Справочник.СпособыОтраженияРасходовПоАмортизации.ПустаяСсылка)) КАК СпособОтраженияРасходов,
| ЕСТЬNULL(МестонахождениеОС.Подразделение, ЗНАЧЕНИЕ(Справочник.ПодразделенияОрганизаций.ПустаяСсылка)) КАК Подразделение,
| ЕСТЬNULL(РасходыЗаПериод.ПризнаноРасходовСумма, 0) КАК ПризнаноРасходовСумма,
| ЕСТЬNULL(РасходыЗаПериод.ПризнаноРасходовСумма, 0) = 0
| И РасходыЗаПериод.ОсновноеСредство ЕСТЬ НЕ NULL КАК ОСДляОтраженияРасходов
|ИЗ
| ЗадолженностьПоАренде КАК ЗадолженностьПоАренде
| ЛЕВОЕ СОЕДИНЕНИЕ АрендныеПлатежи КАК АрендныеПлатежи
| ПО ЗадолженностьПоАренде.Контрагент = АрендныеПлатежи.Контрагент
| И ЗадолженностьПоАренде.ДоговорКонтрагента = АрендныеПлатежи.ДоговорКонтрагента
| ЛЕВОЕ СОЕДИНЕНИЕ АрендованныеОС КАК АрендованныеОС
| ЛЕВОЕ СОЕДИНЕНИЕ ДанныеПредметовАренды КАК ДанныеПредметовАренды
| ПО АрендованныеОС.ОсновноеСредство = ДанныеПредметовАренды.ОсновноеСредство
| И АрендованныеОС.Контрагент = ДанныеПредметовАренды.Контрагент
| И АрендованныеОС.ДоговорКонтрагента = ДанныеПредметовАренды.ДоговорКонтрагента
| ЛЕВОЕ СОЕДИНЕНИЕ СпособыОтраженияРасходов КАК СпособыОтраженияРасходов
| ПО АрендованныеОС.ОсновноеСредство = СпособыОтраженияРасходов.ОсновноеСредство
| ЛЕВОЕ СОЕДИНЕНИЕ МестонахождениеОС КАК МестонахождениеОС
| ПО АрендованныеОС.ОсновноеСредство = МестонахождениеОС.ОсновноеСредство
| ЛЕВОЕ СОЕДИНЕНИЕ РасходыЗаПериод КАК РасходыЗаПериод
| ПО АрендованныеОС.ОсновноеСредство = РасходыЗаПериод.ОсновноеСредство
| ПО ЗадолженностьПоАренде.Контрагент = АрендованныеОС.Контрагент
| И ЗадолженностьПоАренде.ДоговорКонтрагента = АрендованныеОС.ДоговорКонтрагента
|
|УПОРЯДОЧИТЬ ПО
| Контрагент,
| ДоговорКонтрагента,
| ОсновноеСредство
|ИТОГИ
| МАКСИМУМ(Контрагент),
| МАКСИМУМ(ВалютнаяСуммаНачальныйОстаток),
| МАКСИМУМ(ВалютнаяСуммаОборотДт),
| МАКСИМУМ(ВалютнаяСуммаОборотКт),
| МАКСИМУМ(СуммаПлатежаБезНДС),
| СУММА(ПризнаноРасходовСумма),
| МАКСИМУМ(ОСДляОтраженияРасходов)
|ПО
| ДоговорКонтрагента";
Если ТаблицаОСНеЗаполнена Тогда
Запрос.Текст = ТекстЗапроса;
Возврат;
КонецЕсли;
СхемаSQL = Новый СхемаЗапроса;
СхемаSQL.УстановитьТекстЗапроса(ТекстЗапроса);
КоллекцияПакетов = СхемаSQL.ПакетЗапросов;
ПакетСхемы = КоллекцияПакетов.Добавить(Тип("ЗапросВыбораСхемыЗапроса"));
ПакетСхемы.УстановитьТекстЗапроса("ВЫБРАТЬ
| ТаблицаОС.ОсновноеСредство КАК ОсновноеСредство
|ПОМЕСТИТЬ ВременнаяТаблицаОС
|ИЗ
| &ТаблицаОС КАК ТаблицаОС");
КоличествоПакетов = КоллекцияПакетов.Количество();
КоллекцияПакетов.Переместить(ПакетСхемы, 0);
ПакетСхемы = КоллекцияПакетов.Добавить(Тип("ЗапросВыбораСхемыЗапроса"));
ПакетСхемы.УстановитьТекстЗапроса("ВЫБРАТЬ
| ВременнаяТаблицаОС.ОсновноеСредство КАК ОсновноеСредство
|ПОМЕСТИТЬ ТаблицаОС
|ИЗ
| ВременнаяТаблицаОС КАК ВременнаяТаблицаОС
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ОсновныеСредства КАК ОсновныеСредстваСпр
| ПО ВременнаяТаблицаОС.ОсновноеСредство = ОсновныеСредстваСпр.Ссылка
| И ОсновныеСредстваСпр.ЕдиницаУчета <> ЗНАЧЕНИЕ(Перечисление.ЕдиницыУчетаОС.ГрупповойОбъект)
|
|ИНДЕКСИРОВАТЬ ПО
| ОсновноеСредство");
КоличествоПакетов = КоллекцияПакетов.Количество();
КоллекцияПакетов.Переместить(ПакетСхемы, 1);
ПакетСхемы = КоллекцияПакетов.Получить(2);
ОператорПакета = ПакетСхемы.Операторы.Получить(0);
ТекущийИсточник = ОператорПакета.Источники.НайтиПоПсевдониму("РасходыПоДокументу");
ПараметрыИсточника = ТекущийИсточник.Источник.Параметры;
ТекущийПараметр = ПараметрыИсточника.Получить(2);
СтрокаВыражения = "СчетКт = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.КорректировкаСтоимостиАрендованногоИмущества)
| И НЕ СчетДт В (&СчетаАрендныхОбязательств)
| И НЕ СчетДт В (&СчетаНДСПоАренднымОбязательствам)
| И НЕ СчетДт В (&СчетаУчетаСобственныхОС)
| И СубконтоКт1 В (ВЫБРАТЬ ТаблицаОС.ОсновноеСредство ИЗ ТаблицаОС)";
ТекущийПараметр.Выражение = Новый ВыражениеСхемыЗапроса("Регистратор = &Регистратор И " + СтрокаВыражения);
ТекущийИсточник = ОператорПакета.Источники.НайтиПоПсевдониму("РасходыЗаПериод");
ПараметрыИсточника = ТекущийИсточник.Источник.Параметры;
ТекущийПараметр = ПараметрыИсточника.Получить(2);
ТекущийПараметр.Выражение = Новый ВыражениеСхемыЗапроса("Организация = &Организация И " + СтрокаВыражения);
ТекущийИсточник = ОператорПакета.Источники.НайтиПоПсевдониму("ОстаткиРасходов");
ПараметрыИсточника = ТекущийИсточник.Источник.Параметры;
ТекущийПараметр = ПараметрыИсточника.Получить(3);
ТекущийПараметр.Выражение = Новый ВыражениеСхемыЗапроса("Организация = &Организация И Субконто1
|В (ВЫБРАТЬ ТаблицаОС.ОсновноеСредство ИЗ ТаблицаОС)");
Запрос.Текст = СхемаSQL.ПолучитьТекстЗапроса();
КонецПроцедуры
А штатная функция приобрела вот этот вид
Функция ПодготовитьТаблицуАрендныхПлатежей(ТаблицаОС, Реквизиты, Отказ)
ТаблицаАрендныхПлатежей = ПолучитьПустуюТаблицуАрендныхПлатежей();
МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос = Новый Запрос();
Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
Запрос.УстановитьПараметр("Организация", Реквизиты.Организация);
// +++ Климушкин Д.Ю. 10.08.2024
// Текст запроса формируется таким образом, чтобы запрос выполнялся один раз
ТаблицаОСНеЗаполнена = (ТаблицаОС.Количество() = 0);
ПодготовитьТаблицуАрендныхПлатежейТекстЗапроса(Запрос, ТаблицаОСНеЗаполнена);
// --- Климушкин Д.Ю. 10.08.2024
Если ТаблицаОСНеЗаполнена Тогда
Запрос.УстановитьПараметр("Период", КонецМесяца(Реквизиты.Период));
Запрос.УстановитьПараметр("КонецПериода", КонецМесяца(Реквизиты.Период));
Запрос.УстановитьПараметр("КонецПериодаГраница", Новый Граница(КонецМесяца(Реквизиты.Период), ВидГраницы.Включая));
Иначе
Запрос.УстановитьПараметр("Период", Реквизиты.Период);
Запрос.УстановитьПараметр("ТаблицаОС", ТаблицаОС);
Запрос.УстановитьПараметр("КонецПериода", Реквизиты.Период);
Запрос.УстановитьПараметр("КонецПериодаГраница", Новый Граница(Реквизиты.Регистратор.МоментВремени(), ВидГраницы.Исключая));
КонецЕсли;
Запрос.УстановитьПараметр("СчетаАрендныхОбязательств", ПланыСчетов.Хозрасчетный.СчетаАрендныхОбязательств());
Запрос.УстановитьПараметр("СчетаПроцентовПоАренде", ПланыСчетов.Хозрасчетный.СчетаПроцентовПоАренде());
Запрос.УстановитьПараметр("СчетаНДСПоАренднымОбязательствам", ПланыСчетов.Хозрасчетный.СчетаНДСПоАренднымОбязательствам());
Запрос.УстановитьПараметр("СчетаАрендныхПлатежей", ПланыСчетов.Хозрасчетный.СчетаАрендныхПлатежей());
Запрос.УстановитьПараметр("Счет01К", ПланыСчетов.Хозрасчетный.КорректировкаСтоимостиАрендованногоИмущества);
СчетаУчетаСобственныхОС = Новый Массив;
СчетаУчетаСобственныхОС.Добавить(ПланыСчетов.Хозрасчетный.ОСвОрганизации); // 01.01
СчетаУчетаСобственныхОС.Добавить(ПланыСчетов.Хозрасчетный.ОСБезГосРегистрации); // 01.08
// +++ Климушкин Д.Ю. 31.07.2024
// Добавлю счет 03.01 в массив счетов учета собственных ОС организации
СчетаУчетаСобственныхОС.Добавить(ПланыСчетов.Хозрасчетный.МЦвОрганизации); // 03.01
// --- Климушкин Д.Ю. 31.07.2024
Запрос.УстановитьПараметр("СчетаУчетаСобственныхОС", СчетаУчетаСобственныхОС);
Запрос.УстановитьПараметр("ВидСубконтоОС", ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.ОсновныеСредства);
Запрос.УстановитьПараметр("Регистратор", Реквизиты.Регистратор);
Запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца(Реквизиты.Период));
ВидыСубконтоКонтрагентыДоговоры = Новый Массив;
ВидыСубконтоКонтрагентыДоговоры.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Контрагенты);
ВидыСубконтоКонтрагентыДоговоры.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Договоры);
Запрос.УстановитьПараметр("ВидыСубконтоКонтрагентыДоговоры", ВидыСубконтоКонтрагентыДоговоры);
Запрос.УстановитьПараметр("ВалютаРегламентированногоУчета", ОбщегоНазначенияБПВызовСервераПовтИсп.ПолучитьВалютуРегламентированногоУчета());
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
Возврат ТаблицаАрендныхПлатежей;
КонецЕсли;
ВыборкаДоговоры = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "ДоговорКонтрагента");
Пока ВыборкаДоговоры.Следующий() Цикл
Если (ВыборкаДоговоры.ВалютнаяСуммаНачальныйОстаток + ВыборкаДоговоры.ВалютнаяСуммаОборотКт = 0)
И ВыборкаДоговоры.СуммаПлатежаБезНДС <> 0 Тогда
ШаблонСообщения = НСтр("ru = 'По договору ""%1"" c контрагентом ""%2"" отражено начисление"
+ " арендного платежа в сумме %3 руб., но кредиторской задолженности по договору нет."
+ " Расходы не будут отражены в налоговом учете.'");
ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщения,
ВыборкаДоговоры.ДоговорКонтрагента,
ВыборкаДоговоры.Контрагент,
ВыборкаДоговоры.СуммаПлатежаБезНДС);
// Выводим сообщение, но не прерываем выполнение всей процедуры.
БухгалтерскийУчетПереопределяемый.СообщитьОбОшибкеРегОперацииСНавигацией(ТекстСообщения,
ВыборкаДоговоры.ДоговорКонтрагента, , Неопределено);
Продолжить;
КонецЕсли;
НераспределеннаяСумма = ВыборкаДоговоры.СуммаПлатежаБезНДС - ВыборкаДоговоры.ПризнаноРасходовСумма;
//+++ Климушкин 05.08.2024
// Если нераспределенная сумма затрат меньше нуля, то нет смысла ее отражать красным,
// чтобы потом корректировать "черным"
Если НераспределеннаяСумма < 0 Тогда
Продолжить;
КонецЕсли;
// --- Климушкин 05.08.2024
Если Не ВыборкаДоговоры.ОСДляОтраженияРасходов
И НераспределеннаяСумма > 0 Тогда
ШаблонСообщения = НСтр("ru = 'По договору ""%1"" c контрагентом ""%2"" не определены предметы аренды "
+ "для отражения расходов по арендным платежам. "
+ "Расходы не будут отражены в налоговом учете.'");
ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщения,
ВыборкаДоговоры.ДоговорКонтрагента,
ВыборкаДоговоры.Контрагент);
// Выводим сообщение, но не прерываем выполнение всей процедуры.
БухгалтерскийУчетПереопределяемый.СообщитьОбОшибкеРегОперацииСНавигацией(ТекстСообщения,
ВыборкаДоговоры.ДоговорКонтрагента, , Неопределено);
Продолжить;
КонецЕсли;
ОСДляРасходов = Новый Массив;
СтоимостьОС = Новый Массив;
СпособыОтраженияРасходов = Новый Массив;
ПодразделенияОС = Новый Массив;
ВыборкаОС = ВыборкаДоговоры.Выбрать();
Пока ВыборкаОС.Следующий() Цикл
Если Не ВыборкаОС.ОСДляОтраженияРасходов Тогда
Продолжить;
КонецЕсли;
Если НЕ ЗначениеЗаполнено(ВыборкаОС.СпособОтраженияРасходов)
И НераспределеннаяСумма > 0 Тогда
ШаблонСообщения = НСтр("ru = 'Не определен способ отражения расходов "
+ " по арендным платежам в налоговом учете по договору ""%1"" с контрагентом ""%2"", "
+ " предмет аренды ""%3"" (инвентарный номер ""%4""). "
+ "Расходы не будут отражены в налоговом учете.'");
ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщения,
ВыборкаДоговоры.ДоговорКонтрагента,
ВыборкаДоговоры.Контрагент,
ВыборкаОС.ОсновноеСредство,
ВыборкаОС.ИнвентарныйНомер);
// Выводим сообщение, но не прерываем выполнение всей процедуры.
БухгалтерскийУчетПереопределяемый.СообщитьОбОшибкеРегОперацииСНавигацией(ТекстСообщения,
ВыборкаОС.ОсновноеСредство, , Неопределено);
Продолжить;
КонецЕсли;
ОСДляРасходов.Добавить(ВыборкаОС.ОсновноеСредство);
СтоимостьОС.Добавить(ВыборкаОС.ПервоначальнаяСтоимость);
СпособыОтраженияРасходов.Добавить(ВыборкаОС.СпособОтраженияРасходов);
ПодразделенияОС.Добавить(ВыборкаОС.Подразделение);
КонецЦикла;
СуммыРасходов = ОбщегоНазначения.РаспределитьСуммуПропорциональноКоэффициентам(
НераспределеннаяСумма, СтоимостьОС);
ВалютныеОстатки = ОбщегоНазначения.РаспределитьСуммуПропорциональноКоэффициентам(
ВыборкаДоговоры.ВалютнаяСуммаНачальныйОстаток, СтоимостьОС);
ВалютныеОбороты = ОбщегоНазначения.РаспределитьСуммуПропорциональноКоэффициентам(
ВыборкаДоговоры.ВалютнаяСуммаОборотКт, СтоимостьОС);
Для Индекс = 0 По СтоимостьОС.ВГраница() Цикл
НоваяСтрока = ТаблицаАрендныхПлатежей.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, ВыборкаДоговоры);
НоваяСтрока.ОсновноеСредство = ОСДляРасходов[Индекс];
НоваяСтрока.СпособОтраженияРасходовПоАренднымПлатежам = СпособыОтраженияРасходов[Индекс];
НоваяСтрока.Подразделение = ПодразделенияОС[Индекс];
НоваяСтрока.СуммаПлатежаБезНДС = ?(ЗначениеЗаполнено(СуммыРасходов), СуммыРасходов[Индекс], 0);
НоваяСтрока.ВалютнаяСуммаНачальныйОстаток = ?(ЗначениеЗаполнено(ВалютныеОстатки), ВалютныеОстатки[Индекс], 0);
НоваяСтрока.ВалютнаяСуммаОборотКт = ?(ЗначениеЗаполнено(ВалютныеОбороты), ВалютныеОбороты[Индекс], 0);
КонецЦикла;
КонецЦикла;
Возврат ТаблицаАрендныхПлатежей;
КонецФункции