Как заполнить КУДиР предпринимателя в 1С:УПП и определить партии товаров при РАУЗ?

Программист 1С v8.3 (Обычные формы) Налоговый учет IT и автоматизация бизнеса
← На главную

При переносе механизмов налогового учета индивидуального предпринимателя (на ОСНО) из конфигурации «Бухгалтерия предприятия» в «Управление производственным предприятием» (УПП) или «Комплексную автоматизацию 1.1» (КА) разработчики сталкиваются с серьезной проблемой. Для заполнения Книги учета доходов и расходов (КУДиР) предпринимателя требуются сведения о конкретных документах оприходования, стоимости приобретения и суммах входящего НДС. Однако в УПП при включенном режиме расширенной аналитики учета затрат (РАУЗ) традиционный партионный учет отключен, а регистр ПартииТоваровНаСкладах пуст.

Разберем по шагам, как решить эту задачу, как восстановить партии товаров виртуальным методом ФИФО по количественным регистрам и какие сопутствующие настройки необходимы для формирования отчета.

Принцип виртуального восстановления партий при РАУЗ

Поскольку РАУЗ агрегирует себестоимость на конец месяца и не привязывает расходные накладные к конкретным партиям оприходования в момент проведения, информацию о партиях приходится рассчитывать «на лету» по методу ФИФО. Для этого анализируются движения регистров ТоварыОрганизаций или ТоварыНаСкладах.

Рассмотрим алгоритм определения партии:

  1. Получаем количественный остаток номенклатуры на момент проведения документа реализации (исключая сам документ отгрузки).
  2. Выбираем все предшествующие документы поступления в обратном хронологическом порядке (с сортировкой по убыванию даты).
  3. Сопоставляем остаток товара с количествами в приходных документах, восстанавливая цепочку списания партий.
  4. Считываем из найденных документов поступления цены и суммы входящего НДС пропорционально списанному количеству.

Программная реализация подбора партий

Разберем пример функций на встроенном языке 1С, которые позволяют определить документ поступления и рассчитать долю входящей стоимости и НДС для документа реализации.

Первая функция определяет остаток конкретной номенклатуры на момент документа продажи:


// Возвращает остаток товара на момент продажи
// для КУДиР предпринимателя
Функция ОстатокТовараНаМоментРеализации(ДокументПродажи, Номенклатура, Характеристика = Неопределено) Экспорт
    
    Запрос = Новый Запрос;
    
    Запрос.УстановитьПараметр("Дата",            Новый Граница(ДокументПродажи.МоментВремени(), ВидГраницы.Исключая)); 
    Запрос.УстановитьПараметр("Организация",    ДокументПродажи.Организация); 
    Запрос.УстановитьПараметр("Номенклатура",    Номенклатура); 
    Запрос.УстановитьПараметр("Характеристика", ?(Характеристика = Неопределено, Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка(), Характеристика)); 
    КоличествоОстаток = 0;
    
    Запрос.Текст = "
    |ВЫБРАТЬ
    |    ТоварыОрганизацийОстатки.КоличествоОстаток
    |ИЗ
    |    РегистрНакопления.ТоварыОрганизаций.Остатки(
    |            &Дата,
    |            Организация = &Организация
    |                И Номенклатура = &Номенклатура
    |                И ХарактеристикаНоменклатуры = &Характеристика
    |                ) КАК ТоварыОрганизацийОстатки
    |ГДЕ
    |    ТоварыОрганизацийОстатки.КоличествоОстаток > 0";
    
    ВыборкаИзЗапроса = Запрос.Выполнить().Выбрать();
    Если ВыборкаИзЗапроса.Следующий() Тогда
        КоличествоОстаток = ВыборкаИзЗапроса.КоличествоОстаток;
    КонецЕсли;
    Возврат КоличествоОстаток;
КонецФункции

Вторая функция производит раскрутку партий назад по времени и формирует таблицу значений с партиями и суммами:


// Возвращает партии товара для документа продажи
// для КУДиР предпринимателя
Функция ПартииТовараДляРеализации(ДокументПродажи, Номенклатура, Характеристика = Неопределено) Экспорт
    
    ТабПартий = Новый ТаблицаЗначений;
    ТабПартий.Колонки.Добавить("ДатаПрихода");
    ТабПартий.Колонки.Добавить("ПриходныйДокумент");
    ТабПартий.Колонки.Добавить("КоличествоПрихода");
    ТабПартий.Колонки.Добавить("СуммаПрихода");
    ТабПартий.Колонки.Добавить("СуммаНДСПрихода");
    
    Остаток = ОстатокТовараНаМоментРеализации(ДокументПродажи, Номенклатура, Характеристика);
    
    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("Дата",            Новый Граница(ДокументПродажи.МоментВремени(), ВидГраницы.Исключая)); 
    Запрос.УстановитьПараметр("Организация",    ДокументПродажи.Организация); 
    Запрос.УстановитьПараметр("Номенклатура",    Номенклатура); 
    Запрос.УстановитьПараметр("Характеристика", ?(Характеристика = Неопределено, Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка(), Характеристика)); 
    
    Запрос.Текст = "
    |ВЫБРАТЬ
    |    ТоварыОрганизаций.Период,
    |    ТоварыОрганизаций.Регистратор,
    |    ТоварыОрганизаций.КоличествоПриход
    |ИЗ
    |    РегистрНакопления.ТоварыОрганизаций.ОстаткиИОбороты(
    |            ,&Дата,
    |            Регистратор,,
    |            Организация = &Организация
    |                И Номенклатура = &Номенклатура
    |                И ХарактеристикаНоменклатуры = &Характеристика
    |                ) КАК ТоварыОрганизаций
    |ГДЕ
    |    ТоварыОрганизаций.КоличествоПриход > 0
    |
    |УПОРЯДОЧИТЬ ПО
    |    ТоварыОрганизаций.Период УБЫВ";
    
    ВыборкаИзЗапроса = Запрос.Выполнить().Выбрать();
    Пока ВыборкаИзЗапроса.Следующий() Цикл
        СуммаПрихода = 0;    
        СуммаНДСПрихода = 0;
        СуммыПартииТовара(ВыборкаИзЗапроса.Регистратор, Номенклатура, Характеристика, СуммаПрихода, СуммаНДСПрихода);
        
        Если Остаток > 0 Тогда
            Строка = ТабПартий.Добавить();
            Строка.ДатаПрихода        = ВыборкаИзЗапроса.Период;
            Строка.ПриходныйДокумент = ВыборкаИзЗапроса.Регистратор;
            Строка.КоличествоПрихода = ВыборкаИзЗапроса.КоличествоПриход - ?(ВыборкаИзЗапроса.КоличествоПриход > Остаток, Остаток, 0);
            Строка.СуммаПрихода         = СуммаПрихода * Строка.КоличествоПрихода / ВыборкаИзЗапроса.КоличествоПриход;
            Строка.СуммаНДСПрихода     = СуммаНДСПрихода * Строка.КоличествоПрихода / ВыборкаИзЗапроса.КоличествоПриход;
            Остаток = Остаток - ВыборкаИзЗапроса.КоличествоПриход;
        Иначе
            Прервать;
        КонецЕсли;
    КонецЦикла;
    
    ТабПартий.Сортировать("ДатаПрихода");
    Возврат ТабПартий;
КонецФункции

Ограничения и риски восстановления партий «на лету»

При использовании виртуального подбора партий важно помнить о существенных методических и технических нюансах:

  1. Хронологическая последовательность: Если пользователи задним числом меняют или перепроводят документы поступлений и отгрузок, восстановленные партии теряют актуальность. Заполнение КУДиР необходимо производить строго после завершения всех правок в периоде и закрытия месяца.
  2. Требования налогового учета ИП: Порядок учета доходов и расходов ИП (Приказ Минфина РФ № 86н/БГ-3-04/430) требует для признания материальных расходов одновременного выполнения условий: товар должен быть оприходован, оплачен поставщику и отгружен покупателю. Анализ только количественных движений по регистру ТоварыОрганизаций не контролирует факт оплаты поставщику.
  3. Производительность: Выполнение запросов к виртуальным таблицам остатков и оборотов в цикле по каждой строке реализации создает серьезную нагрузку на СУБД. При обработке больших массивов данных запросы следует пакетировать.

Почему отчет «КУДиР предпринимателя» формируется пустым

Если документ ЗаписьКнигиУчетаДоходовИРасходовИП заполнен и сформировал движения по регистру накопления ИП Доходы, но отчет КнигаУчетаДоходовИРасходовПредпринимателя остается пустым, проанализируем следующие причины:

  1. Реквизиты учетной политики ИП: В типовой конфигурации «Бухгалтерия предприятия» реквизиты ВестиУчетПоВидамДеятельности, ОсновнойХарактерДеятельности и ОсновнаяНоменклатурнаяГруппа хранятся в специализированном регистре сведений УчетнаяПолитикаПоНДФЛ (или расширении учетной политики). В УПП этого регистра нет. Без заполненных данных учетной политики алгоритм отчета не определяет параметры группировки и возвращает пустой результат.
  2. Тип организации: В справочнике Организации реквизит ЮрФизЛицо должен иметь значение ФизЛицо. Если организация заведена как юридическое лицо, отчет игнорирует ее движения.
  3. Взаимосвязь регистров: Разделы книги (например, Таблицы 1-6 и 1-7) требуют связки между доходами и расходами. Если внесены только доходы без сопутствующих движений по регистрам ИП МПЗ, ИП Обороты МПЗ или ИП Иные материальные расходы, часть таблиц книги не будет сформирована.

Альтернативные архитектурные решения

Если первичный учет ведется во внешней системе (например, в «Альфа-Авто»), где полноценно сохраняется партионный учет, гораздо надежнее не рассчитывать виртуальное ФИФО в УПП, а транслировать готовые ссылки на партии и суммы входящего НДС напрямую через правила обмена. Для полноценного регламентированного учета ИП на ОСНО наиболее стабильным решением остается выгрузка итоговых данных в типовую конфигурацию «Бухгалтерия предприятия» с настроенным модулем учета НДФЛ индивидуального предпринимателя.

← На главную