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