В процессе сопровождения и адаптации типовых конфигураций 1С (таких как 1С:Комплексная автоматизация 1.1, 1С:Управление производственным предприятием 1.3 или 1С:Бухгалтерия предприятия 2.0) программисты часто сталкиваются с необходимостью добавления пользовательских субсчетов в План счетов. Однако просто создать счет в режиме «1С:Предприятие» недостаточно — нужно сделать так, чтобы данные по этому счету корректно попадали в регламентированную отчетность, в частности в Бухгалтерский баланс (форма по ОКУД 0710001).
В этой статье мы подробно разберем, как правильно прописать новый счет в модуле регламентированного отчета, почему стандартный механизм расчета развернутого сальдо может приводить к ошибкам или возвращать нулевые значения, и как исправить эту ситуацию в программном коде.
Рассмотрим классическую ситуацию. Нам необходимо добавить активный счет 62.Р («Расчеты с розничными покупателями») в Бухгалтерский баланс. Он должен отражаться в составе дебиторской задолженности (строка 1230) и кредиторской задолженности (строка 1520), полностью дублируя поведение стандартного счета 62.01.
Разработчик выполняет глобальный поиск по коду формы регламентированного отчета (например, ФормаОтчета2011Кв4) и дублирует строки для счета 62.01, подставляя свой счет 62.Р. Однако при формировании баланса показатели по новому счету остаются нулевыми, а в процессе отладки метод Выбрать() или НайтиСледующий() в выборке бухгалтерских итогов возвращает Неопределено.
Выясним главную техническую причину этой проблемы. Она кроется в вызове метода получения развернутого сальдо:
СКДР_62_Р = мБухИтогиРС.ПолучитьИтог("СуммаКонечныйРазвернутыйОстатокДт", "Счет", мСчет["62.Р"]);
Показатель СуммаКонечныйРазвернутыйОстатокДт (развернутое сальдо) требует обязательного наличия субконто, по которым система будет «разворачивать» итоги. Для счета 62.01 такими субконто выступают «Контрагенты» и «Договоры». Если у созданного вами счета 62.Р в плане счетов отсутствуют данные субконто (например, учет ведется без детализации по договорам или вообще по другим аналитикам, таким как «Склады»), то запрос к регистру бухгалтерии по расчету развернутого итога вернет пустой результат. Платформа просто не сможет построить выборку по отсутствующим измерениям.
Рассмотрим последовательность действий, которая позволит корректно внедрить новый счет в код регламентированного отчета.
Для начала нам необходимо определить все места в модуле формы отчета (например, ФормаОтчета2011Кв4 или соответствующем общем модуле заполнения), где используется базовый счет (в нашем случае 62.01). Используем сочетание клавиш Ctrl + F для поиска строк "62.01" и 62_01.
Везде, где объявляется и рассчитывается базовый счет, добавляем аналогичные строки для нашего нового счета 62.Р.
В процедуре ЗаполнитьСоответствиеСчетов (или аналогичной, инициализирующей список счетов) необходимо связать строковое представление счета с объектом метаданных плана счетов:
СоответствиеСчетов.Вставить("62.01", ПС.РасчетыСПокупателями);
СоответствиеСчетов.Вставить("62.Р", ПС.РасчетыСРозничнымиПокупателями); // Наш новый счет
Проанализируем структуру субконто нашего нового счета 62.Р. Если на этом счете действительно нет аналитики по контрагентам и договорам, то использовать получение развернутого сальдо СуммаКонечныйРазвернутыйОстатокДт категорически нельзя. Вместо этого мы должны рассчитывать обычное (свернутое) конечное дебетовое сальдо.
В коде расчета показателей разделов баланса (Процедуры ЗаполнитьАвтоБалансРаздел2 для дебиторской задолженности и ЗаполнитьАвтоБалансРаздел5 для кредиторской) пишем следующий алгоритм:
// 1. Получаем развернутый итог по стандартному счету 62.01 (где есть субконто)
СКДР_62_01_КонтрагентыДоговоры = мБухИтогиРС.ПолучитьИтог("СуммаКонечныйРазвернутыйОстатокДт", "Счет", мСчет["62.01"]);
СКДР_62_01_КонтрагентыДоговоры = ?(СКДР_62_01_КонтрагентыДоговоры = Неопределено, 0, СКДР_62_01_КонтрагентыДоговоры);
// 2. Получаем ОБЫЧНЫЙ (свернутый) итог по нашему счету 62.Р (где нет субконто расчетов)
СКД_62_Р = мБухИтогиРС.ПолучитьИтог("СуммаКонечныйОстатокДт", "Счет", мСчет["62.Р"]);
СКД_62_Р = ?(СКД_62_Р = Неопределено, 0, СКД_62_Р);
Важное примечание: Обратите внимание на использование тернарного оператора ?(). Метод ПолучитьИтог возвращает значение Неопределено, если по счету нет движений и остатков за отчетный период. Попытка сложить числовое значение с типом Неопределено приведет к критической ошибке выполнения программы (вылету с ошибкой несоответствия типов). Приведение полученного результата к нулю при помощи проверки — обязательное условие стабильной работы отчета.
После того как мы получили безопасные числовые переменные остатков по счетам, мы можем сложить их для вычисления значения конкретной строки (например, строки 1230 дебиторской задолженности):
ЗначениеПоказателя = СКД_60_02
+ СКДР_60_01_КонтрагентыДоговоры
+ СКД_62_03
+ СКДР_62_01_КонтрагентыДоговоры
+ СКД_62_Р; // Наша новая переменная с обычным дебетовым остатком
Аналогично поступаем и для пассивной части (кредиторской задолженности в строке 1520), используя при необходимости кредитовый остаток по счету 62.Р (СуммаКонечныйОстатокКт), если специфика ведения учета на вашем субсчете допускает появление кредитового сальдо.
Описанный выше метод внесения изменений непосредственно в модуль формы регламентированного отчета имеет один существенный недостаток: при каждом обновлении конфигурации (особенно при обновлении регламентированной отчетности в конце года) ваши изменения будут затираться. Вам придется заново выполнять поиск и дописывать алгоритмы расчета.
В современных редакциях программных продуктов 1С (таких как 1С:Бухгалтерия 3.0, 1С:ERP 2.5, 1С:Комплексная автоматизация 2.5) эта проблема решена разработчиками на уровне платформы. Внедрен механизм Настраиваемой бухгалтерской отчетности.
Если вы работаете в актуальной конфигурации, вам не нужно открывать конфигуратор. Достаточно выполнить следующие действия прямо в режиме «1С:Предприятие»:
Использование встроенного режима настройки исключает ошибки ручного кодинга, существенно сокращает время на разработку и гарантирует беспрепятственное обновление программного обеспечения в будущем.