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