Как настроить автоматический зачет и вывод авансов при печати УПД в «1С:Торговля и Склад 7.7»?

Программист 1С v7.7 Бухгалтерский учет Торговля и дистрибуция
← На главную

При оформлении отгрузочных документов в конфигурации «1С:Торговля и Склад 7.7» (ТиС) перед разработчиками и бухгалтерами часто встает задача: как правильно отразить сведения о полученных авансах в печатных формах накладных и особенно в Универсальном передаточном документе (УПД). Согласно требованиям налогового законодательства, при отгрузке в счет ранее полученной предоплаты в строке 5 (а также в строке 5б) УПД обязательно должны быть указаны реквизиты платежно-расчетных документов.

В типовой конфигурации «1С:Бухгалтерия 8» этот механизм давно автоматизирован. Однако в «1С:7.7» разработчикам приходится реализовывать этот алгоритм самостоятельно. В этой статье мы подробно разберем, как решить эту задачу программно, какие регистры использовать и как обойти проблему «человеческого фактора» и ввода документов задним числом.

---

Законодательный контекст: почему это критично для УПД

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

Если эти строки не заполнены или заполнены неверно, у налоговых органов возникнут вопросы при проверке вычетов по НДС как у продавца, так и у покупателя. Поэтому автоматизация этого процесса — жизненно важная задача для бизнеса.

---

Метод 1. Динамический запрос к регистру «Покупатели» (Метод ФИФО)

Проанализируем самый распространенный технический подход. Если в базе ведется регулярный и последовательный учет взаиморасчетов по договорам, мы можем динамически вычислять остатки авансов в момент формирования печатной формы УПД. Для этого используется штатный регистр Покупатели.

Рассмотрим пошаговый алгоритм работы программного кода в модуле печатной формы:

  1. Определяем дату и время текущего документа Реализация.
  2. Делаем запрос к регистру Покупатели (или используем объект Регистр.Покупатели с временным расчетом), чтобы получить кредитовое сальдо (сумму аванса) по контрагенту и договору на момент отгрузки.
  3. Если аванс обнаружен, мы начинаем «разматывать» историю платежей назад (по методу ФИФО), выбирая документы движения, которые этот аванс сформировали. Нам нужны документы СтрокаВыпискиПриход (банковская выписка) или ПриходныйКассовыйОрдер.
  4. Из найденных документов оплаты извлекаем дату и номер входящего платежного поручения и подставляем их в печатную форму.

Посмотрим на пример реализации такого алгоритма на встроенном языке «1С:Предприятие 7.7»:


// Функция нахождения платежных документов по авансу
Функция ПолучитьПлатежкиАванса(ДокРеализация) Экспорт
    Перем ВремРегистр, ТекстПлатежек;
    
    ТекстПлатежек = "";
    СуммаКРаспределению = ДокРеализация.Итог("Всего"); // Сумма нашей отгрузки
    
    // Создаем объект для работы с регистрами
    ВремРегистр = СоздатьОбъект("Регистр.Покупатели");
    
    // Устанавливаем точку расчета на момент перед проведением реализации
    ВремРегистр.ВременныйРасчет(1);
    РассчитатьРегистрыНа(ДокРеализация.ТекущийДокумент());
    
    // Получаем остаток долга/аванса по договору
    ОстатокАванса = ВремРегистр.СводныйОстаток(ДокРеализация.Клиент, ДокРеализация.Договор, , "Крд");
    
    Если ОстатокАванса > 0 Тогда
        // У нас есть предоплата. Начинаем искать платежные документы
        ВыборкаПлатежей = СоздатьОбъект("Документ");
        ВыборкаПлатежей.ВыбратьПодчиненныеДокументы(,, ДокРеализация.Договор);
        
        Пока (ВыборкаПлатежей.ПолучитьДокумент() = 1) И (СуммаКРаспределению > 0) Цикл
            Если (ВыборкаПлатежей.Вид() = "СтрокаВыпискиПриход") Или (ВыборкаПлатежей.Вид() = "ПриходныйКассовыйОрдер") Тогда
                // Проверяем, был ли этот платеж проведен ранее даты реализации
                Если ВыборкаПлатежей.ДатаДок <= ДокРеализация.ДатаДок Тогда
                    СуммаПлатежа = ВыборкаПлатежей.Сумма;
                    // Извлекаем реквизиты платежного поручения
                    НомПлатежки = ВыборкаПлатежей.НомерДокВходящий;
                    ДатаПлатежки = ВыборкаПлатежей.ДатаДокВходящий;
                    
                    ТекстПлатежек = ТекстПлатежек + "п/п № " + НомПлатежки + " от " + Формат(ДатаПлатежки, "ДДДММГГГГ") + "; ";
                    СуммаКРаспределению = СуммаКРаспределению - СуммаПлатежа;
                КонецЕсли;
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;
    
    Возврат ТекстПлатежек;
КонецФункции

---

Метод 2. Использование штатного реквизита «КредДокумент»

Рассмотрим подробнее встроенные механизмы конфигурации «Торговля и Склад». В ТиС зачет авансов может производиться в разрезе конкретных документов-оснований (например, по счетам или заказам покупателей). Для этого в структуре регистров взаиморасчетов существует специальное измерение (или реквизит) — КредДокумент (кредитовый документ).

Если в вашей компании менеджеры и бухгалтеры ведут учет дисциплинированно и разносят оплаты строго под конкретные заказы:

В этом случае в коде печатной формы УПД достаточно напрямую обратиться к значению поля КредДокумент текущей реализации или связанного заказа. Нам не нужно запускать тяжелые циклы перебора движений регистров — мы мгновенно получаем ссылку на конкретную выписку банка.

Но будьте осторожны: как справедливо отмечают практикующие специалисты на форумах, идеальный порядок во взаиморасчетах «документ-в-документ» в реальной жизни — это огромная редкость. Достаточно одному бухгалтеру разнести платеж «на договор в целом», как вся цепочка автоматического поиска через КредДокумент ломается.

---

Метод 3. Полуавтоматический выбор через внешнюю форму (ERT)

Что делать, если автоматика сбоит из-за бардака в учете, а сдавать отчетность и выдавать красивые УПД клиентам нужно уже сейчас? Для этого отлично подходит компромиссный вариант — внешняя печатная форма с диалоговым окном.

Разберем по шагам, как работает такое решение:

  1. Пользователь в документе Реализация нажимает кнопку «Печать УПД».
  2. Вместо мгновенного вывода таблицы на экран запускается алгоритм внешней обработки (с расширением .ert), который открывает небольшое модальное окно.
  3. В этом окне пользователю показывается список всех нераспределенных платежей данного контрагента (строки выписок, ПКО) за последнее время.
  4. Бухгалтер просто отмечает галочками те платежи, которые он хочет зачесть под эту конкретную отгрузку.
  5. После нажатия кнопки «ОК» выбранные номера и даты платежек красиво уходят в строку 5 печатной формы УПД.

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

---

Как победить проблему «заднего числа» при разноске выписок

Выясним причину еще одной классической боли оптовой торговли. Продукция со склада отгружается клиенту «здесь и сейчас» (например, в 11:00 утра), а выписку из банка за вчерашний день бухгалтерия загрузит и проведет только после обеда или вообще на следующий день. На момент выписки УПД программа «не видит» аванса, хотя фактически деньги уже на счету.

Для минимизации этой проблемы мы рекомендуем внедрить следующие организационно-технические правила:

Используя предложенные методики, вы сможете безболезненно внедрить корректную печать УПД с зачетом авансовых платежей даже на такой заслуженной платформе, как «1С:Предприятие 7.7».

← На главную