Как программно создать документ «Операция по платежной карте» в 1С:УТ 11 и правильно заполнить табличную часть?

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

При автоматизации загрузки данных из внешних систем (интернет-магазинов, платежных шлюзов или систем типа PayKeeper) программисты часто сталкиваются с проблемой: при программном создании документа ОперацияПоПлатежнойКарте данные в табличной части Расшифровка платежа (статья ДДС, сумма взаиморасчетов, объект оплаты) не сохраняются или очищаются сразу после записи документа. Рассмотрим подробно, почему это происходит и как правильно реализовать программное создание эквайринговой операции в конфигурациях на базе УТ 11, ERP 2 и КА 2.

Выясним причину проблемы: почему данные исчезают?

Многие разработчики полагаются на стандартный метод Заполнить(), передавая в него объект-основание (например, Заказ клиента). Однако в типовых конфигурациях логика ОбработкиЗаполнения в модуле менеджера документа может быть настроена таким образом, что она заполняет только основные реквизиты шапки. Если структура данных в основании не полностью соответствует ожиданиям системы, табличная часть РасшифровкаПлатежа может остаться пустой или заполниться некорректно.

Проанализируем ситуацию: когда вы смотрите данные в отладчике непосредственно перед вызовом метода Записать(РежимЗаписиДокумента.Проведение), вы видите заполненную таблицу. Но после записи документ открывается «пустым». Это происходит потому, что при записи срабатывают дополнительные механизмы пересчета и проверки, которые могут «обнулить» строки, если в них не заполнены обязательные служебные реквизиты, такие как ОбъектОплаты или СуммаВзаиморасчетов.

Разберем по шагам алгоритм программного создания документа

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

Шаг 1. Инициализация объекта и заполнение реквизитов шапки

Сначала создадим новый объект документа и заполним основные параметры: дату, организацию, операцию и терминал. Рассмотрим пример:


ДокОбъект = Документы.ОперацияПоПлатежнойКарте.СоздатьДокумент();
ДокОбъект.Дата = ТекущаяДата();
ДокОбъект.Организация = Справочники.Организации.НайтиПоРеквизиту("ИНН", "7700000000");
ДокОбъект.ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ПоступлениеОплатыОтКлиента;
ДокОбъект.ЭквайринговыйТерминал = Справочники.ЭквайринговыеТерминалы.НайтиПоКоду("00001");
ДокОбъект.СтатьяДвиженияДенежныхСредств = Справочники.СтатьиДвиженияДенежныхСредств.НайтиПоКоду("УТ-000005");

Шаг 2. Использование флага «Оплата выполнена»

Проанализируем важность реквизита ОплатаВыполнена. Это логический флаг (Булево), который в последних версиях УТ 11 критически важен для проведения. Если его не установить в Истина, документ будет считаться лишь «намерением» оплаты. Он запишется, но не сформирует движений по регистрам накопления Денежные средства в пути и Расчеты с клиентами.

Шаг 3. Явное заполнение табличной части «Расшифровка платежа»

Это самый важный этап. Нам нужно не просто добавить строку, а заполнить все ключевые поля, даже если они кажутся дублирующими. Посмотрим на пример кода, который решает проблему пустых данных:


// Предположим, у нас есть СуммаОперации и СсылкаНаЗаказ
ДокОбъект.СуммаДокумента = СуммаОперации;
ДокОбъект.Валюта = Справочники.Валюты.НайтиПоКоду("643"); // Рубли

// Очищаем ТЧ, если метод Заполнить() добавил лишнее, или просто создаем новую строку
ДокОбъект.РасшифровкаПлатежа.Очистить();
НоваяСтрока = ДокОбъект.РасшифровкаПлатежа.Добавить();

НоваяСтрока.Сумма = ДокОбъект.СуммаДокумента;
НоваяСтрока.СуммаВзаиморасчетов = ДокОбъект.СуммаДокумента;
НоваяСтрока.СтатьяДвиженияДенежныхСредств = ДокОбъект.СтатьяДвиженияДенежныхСредств;
НоваяСтрока.ВалютаВзаиморасчетов = ДокОбъект.Валюта;
НоваяСтрока.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС; // Или нужная ставка

// Очень важно заполнить ОбъектОплаты
Если ЗначениеЗаполнено(СсылкаНаЗаказ) Тогда
    НоваяСтрока.ОбъектОплаты = СсылкаНаЗаказ;
КонецЕсли;

Проанализируем нюансы работы с объектами расчетов

В современных версиях УТ 11 (начиная с 11.5) архитектура взаиморасчетов строится на Объектах оплаты. Если вы создаете оплату по конкретному заказу, именно ЗаказКлиента должен быть указан в ОбъектеОплаты. Если же это аванс без привязки к заказу, то после первой записи документа (когда он получит ссылку) рекомендуется в качестве объекта оплаты указать сам этот документ ОперацияПоПлатежнойКарте. Это позволит системе корректно закрыть расчеты при последующей отгрузке. Для автоматического распределения поступивших сумм можно использовать обработку для разноски платежей по объектам расчетов.

Также не забывайте про реквизит ДоговорЭквайринга. Обычно он подтягивается автоматически при выборе терминала в интерфейсе, но при программном заполнении его стоит установить явно, чтобы правильно рассчиталась комиссия банка. Сумма комиссии в самом документе оплаты обычно не фигурирует в движениях по клиенту, но она потребуется позже для формирования документа Отчет банка по эквайрингу.

Полный пример реализации функции создания документа

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


&НаСервере
Процедура СоздатьЭквайринговуюОперацию(ДанныеТранзакции)
    
    Док = Документы.ОперацияПоПлатежнойКарте.СоздатьДокумент();
    Док.Дата = ДанныеТranзакции.Дата;
    Док.Организация = ДанныеТranзакции.Организация;
    Док.ЭквайринговыйТерминал = ДанныеТranзакции.Терминал;
    Док.ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ПоступлениеОплатыОтКлиента;
    Док.Партнер = ДанныеТranзакции.Партнер;
    Док.Контрагент = ДанныеТranзакции.Контрагент;
    Док.Валюта = ДанныеТranзакции.Валюта;
    Док.СуммаДокумента = ДанныеТranзакции.Сумма;
    
    // Обязательные реквизиты карты
    Док.НомерПлатежнойКарты = ДанныеТranзакции.НомерКарты;
    Док.КодАвторизации = ДанныеТranзакции.КодАвторизации;
    Док.ОплатаВыполнена = Истина; // Ключевой флаг для проведения!
    
    Док.СтатьяДвиженияДенежныхСредств = Справочники.СтатьиДвиженияДенежныхСредств.НайтиПоКоду("УТ-000005");
    
    // Заполнение расшифровки
    ТЧ = Док.РасшифровкаПлатежа.Добавить();
    ТЧ.Сумма = Док.СуммаДокумента;
    ТЧ.СуммаВзаиморасчетов = Док.СуммаДокумента;
    ТЧ.СтатьяДвиженияДенежныхСредств = Док.СтатьяДвиженияДенежныхСредств;
    ТЧ.ВалютаВзаиморасчетов = Док.Валюта;
    
    Если ЗначениеЗаполнено(ДанныеТranзакции.Заказ) Тогда
        ТЧ.ОбъектОплаты = ДанныеТranзакции.Заказ;
    КонецЕсли;
    
    // Попытка проведения
    Попытка
        Док.Записать(РежимЗаписиДокумента.Проведение);
        Сообщить("Документ создан: " + Док.Ссылка);
    Исключение
        ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ОписаниеОшибки());
    КонецПопытки;
    
КонецПроцедуры

Дополнительные рекомендации

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

  1. Проверка прав доступа: Если код выполняется в фоновом задании (например, при загрузке через API), убедитесь, что у пользователя, под которым запускается задание, достаточно прав на создание и проведение документов оплаты, а также заполнены значения по умолчанию в настройках (Подразделение, Склад и т.д.). Для настройки регулярного выполнения подобных задач по расписанию используется программа МС:Автообмен для автоматизации обмена данными между базами 1С.
  2. Валютный учет: Если ваша база ведет учет в нескольких валютах, обязательно проверяйте Курс и Кратность. Хотя для рублей они обычно равны 1, для валютных операций их отсутствие в строках ТЧ приведет к нулевым суммам в регистрах.
  3. Статус документа: В зависимости от настроек конфигурации, у документа могут быть статусы. Хотя проведение обычно устанавливает финальный статус, в некоторых кастомизированных базах может потребоваться явная установка значения перечисления СтатусыОперацийПоПлатежнымКартам.

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

← На главную