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