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