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