Почему не пересчитываются суммы в документе при загрузке через Конвертацию данных 2 и как это исправить?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При работе с инструментом «Конвертация данных 2.1» (КД 2) программисты часто сталкиваются с неприятной ситуацией: документ (например, ПоступлениеТоваровУслуг) загружается в целевую базу (например, Бухгалтерия предприятия 3.0) с виду корректно, все поля заполнены, но итоговые суммы или суммы НДС в строках рассчитаны неверно. Более того, стоит пользователю вручную изменить любое значение в строке (например, переввести то же самое количество), как система тут же «просыпается» и пересчитывает документ правильно. Разберем детально, почему так происходит и как автоматизировать этот процесс при загрузке.

Выясняем причину: почему типовые механизмы не срабатывают?

Проанализируем архитектуру современных конфигураций на базе БСП (Библиотеки стандартных подсистем). В 1С:Бухгалтерии 3.0 основная логика расчетов заложена в событиях формы (на клиенте) и в процедурах модуля объекта. Когда вы загружаете данные через Универсальный обмен XML, платформа устанавливает специальный признак: Объект.ОбменДанными.Загрузка = Истина.

Этот флаг — критически важный момент. Он сообщает системе, что происходит техническая запись данных, и выполнение стандартных проверок и автоматических расчетов в процедурах ПередЗаписью и ПриЗаписи модуля объекта блокируется. Это сделано для ускорения загрузки и предотвращения зацикливания обменов, но обратной стороной является «застывание» данных в том виде, в котором они пришли из файла обмена. Если в файле суммы были неполными или отсутствовали важные служебные реквизиты, документ останется «битым» до ручного вмешательства.

Проверяем «забытые» реквизиты шапки документа

Рассмотрим ситуацию, когда данные вроде бы перенесены полностью, но расчет все равно не идет. Выясним, все ли скрытые настройки документа заполнены. В БП 3.0 расчет сумм сильно зависит от настроек налогообложения и валют в шапке документа. Проверьте наличие и корректность следующих реквизитов:

  1. СуммаВключаетНДС: Это булево значение. Если в источнике НДС не входил в стоимость, а в приемнике этот флаг по умолчанию установился в Истина, итоговые суммы «поплывут».
  2. НалогообложениеНДС: Если этот реквизит не заполнен или заполнен неверно (например, «Продажа не облагается НДС»), система может игнорировать колонку СуммаНДС в табличной части.
  3. КурсВзаиморасчетов и КратностьВзаиморасчетов: Даже если вы ведете учет только в рублях, эти поля должны быть равны 1. Если они останутся нулевыми, математические модули конфигурации при попытке расчета могут выдать ошибку или вернуть 0.
  4. ТипЦен: Если в документе указан тип цен, система может пытаться сопоставить загруженные цены с прайс-листом или применять специфические правила округления.

Как показала практика обсуждения на форуме, часто причиной является отсутствие какого-то специфического поля, например, процента скидки (СуммаСкидки) или реквизита, отвечающего за способ отражения НДС в бухгалтерском учете.

Программный пересчет в обработчике «ПослеЗагрузки»

Если все реквизиты перенесены, но итоговые колонки все равно не сходятся, нам необходимо принудительно вызвать логику пересчета конфигурации-приемника. Посмотрим, как это реализовать в Правилах Конвертации Объектов (ПКО) на закладке «После загрузки».

Нам не нужно изобретать велосипед и писать свои формулы. В современных конфигурациях 1С логика расчетов вынесена в общие модули. Рассмотрим пример кода, который можно вставить в обработчик ПослеЗагрузки для документа поступления:


// В обработчике ПослеЗагрузки параметр "Объект" — это загруженный документ
// Сначала подготовим структуру параметров, если это требуется для общих модулей
Для Каждого СтрокаТовары Из Объект.Товары Цикл
    
    // Вызываем типовой пересчет строки. 
    // Названия модулей могут отличаться в зависимости от версии БП (3.0.ХХ)
    // Обычно это "ОбработкаТабличнойЧастиКлиентСервер" или "СуммыДокумента"
    
    ПараметрыПересчета = Новый Структура("СпособЗаполненияЦен, Валюта, НалогообложениеНДС, СуммаВключаетНДС");
    ЗаполнитьЗначенияСвойств(ПараметрыПересчета, Объект);
    
    // Пересчитываем сумму НДС и итоговую сумму в строке
    ОбработкаТабличнойЧастиКлиентСервер.РассчитатьСуммуНДСВСтрокеТабличнойЧасти(СтрокаТовары, ПараметрыПересчета);
    ОбработкаТабличнойЧастиКлиентСервер.РассчитатьСуммуВСтрокеТабличнойЧасти(СтрокаТовары, ПараметрыПересчета);
    
КонецЦикла;

// В конце вызываем общий пересчет итогов документа (подвала)
Объект.Записать(РежимЗаписиДокумента.Запись); 

Важно: Вызов Объект.Записать() внутри обработчика ПослеЗагрузки может замедлить процесс, если документов очень много, так как запись будет происходить фактически дважды (один раз самой обработкой загрузки, второй раз вашим кодом). Однако это гарантирует, что все механизмы платформы отработают.

Использование логики «ПриИзменении» через серверные вызовы

Проанализируем ситуацию, упомянутую участниками форума: в документе на клиенте срабатывают обработчики ПриИзменении. В КД 2 мы работаем на сервере и не имеем доступа к клиентским процедурам формы. Чтобы воспроизвести это поведение, нужно найти, какие серверные процедуры вызываются этими клиентскими обработчиками. Обычно это процедуры в модуле менеджера или в общем модуле с заголовком Рассчитать... или Заполнить....

Если вы обнаружили, что в БП 3.0 расчет сложный и зависит от множества условий (например, есть скидки, наценки, распределение НДС по разным ставкам), попробуйте следующий подход в КД:

  1. Найдите экспортную процедуру в модуле объекта документа, которая отвечает за расчет (например, РассчитатьИтоги() или ЗаполнитьСчетаУчета()).
  2. В ПКО документа в событии ПослеЗагрузки временно сбросьте флаг загрузки, вызовите метод и верните флаг обратно (используйте с осторожностью!):

Объект.ОбменДанными.Загрузка = Ложь;
Попытка
    // Вызов внутренних методов документа для инициализации расчетов
    Объект.ПриЗаписи(Новый Структура("Записывать", Истина)); 
Исключение
    // Обработка ошибок
КонецПопытки;
Объект.ОбменДанными.Загрузка = Истина;

Однако более правильным и безопасным методом считается прямой вызов процедур из общих модулей, таких как ОбщегоНазначенияБП.ЗаполнитьСтавкиНДСВДокументе(Объект) или аналогичных.

Типичные ошибки в табличной части

Посмотрим на состав реквизитов табличной части Товары. Проблема часто кроется не в коде пересчета, а в том, что в КД 2 не были сопоставлены «второстепенные» поля, которые участвуют в формулах:

Итоговые рекомендации для стабильной загрузки

Чтобы раз и навсегда решить проблему некорректных сумм при загрузке через КД 2, придерживайтесь следующего алгоритма:

1. Синхронизируйте порядок полей: В правилах конвертации (ПКО) убедитесь, что реквизиты шапки (Валюта, Склад, Организация, Налогообложение) стоят в списке выше, чем табличные части. Это гарантирует, что к моменту загрузки строк объект уже будет иметь базовые настройки для расчетов.

2. Используйте отладчик: Если суммы не считаются, откройте базу-приемник, запустите отладку и посмотрите, что происходит в процедуре ОбработкаТабличнойЧастиТоварыПриИзмененииКоличества. Найдите там серверный вызов и продублируйте его в КД.

3. Заполняйте всё: Не полагайтесь на то, что «1С сама заполнит ставку НДС или курс». В режиме ОбменДанными.Загрузка = Истина автоматика работает минимально. Переносите абсолютно все реквизиты, даже если они кажутся вам избыточными.

Следуя этим правилам, вы обеспечите корректность данных в бухгалтерском учете и избавите пользователей от необходимости «прощелкивать» каждый загруженный документ вручную.

← На главную