Как подсчитать количество драгоценных материалов в составе основных средств в запросе 1С

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При разработке отчетов по учету драгоценных металлов (приход, расход, остатки) в конфигурации 1С:Бухгалтерия 3.0 программисты часто сталкиваются со специфической проблемой. Драгметаллы не учитываются как самостоятельные материальные ценности на стандартных счетах учета (например, на 10 счете), а входят в компонентный состав конкретных основных средств (ОС). Сведения о них хранятся исключительно в табличной части справочника ОсновныеСредства.

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

Методологический тупик: почему запрос возвращает неверные данные?

Прежде чем переходить к написанию кода, проанализируем методологию учета основных средств в системе 1С. В программе «1С:Бухгалтерия» на счете 01 «Основные средства» принципиально отсутствует количественный учет. Учет ведется строго в разрезе инвентарных объектов. Это диктует следующее правило:

Один инвентарный номер = один уникальный элемент справочника «Основные средства».

Если предприятие приобретает и принимает на учет 5 абсолютно одинаковых станков, то в справочнике ОсновныеСредства должно быть создано 5 разных элементов. У каждого из них будет свое наименование (или одинаковое наименование, но разные коды) и свой уникальный инвентарный номер. Соответственно, при проведении документа «Принятие к учету ОС» в регистр сведений СостоянияОСОрганизаций запишется 5 отдельных строк — по одной на каждую уникальную ссылку ОС.

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

Однако на практике пользователи часто допускают грубые методологические ошибки:

  1. Использование одной карточки ОС для нескольких объектов. Пользователи создают один элемент «Станок №1» и пытаются принять его к учету несколько раз в разных документах или несколькими строками. Это ломает логику работы регистров сведений, так как измерением в СостоянияОСОрганизаций является само «Основное средство». Срез последних по этому регистру всегда вернет только одно (последнее) состояние для этой ссылки.
  2. Заполнение драгметаллов только в «шаблоне». Пользователи создают 5 разных карточек ОС, но заполняют табличную часть «Драгоценные материалы» только в первой («эталонной») карточке, оставляя остальные четыре пустыми. В результате запрос находит металл только в одном объекте из пяти.

Рассмотрим способы решения этой проблемы для каждого из сценариев.

Решение №1. Исправление ошибки со «Срезом последних» на границах периода

Прежде чем приступать к расчету количества, необходимо устранить классическую ошибку в логике получения остатков, на которую указали в обсуждении. При использовании виртуальной таблицы СрезПоследних с параметром &НачалоПериода, платформа 1С включает в выборку данные, записанные ровно в эту секунду. Это приводит к тому, что движения, совершенные в первую секунду периода, попадают и в начальный остаток, и в обороты за период, удваивая или искажая данные.

Чтобы избежать этой ошибки, во встроенном языке при установке параметров запроса необходимо использовать объект Граница с типом Исключая. Рассмотрим пример правильной передачи параметров:


// Во встроенном языке перед выполнением запроса:
ГраницаНачала = Новый Граница(ПараметрыОтчета.НачалоПериода, ГраницаТипа.Исключая);
ГраницаКонца = Новый Граница(ПараметрыОтчета.КонецПериода, ГраницаТипа.Включая);

Запрос.УстановитьПараметр("НачалоПериода", ГраницаНачала);
Запрос.УстановитьПараметр("КонецПериода", ГраницаКонца);

В самом запросе получение начального остатка будет выглядеть стандартно, но благодаря объекту Граница виртуальная таблица получит срез строго на последнюю секунду предыдущего периода:


ВЫБРАТЬ
    СостоянияОСОрганизацийСрезПоследних.ОсновноеСредство КАК ОсновноеСредство
ПОМЕСТИТЬ ВТОСНаНачало
ИЗ
    РегистрСведений.СостоянияОСОрганизаций.СрезПоследних(&НачалоПериода, ) КАК СостоянияОСОрганизацийСрезПоследних
ГДЕ
    СостоянияОСОрганизацийСрезПоследних.Состояние = ЗНАЧЕНИЕ(Перечисление.СостоянияОС.ПринятоКУчету)

Решение №2. Получение количества ОС через документы-регистраторы

Если пользователи ведут учет с нарушениями и приходуют несколько физических единиц оборудования на один и тот же элемент справочника ОсновныеСредства, нам придется обратиться к документам-регистраторам, которые зафиксировали движение, и вытащить реальное количество оборудования из их табличных частей (например, со счета 08.04 «Приобретение объектов основных средств» до момента их ввода в эксплуатацию).

Рассмотрим, как связать состояние ОС с табличной частью документа принятия к учету:


ВЫБРАТЬ
    СостоянияОС.ОсновноеСредство КАК ОсновноеСредство,
    // Получаем реальное количество оборудования из документа-регистратора
    ВЫРАЗИТЬ(СостоянияОС.Регистратор КАК Документ.ПринятиеКУчетуОС).Оборудование.Количество КАК КоличествоИзДокумента
ПОМЕСТИТЬ ВТОСРеальноеКоличество
ИЗ
    РегистрСведений.СостоянияОСОрганизаций КАК СостоянияОС
ГДЕ
    СостоянияОС.Период МЕЖДУ &НачалоПериода И &КонецПериода
    И СостоянияОС.Состояние = ЗНАЧЕНИЕ(Перечисление.СостоянияОС.ПринятоКУчету)

Затем полученное количество мы можем перемножить на массу драгметалла из карточки этого ОС:


ВЫБРАТЬ
    ВТОСРеальноеКоличество.ОсновноеСредство КАК ОсновноеСредство,
    ДрагМеталлы.ДрагоценныйМатериал КАК ДрагоценныйМатериал,
    СУММА(ВТОСРеальноеКоличество.КоличествоИзДокумента * ДрагМеталлы.Количество) КАК ВсегоДрагметалла
ИЗ
    ВТОСРеальноеКоличество КАК ВТОСРеальноеКоличество
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ОсновныеСредства.ДрагоценныеМатериалы КАК ДрагМеталлы
        ПО ВТОСРеальноеКоличество.ОсновноеСредство = ДрагМеталлы.Ссылка
ГРУППИРОВАТЬ ПО
    ВТОСРеальноеКоличество.ОсновноеСредство,
    ДрагМеталлы.ДрагоценныйМатериал

Решение №3. Метод «Эталонной карточки» (группировка по наименованию)

Рассмотрим вторую частую ситуацию: в базе создано 5 разных элементов справочника (например, «Станок №1» с инвентарными номерами от 001 до 005), но табличная часть с драгметаллами заполнена только в самом первом элементе. Остальные четыре карточки пустые.

Чтобы решить эту задачу в запросе, мы можем сгруппировать основные средства по их наименованию, найти «эталонный» элемент (где заполнена табличная часть драгметаллов), посчитать общее количество принятых ОС с таким наименованием и умножить на вес металла из эталона.

Проанализируем пошагово построение такого запроса:


// Шаг 1: Находим все принятые к учету ОС за период и группируем их по наименованию
ВЫБРАТЬ
    СостоянияОС.ОсновноеСредство.Наименование КАК НаименованиеОС,
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ СостоянияОС.ОсновноеСредство) КАК КоличествоОС
ПОМЕСТИТЬ ВТ_КоличествоОС
ИЗ
    РегистрСведений.СостоянияОСОрганизаций КАК СостоянияОС
ГДЕ
    СостоянияОС.Период МЕЖДУ &НачалоПериода И &КонецПериода
    И СостоянияОС.Состояние = ЗНАЧЕНИЕ(Перечисление.СостоянияОС.ПринятоКУчету)
ГРУППИРОВАТЬ ПО
    СостоянияОС.ОсновноеСредство.Наименование
ИНДЕКСИРОВАТЬ ПО
    НаименованиеОС
;

// Шаг 2: Находим "эталонные" карточки драгметаллов для каждого наименования ОС.
// Мы берем МАКСИМУМ по ссылке ОС, у которого заполнена ТЧ драгметаллов.
ВЫБРАТЬ
    ДрагМеталлы.Ссылка.Наименование КАК НаименованиеОС,
    ДрагМеталлы.ДрагоценныйМатериал КАК ДрагоценныйМатериал,
    МАКСИМУМ(ДрагМеталлы.Количество) КАК КоличествоНаЕдиницу
ПОМЕСТИТЬ ВТ_ДрагметаллыЭталон
ИЗ
    Справочник.ОсновныеСредства.ДрагоценныеМатериалы КАК ДрагМеталлы
ГРУППИРОВАТЬ ПО
    ДрагМеталлы.Ссылка.Наименование,
    ДрагМеталлы.ДрагоценныйМатериал
ИНДЕКСИРОВАТЬ ПО
    НаименованиеОС
;

// Шаг 3: Соединяем количество принятых ОС с весом из "эталонной" карточки
ВЫБРАТЬ
    ВТ_КоличествоОС.НаименованиеОС КАК ОсновноеСредство,
    ВТ_ДрагметаллыЭталон.ДрагоценныйМатериал КАК ДрагоценныйМатериал,
    (ВТ_КоличествоОС.КоличествоОС * ВТ_ДрагметаллыЭталон.КоличествоНаЕдиницу) КАК ИтоговыйВес
ИЗ
    ВТ_КоличествоОС КАК ВТ_КоличествоОС
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ДрагметаллыЭталон КАК ВТ_ДрагметаллыЭталон
        ПО ВТ_КоличествоОС.НаименованиеОС = ВТ_ДрагметаллыЭталон.НаименованиеОС

Альтернативные и системные решения проблемы

Важно понимать, что в типовой конфигурации «1С:Бухгалтерия 3.0» табличная часть «Драгоценные материалы» в справочнике ОС носит исключительно справочный характер. Она предназначена только для вывода информации в печатные формы (например, инвентарную карточку ОС-6). Полноценного контура учета движения драгметаллов (приход, расход, перемещение) в БП 3.0 "из коробки" нет.

Если перед вами стоит задача регулярного и строгого контроля за оборотом драгметаллов, стандартных запросов к справочнику будет недостаточно по следующим причинам:

Рекомендуемые альтернативы:

  1. Использование расширения конфигурации. Вы можете создать расширение, в которое добавите собственный забалансовый регистр накопления (например, НаличиеДрагоценныхМатериалов). При проведении документов принятия к учету, модернизации или списания основных средств, подписка на события будет делать соответствующие движения по этому регистру. Отчет по драгметаллам в этом случае будет строиться мгновенно и со 100% точностью по стандартным виртуальным таблицам остатков и оборотов.
  2. Переход на специализированные решения. Если учет драгметаллов является ключевым бизнес-процессом предприятия, стоит рассмотреть конфигурации 1С:ERP Управление предприятием или 1С:Бухгалтерия государственного учреждения (БГУ 2.0). В этих программных продуктах подсистема учета драгметаллов в составе НФА (нефинансовых активов) является типовой и содержит все необходимые регистры и механизмы отчетности.

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

← На главную