Программное создание документов в 1С:Бухгалтерия предприятия 3.0 (БП 3.0) существенно отличается от старых версий (например, БП 2.0) из-за широкого использования механизмов общих модулей, подписок на события и дополнительных свойств объектов. Часто разработчики сталкиваются с тем, что после создания документа через код в нем отсутствуют счета учета, не рассчитывается НДС или, что еще критичнее, формируются «пустые» проводки без сумм. Рассмотрим подробно, как правильно автоматизировать этот процесс, опираясь на лучшие практики разработки.
Одной из главных проблем при создании документа является ручная прописка счетов учета (например, 62.01, 90.01.1). Это считается плохим тоном, так как счета могут меняться в зависимости от учетной политики или настроек номенклатуры. В БП 3.0 реализован механизм автоматического определения счетов. Проанализируем, как заставить систему сделать это за нас.
Самый простой и «чистый» способ — использовать дополнительные свойства объекта перед записью. Разберем этот пример кода:
// Добавляем флаг автоматического заполнения счетов
ДокументОбъект.ДополнительныеСвойства.Вставить("ЗаполнитьСчетаУчетаПередЗаписью", Истина);
// Вызываем типовой метод заполнения перед записью
СчетаУчетаВДокументах.ЗаполнитьПередЗаписью(ДокументОбъект, РежимЗаписиДокумента.Проведение);
Этот метод обращается к регистрам сведений «Счета учета номенклатуры» и «Счета учета расчетов с контрагентами». Система сама определит нужные счета для организации, контрагента и каждой позиции в табличной части. Для работы со строками табличной части также можно использовать специализированный метод модуля СчетаУчетаВДокументах:
СтрокиДляЗаполнения = Новый Массив;
СтрокиДляЗаполнения.Добавить(НоваяСтрокаУслуги);
// Заполняем счета для конкретных строк ТЧ "Услуги"
СчетаУчетаВДокументах.ЗаполнитьСтроки(СтрокиДляЗаполнения, "Услуги", ДокументОбъект);
Если после выполнения метода Записать(РежимЗаписиДокумента.Проведение) в бухгалтерских проводках (Дт/Кт) суммы равны нулю, причина чаще всего кроется в незаполненных реквизитах валюты и курса. Даже если учет ведется в рублях, для механизмов БП 3.0 критически важно наличие следующих данных:
ВалютаДокумента пуст, расчеты по регистрам бухгалтерии могут игнорироваться.КурсВзаиморасчетов и КратностьВзаиморасчетов должны быть равны 1. Если система видит 0, итоговая сумма в проводках (Сумма * Курс) превращается в ноль.НалогообложениеНДС (тип ПеречислениеСсылка.ТипыНалогообложенияНДС) определяет, должна ли система вообще формировать движения по НДС.Посмотрим на пример правильной инициализации этих реквизитов:
ДокументОбъект.ВалютаДокумента = Справочники.Валюты.НайтиПоКоду("643"); // Рубли
ДокументОбъект.КурсВзаиморасчетов = 1;
ДокументОбъект.КратностьВзаиморасчетов = 1;
ДокументОбъект.НалогообложениеНДС = Перечисления.ТипыНалогообложенияНДС.ПродажаОблагаетсяНДС;
В отличие от БП 2.0, где часто использовались процедуры «ОбработатьТабличнуюЧасть», в современной конфигурации функции вынесены в модуль ОбработкаТабличныхЧастей. Чтобы не высчитывать НДС вручную (Сумма * 20 / 120), рекомендуется использовать типовые процедуры. Выясним, как это реализовать:
// Предположим, мы заполнили Цену и Количество
НоваяСтрока.Количество = 1;
НоваяСтрока.Цена = 120;
// Рассчитываем общую сумму строки
ОбработкаТабличныхЧастей.РассчитатьСуммуТабЧасти(НоваяСтрока, ДокументОбъект);
// Заполняем ставку НДС из справочника Номенклатура
УчетНДС.ЗаполнитьСтавкуНДСВТабличнойЧасти(ДокументОбъект, "Услуги");
// Рассчитываем сумму НДС на основании ставки и суммы строки
ОбработкаТабличныхЧастей.РассчитатьСуммуНДС(НоваяСтрока, ДокументОбъект);
Использование ОбработкаТабличныхЧастей.РассчитатьСуммуНДС гарантирует, что расчет будет произведен корректно в зависимости от того, включен ли НДС в сумму (реквизит СуммаВключаетНДС) или начисляется сверху.
Для того чтобы в печатной форме документа (Акте или УПД) отображались фамилии руководителя и бухгалтера, необходимо заполнить данные об уполномоченных лицах. В БП 3.0 это скрытые механизмы, которые вызываются следующей командой:
Руководители.ЗаполнитьУполномоченныхЛиц(ДокументОбъект, ДокументОбъект.Организация, ДокументОбъект.Дата);
Это позволит избежать пустых полей в подписях при последующей печати документа пользователями.
Если ваша операция подразумевает выставление счета-фактуры (особенно если ЭтоУниверсальныйДокумент = Ложь), его также нужно создать программно. Рассмотрим наиболее эффективный метод через менеджер документа:
// Сначала записываем основной документ
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
// Создаем и связываем счет-фактуру
УчетНДСПереопределяемый.СоздатьСчетФактуруНаРеализацию(ДокументОбъект.Ссылка);
Этот метод автоматически создаст документ «Счет-фактура выданный», свяжет его с реализацией и заполнит все необходимые реквизиты на основании данных основания.
Подведем итог. Для качественного программного создания документа «Реализация товаров и услуг» в БП 3.0 необходимо:
СчетаУчетаВДокументах для автоматического подбора счетов бухгалтерского учета.ВалютаДокумента, КурсВзаиморасчетов и КратностьВзаиморасчетов (равными 1 для рубля), чтобы проводки не были пустыми.ОбработкаТабличныхЧастей.РассчитатьСуммуНДС для корректного вычисления налога.ДополнительныеСвойства.Вставить("ЗаполнитьСчетаУчетаПередЗаписью", Истина) перед вызовом проведения.Такой подход делает ваш код устойчивым к изменениям в настройках программы и гарантирует корректность ведения бухгалтерского и налогового учета.