При настройке обменов между идентичными или похожими конфигурациями (например, 1С:Бухгалтерия 3.0 -> 1С:Бухгалтерия 3.0) разработчики часто сталкиваются с мистическим поведением системы. Документ переносится, у него стоит признак "Проведен", если нажать кнопку "Дт/Кт" — проводки видны. Однако, если сформировать Оборотно-сальдовую ведомость (ОСВ) или карточку счета, этих сумм там нет. При этом ручное перепроведение или отмена проведения с последующим проведением исправляют ситуацию.
Разберем подробно причины этого явления и способы диагностики и решения проблемы.
Давайте проанализируем симптомы. В базе-приемнике мы имеем документ, который визуально кажется корректным. Ключевые моменты:
Проведен установлен в Истину.Активность у записей регистра установлено в Истину.Это происходит из-за того, как платформа 1С записывает данные при обмене и как строятся отчеты.
Это самая распространенная причина, когда движения "физически" есть, но отчеты их не видят. Стандартная Оборотно-сальдовая ведомость практически всегда строит отчет с отбором по измерению Организация.
При обычном проведении документа модуль объекта берет Организацию из шапки и прописывает её в каждую строку движения регистра. При обмене данными (особенно через «Конвертацию данных 2.0» или универсальный обмен) часто используется режим ОбменДанными.Загрузка = Истина.
В этом режиме:
ОбработкаПроведения) не выполняется, если движения переносятся "как есть".NULL или пустую ссылку.Почему в журнале проводок видно, а в ОСВ нет?
Форма списка регистра (Журнал проводок) часто показывает "сырые" данные. Если поле Организация пустое, вы можете этого не заметить визуально или оно будет пустым.
ОСВ же делает запрос вида: ГДЕ Организация = &ВыбОрганизация. Запись, где Организация не заполнена (NULL), просто отсеивается фильтром.
Воспользуемся Консолью запросов. Нам нужно посмотреть "сырые" данные регистра бухгалтерии, игнорируя стандартные отборы.
ВЫБРАТЬ
ХозрасчетныйДвиженияССубконто.Регистратор,
ХозрасчетныйДвиженияССубконто.Организация,
ХозрасчетныйДвиженияССубконто.СчетДт,
ХозрасчетныйДвиженияССубконто.СчетКт,
ХозрасчетныйДвиженияССубконто.Сумма
ИЗ
РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто КАК ХозрасчетныйДвиженияССубконто
ГДЕ
ХозрасчетныйДвиженияССубконто.Регистратор = &СсылкаНаПроблемныйДокумент
Выполните этот запрос для проблемного документа. Внимательно посмотрите на колонку Организация. Если там пусто или значение NULL, причина найдена. Отчеты не видят эти записи, потому что они "ничьи".
Регистры накопления и бухгалтерии в 1С хранятся в нескольких физических таблицах SQL: таблица движений (записей) и таблица итогов (агрегированные данные для быстрого построения отчетов). ОСВ строится по таблице итогов.
Иногда при загрузке данных с флагом ОбменДанными.Загрузка = Истина механизм обновления итогов может не сработать корректно, особенно если были сбои транзакций или используется нестандартный код записи наборов записей.
В итоге: запись в таблице движений появилась, а в таблицу итогов "плюс" не прилетел. Обычное перепроведение (отмена + проведение) лечит это, так как при отмене старые движения стираются (и минусуются из итогов), а при проведении создаются новые корректные записи.
Если вы переносите не сами движения, а только документы, рассчитывая, что они проведутся в приемнике, нужно учитывать нюанс свойства ОбменДанными.Загрузка.
Если при записи документа в базе-приемнике этот флаг установлен в Истина, то событие ОбработкаПроведения игнорируется платформой. Документ записывается, флаг "Проведен" переносится из источника (как реквизит), но реального формирования движений не происходит (если только вы не переносите сами движения отдельным набором).
Разберем последовательно, что нужно сделать, чтобы исправить ситуацию и предотвратить её повторение.
Если проблема в таблицах итогов, выполните стандартную процедуру обслуживания.
После этой процедуры данные в ОСВ должны появиться, если проблема была в агрегатах.
Если вы используете "Конвертацию данных 2.0", у вас есть два пути стратегии переноса. Выбирайте один, не смешивайте их.
Стратегия А: Перенос движений (рекомендуется для сложных операций и переноса истории)
В правилах конвертации группы свойств (ПКГС) для набора записей регистра (обычно это папка "Движения" в правиле документа):
Организация переносится корректно.ПередВыгрузкой или ПослеЗагрузки принудительно устанавливайте организацию.Стратегия Б: Перенос только документа с перепроведением на стороне приемника
В этом случае в КД нужно отключить перенос движений. Но просто перенести документ с флагом "Проведен" недостаточно, так как ОбменДанными.Загрузка = Истина блокирует проведение.
Вам нужно использовать механизм отложенного проведения или явного запуска проведения после загрузки.
В обработчике ПослеЗагрузки (ПКО документа) можно написать код:
// Пример для принудительной регистрации к проведению
// Не рекомендуется делать Провести() прямо здесь, чтобы не замедлять транзакцию обмена
РежимЗаписи = "Запись"; // Сбрасываем режим, чтобы не пытался провестись внутри обмена
Объект.Проведен = Ложь; // Сбрасываем флаг, чтобы потом обработка увидела непроведенные
// Либо используйте штатные механизмы БСП для отложенного проведения
// ПараметрыОбъекта.Вставить("ТребуетсяПроведение", Истина);
Затем, после завершения обмена, в базе-приемнике запускается типовая обработка "Групповое перепроведение документов". Это самый надежный способ получить корректные движения, соответствующие учетной политике базы-приемника.
Если вам нужно разово исправить документы, у которых движения есть, но измерения (например, Организация) не заполнены, можно использовать простую обработку. Алгоритм следующий:
ОбменДанными.Загрузка = Ложь (чтобы запустились механизмы платформы) или просто записать, если мы заполнили всё сами.
Набор = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(ДокументСсылка);
Набор.Прочитать();
Изменен = Ложь;
Для Каждого Запись Из Набор Цикл
Если НЕ ЗначениеЗаполнено(Запись.Организация) Тогда
Запись.Организация = ДокументСсылка.Организация;
Изменен = Истина;
КонецЕсли;
КонецЦикла;
Если Изменен Тогда
Набор.ОбменДанными.Загрузка = Истина; // Пишем тихо, но с исправленными данными
Набор.Записать();
КонецЕсли;
Если вы видите движения в документе, но не видите их в ОСВ, проблема почти всегда в незаполненных измерениях регистра (чаще всего Организация, реже Валюта) или в необходимости пересчета итогов. Проблема возникает из-за особенностей режима загрузки данных при обмене, который отключает штатные проверки заполнения полей.