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