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