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

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

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

Анализ структуры хранения данных об условиях оплаты

Прежде чем приступать к написанию запроса, нам необходимо разобраться, где именно система хранит информацию о «плече» кредита. Проанализируем архитектуру хранения данных в типовом решении. В конфигурациях на базе Управление торговлей 11 предусмотрено два основных сценария настройки условий оплаты в соглашениях с клиентами:

  1. Использование типовых графиков оплаты: В этом случае в справочнике СоглашенияСКлиентами выбран конкретный элемент из справочника ГрафикиОплаты. Все данные о сроках и этапах находятся в табличной части Этапы этого графика.
  2. Индивидуальные условия оплаты: Если в соглашении установлена настройка «Условия оплаты: Индивидуальные», то информация о кредитных днях записывается непосредственно в табличную часть ЭтапыГрафикаОплаты самого соглашения.

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

Разбор ключевых полей для запроса

Давайте проанализируем реквизиты табличных частей, которые отвечают за расчет дней кредита. Нам важны следующие поля:

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


ВЫБРАТЬ
    СоглашенияЭтапы.Ссылка КАК Соглашение,
    СоглашенияЭтапы.Сдвиг КАК КоличествоДнейКредита,
    СоглашенияЭтапы.ВариантОплаты КАК ВариантОплаты
ИЗ
    Справочник.СоглашенияСКлиентами.ЭтапыГрафикаОплаты КАК СоглашенияЭтапы
ГДЕ
    СоглашенияЭтапы.ВариантОплаты В (ЗНАЧЕНИЕ(Перечисление.ВариантыОплатыКлиентом.КредитПослеОтгрузки))
    И СоглашенияЭтапы.Ссылка = &СсылкаНаСоглашение

Реализация логики в Системе компоновки данных (СКД)

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

Проанализируем ситуацию: если в графике оплаты указано, что дни считаются как «рабочие», обычная разность дат в запросе не сработает. Нам потребуется приплести данные регистра сведений ДанныеПроизводственногоКалендаря. В СКД это удобнее всего сделать через программную функцию.

Шаги для реализации через вычисляемое поле:

  1. Создаем в общем модуле (с флагом «Сервер», «Внешнее соединение») функцию, которая принимает ссылку на соглашение.
  2. В функции описываем логику поиска этапа кредита.
  3. В СКД на вкладке «Вычисляемые поля» добавляем новое поле и в выражении вызываем нашу функцию.

Пример кода функции для получения максимального срока кредита:


Функция ПолучитьМаксимальныйСрокКредита(СоглашениеСсылка) Экспорт
    
    Если СоглашениеСсылка.ХозяйственнаяОперация = ПредопределенноеЗначение("Перечисление.ХозяйственныеОперации.РеализацияКлиенту") Тогда
        // Проверяем, используются ли индивидуальные условия
        Если СоглашениеСсылка.ИндивидуальноеСоглашение Тогда
            Запрос = Новый Запрос;
            Запрос.Текст = 
            "ВЫБРАТЬ
            |	МАКСИМУМ(Этапы.Сдвиг) КАК Срок
            |ИЗ
            |	Справочник.СоглашенияСКлиентами.ЭтапыГрафикаОплаты КАК Этапы
            |ГДЕ
            |	Этапы.Ссылка = &Ссылка
            |	И Этапы.ВариантОплаты = ЗНАЧЕНИЕ(Перечисление.ВариантыОплатыКлиентом.КредитПослеОтгрузки)";
            
            Запрос.УстановитьПараметр("Ссылка", СоглашениеСсылка);
            Результат = Запрос.Выполнить();
            // ... возврат значения
        КонецЕсли;
    КонецЕсли;
    
    Возврат 0;
    
КонецФункции

Учет приоритета данных в документах отгрузки

Важно помнить, что в последних версиях УТ 11 / УТ 3.1 условия оплаты могут быть изменены пользователем непосредственно в документе Реализация товаров и услуг на вкладке «Этапы оплаты». Если в документе заполнена табличная часть ЭтапыГрафикаОплаты, то данные из соглашения игнорируются.

Поэтому при построении запроса для конкретной накладной, логика должна быть следующей:

  1. Проверяем наличие записей в ТЧ ЭтапыГрафикаОплаты самого документа РеализацияТоваровУслуг.
  2. Если ТЧ пуста, обращаемся к Соглашению.
  3. В соглашении проверяем, «Индивидуальные» ли это условия или используется «График оплаты».

Рассмотрим структуру запроса, учитывающего приоритет документа:


ВЫБРАТЬ
    ЕСТЬNULL(ДокументЭтапы.Сдвиг, СоглашениеЭтапы.Сдвиг) КАК ДниКредита
ИЗ
    Документ.РеализацияТоваровУслуг КАК Реализация
    ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.ЭтапыГрафикаОплаты КАК ДокументЭтапы
        ПО ДокументЭтапы.Ссылка = Реализация.Ссылка
        И ДокументЭтапы.ВариантОплаты = ЗНАЧЕНИЕ(Перечисление.ВариантыОплатыКлиентом.КредитПослеОтгрузки)
    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СоглашенияСКлиентами.ЭтапыГрафикаОплаты КАК СоглашениеЭтапы
        ПО СоглашениеЭтапы.Ссылка = Реализация.Соглашение
        И СоглашениеЭтапы.ВариантОплаты = ЗНАЧЕНИЕ(Перечисление.ВариантыОплатыКлиентом.КредитПослеОтгрузки)
ГДЕ
    Реализация.Ссылка = &ДокументСсылка

Обработка рабочих и календарных дней

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

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

Таким образом, для простого получения «надписи» с количеством дней, которую видел автор вопроса, достаточно обратиться к табличным частям ЭтапыГрафикаОплаты. Для более сложных расчетов с учетом календарей рекомендуется анализировать фактические даты платежей, сформированные документом.

← На главную