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