Как документу из расширения сформировать проводки в «1С:Бухгалтерия государственного учреждения 2.0»?

Программист 1С v8.3 (Управляемые формы) Бухгалтерский учет Сфера услуг, туризм и социальный сектор
← На главную

При разработке в расширении для конфигурации «1С:Бухгалтерия государственного учреждения 2.0» (БГУ 2.0) часто возникает задача: создать новый документ, который должен формировать бухгалтерские проводки. Стандартный подход, работающий во многих других конфигурациях — написать код в процедуре ОбработкаПроведения и напрямую добавить движения в регистр бухгалтерии. Однако в БГУ 2.0 такой код молча не выполняется, документ проводится, а проводок нет. Разберем, почему так происходит и как правильно решать эту задачу.

Почему не работает стандартный код проведения?

Основная причина кроется в особой архитектуре механизма проведения документов в БГУ 2.0. В отличие от многих типовых решений, эта конфигурация использует сложную систему, построенную на основе так называемых типовых операций. Система ожидает, что все бухгалтерские записи будут инициированы не напрямую из модуля документа, а через специальную прослойку — регистр сведений ОперацииДокументов.

Этот регистр связывает проведенный документ с его бухгалтерской операцией (которая, в свою очередь, и содержит проводки). Если для документа не создана запись в этом регистре, система считает, что у него нет бухгалтерской операции, и просто игнорирует любые попытки прямой записи в регистр бухгалтерии ЖурналПроводокЕПСБУ из его модуля.

Следовательно, чтобы наш документ из расширения начал формировать движения, мы должны корректно встроиться в этот механизм. Рассмотрим несколько способов, как это сделать.

Подготовительные шаги: что обязательно нужно сделать в расширении

Вне зависимости от выбранного способа решения, необходимо выполнить базовую настройку в конфигураторе. Без этих шагов ни один из методов не сработает.

  1. Заимствование объектов в расширение. Вам необходимо заимствовать все объекты, с которыми будет взаимодействовать ваш документ. Минимальный обязательный набор:
    • Регистр бухгалтерии ЖурналПроводокЕПСБУ.
    • Регистр сведений ОперацииДокументов.
    • Регистр сведений ЗначенияДополнительныхРеквизитовОпераций.
    • План счетов ЕПСБУ и план видов характеристик ВидыСубконто.
    • Все справочники, перечисления и другие объекты, которые вы используете при заполнении проводок (например, Справочники.КОСГУ, Справочники.Организации, Перечисления.КВД и т.д.).
  2. Установка регистратора. Это ключевой момент. В свойствах заимствованного регистра бухгалтерии ЖурналПроводокЕПСБУ необходимо перейти на вкладку "Регистраторы" и установить флажок напротив вашего нового документа, созданного в расширении. Это действие "сообщает" платформе, что ваш документ имеет право формировать движения по этому регистру.

После выполнения этих действий и обновления базы данных можно переходить к реализации логики проведения.

Решение 1: Программное создание типового документа (быстрый способ)

Этот подход является, по сути, обходным маневром, но он очень эффективен и часто применяется для быстрого решения задачи. Его суть в том, чтобы из обработки проведения нашего документа программно создать, заполнить и провести один из стандартных документов конфигурации, который уже умеет формировать нужные проводки (например, «Операция (бухгалтерская)» или, как в примере с форума, «Бюджетные данные»).

Главный секрет — после создания этого технического документа мы создаем запись в регистре ОперацииДокументов, которая связывает проводки этого технического документа с нашим исходным документом из расширения.

Рассмотрим по шагам на примере кода. Допустим, наш документ должен формировать движения по счетам санкционирования, и для этого идеально подходит типовой документ «Бюджетные данные».


// Процедура ОбработкаПроведения(Отказ, РежимПроведения)

// 1. Создаем программно экземпляр типового документа
НовыйДок = Документы.БюджетныеДанные.СоздатьДокумент();
НовыйДок.Дата = ЭтотОбъект.Дата;
НовыйДок.Организация = ЭтотОбъект.Организация;
// ... заполняем прочие реквизиты шапки из нашего документа ...
НовыйДок.ВидДанных = Перечисления.ВидыКБК.КРБ;
НовыйДок.РазделЛицевогоСчета = РеквизитыЛС.РазделЛС; // Получаем где-то в коде
НовыйДок.ДатаВведенияВДействиеАссигнований = НовыйДок.Дата;
НовыйДок.ДатаВведенияВДействиеЛБО = НовыйДок.Дата;

// 2. Очищаем и заполняем табличные части
НовыйДок.Ассигнования.Очистить();
НовыйДок.ЛБО.Очистить();

Для Каждого мСтрПлана Из ЭтотОбъект.Расшифровка Цикл
    стрАсг = НовыйДок.Ассигнования.Добавить();
    стрАсг.КПС = мСтрПлана.КБК;
    стрАсг.КОСГУ = Справочники.КОСГУ.НайтиПоКоду("211"); // Пример
    стрАсг.СуммаНаТекущийГод = мСтрПлана.Сумма;
    
    // Копируем данные в другую табличную часть, если нужно
    стрЛБО = НовыйДок.ЛБО.Добавить();
    ЗаполнитьЗначенияСвойств(стрЛБО, стрАсг);
КонецЦикла;

// 3. Записываем технический документ (пока без проведения)
НовыйДок.Записать(РежимЗаписиДокумента.Запись);

// 4. САМЫЙ ВАЖНЫЙ ЭТАП: Формируем запись об операции для НАШЕГО документа
СтруктЗаписи = РегистрыСведений.ОперацииДокументов.ДанныеДляЗаписи(НовыйДок);
ЗаполнитьЗначенияСвойств(СтруктЗаписи, ЭтотОбъект.Ссылка); // Подменяем ссылку на нашу!
СтруктЗаписи.Документ = ЭтотОбъект.Ссылка; // Явно указываем наш документ
СтруктЗаписи.СуммаОперации = НовыйДок.Ассигнования.Итог("СуммаНаТекущийГод");
// Указываем типовую операцию, которую "выполнил" наш документ
СтруктЗаписи.Операция = Справочники.ТиповыеОперации.БюджетныеДанные_ПБС_полученные_от_распорядителя;
СтруктЗаписи.ЕстьПроводки = Истина;

// Записываем информацию об операции
РегистрыСведений.ОперацииДокументов.ЗаписатьОперацию(ЭтотОбъект.Ссылка, СтруктЗаписи, Истина, Ложь);

// 5. Теперь проводим технический документ, чтобы он создал реальные движения в регистрах
НовыйДок.Записать(РежимЗаписиДокумента.Проведение);

// Важно! Нашему документу не нужно делать свои движения. 
// Мы "присвоили" движения другого документа.
Движения.ЖурналПроводокЕПСБУ.Записывать = Ложь;

// КонецПроцедуры

Таким образом, для системы все выглядит корректно: есть запись в ОперацииДокументов для нашего документа, и есть связанные с ней проводки, хотя фактически их создал другой, технический документ.

Решение 2: Настройка типовой операции (штатный механизм)

Это наиболее "правильный" и идеологически верный способ, который обеспечивает гибкость настройки для бухгалтера без необходимости менять код в конфигураторе.

Суть метода: мы используем встроенный в БГУ 2.0 конструктор для описания правил формирования проводок для нашего документа.

Проанализируем шаги:

  1. Выполните все подготовительные шаги (заимствование объектов и установка регистратора).
  2. Обновите информационную базу, чтобы система увидела изменения в метаданных.
  3. Запустите программу в режиме 1С:Предприятие.
  4. Перейдите в справочник "Типовые операции" (обычно находится в разделе администрирования или настроек учета).
  5. Создайте новый элемент справочника. В поле "Документ-регистратор" выберите ваш новый документ из расширения. Он появится в списке благодаря выполненным подготовительным шагам.
  6. На закладке "Настройка проводок" или "Бухгалтерские записи" используйте конструктор для создания шаблонов проводок. Вы можете указывать конкретные счета, а в качестве субконто, сумм и других аналитик использовать данные из реквизитов и табличных частей вашего документа (например, [Сумма], [Контрагент] и т.д.).
  7. Сохраните типовую операцию.

Теперь при проведении вашего документа из расширения система автоматически найдет эту типовую операцию, применит настроенные в ней правила и сама сформирует корректные проводки и запись в регистре ОперацииДокументов.

Решение 3: Собственный модуль проведения в расширении (продвинутый способ)

Этот метод сочетает в себе гибкость прямого кодирования и корректную интеграцию в штатный механизм. Он подходит для случаев, когда логика формирования проводок слишком сложна для конструктора типовых операций.

Суть метода: мы пишем логику формирования проводок в отдельном общем модуле в расширении, а затем "подключаем" этот модуль к типовой операции.

Разберем процесс:

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

Этот подход дает полный контроль над логикой формирования проводок, сохраняя при этом совместимость со стандартным механизмом БГУ 2.0.

← На главную