При автоматизированной загрузке данных, создании корректировок или программном формировании документов ОперацияБух разработчики часто сталкиваются с неприятной ситуацией: бухгалтерские проводки присутствуют, движения по регистру КУДиР в документе видны, однако отчет «Анализ состояния налогового учета по УСН» эти суммы полностью игнорирует. При этом стоит только интерактивно открыть операцию в пользовательском интерфейсе и нажать «Записать и закрыть», как данные мгновенно подтягиваются во все налоговые отчеты. Обычный вызов метода ДокументОбъект.Записать() в коде нужного эффекта не дает.
Разберем детально механизм работы ручных операций в «1С:Бухгалтерии предприятия», выясним причины такого поведения платформы и конфигурации, а также рассмотрим рабочие программные способы исправления ситуации.
Проанализируем технические особенности документа «Операция, введенная вручную» и логику подсистемы УСН:
ОперацияБух имеет свойство Проведение: Запретить. У него нет стандартного события ОбработкаПроведения. При вызове ДокументОбъект.Записать() платформа перезаписывает только сам заголовок документа и его табличные части, но не трогает наборы записей подчиненных регистров, если для них явно не выставлено свойство Записывать = Истина.ОбменДанными.Загрузка = Истина. Если операция создавалась обработкой загрузки или обменом, включенный флаг загрузки полностью отключает прикладные обработчики событий (ПередЗаписью, ПриЗаписи), подписки на события и заполнение сопутствующих служебных реквизитов. При интерактивной записи из формы этот флаг всегда равен Ложь, и логика конфигурации срабатывает в полном объеме.ТаблицаРегистровНакопления и ТаблицаРегистровСведений. Если записи в регистр КУДиР были сформированы программно напрямую в набор записей регистратора, но строка с именем регистра не была добавлена в табличную часть ТаблицаРегистровНакопления, документ при дальнейшей обработке может «терять» этот регистр. При открытии формы документа выполняется сопоставление этих таблиц.Активность может остаться в значении Ложь. Неактивные записи отображаются в таблицах документа, но не учитываются при расчете итогов и не попадают в типовые отчеты.КнигаУчетаДоходовИРасходов, но и из регистра сведений РасшифровкаКУДиР, а также регистра накопления РасходыПриУСН. Если при программной загрузке сформирован только один регистр, отчет не может классифицировать суммы по своим разделам.Разберем по шагам, как правильно перезаписать документ целиком из встроенного языка 1С, гарантируя обновление движений и запуск необходимых алгоритмов конфигурации:
ТаблицаРегистровНакопления.КнигаУчетаДоходовИРасходов и принудительно устанавливаем свойство Записывать = Истина.ОбменДанными.Загрузка = Ложь).Посмотрим на пример реализации:
ОперацияОбъект = СсылкаНаОперацию.ПолучитьОбъект();
// 1. Проверяем состав используемых регистров накопления
Если ОперацияОбъект.ТаблицаРегистровНакопления.Найти("КнигаУчетаДоходовИРасходов", "Имя") = Неопределено Тогда
СтрРегистра = ОперацияОбъект.ТаблицаРегистровНакопления.Добавить();
СтрРегистра.Имя = "КнигаУчетаДоходовИРасходов";
КонецЕсли;
// 2. Инициализируем и помечаем на запись движения КУДиР
ДвиженияКУДиР = ОперацияОбъект.Движения.КнигаУчетаДоходовИРасходов;
ДвиженияКУДиР.Прочитать();
Для Каждого Запись Из ДвиженияКУДиР Цикл
Запись.Активность = Истина;
Запись.Период = ОперацияОбъект.Дата;
Если ЗначениеЗаполнено(ОперацияОбъект.Организация) Тогда
Запись.Организация = ОперацияОбъект.Организация;
КонецЕсли;
КонецЦикла;
ДвиженияКУДиР.Записывать = Истина;
// 3. Выключаем режим обмена, чтобы отработали типовые подписки
ОперацияОбъект.ОбменДанными.Загрузка = Ложь;
// 4. Записываем документ
ОперацияОбъект.Записать(РежимЗаписиДокумента.Запись);
Если сам документ менять не требуется, а нужно быстро и безопасно восстановить активность записей и пересчитать итоги в регистрах по списку проблемных документов, удобнее работать напрямую с набором записей регистратора.
Рассмотрим пример перезаписи набора записей регистра накопления:
НаборКУДиР = РегистрыНакопления.КнигаУчетаДоходовИРасходов.СоздатьНаборЗаписей();
НаборКУДиР.Отбор.Регистратор.Установить(СсылкаНаОперацию);
НаборКУДиР.Прочитать();
Модифицирован = Ложь;
Для Каждого Запись Из НаборКУДиР Цикл
// Проверяем активность записей
Если Не Запись.Активность Тогда
Запись.Активность = Истина;
Модифицирован = Истина;
КонецЕсли;
// Проверяем синхронизацию периода с датой документа
Если Запись.Период <> СсылкаНаОперацию.Дата Тогда
Запись.Период = СсылкаНаОперацию.Дата;
Модифицирован = Истина;
КонецЕсли;
КонецЦикла;
// Выполняем запись без режима загрузки для пересчета итогов
НаборКУДиР.ОбменДанными.Загрузка = Ложь;
НаборКУДиР.Записать();
Проанализируем методику учета в типовой «Бухгалтерии предприятия». Использование документа ОперацияБух для налогового учета при УСН является крайней мерой, так как ручная операция предназначена в первую очередь для бухгалтерских проводок (регистр Хозрасчетный).
Для корректного отражения доходов и расходов УСН типовой функционал предоставляет специализированный документ — «Записи книги учета доходов и расходов (УСН)» (метаданные: Документ.ЗаписьКнигиУчетаДоходовИРасходов). Перевод загрузки данных на этот документ снимает большинство проблем: