Как реализовать печать банковской выписки в 1С:Управление производственным предприятием 1.3?

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

В отличие от конфигурации «1С:Бухгалтерия предприятия», где банковская выписка представлена удобным списком с возможностью быстрой отправки на печать, в «1С:Управление производственным предприятием 1.3» (УПП) отсутствует отдельный документ «Банковская выписка» и соответствующая стандартная кнопка печати. В УПП операции по расчетным счетам регистрируются разрозненными документами: платежными поручениями и платежными ордерами. Из-за этого у бухгалтеров регулярно возникает потребность в получении единого бумажного реестра за день.

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

Почему в УПП 1.3 нет стандартной кнопки «Печать выписки»?

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

Сама выписка в системе выступает лишь в роли технологической обработки «Клиент-банк», которая служит для импорта/экспорта платежных документов из текстовых файлов банковских выгрузок. Физического документа «Выписка банка», который хранил бы в себе табличную часть со всеми операциями за день, в системе просто нет. Соответственно, и распечатать «Выписку» напрямую одной кнопкой не представляется возможным.

Вариант №1. Печать выписки штатными средствами без программирования

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

Способ А. Использование обработки «Выписка банка» и вывод списка

Рассмотрим этот наиболее близкий к желаемому результат метод по шагам:

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

Способ Б. Карточка счета 51

Еще один популярный среди бухгалтеров метод — формирование стандартного отчета «Карточка счета»:

  1. Откроем отчет «Карточка счета».
  2. Установим период (конкретный день) и выберем счет 51 (или 52 для валютных операций).
  3. В настройках отчета добавим отбор по субконто Банковские счета, указав интересующий нас расчетный счет организации.
  4. Сформируем отчет. Мы получим строгий регламентированный документ с начальным остатком, списком проводок и конечным остатком. Главный минус такого подхода — отсутствие вывода текстового поля «Назначение платежа» в удобном и читаемом формате по умолчанию.

Вариант №2. Разработка собственного отчета на СКД

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

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

Проанализируем структуру оптимального запроса для СКД. Будем использовать виртуальную таблицу остатков и оборотов регистра накопления ДенежныеСредстваБезналичные.ОстаткиИОбороты. Нам потребуется связать ее левым соединением со всеми четырьмя возможными типами документов оплаты.

Рассмотрим пример построения запроса в конструкторе:


ВЫБРАТЬ
    ДС.Период КАК ДатаДвижения,
    ДС.БанковскийСчетОрганизации КАК БанковскийСчет,
    ДС.Регистратор КАК Регистратор,
    ДС.СуммаПриход КАК Приход,
    ДС.СуммаРасход КАК Расход,
    ДС.СуммаНачальныйОстаток КАК НачальныйОстаток,
    ДС.СуммаКонечныйОстаток КАК КонечныйОстаток,
    ВЫБОР
        КОГДА ДС.Регистратор ССЫЛКА Документ.ПлатежноеПоручениеВходящее 
            ТОГДА ВЫРАЗИТЬ(ДС.Регистратор КАК Документ.ПлатежноеПоручениеВходящее).НазначениеПлатежа
        КОГДА ДС.Регистратор ССЫЛКА Документ.ПлатежноеПоручениеИсходящее 
            ТОГДА ВЫРАЗИТЬ(ДС.Регистратор КАК Документ.ПлатежноеПоручениеИсходящее).НазначениеПлатежа
        КОГДА ДС.Регистратор ССЫЛКА Документ.ПлатежныйОрдерПоступлениеДенежныхСредств 
            ТОГДА ВЫРАЗИТЬ(ДС.Регистратор КАК Документ.ПлатежныйОрдерПоступлениеДенежныхСредств).НазначениеПлатежа
        КОГДА ДС.Регистратор ССЫЛКА Документ.ПлатежныйОрдерСписаниеДенежныхСредств 
            ТОГДА ВЫРАЗИТЬ(ДС.Регистратор КАК Документ.ПлатежныйОрдерСписаниеДенежныхСредств).НазначениеПлатежа
        ИНАЧЕ ""
    КОНЕЦ КАК НазначениеПлатежа,
    ВЫБОР
        КОГДА ДС.Регистратор ССЫЛКА Документ.ПлатежноеПоручениеВходящее 
            ТОГДА ВЫРАЗИТЬ(ДС.Регистратор КАК Документ.ПлатежноеПоручениеВходящее).Контрагент
        КОГДА ДС.Регистратор ССЫЛКА Документ.ПлатежноеПоручениеИсходящее 
            ТОГДА ВЫРАЗИТЬ(ДС.Регистратор КАК Документ.ПлатежноеПоручениеИсходящее).Контрагент
        КОГДА ДС.Регистратор ССЫЛКА Документ.ПлатежныйОрдерПоступлениеДенежныхСредств 
            ТОГДА ВЫРАЗИТЬ(ДС.Регистратор КАК Документ.ПлатежныйОрдерПоступлениеДенежныхСредств).Контрагент
        КОГДА ДС.Регистратор ССЫЛКА Документ.ПлатежныйОрдерСписаниеДенежныхСредств 
            ТОГДА ВЫРАЗИТЬ(ДС.Регистратор КАК Документ.ПлатежныйОрдерСписаниеДенежныхСредств).Контрагент
        ИНАЧЕ НЕОПРЕДЕЛЕНО
    КОНЕЦ КАК Контрагент
ИЗ
    РегистрНакопления.ДенежныеСредстваБезналичные.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, Запись, , БанковскийСчетОрганизации = &БанковскийСчет) КАК ДС

Важные особенности реализации схемы компоновки данных:

  1. Периодичность детализации: В параметрах виртуальной таблицы обязательно указываем периодичность Запись (или Регистратор). Это позволит нам получать корректные остатки на момент совершения каждой конкретной операции внутри дня и связывать строки с документами движения.
  2. Конструкция ВЫРАЗИТЬ: Обратите внимание, что обращение через точку к реквизиту НазначениеПлатежа от составного типа данных Регистратор приводит к существенному снижению производительности СУБД. Использование явного приведения типов через оператор ВЫРАЗИТЬ решает эту проблему и оптимизирует выполнение запроса.
  3. Остатки по дням: Для вывода красивой шапки "Начальный остаток на дату Х" и подвала "Конечный остаток" в настройках компоновки данных (вкладка "Настройки" -> "Ресурсы") добавим ресурсы по полям НачальныйОстаток и КонечныйОстаток с расчетом по группировке ПериодДень.

Вариант №3. Автоматизация через загрузку текстового файла

Если по какой-то причине вы не хотите делать сложные запросы к базе данных (например, если в базу заносятся не все платежные документы или они проводятся позже реального получения выписок), можно реализовать альтернативный подход. Напишем внешнюю обработку, которая будет парсить входящий файл обмена с банком формата .txt напрямую и сразу формировать красивую печатную форму.

Рассмотрим структуру парсинга текстовой выписки 1С-совместимого формата:


Функция ПрочитатьВыпискуИНапечатать(ПутьКФайлу) Экспорт
    Файл = Новый ТекстовыйДокумент;
    Файл.Прочитать(ПутьКФайлу, КодировкаТекста.ANSI);
    
    КоличествоСтрок = Файл.КоличествоСтрок();
    ТаблицаДвижений = Новый ТаблицаЗначений;
    ТаблицаДвижений.Колонки.Добавить("Дата");
    ТаблицаДвижений.Колонки.Добавить("Контрагент");
    ТаблицаДвижений.Колонки.Добавить("СуммаПриход", Новый ОписаниеТипов("Число"));
    ТаблицаДвижений.Колонки.Добавить("СуммаРасход", Новый ОписаниеТипов("Число"));
    ТаблицаДвижений.Колонки.Добавить("НазначениеПлатежа");

    ТекущаяСтрокаДокумента = Неопределено;
    
    Для НомерСтроки = 1 По КоличествоСтрок Цикл
        СтрокаТекста = СокрЛП(Файл.ПолучитьСтроку(НомерСтроки));
        
        Если Найти(СтрокаТекста, "СекцияДокумент") > 0 Тогда
            ТекущаяСтрокаДокумента = ТаблицаДвижений.Добавить();
        КонецЕсли;
        
        Если ТекущаяСтрокаДокумента <> Неопределено Тогда
            Если Найти(СтрокаТекста, "Получатель=") > 0 Тогда
                ТекущаяСтрокаДокумента.Контрагент = Сред(СтрокаТекста, Найти(СтрокаТекста, "=") + 1);
            ИначеЕсли Найти(СтрокаТекста, "Сумма=") > 0 Тогда
                Сумма = Число(Сред(СтрокаТекста, Найти(СтрокаТекста, "=") + 1));
                // Логика определения прихода/расхода зависит от вида документа в секции
            ИначеЕсли Найти(СтрокаТекста, "НазначениеПлатежа=") > 0 Тогда
                ТекущаяСтрокаДокумента.НазначениеПлатежа = Сред(СтрокаТекста, Найти(СтрокаТекста, "=") + 1);
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    
    Возврат ТаблицаДвижений;
КонецФункции

Используя этот метод, мы полностью изолируем печатную форму от возможных расхождений оперативного учета с банковской реальностью, а бухгалтерия всегда сможет получить распечатанную копию "один в один" с тем, что прислал банк.

Выбирайте наиболее удобный для вас вариант решения. Для быстрого закрытия потребности "здесь и сейчас" отлично подойдет вывод списка из стандартной обработки выписки. Для системного и красивого решения — разработка простого внешнего отчета на СКД с левыми соединениями.

← На главную