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