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