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