Почему программно созданный Возврат товаров поставщику в УТ 11.4 не сохраняется или не виден в списке?

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

При разработке внешних обработок или регламентных заданий в среде 1С:Управление торговлей 11.4 программисты часто сталкиваются с ситуацией: код создания документа выполняется без ошибок, метод Записать(РежимЗаписиДокумента.Проведение) возвращает истину (или не вызывает исключения), но сам документ в интерфейсе не появляется. При анализе журнала регистрации обнаруживаются записи об отмене транзакций по регистрам сведений, таким как ДанныеПервичныхДокументов и РеестрДокументов. Рассмотрим подробно, почему это происходит и как правильно реализовать программное создание документа возврата.

Анализ механизма транзакций в УТ 11.4

В современных конфигурациях на базе ERP-платформы (УТ 11, КА 2, ERP) процесс записи и проведения документа — это не просто перенос данных в таблицы БД. Это сложная цепочка событий, в которой участвуют подписки на события и механизмы фонового заполнения регистров. Если на любом из этапов типовая логика конфигурации встречает некорректные данные, транзакция может быть отменена. Проанализируем основные причины «невидимости» документа:

  1. Откат транзакции в журнале регистрации: Бледные (серые) строки в журнале регистрации с пометкой «Отмена» означают, что физическая запись в базу данных не произошла. Это случается, когда внутри транзакции возникла ошибка, которая была перехвачена внутренними механизмами платформы или конфигурации.
  2. Пустой Реестр документов: В УТ 11 списки документов часто строятся не по самим таблицам документов, а по регистру сведений РеестрДокументов. Если запись в этот регистр не попала (например, из-за ошибки в процедурах ПриЗаписи), документ не будет отображаться в списках, хотя в базе он может существовать.
  3. Механизм Видов запасов: Это «сердце» складского учета в УТ 11. Без заполненной табличной части ВидыЗапасов документ возврата не может быть проведен, так как система не знает, какую именно партию или категорию товара (собственный, комиссионный и т.д.) нужно списать.

Главная проблема: Автоматическое заполнение видов запасов

Выясним причину, по которой транзакция может рушиться без видимых сообщений. В УТ 11.4 при проведении документа система пытается динамически сформировать записи в ТЧ ВидыЗапасов. Если в документе не заполнены ключевые реквизиты (склад, организация, соглашение) или если алгоритм подбора видов запасов натыкается на ошибку в запросе (например, из-за пустых ссылок), вся транзакция отменяется.

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


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

// После заполнения ТЧ Товары необходимо вызвать процедуру формирования видов запасов
// В типовых решениях это делается так:
СтруктураПараметров = Новый Структура;
СтруктураПараметров.Вставить("АдресРезультата", "");
СтруктураПараметров.Вставить("ДокументСсылка", НовыйДокумент.Ссылка);

// Но до записи ссылки еще нет! 
// Поэтому сначала записываем документ в режиме Запись
НовыйДокумент.Записать(РежимЗаписиДокумента.Запись);

// Теперь вызываем типовой механизм
ЗапасыСервер.СформироватьВидыЗапасовУказанногоДокумента(НовыйДокумент.Ссылка);

Использование типового метода заполнения по основанию

Вместо того чтобы вручную переносить строки из ПриобретениеТоваровУслуг (ПТУ), проанализируем возможность использования штатного механизма. Это наиболее безопасный способ, так как он автоматически заполняет все скрытые аналитики и связи, которые необходимы для корректного проведения документа.

Разберем алгоритм заполнения по шагам:

  1. Создаем новый объект документа.
  2. Используем метод Заполнить(), передавая в него документ-основание или массив оснований.
  3. Дозаполняем специфические реквизиты (например, количество к возврату, если оно отличается от прихода).

НовыйВозврат = Документы.ВозвратТоваровПоставщику.СоздатьДокумент();
// Основание - это ссылка на документ ПриобретениеТоваровУслуг
ДанныеЗаполнения = Новый Структура("Основание", СсылкаНаПТУ);
НовыйВозврат.Заполнить(ДанныеЗаполнения);

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

Ловушка свойства ОбменДанными.Загрузка

Часто программисты пытаются обойти ошибки проведения, устанавливая НовыйДокумент.ОбменДанными.Загрузка = Истина. Рассмотрим, почему в случае с УТ 11.4 это плохая практика для создания новых документов:

Когда этот флаг установлен, система отключает почти все проверки и подписки на события. В результате:

Рекомендация: Никогда не используйте этот флаг, если вам нужно полноценное проведение документа в управленческом учете. Используйте его только для технической синхронизации данных, где вы самостоятельно программно заполняете абсолютно все связанные регистры.

Как найти «скрытую» ошибку при проведении?

Если транзакция все равно отменяется, а ОписаниеОшибки() молчит, проанализируем ситуацию с помощью отладки. Основная причина отсутствия сообщения об ошибке заключается в том, что в УТ 11 многие ошибки проведения не генерируют исключение, а записываются в массив СообщенияПользователю.

Посмотрим на пример правильной обработки записи с выводом всех системных сообщений:


Попытка
    Если Не НовыйДокумент.ПроверитьЗаполнение() Тогда
        // Здесь можно программно проанализировать, какие поля не заполнены
    КонецЕсли;
    
    НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);
Исключение
    ТекстОшибки = ОписаниеОшибки();
    // Получаем сообщения, которые система успела накопить перед падением
    СписокСообщений = ПолучитьСообщенияПользователю(Истина);
    Для Каждого Сообщение Из СписокСообщений Цикл
        ТекстОшибки = ТекстОшибки + Символы.ПС + Сообщение.Текст;
    КонецЦикла;
    
    // Записываем в Журнал Регистрации для анализа
    ЗаписьЖурналаРегистрации("ПрограммноеСозданиеДокумента", 
        УровеньЖурналаРегистрации.Ошибка, , , ТекстОшибки);
КонецПопытки;

Заключение и выводы

Для успешного программного создания Возврата товаров поставщику в УТ 11.4 необходимо придерживаться следующих правил:

  1. Заполняйте Хозяйственную операцию: Без неё алгоритмы проведения не понимают, по какой схеме двигать запасы.
  2. Обеспечьте заполнение Видов запасов: После записи документа (но до окончательного проведения) вызывайте ЗапасыСервер.СформироватьВидыЗапасовУказанногоДокумента.
  3. Проверяйте заполнение: Всегда используйте ПроверитьЗаполнение(), чтобы убедиться, что аналитика (Склад, Организация, Подразделение) корректна.
  4. Анализируйте сообщения: Ошибки в запросах по остаткам часто не вызывают Exception, но видны в системных сообщениях пользователя.

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

← На главную