При работе с конфигурацией «Управление производственным предприятием» (УПП) редакции 1.3 программисты часто сталкиваются с тем, что движения документа по регистру бухгалтерии Хозрасчетный невозможно найти привычным способом через модуль объекта. Документ Корректировка реализации — один из самых сложных в этом плане, так как его логика распределена между менеджером модуля, общими модулями партионного учета и механизмами проведения по партиям. Разберем подробно, где именно искать код, отвечающий за «рождение» бухгалтерских записей.
Прежде чем приступать к отладке, нам необходимо понять, что в УПП 1.3 используется двухэтапная схема формирования движений. Как справедливо замечено в комментариях к коду конфигурации: «Проводки формируются и в модуле документа, и при списании партий». Это означает, что если мы поставим точку останова в процедуре ОбработкаПроведения, мы можем увидеть только часть движений (например, по взаиморасчетам), в то время как проводки по себестоимости (списание товара) будут отсутствовать.
Рассмотрим основные факторы, влияющие на процесс:
Расчет себестоимости.Хозрасчетный в части списания ТМЦ появятся только после запуска обработки Проведение по партиям.Проанализируем структуру документа. В современных версиях УПП 1.3 значительная часть логики вынесена в Менеджер модуля. Это сделано для оптимизации и возможности формирования проводок без создания тяжеловесного объекта документа.
Выясним точное место формирования проводок по товарам. Как показывает практика, основной алгоритм сосредоточен в процедуре:
Документы.КорректировкаРеализаций.СформироватьПроводкиПоТовару()
Эта процедура отвечает за подготовку данных для формирования записей в регистре бухгалтерии. Именно здесь определяется, какие счета доходов и расходов будут задействованы, как будет рассчитываться сумма НДС и какие субконто будут заполнены. Если вам нужно изменить логику заполнения счетов, начинать анализ стоит именно отсюда.
Если при отладке в модуле документа вы видите, что набор записей регистра Хозрасчетный остается пустым даже в самом конце процедуры проведения, значит, запись происходит «транзитом» через специализированные механизмы партионного учета. Рассмотрим подробнее этот процесс.
Для записи движений в УПП часто используется процедура:
УправлениеЗапасамиПартионныйУчет.ЗаписатьДвижения
Этот метод получает на вход сформированные таблицы данных и осуществляет их физическую запись в базу данных. Посмотрим на ситуацию, когда точка останова ПередЗаписью в самом регистре бухгалтерии не срабатывает. Это может происходить по нескольким причинам:
ОбменДанными.Загрузка = Истина.НаборЗаписей внутри общего модуля, и вы просто «проскакиваете» этот момент при пошаговой отладке в модуле документа.Важнейшим элементом механизма корректировки является служебная таблица СписанныеТовары. Проанализируем процедуру ЗаполнитьКолонкиРегистраСписанныеТоварыПоТоварамРегл. Она готовит данные для регистра накопления, который в дальнейшем служит источником для партионного учета. Если в этой процедуре данные будут очищены или изменены некорректно, проводки по бухгалтерскому учету просто не сформируются, так как системе будет «нечего списывать».
Рассмотрим пример кода, который может встретиться при доработке системы (с осторожностью относитесь к подобным вставкам):
Процедура ЗаполнитьКолонкиРегистраСписанныеТоварыПоТоварамРегл(ТаблицаДвижений, СтруктураШапкиДокумента, ТаблицаПоТоварам)
// Заполнение базовых реквизитов организации и отражения в учете
ТаблицаДвижений.ЗаполнитьЗначения(СтруктураШапкиДокумента.ОтражатьВБухгалтерскомУчете, "ОтражатьВБухгалтерскомУчете");
ТаблицаДвижений.ЗаполнитьЗначения(СтруктураШапкиДокумента.Организация, "Организация");
Для Каждого Строка Из ТаблицаДвижений Цикл
СтрокаТЧ = ТаблицаПоТоварам.Получить(Строка.НомерСтроки);
// Установка корреспондирующих счетов из ТЧ документа
Строка.КорСчетБУ = СтрокаТЧ.СчетРасходовБУ;
Строка.КорСубконтоБУ2 = СтрокаТЧ.СубконтоБУ;
// Определение суммы задолженности в зависимости от того, возврат это или исправление
ЭтоВозврат = (Строка.КодОперацииПартииТоваров = Перечисления.КодыОперацийПартииТоваров.ВозвратОтПокупателя);
Строка.СуммаЗадолженностиБУ = ?(ЭтоВозврат, -(СтрокаТЧ.СуммаБезНДС + СтрокаТЧ.НДС), СтрокаТЧ.СуммаБезНДС + СтрокаТЧ.НДС);
КонецЦикла;
// Внимание: если здесь вызвать ТаблицаДвижений.Очистить(),
// проводки по списанию себестоимости в БУ сформированы не будут!
КонецПроцедуры
Выясним, как тип операции документа влияет на место формирования проводок. В Корректировке реализации есть два ключевых режима:
ПодготовитьТаблицуСторно, которая программно вычитает движения исходного документа реализации. В этом случае проводки формируются на основании движений регистратора-основания.Если вы все еще не видите, где записывается набор записей Хозрасчетный, попробуйте следующие методы:
РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей(). В УПП таких мест много, но ограничьте область поиска общими модулями с именами Проведение... и ЗаполнениеДвижений....ПередЗаписью и ПриЗаписи для документа. В некоторых кастомизированных конфигурациях логика может быть вынесена туда.УчетНДСФормированиеДвижений), а не напрямую из модуля документа. Если не «идет» НДС, искать нужно именно там.Таким образом, для полного понимания процесса формирования движений в Корректировке реализации необходимо последовательно изучить Менеджер документа (формирование таблиц проводок) и Общие модули партионного учета (физическая запись наборов в регистр). Только комплексный анализ этих узлов позволит точно определить точку внесения изменений в логику учета.