Как в 1С:Бухгалтерия 8.3 сделать так, чтобы в назначении платежа перечислялись все оплачиваемые счета, даже если у них один договор?

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

Часто бухгалтеры сталкиваются с ситуацией, когда при использовании помощника "Оплата поставщикам" в программе "1С:Бухгалтерия 8.3" возникает странное поведение системы. Если мы выбираем несколько счетов на оплату, относящихся к разным договорам, программа послушно перечисляет их в поле "Назначение платежа". Однако, если все выбранные счета привязаны к одному и тому же договору, в итоговом платежном поручении отображается только один, самый первый счет. Рассмотрим подробнее, почему это происходит и как мы можем это исправить.

Выясним причину проблемы в логике программы

Для начала проанализируем ситуацию. Когда мы работаем в списке документов или через обработку ОплатаПоставщикам, система собирает данные о выбранных документах и передает их в объект документа ПлатежноеПоручение. За автоматическое формирование текста назначения платежа отвечает программный код, заложенный разработчиками в модуле самого документа.

Проанализируем программный код. Нам необходимо открыть конфигуратор и найти документ ПлатежноеПоручение. Вся основная магия заполнения происходит в модуле объекта в процедуре ЗаполнитьПоМассиву(). Именно здесь система анализирует массив переданных счетов и договоров.

В типовом решении (например, релизы ветки 3.0.71 и аналогичные) разработчики заложили условие: если количество уникальных договоров в списке оплаты равно единице, то система считает излишним перечислять все счета и просто берет первый попавшийся (индекс 0 в массиве). Это сделано для экономии места, так как поле "Назначение платежа" в банковских системах ограничено 210 символами, и длинный список счетов может просто "обрезаться".

Разберем по шагам решение через изменение программного кода

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

Найдем в процедуре ЗаполнитьПоМассиву() фрагмент, который выглядит примерно так:


Если МассивТекстНазначенияСчета.Количество() = 0 Тогда
    ТекстНазначение = ТекстОплата + "по счетам";
ИначеЕсли МассивДоговоров.Количество() = 1 Тогда
    ТекстНазначение = ТекстОплата + "по счету " + МассивТекстНазначенияСчета[0];
Иначе
    ТекстНазначение = ТекстОплата + "по договорам: " + СтрСоединить(МассивТекстНазначенияДоговора, ", ");
КонецЕсли;

Как мы видим, в блоке ИначеЕсли МассивДоговоров.Количество() = 1 Тогда жестко прописано обращение к МассивТекстНазначенияСчета[0]. Чтобы программа перечисляла все счета, нам нужно изменить это условие.

Посмотрим на пример исправленного кода, который позволит выводить весь список:


ИначеЕсли МассивДоговоров.Количество() = 1 Тогда
    Если МассивТекстНазначенияСчета.Количество() > 1 Тогда
        ТекстНазначение = ТекстОплата + "по счетам: " + СтрСоединить(МассивТекстНазначенияСчета, ", ");
    Иначе
        ТекстНазначение = ТекстОплата + "по счету " + МассивТекстНазначенияСчета[0];
    КонецЕсли;

В данном случае мы использовали встроенную функцию СтрСоединить, которая объединяет все элементы массива МассивТекстНазначенияСчета в одну строку, разделяя их запятой и пробелом. Теперь, сколько бы счетов вы ни выбрали по одному договору, все они попадут в печатную форму и файл выгрузки для банка.

Применяем современный подход: использование Расширений

Вносить изменения напрямую в типовую конфигурацию — не самый лучший путь, так как это затруднит последующие обновления программы. Рассмотрим, как решить задачу с помощью Расширений конфигурации. Это позволит нам сохранить программу "на поддержке" и при этом добиться нужного результата.

  1. Создадим новое расширение в базе данных.
  2. Добавим в расширение документ ПлатежноеПоручение и его процедуру ЗаполнитьПоМассиву.
  3. Используем аннотацию &Вместо, чтобы полностью заменить логику формирования текста.

Важно помнить о безопасности! Поскольку поле "Назначение платежа" ограничено по длине, при программном перечислении всех счетов рекомендуется добавить проверку на длину результирующей строки. Рассмотрим пример безопасного формирования строки в расширении:


&Вместо("ЗаполнитьПоМассиву")
Процедура Расш_ЗаполнитьПоМассиву(МассивОбъектов)
    // Вызываем стандартную логику или пишем свою
    // ... (код сбора данных в массивы) ...
    
    // Модифицированный блок формирования текста:
    Если МассивДоговоров.Количество() = 1 И МассивТекстНазначенияСчета.Количество() > 1 Тогда
        ПолныйТекст = ТекстОплата + "по счетам: " + СтрСоединить(МассивТекстНазначенияСчета, ", ");
        // Ограничиваем длину строки 210 символами для банковских стандартов
        ТекстНазначение = Лев(ПолныйТекст, 210);
    Иначе
        // Оставляем типовое поведение для остальных случаев
        ПродолжитьВызов(МассивОбъектов);
    КонецЕсли;
КонецПроцедуры

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

Прежде чем приступать к программированию, всегда полезно проверить пользовательские настройки. В разделе "Администрирование" — "Параметры учета" — "Настройки платежных поручений" существует опция автоматического формирования текста. Проверьте, установлено ли там значение "Автоматически".

Также обратим внимание на функциональность программы (раздел "Главное"). Если в базе включен упрощенный учет, некоторые механизмы группировки данных в документах могут работать более агрессивно, "схлопывая" аналитику. Убедитесь, что используется полная функциональность, если вам требуется детальный контроль над расчетами.

Выясним нюансы работы через "Помощник оплаты"

Стоит отметить, что проблема часто локализуется именно в момент вызова команды "Оплатить — Товары и услуги" из списка счетов или документов поступления. В этот момент запускается обработка ОплатаПоставщикам. Если вы заметили, что у коллег ("у соседей") программа ведет себя иначе, возможно, у них установлена другая версия релиза или используется специализированное расширение от партнеров 1С.

В более новых релизах (3.0.100 и старше) логика формирования текста назначения платежа была частично вынесена в общие модули, такие как УчетПлатежныхПоручений. Если вы работаете на современной версии, искать причину стоит именно там, анализируя функцию СформироватьТекстНазначенияПлатежа.

Резюме

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

Основные моменты для запоминания:

← На главную