При разработке внешних обработок заполнения, интеграций или механизмов переноса данных в «1С:Предприятие 8.3» программисты часто сталкиваются с задачей создания документов программным путем. На первый взгляд задача кажется простой: создать объект, заполнить реквизиты шапки и добавить строки в табличную часть. Однако при интерактивном (ручном) вводе номенклатуры в документе автоматически рассчитывается масса «сопутствующих» данных: цены по типу цен, ставки НДС, суммы, единицы измерения и, что самое важное для бухгалтерских конфигураций, — счета учета. Если аналогичные механизмы создаются для обмена между близкими базами 1С, вместо написания собственного кода сопоставления объектов технически проще применить инструмент для переноса данных между похожими конфигурациями 1С.
Если заполнить только номенклатуру и количество программно «в лоб», документ запишется пустым по счетам учета и суммам, что приведет к ошибкам при проведении. В этой статье мы подробно разберем, как правильно задействовать стандартные механизмы автоматического заполнения БСП (Библиотеки стандартных подсистем) и конфигурации «Бухгалтерия предприятия 3.0» без «грязного» копирования кода из форм документов.
Начинающие разработчики часто идут по пути наименьшего сопротивления: открывают модуль формы документа, находят процедуру уровня ПриИзмененииНоменклатуры, копируют ее код во внешнюю обработку и пытаются адаптировать. Давайте разберем по шагам, почему этот подход ошибочен и опасен:
ЭтаФорма, Элементы.Товары.ТекущиеДанные, обращаются к видимости и доступности кнопок на клиенте. Вне контекста открытой формы (например, в фоновом задании на сервере) этот код моментально вызовет критическую ошибку выполнения.Рассмотрим правильные и безопасные способы программного заполнения «пурги» (счетов учета, цен, НДС), предусмотренные разработчиками платформы и типовых конфигураций.
Большинство документов в современных конфигурациях на базе БСП поддерживают интеллектуальное заполнение «под ключ» через переопределяемый метод ОбработкаЗаполнения в модуле объекта. Мы можем передать в этот метод специальную структуру параметров, а документ сам выполнит всю рутинную работу.
Давайте проанализируем пример кода, в котором мы создаем документ программно и передаем параметры для автоматической инициализации:
// Создаем структуру параметров для заполнения
ПараметрыЗаполнения = Новый Структура;
ПараметрыЗаполнения.Вставить("Организация", СсылкаНаОрганизацию);
ПараметрыЗаполнения.Вставить("Склад", СсылкаНаСклад);
// Создаем новый объект документа программно
НовыйДокумент = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
// Вызываем стандартный метод заполнения объекта
НовыйДокумент.Заполнить(ПараметрыЗаполнения);
При таком подходе система автоматически заполнит реквизиты шапки по умолчанию (валюту, договор, счета расчетов с контрагентом), используя настройки учетной политики. Если конфигурация позволяет передавать в параметры заполнения таблицы значений с номенклатурой, этот способ является самым лаконичным и надежным. Для поиска готовых программных конструкций и API можно использовать справочник по методам Библиотеки стандартных подсистем с примерами кода.
В конфигурации «1С:Бухгалтерия предприятия 3.0» счета учета номенклатуры (такие как 41.01, 10.01, 43) и счета доходов/расходов определяются динамически на основании регистра сведений Счета учета номенклатуры. Для выявления возможных ошибок и расхождений в сформированных бухгалтерских записях после программного проведения документов применяется инструмент для автоматического сравнения проводок между базами 1С.
Для того чтобы программно не писать сложные запросы к этому регистру, мы должны использовать стандартный общий модуль СчетаУчетаВДокументах. Выясним, как применить его на практике:
// Предположим, у нас уже есть созданный и частично заполненный объект документа
ДокументОбъект = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
ДокументОбъект.Дата = ТекущаяДата();
ДокументОбъект.Организация = СсылкаНаОрганизацию;
ДокументОбъект.Склад = СсылкаНаСклад;
ДокументОбъект.Контрагент = СсылкаНаКонтрагента;
ДокументОбъект.ДоговорКонтрагента = СсылкаНаДоговор;
// Добавляем строку в табличную часть "Товары"
НоваяСтрока = ДокументОбъект.Товары.Добавить();
НоваяСтрока.Номенклатура = СсылкаНаНоменклатуру;
НоваяСтрока.Количество = 10;
// Вызываем метод автоматического заполнения счетов учета для всего документа перед записью
СчетаУчетаВДокументах.ЗаполнитьПередЗаписью(ДокументОбъект, РежимЗаписиДокумента.Запись);
// Также заполняем счета расчетов с контрагентами в шапке документа
СчетаУчетаВДокументах.ЗаполнитьСчетаРасчетов(ДокументОбъект);
Метод ЗаполнитьПередЗаписью самостоятельно обойдет все табличные части документа, проанализирует тип номенклатуры, склад, организацию и подставит верные счета учета в каждую строчку ТЧ. Это наиболее защищенный от обновлений код. Для изучения доступных процедур и примеров их вызова подойдёт справочник методов конфигурации «Бухгалтерия предприятия 3.0».
Если нам необходимо заполнить цены согласно действующему прайс-листу или договору, а также автоматически рассчитать НДС и суммы в строках табличной части, мы используем механизмы ценообразования БСП. Рассмотрим подробнее, как это реализуется в коде:
// 1. Заполнение цен по типу цен или договору
// Используем экспортный метод общего модуля Ценообразование
ПараметрыЗаполненияЦен = Ценообразование.ПараметрыЗаполненияЦенВДокументе();
ПараметрыЗаполненияЦен.Договор = ДокументОбъект.ДоговорКонтрагента;
ПараметрыЗаполненияЦен.Документ = ДокументОбъект;
// Функция заполнит цены в ТЧ "Товары" на основании цен номенклатуры
Ценообразование.ЗаполнитьЦеныВДокументе(ДокументОбъект, "Товары", ПараметрыЗаполненияЦен);
// 2. Расчет НДС и сумм по строкам табличной части
Для Каждого СтрокаТовара Из ДокументОбъект.Товары Цикл
// Рассчитаем базовую сумму без НДС
СтрокаТовара.Сумма = СтрокаТовара.Количество * СтрокаТовара.Цена;
// Пересчитаем НДС и общую сумму с помощью серверного общего модуля
// В БП 3.0 для этого используется модуль ОбработкаТабличнойЧастиТоварыСервер (или аналогичные модули)
СтруктураДанныхСтроки = Новый Структура("Сумма, Количество, Цена, СтавкаНДС, СуммаНДС, Всего");
ЗаполнитьЗначенияСвойств(СтруктураДанныхСтроки, СтрокаТовара);
// Пересчитываем значения с учетом налоговой политики документа (сверху НДС или в том числе)
ОбработкаТабличнойЧастиТоварыСервер.ПересчитатьСуммуНДСВСтрокеТЧСервер(
СтруктураДанныхСтроки,
ДокументОбъект.СуммаВключаетНДС
);
// Возвращаем рассчитанные данные обратно в строку документа
ЗаполнитьЗначенияСвойств(СтрокаТовара, СтруктураДанныхСтроки);
КонецЦикла;
Использование таких методов гарантирует, что округления сумм и расчет копеек налога НДС пройдут ровно так, как это заложено методологами фирмы «1С».
В ситуациях, когда вы пишете простую, изолированную самописную обработку для переноса данных и не хотите зависеть от тяжелых механизмов БСП, вы можете заполнить базовые реквизиты строк напрямую, обращаясь к реквизитам справочника Номенклатура.
Давайте посмотрим на пример реализации такого быстрого и легкого подхода:
НовыйДокумент = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
// Заполнение шапки...
НоваяСтрока = НовыйДокумент.Товары.Добавить();
НоваяСтрока.Номенклатура = ВыбраннаяНоменклатура;
НоваяСтрока.Количество = 5;
// Прямое обращение к реквизитам справочника через точку (допускается для простых реквизитов)
НоваяСтрока.ЕдиницаИзмерения = ВыбраннаяНоменклатура.ЕдиницаИзмерения;
НоваяСтрока.СтавкаНДС = ВыбраннаяНоменклатура.СтавкаНДС;
// Проводим простые математические вычисления вручную
НоваяСтрока.Цена = 1500;
НоваяСтрока.Сумма = НоваяСтрока.Количество * НоваяСтрока.Цена;
// Рассчитываем НДС (например, 20%)
Если НоваяСтрока.СтавкаНДС = Перечисления.СтавкиНДС.НДС20 Тогда
НоваяСтрока.СуммаНДС = НоваяСтрока.Сумма * 20 / 120; // Если сумма включает НДС
КонецЕсли;
Важное замечание: Этот метод работает максимально быстро, так как не вызывает тяжелые общие модули. Однако используйте его с осторожностью и только тогда, когда вы на 100% уверены в стабильности структуры метаданных и правилах расчета налогов на вашем предприятии.
Для создания надежного программного кода при заполнении табличных частей в 1С:Бухгалтерия 3.0 придерживайтесь следующих правил:
СчетаУчетаВДокументах.ЗаполнитьПередЗаписью().Ценообразование.