В практике бухгалтера и программиста 1С часто возникает задача очистки или свертки остатков по специфическим счетам. Одним из таких является счет 19.07 «Налог на добавленную стоимость по товарам, реализованным по ставке 0% (экспорт)». В связи с изменениями в законодательстве (ФЗ №150), накопление НДС на этом счете для многих видов товаров стало необязательным, и старые «зависшие» остатки требуют корректировки.
В данной статье мы разберем, как правильно реализовать программную свертку остатков, какие объекты использовать и как избежать типичных ошибок, когда проводки вроде бы есть, а сальдо в оборотно-сальдовой ведомости (ОСВ) не закрывается.
Разберем типичную ошибку начинающих разработчиков: попытку добавить новые записи в существующие наборы движений документов прошлых периодов. Как справедливо отмечено в обсуждении, это «убийство для учета». Любое последующее перепроведение документа полностью затрет ваши ручные или программные правки.
Правильный подход — создание нового документа ОперацияБух (в конфигурациях на обычных формах, таких как УПП или КА 1.1) или Операция (бухгалтерский и налоговый учет). Это обеспечит сохранность данных и наглядность корректировок для аудита.
Прежде всего, нам необходимо получить данные, которые мы будем сворачивать. Важным нюансом здесь является использование объекта Граница. Если использовать просто КонецДня(Дата), в выборку могут не попасть движения, сделанные в ту же самую секунду, или возникнет путаница с последовательностью. Рассмотрим правильный способ получения остатков по счету 19.07.
// Подготовка параметров запроса
СписокСчетовБУ = Новый СписокЗначений;
СписокСчетовБУ.Добавить(ПланыСчетов.Хозрасчетный.НДС_Экспорт); // 19.07
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ХозрасчетныйОстатки.Организация КАК Организация,
| ХозрасчетныйОстатки.Счет КАК Счет,
| ХозрасчетныйОстатки.Субконто1 КАК Контрагент,
| ХозрасчетныйОстатки.Субконто2 КАК Поступление,
| ХозрасчетныйОстатки.Субконто3 КАК Реализация,
| ХозрасчетныйОстатки.СуммаОстатокДт КАК Сумма
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.Остатки(&Период, Счет В ИЕРАРХИИ (&СписокСчетовБУ), , ) КАК ХозрасчетныйОстатки
|ГДЕ
| ХозрасчетныйОстатки.СуммаОстатокДт <> 0";
// Используем Границу для точности получения остатков
ПараметрПериод = Новый Граница(КонецДня(ДатаКон), ВидГраницы.Включая);
Запрос.УстановитьПараметр("Период", ПараметрПериод);
Запрос.УстановитьПараметр("СписокСчетовБУ", СписокСчетовБУ);
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
Сообщить("Остатков для свертки не обнаружено.");
Возврат;
КонецЕсли;
Обратите внимание на использование В ИЕРАРХИИ. Это хорошая практика на случай, если пользователи добавили свои субсчета к счету 19.07. Проверка результата методом Пустой() позволяет избежать лишних действий и ошибок в коде.
Теперь рассмотрим процесс создания документа и циклического заполнения его проводок. Главная задача здесь — перенести дебетовый остаток на кредит этого же счета или списать его на затраты (например, счет 91.02), соблюдая всю аналитику.
Важный момент: если вы просто укажете СчетКт = СчетДт и перенесете те же субконто, сумма в ОСВ закроется только в том случае, если все измерения (Организация, Подразделение и т.д.) совпадут до копейки.
Выборка = РезультатЗапроса.Выбрать();
ДокументОбъект = Документы.ОперацияБух.СоздатьДокумент();
ДокументОбъект.Дата = ДатаКон;
ДокументОбъект.Организация = ВыбраннаяОрганизация;
ДокументОбъект.Ответственный = глТекущийПользователь;
ДокументОбъект.Содержание = "Свертка остатков по счету 19.07 (программно)";
// Запись документа для получения ссылки, если это необходимо
ДокументОбъект.Записать();
Пока Выборка.Следующий() Цикл
Движение = ДокументОбъект.Движения.Хозрасчетный.Добавить();
Движение.Период = ДокументОбъект.Дата;
Движение.Организация = Выборка.Организация;
// Списываем с дебета 19.07 на кредит другого счета (например, 91.02)
// Либо делаем корректировку внутри счета 19.07
Движение.СчетДт = ПланыСчетов.Хозрасчетный.ПрочиеРасходы;
Движение.СчетКт = Выборка.Счет;
// Заполнение субконто кредита (то, что закрываем)
Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Контрагенты] = Выборка.Контрагент;
Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.СФПолученные] = Выборка.Поступление;
Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.ДокументыРеализации] = Выборка.Реализация;
// Заполнение субконто дебета (куда списываем)
Движение.СубконтоДт.ПрочиеДоходыИРасходы = Справочники.ПрочиеДоходыИРасходы.НайтиПоНаименованию("Списание НДС");
Движение.Сумма = Выборка.Сумма;
КонецЦикла;
ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);
Часто программисты сталкиваются с ситуацией: в регистре бухгалтерии записи появились, дебет и кредит по сумме равны, но в отчете ОСВ всё равно висит сальдо. Проанализируем основные причины этого явления:
ДокументСсылка.ПоступлениеТоваровУслуг, а вы в проводку записали Неопределено или ссылку на другой тип документа — 1С не «схлопнет» эти суммы.Организация. Если при программном создании проводки вы забыли заполнить Движение.Организация, сумма «упадет» на пустую организацию, и остаток по основной организации останется нетронутым.Проанализируем ситуацию в сложных конфигурациях (УПП, Комплексная 1.1). Счета 19-й группы тесно связаны с регистрами накопления НДС (например, «НДС предъявленный»). Если вы сделаете только бухгалтерскую проводку через «Операцию», вы уберете цифры из ОСВ, но при попытке сформировать Книгу покупок или Книгу продаж система выдаст ошибки, так как регистры НДС останутся незакрытыми.
В таких случаях рекомендуется:
НДС Предъявленный, используя ДокументОбъект.Движения.НДСПредъявленный.Разбор данной темы показывает, что программная свертка — это не просто перекладывание сумм из одной колонки в другую. Рассмотрим основные правила успеха:
Граница в запросах по остаткам.ОперацияБух).Организация.Использование предложенного подхода позволит вам быстро и корректно привести учет в соответствие с актуальными требованиями, избежав рутинного ручного ввода сотен операций.