Почему одинаковые документы в 1С:Бухгалтерия 3.0 формируют разные проводки при загрузке из XML и ручном вводе

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

На практике сопровождения типовых конфигураций 1С (в частности, 1С:Бухгалтерия предприятия 3.0) разработчики и бухгалтеры часто сталкиваются со странным поведением системы: два внешне абсолютно идентичных документа — один из которых был загружен посредством обмена из XML (или сторонней системы), а второй создан вручную в интерфейсе — формируют принципиально разные проводки в регистре бухгалтерии.

Типичный пример подобного поведения прослеживается на документе Отчет о розничных продажах. В интерактивно созданном документе программа корректно списывает себестоимость по дебету счета 90.02.2 и кредиту счета 41.02, а также фиксирует выручку в кассу по дебету 50.01. В то же время загруженный из XML документ формирует проводку по себестоимости с нулевой суммой или расхождениями по выручке. Проанализируем подробно причинно-следственные связи данного явления и рассмотрим по шагам, как выявить и устранить проблему.

1. Влияние хронологии и момента времени документа

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

При загрузке из XML время документа очень часто устанавливается в значение 00:00:00 или фиксируется по времени системы-источника. Рассмотрим, к чему это приводит:

  1. Документ перемещения товара на розничный склад проведен 15-го числа в 10:00:00.
  2. Документ продажи загружен из XML на ту же дату, но со временем 00:00:00.
  3. При проведении розничного отчета система анализирует партии и остатки на счете 41.02 строго на момент времени документа продажи.
  4. Поскольку на 00:00:00 товар еще не поступил на склад, партия не обнаруживается, и система списывает товар с нулевой себестоимостью (Дт 90.02.2 Кт 41.02 — сумма 0).

Если тот же самый документ скопировать в интерфейсе, он получит более позднее время (например, текущие 14:30:00), успешно «увидит» остаток от перемещения за 10:00:00 и корректно рассчитает себестоимость.

2. Режим загрузки данных и пропуск обработчиков событий

Выясним техническую разницу между созданием объекта платформы в интерактивном режиме и его программой загрузкой. Когда документ создается через обработку обмена (например, механизмы «Конвертации данных» или формат EnterpriseData), у объекта устанавливается служебный флаг:

ДокументОбъект.ОбменДанными.Загрузка = Истина;

Установка данного параметра приводит к следующему поведению системы:

  1. Отключаются стандартные обработчики событий модуля объекта (ПередЗаписью, ПриЗаписи) и модуля формы.
  2. Не срабатывают алгоритмы автоматического заполнения скрытых или служебных реквизитов (например, счетов учета доходов/расходов, налоговых флагов спецрежимов ЕНВД/Патент/УСН).
  3. Не пересчитываются взаимосвязанные табличные части.

В документе Отчет о розничных продажах присутствуют четыре табличные части: Товары, Возвраты, Безналичные оплаты и Агентские услуги. При интерактивном заполнении номенклатуры подтягиваются счета из регистра сведений Счета учета номенклатуры. При XML-загрузке, если правила обмена явно не передали значения этих полей, реквизиты могут остаться пустыми или заполниться дефолтными значениями типов, что изменит структуру проводок.

3. Расхождения в табличных частях оплат (счета 50.01 и 57.03)

Рассмотрим ситуацию, когда в документе различаются суммы по кассовым проводкам. Если в интерактивном документе сумма по дебету счета 50.01 составляет 353,88 руб., а в загруженном — 171,90 руб., это напрямую указывает на различие в заполнении табличной части Безналичные оплаты (оплата банковскими картами, эквайринг или подарочные сертификаты).

При наличии эквайринговых операций общее поступление выручки split-ится между счетами учета:

Если при выгрузке из XML табличная часть оплат была заполнена частично или с ошибками, проводки по кассе и эквайрингу сформируются некорректно, даже если табличная часть Товары полностью совпадает.

4. Признак ручной корректировки движений

Проанализируем еще один подводный камень XML-импорта. Из внешних систем документы могут передаваться сразу с готовым набором движений по регистрам. В таком случае в наборе записей регистра бухгалтерии устанавливается флаг:

Движения.Хозрасчетный.РучнаяКорректировка = Истина;

Если этот признак взведен, стандартная процедура перепроведения документа из формы или динамических списков не будет пересчитывать проводки. Система сохранит зафиксированные из XML движения, игнорируя реальные остатки на счетах учета.

5. Пошаговая методика диагностики расхождений

Если вы столкнулись с проблемой разных проводок в одинаковых документах, выполним последовательную диагностику по следующему алгоритму:

Шаг 1. Сравнение реквизитов и табличных частей методом XML-сериализации

Сравнение реквизитов через стандартные запросы к основной таблице и табличной части Товары может не показать разницу, если расхождения кроются в скрытых реквизитах или других табличных частях. Быстрый и надежный способ найти разницу — выгрузить оба объекта (загруженный и ручной) в XML-строку и сравнить их в текстовом диффе (WinMerge, KDiff3):


// Внешняя обработка или код в отладчике для получения XML-структуры
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();

ЗаписатьXML(ЗаписьXML, ДокументСсылка.ПолучитьОбъект());
XMLСтрока = ЗаписьXML.Закрыть();

Сравнив полученные тексты, вы сразу увидите различия в точной дате/времени, скрытых флагах, счетах учета и заполнении соседних табличных частей.

Шаг 2. Проверка остатков номенклатуры по секундам

Для проверки наличия остатка номенклатуры сформируем отчет «Карточка счета 41.02» или «Оборотно-сальдовая ведомость по счету 41.02» со следующими настройками:

  1. Отбор по конкретной номенклатуре и складу из документа.
  2. Период: день совершения операции.
  3. Детализация: до документа и точного времени (с точностью до секунд).

Проверим хронологический порядок: документ поступления/перемещения товара должен строго предшествовать документу розничной продажи. Если продажа записана на 00:00:00, измените время документа или воспользуйтесь обработкой «Групповое перепроведение документов» с группировкой по времени.

Шаг 3. Запрос для проверки остатков перед проведением

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


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ХозрасчетныйОстатки.Субконто1 КАК Номенклатура,
    |	ХозрасчетныйОстатки.Субконто2 КАК Склад,
    |	ХозрасчетныйОстатки.КоличествоОстаток КАК Количество,
    |	ХозрасчетныйОстатки.СуммаРазвернутыйОстатокДт КАК СуммаОстаток
    |ИЗ
    |	РегистрБухгалтерии.Хозрасчетный.Остатки(&МоментВремени, Счет = &СчетУчета, , Организация = &Организация И Субконто1 = &Номенклатура) КАК ХозрасчетныйОстатки";

Запрос.УстановитьПараметр("МоментВремени", Новый Граница(ВыбранныйДокумент.МоментВремени(), ВидГраницы.Исключая));
Запрос.УстановитьПараметр("СчетУчета", ПланыСчетов.Хозрасчетный.ТоварыВРозничнойТорговле); // 41.02
Запрос.УстановитьПараметр("Организация", ВыбранныйДокумент.Организация);
Запрос.УстановитьПараметр("Номенклатура", НоменклатураСсылка);

Результат = Запрос.Выполнить().Выгрузить();

Использование ВидГраницы.Исключая позволяет узнать точный остаток партии непосредственно перед выполнением операции проведения данного документа.

Резюме и практические рекомендации

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

← На главную