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