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