Как вывести в печатную форму данные о задолженности клиента в 1С:Управление торговлей 11?

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

При работе в 1С:Управление торговлей 11 (УТ 11) часто возникает потребность отображать актуальную информацию о задолженности клиента непосредственно в печатных формах документов, таких как расходная накладная (реализация товаров и услуг). Это позволяет менеджерам, клиентам и другим заинтересованным сторонам мгновенно видеть состояние взаиморасчетов, что способствует более эффективному контролю и принятию решений. Мы рассмотрим, как можно реализовать эту функциональность, используя регистры накопления для получения данных о долге и различные подходы к модификации печатных форм.

Добавление информации о долге клиента в печатную форму – это задача, которая требует понимания структуры данных в 1С и принципов работы с макетами и запросами. Мы проанализируем два основных способа получения данных о задолженности: с учетом текущего документа и общий долг на текущий момент. Также обсудим, каким образом корректно внести изменения в конфигурацию для их отображения.

1. Подходы к реализации изменений в печатных формах

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

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

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

2. Как получить данные о задолженности клиента

Для получения данных о задолженности клиента в 1С:УТ 11 используются регистры накопления, в частности, РасчетыСКлиентами. Этот регистр хранит информацию о взаиморасчетах с покупателями.

2.1. Вариант 1: Задолженность с учетом текущего документа (ОстаткиИОбороты)

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

Мы разберем по шагам, как это сделать, используя код, приведенный в исходной теме:

  1. Определение области макета: Прежде всего, нам нужно определить, куда будет выводиться информация о долге. В макете печатной формы документа необходимо создать новую ячейку (или использовать существующую, но добавить в нее параметр) для отображения долга. Предположим, вы добавили параметр с именем ДолгИнфа в нужную область макета, например, в область "Покупатель" или "Подвал".
  2. Создание запроса к регистру РасчетыСКлиентами.ОстаткиИОбороты: Мы формируем запрос, который выберет конечный остаток по сумме взаиморасчетов для конкретного контрагента на определенную дату.
  3. 
    Запрос2 = Новый Запрос(
        "ВЫБРАТЬ
        |    РасчетыСКлиентамиОстаткиИОбороты.СуммаКонечныйОстаток КАК СуммаКонечныйОстаток,
        |    РасчетыСКлиентамиОстаткиИОбороты.АналитикаУчетаПоПартнерам КАК АналитикаУчетаПоПартнерам,
        |    РасчетыСКлиентамиОстаткиИОбороты.Регистратор КАК Регистратор
        |ИЗ
        |    РегистрНакопления.РасчетыСКлиентами.ОстаткиИОбороты(, , Регистратор, Движения, ) КАК РасчетыСКлиентамиОстаткиИОбороты
        |ГДЕ
        |    РасчетыСКлиентамиОстаткиИОбороты.АналитикаУчетаПоПартнерам.Контрагент = &Контрагент
        |    И РасчетыСКлиентамиОстаткиИОбороты.Период = &Регистратор"
    );
    

Мы выбираем СуммаКонечныйОстаток, который и будет представлять собой долг или предоплату. Важно, что мы используем параметр Регистратор для периода запроса, чтобы учесть движения, сформированные текущим документом.


Запрос2.УстановитьПараметр("Контрагент", ДанныеПечати.Получатель);
Запрос2.УстановитьПараметр("Регистратор", ДанныеПечати.Дата);

Здесь ДанныеПечати.Получатель – это контрагент, для которого мы рассчитываем долг, а ДанныеПечати.Дата – это дата документа.


Результат2 = Запрос2.Выполнить();
ВыборкаДетальныеЗаписи2 = Результат2.Выбрать();

Если ВыборкаДетальныеЗаписи2.Следующий() Тогда
    КонечныйДолг = ВыборкаДетальныеЗаписи2.СуммаКонечныйОстаток;
    Если КонечныйДолг < 0 Тогда
        ОбластьМакета.Параметры.ДолгИнфа = "Предоплата контрагента с учетом этой накладной составляет " + (-1)*КонечныйДолг + " руб.";
    Иначе
        ОбластьМакета.Параметры.ДолгИнфа = "Задолженность контрагента с учетом этой накладной составляет " + КонечныйДолг + " руб.";
    КонецЕсли;
Иначе
    ОбластьМакета.Параметры.ДолгИнфа = "";
КонецЕсли;

Обратите внимание, что мы используем (-1)*КонечныйДолг для вывода положительного значения предоплаты.

Пример неверного порядка:


// ... получение ОбластьМакета "Покупатель" ...
// ... присвоение других параметров ...
ТабличныйДокумент.Вывести(ОбластьМакета); // Область вывелась без данных о долге
// ... запрос на получение долга и присвоение ОбластьМакета.Параметры.ДолгИнфа ...

Правильный порядок:


// ... получение ОбластьМакета "Покупатель" ...
// ... присвоение других параметров ...
// --- Запрос на получение долга ---
Запрос2 = Новый Запрос(...);
Запрос2.УстановитьПараметр(...);
Результат2 = Запрос2.Выполнить();
ВыборкаДетальныеЗаписи2 = Результат2.Выбрать();
Если ВыборкаДетальныеЗаписи2.Следующий() Тогда
    КонечныйДолг = ВыборкаДетальныеЗаписи2.СуммаКонечныйОстаток;
    // ... формирование строки ДолгИнфа ...
    ОбластьМакета.Параметры.ДолгИнфа = "...";
Иначе
    ОбластьМакета.Параметры.ДолгИнфа = "";
КонецЕсли;
// --- Вывод области после того, как все параметры заполнены ---
ТабличныйДокумент.Вывести(ОбластьМакета);

Этот нюанс является ключевым для успешного отображения данных.

2.2. Вариант 2: Общий текущий долг клиента (Остатки)

Второй подход, предложенный в сообщении 26, позволяет вывести общий долг клиента на текущий момент времени, независимо от того, как текущий документ влияет на этот долг. Это может быть полезно, если вы хотите показать общую картину взаиморасчетов, а не только долг с учетом конкретной накладной. Для этого мы используем виртуальную таблицу Остатки регистра РасчетыСКлиентами.

Мы рассмотрим шаги для реализации этого варианта:

  1. Определение области макета: Аналогично первому варианту, в макете печатной формы необходимо создать параметр для отображения общего долга. В примере из форума это ОбщийДолгКлиента, расположенный в области "ПодвалТаблицыДолг".
  2. Создание запроса к регистру РасчетыСКлиентами.Остатки: Мы формируем запрос, который выберет текущий остаток по взаиморасчетам.
  3. 
    ЗапросДолга = Новый Запрос(
        "ВЫБРАТЬ
        |    РасчетыСКлиентамиОстатки.АналитикаУчетаПоПартнерам.Контрагент КАК АналитикаУчетаПоПартнерамКонтрагент,
        |    РасчетыСКлиентамиОстатки.КОплатеОстаток КАК Долг
        |ИЗ
        |    РегистрНакопления.РасчетыСКлиентами.Остатки КАК РасчетыСКлиентамиОстатки
        |ГДЕ
        |    РасчетыСКлиентамиОстатки.АналитикаУчетаПоПартнерам.Контрагент = &Контрагент"
    );
    

Здесь мы выбираем КОплатеОстаток, который представляет собой сумму, подлежащую оплате (или предоплату). Если вам нужен остаток по суммам, которые уже проведены по учету, можно использовать СуммаОстаток. Выбор конкретного поля зависит от настроек учета и требуемой детализации.

ЗапросДолга.УстановитьПараметр("Контрагент", ДанныеПечати.Получатель);


РезультатЗапросаДолга = ЗапросДолга.Выполнить();
ВыборкаДляДолга = РезультатЗапросаДолга.Выбрать();

Если ВыборкаДляДолга.Следующий() Тогда
    ИтоговыйДолг = ВыборкаДляДолга.Долг;
Иначе
    ИтоговыйДолг = "- ";
КонецЕсли;

ОбластьПодвалТаблицыДолг.Параметры.ОбщийДолгКлиента = ИтоговыйДолг + " ";
ТабличныйДокумент.Вывести(ОбластьПодвалТаблицыДолг);

Как и в предыдущем случае, убедитесь, что вызов ТабличныйДокумент.Вывести(ОбластьПодвалТаблицыДолг); происходит после того, как параметр ОбщийДолгКлиента заполнен.

3. Важные аспекты учета и настройки

Для корректного отображения задолженности необходимо учитывать несколько ключевых факторов, влияющих на регистр РасчетыСКлиентами и его работу:

  1. Детализация учета взаиморасчетов: В 1С:УТ 11 взаиморасчеты могут вестись с разной степенью детализации.
    • По партнерам и контрагентам: Чаще всего это основной уровень. АналитикаУчетаПоПартнерам.Контрагент в запросах позволяет получить долг именно по юридическому лицу.
    • По договорам: Если в вашей системе настроен учет взаиморасчетов по договорам, то запрос должен быть дополнен условием по конкретному договору. Например, РасчетыСКлиентамиОстатки.Договор = &Договор.
    • По заказам: При учете по заказам долг может быть детализирован до уровня каждого заказа клиента.
    • По расчетным документам: Наиболее детальный уровень, когда каждый документ оплаты или отгрузки является отдельной статьей взаиморасчетов.

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

  2. Мультивалютный учет: 1С:УТ 11 поддерживает учет взаиморасчетов в различных валютах. Регистр РасчетыСКлиентами может хранить суммы как в валюте взаиморасчетов, так и в валюте управленческого учета (например, рубли). Поля СуммаОстаток, КОплатеОстаток, СуммаКонечныйОстаток обычно представляют сумму в валюте управленческого учета. Если вам нужна сумма в валюте документа, потребуется использовать соответствующее поле (например, СуммаВзаиморасчетовОстаток или СуммаВзаиморасчетовКонечныйОстаток) и добавить условие по валюте.
  3. Новый режим взаиморасчетов (УТ 11.5 и выше): В более поздних версиях 1С:УТ (начиная с 11.5) был введен новый режим ведения взаиморасчетов. Этот режим изменяет логику формирования движений по регистрам и может влиять на то, какие поля следует использовать в запросах. В новом режиме накладные всегда сначала образуют "долг", а затем производится зачет аванса, уменьшая "долг" и "предоплату". Мы должны учитывать эту специфику, если работаем с обновленными конфигурациями.
  4. Просроченная задолженность: Иногда помимо общего долга требуется вывести информацию о просроченной задолженности. В типовой УТ 11 для этого существуют специализированные отчеты ("Задолженность клиентов по срокам"). Реализация аналогичной логики в печатной форме будет более сложной и потребует дополнительных запросов с анализом сроков оплаты, но это выходит за рамки текущей задачи.

4. Рекомендации по отладке и проверке

В процессе разработки всегда будут возникать вопросы и ошибки. Мы рекомендуем использовать стандартные средства отладки 1С:

  1. Использование отладчика: Установите точки останова в коде перед выполнением запроса, после его выполнения и перед выводом области. Это позволит пошагово отследить значения параметров запроса (&Контрагент, &Регистратор), результат выполнения запроса, значения выборки (КонечныйДолг) и финальную строку (ДолгИнфа). Мы сможем увидеть, на каком этапе данные не заполняются или заполняются некорректно.
  2. Вывод служебных сообщений: В процессе отладки используйте функцию Сообщить() для вывода промежуточных значений. Например:
  3. 
    Сообщить("Параметр Контрагент: " + Запрос2.Параметры.Контрагент);
    Сообщить("Параметр Регистратор: " + Запрос2.Параметры.Регистратор);
    // ...
    Сообщить("КонечныйДолг: " + КонечныйДолг);
    Сообщить("Строка ДолгИнфа: " + ОбластьМакета.Параметры.ДолгИнфа);
    

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

Заключение

Мы подробно рассмотрели, как добавить информацию о задолженности клиента в печатную форму в 1С:Управление торговлей 11. Используя запросы к регистру РасчетыСКлиентами и правильно управляя порядком вывода областей макета, мы можем получить и отобразить как долг с учетом текущего документа, так и общий текущий долг клиента. Всегда помните о методах расширения конфигурации или внешних печатных формах для внесения изменений, чтобы обеспечить легкую обновляемость вашей информационной системы. Мы надеемся, что это пошаговое руководство поможет вам успешно реализовать данную функциональность в ваших проектах.

← На главную