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