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