Как получить последнее состояние объекта, если данные хранятся в двух разных регистрах сведений?

Программист 1С v8.3 (Управляемые формы) Управленческий учет Промышленность, строительство и АПК
← На главную

Часто в процессе разработки на 1С возникает задача: определить последнее известное состояние объекта (например, вагона), когда история этого состояния пишется в разные регистры сведений разными документами. Напрямую соединить такие таблицы бывает сложно, а результат запроса может оказаться непредсказуемым. Давайте разберем, как подойти к решению этой задачи грамотно и профессионально.

Вариант 1: Оптимизация архитектуры (рекомендуемый путь)

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

Вариант 2: Использование временных таблиц и объединения

Если изменить структуру метаданных невозможно, воспользуемся проверенным техническим подходом с использованием ВременныхТаблиц. Суть метода заключается в приведении данных из обоих регистров к единому виду и поиску максимальной даты события.

Разберем алгоритм по шагам:

  1. Создадим две временные таблицы, выбрав из каждого регистра необходимые поля: Вагон, Период и значение (Груз или ПодГруз).
  2. С помощью оператора ОБЪЕДИНИТЬ ВСЕ сформируем итоговый набор записей, где все события по вагону будут в одном списке.
  3. Вычислим МАКСИМУМ(Период) для каждого вагона, сгруппировав результат. Это будет наш «виртуальный» срез последних.
  4. На финальном этапе соединим полученный список максимальных дат с исходными регистрами, чтобы вытянуть значения реквизитов.

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


ВЫБРАТЬ
    Вагон,
    МАКСИМУМ(Период) КАК ПоследнийПериод
ПОМЕСТИТЬ ВТ_ПоследниеДаты
ИЗ (
    ВЫБРАТЬ Вагон, Период ИЗ РегистрСведений.Налив
    ОБЪЕДИНИТЬ ВСЕ
    ВЫБРАТЬ Вагон, Период ИЗ РегистрСведений.Пропарка
) КАК ОбщиеДанные
СГРУППИРОВАТЬ ПО Вагон

Важные технические советы

При работе с такими запросами важно учитывать несколько правил:

Заключение

Мы рассмотрели два подхода: архитектурный (через один регистр) и технический (через ВременныеТаблицы). Помните, что грамотное построение модели данных на этапе проектирования — это ключ к высокой производительности системы. Если же задача требует «быстрого» решения в уже сложившейся системе, используйте метод объединения данных с последующей группировкой по максимальной дате — это самый надежный способ собрать актуальные данные из разрозненных источников.

← На главную