При работе в конфигурации 1С:Управление производственным предприятием (УПП) редакции 1.3 пользователи и разработчики часто сталкиваются со спецификой ведения взаиморасчетов. Один из наиболее острых вопросов — автоматический зачет авансов в управленческом и регламентированном учете, когда в договоре контрагента включена детализация «По документам расчетов с контрагентами». Рассмотрим подробно, почему типовой механизм ведет себя именно так, какие подводные камни ожидают пользователей и как решить эту проблему с помощью программных доработок.
Для того чтобы понять логику программы, проанализируем, как влияют настройки договора контрагента на поведение системы проведения документов отгрузки (например, РеализацияТоваровУслуг):
Таким образом, автоматического фонового распределения авансов «на лету» при проведении накладных в режиме детализации по документам расчетов в 1С:УПП не предусмотрено. Пользователь обязан вручную нажимать кнопку «Заполнить» на вкладке «Предоплата» в каждом документе продажи.
Часто у начинающих специалистов возникает иллюзия, что запуск групповой обработки восстановления расчетов сможет автоматически закрыть зависшие авансы. Выясним причину, почему это не так:
Если проигнорировать ручное заполнение вкладки «Предоплата» при активной детализации по документам расчетов, мы получим целый букет системных ошибок:
ВзаиморасчетыСКонтрагентами и РасчетыСКонтрагентами) по одному и тому же договору будут одновременно висеть дебетовый остаток по накладной и кредитовый остаток по платежке. Взаимного закрытия не произойдет.Рассмотрим несколько эффективных способов решения этой проблемы, начиная от организационных и заканчивая программными доработками системы.
Если бизнес-процессы предприятия позволяют, проанализируем возможность изменения аналитики ведения взаиморасчетов. Настройка «По заказам» является компромиссным вариантом. В этом режиме программа автоматически сопоставляет оплаты и отгрузки в рамках конкретного заказа покупателя, избавляя пользователей от необходимости ручного указания платежных документов в каждой накладной.
Самым популярным решением среди разработчиков является доработка проведения документов. Мы можем внедрить алгоритм, который при записи или проведении документа РеализацияТоваровУслуг будет автоматически опрашивать остатки по регистру расчетов и заполнять табличную часть Предоплата.
Рассмотрим пример кода, который можно интегрировать в модуль документа РеализацияТоваровУслуг (или в соответствующий общий модуль подписки на события ПередЗаписью / ОбработкаПроведения):
Процедура АвтозаполнениеПредоплатыПриПроведении(ДокументОбъект) Экспорт
// Проверяем, ведется ли расчет по документам
Если Не ДокументОбъект.ДоговорКонтрагента.ВестиПоДокументамРасчетовСКонтрагентами Тогда
Возврат;
КонецЕсли;
// Очищаем старую предоплату перед перезаполнением
ДокументОбъект.Предоплата.Очистить();
// Формируем запрос для получения свободных авансов по ФИФО
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Расчеты.ДокументРасчетовСКонтрагентом КАК ДокументОплаты,
| Расчеты.СуммаВзаиморасчетовОстаток КАК ОстатокАванса
|ИЗ
| РегистрНакопления.РасчетыСКонтрагентами.Остатки(&Период,
| ДоговорКонтрагента = &ДоговорКонтрагента
| И Организация = &Организация
| И Контрагент = &Контрагент
| И ВидУсловийДоговора = ЗНАЧЕНИЕ(Перечисление.ВидыУсловийДоговоровВзаиморасчетов.Предоплата)
| ) КАК Расчеты
|УПОРЯДОЧИТЬ ПО
| Расчеты.ДокументРасчетовСКонтрагентом.Дата ВОЗР";
Запрос.УстановитьПараметр("Период", Новый Граница(ДокументОбъект.МоментВремени(), ВидГраницы.Исключая));
Запрос.УстановитьПараметр("ДоговорКонтрагента", ДокументОбъект.ДоговорКонтрагента);
Запрос.УстановитьПараметр("Организация", ДокументОбъект.Организация);
Запрос.УстановитьПараметр("Контрагент", ДокументОбъект.Контрагент);
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
Возврат; // Авансов нет
КонецЕсли;
ОсталосьРаспределить = ДокументОбъект.СуммаДокумента;
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() И ОсталосьРаспределить > 0 Цикл
СуммаКЗачету = Мин(ОсталосьРаспределить, Выборка.ОстатокАванса);
НоваяСтрока = ДокументОбъект.Предоплата.Добавить();
НоваяСтрока.ДокументРасчетовСКонтрагентом = Выборка.ДокументОплаты;
НоваяСтрока.СуммаВзаиморасчетов = СуммаКЗачету;
// При необходимости конвертируем сумму в валюту регламентированного учета
НоваяСтрока.СуммаРегл = СуммаКЗачету * ДокументОбъект.КурсВзаиморасчетов / ДокументОбъект.КратностьВзаиморасчетов;
ОсталосьРаспределить = ОсталосьРаспределить - СуммаКЗачету;
КонецЦикла;
КонецПроцедуры
Важно: Приведенный алгоритм является упрощенным и базовым. В реальных базах необходимо также учитывать валюту договора, валюту взаиморасчетов и корректно рассчитывать рублевые эквиваленты (поле СуммаРегл и СуммаСценария для упр. учета) с учетом исторических курсов на дату аванса.
Если вы не хотите вносить изменения в типовую конфигурацию и снимать ее с поддержки, разберем альтернативный вариант — создание внешней обработки. Этот инструмент запускается периодически (например, раз в месяц перед процедурой закрытия периода).
Схема работы такой обработки выглядит следующим образом:
Такой подход позволяет сохранить конфигурацию полностью типовой, что существенно облегчает процесс последующих обновлений.
Выбор конкретного пути автоматизации зависит от масштаба базы данных, объема документооборота и квалификации ИТ-специалистов на вашем предприятии. Внедрение любого из предложенных вариантов автоматизации полностью решает проблему рутинного заполнения документов и сводит к минимуму риск возникновения ошибок в учете НДС и взаиморасчетов.