Как программно создать документ Операция (бухгалтерская) в 1С:БГУ 1.0 и правильно заполнить субконто

Программист 1С v8.3 (Обычные формы) Бухгалтерский учет
← На главную

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

Инициализация документа и заполнение шапки

Начнем с создания самого объекта документа. На этом этапе важно правильно заполнить основные реквизиты шапки, такие как Учреждение и ИФО (если ведется учет по источникам финансового обеспечения). Рассмотрим пример кода, который подготавливает документ к работе:


НовыйДокумент = Документы.ОперацияБух.СоздатьДокумент();
НовыйДокумент.Дата = ТекущаяДата();
НовыйДокумент.Учреждение = ВыбранноеУчреждение; // Ссылка на справочник Учреждения
НовыйДокумент.Баланс = СправочникИФО; // Если требуется заполнение ИФО
НовыйДокумент.Содержание = "Программное создание операции по загрузке данных";
НовыйДокумент.Записать(); // Записываем, чтобы получить ссылку для движений

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

Работа с движениями по регистру ЕПСБУ

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


// Указываем, что движения по регистру нужно записывать вместе с документом
НовыйДокумент.Движения.ЕПСБУ.Записывать = Истина;

// Получаем ссылку на номенклатуру (пример из задачи)
ПолучитьНоменклатуру = Справочники.Номенклатура.НайтиПоНаименованию(ИмяОбъекта);

// Цикл по данным (например, из таблицы значений или Excel)
Для каждого СтрокаДанных Из ТаблицаДанных Цикл
    Проводка = НовыйДокумент.Движения.ЕПСБУ.Добавить();
    Проводка.Период = НовыйДокумент.Дата;
    Проводка.Учреждение = НовыйДокумент.Учреждение;
    
    // Обязательные измерения БГУ
    Проводка.КФО = "4"; // Код финансового обеспечения (строка)
    
    // Заполнение счетов
    Проводка.СчетДт = ПланыСчетов.ЕПСБУ.НайтиПоКоду("105.36");
    Проводка.СчетКт = ПланыСчетов.ЕПСБУ.НайтиПоКоду("109.61");
    
    // Заполнение сумм и количеств
    Проводка.Сумма = СтрокаДанных.Сумма;
    Проводка.КоличествоДт = СтрокаДанных.Количество;
КонецЦикла;

Важный момент: В БГУ 1.0 регистр бухгалтерии имеет измерение Учреждение. Если вы заполните его только в шапке документа, но не укажете в строке проводки (Проводка.Учреждение), система выдаст ошибку: «Значение поля "Учреждение" не может быть пустым!».

Программное заполнение субконто

Одной из самых сложных задач для начинающих является заполнение субконто. На счетах БГУ может быть до трех различных видов субконто (например, КЭК, Номенклатура, ЦМО). Индексы субконто могут меняться в зависимости от настроек плана счетов, поэтому обращение по индексу (например, Получить(0)) является ненадежным.

Для правильной установки значений рекомендуется использовать типовые механизмы. Рассмотрим использование общего модуля БухгалтерскийУчет (или аналогичных серверных модулей в зависимости от точной версии конфигурации):

Разберем вариант заполнения через метод УстановитьСубконто, который автоматически определяет нужный индекс по имени вида субконто:


// Заполнение субконто дебета
БухгалтерскийУчет.УстановитьСубконто(Проводка.СчетДт, Проводка.СубконтоДт, "КЭК", Справочники.КОСГУ.НайтиПоКоду("346"));
БухгалтерскийУчет.УстановитьСубконто(Проводка.СчетДт, Проводка.СубконтоДт, "Номенклатура", ПолучитьНоменклатуру);
БухгалтерскийУчет.УстановитьСубконто(Проводка.СчетДт, Проводка.СубконтоДт, "Центры материальной ответственности", ОбъектМОЛ);

// Заполнение субконто кредита
БухгалтерскийУчет.УстановитьСубконто(Проводка.СчетКт, Проводка.СубконтоКт, "КЭК", Справочники.КОСГУ.НайтиПоКоду("211"));

Если в вашей конфигурации нет доступа к этому модулю, можно использовать прямое обращение к коллекции СубконтоДт или СубконтоКт, но только после проверки типа вида субконто. Выясним причину, почему это важно: на разных счетах первым субконто может быть как Номенклатура, так и Контрагент. Использование имени ("КЭК", "Номенклатура") делает код универсальным.

Типичные ошибки при записи документа

Проанализируем основные проблемы, которые возникают при выполнении метода Записать():

  1. Не заполнен счет кредита (или дебета). В отличие от обычных проводок, где отсутствие счета может быть допустимо (например, для забалансового учета), в балансовых проводках БГУ оба счета должны быть заполнены. Если вы заполняете субконто, но забыли указать сам СчетКт, система выдаст ошибку записи в журнал проводок.
  2. Пустое учреждение в движениях. Как уже упоминалось, измерение Учреждение в регистре ЕПСБУ является обязательным. Убедитесь, что в каждой строке цикла вы присвоили значение Проводка.Учреждение = НовыйДокумент.Учреждение;.
  3. Отсутствие КФО. Код финансового обеспечения — это ключевой разрез учета. Без него проводка не будет считаться корректной. Обычно это значения "1", "2", "4", "5", "7".
  4. Флаг записи движений. Если вы создали проводки, но после записи документа не видите их в списке, проверьте, установлен ли флаг НовыйДокумент.Движения.ЕПСБУ.Записывать = Истина;. Без него коллекция движений в памяти не будет сброшена в базу данных.

Итоговый пример кода

Соберем все рекомендации в один рабочий блок кода, который можно использовать в обработке загрузки данных:


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

Рассмотрим подробнее финальный штрих: реквизит СуммаОперации. В документе ОперацияБух он не всегда пересчитывается автоматически при программном изменении движений. Чтобы в списке документов пользователь видел итоговую сумму, ее желательно рассчитать вручную через метод Итог() коллекции движений и присвоить соответствующему реквизиту объекта документа.

Используя данный подход, мы обеспечиваем корректность данных с точки зрения методологии учета в БГУ 1.0 и гарантируем отсутствие ошибок при записи в базу данных.

← На главную