Почему не выводится сумма остатка по складу в 1С:Бухгалтерия 3.0 и как это исправить?

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

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

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

Выясняем причину: особенности складского учета в 1С

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

  1. Количественный учет. При этом режиме программа отслеживает только физическое наличие товаров на конкретных складах. Финансовая же стоимость (себестоимость) рассчитывается в целом по организации, без привязки к месту хранения. В базе данных проводки перемещения между складами делаются только в количественном выражении, а стоимостная оценка в регистре бухгалтерии по субконто «Склады» попросту не заполняется.
  2. Количественно-суммовой учет. В этом случае себестоимость списания и остатков рассчитывается индивидуально для каждого склада. В регистре «Хозрасчетный» суммы хранятся с четкой привязкой и к номенклатуре (Субконто1), и к складу (Субконто2).

Если в настройках вашей базы включен первый вариант (только количественный учет), то вытащить готовую сумму по конкретному складу из регистра стандартным запросом невозможно — ее там физически нет.

Решение 1: Изменение настроек плана счетов (административный метод)

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

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

  1. Перейдем в раздел Главное (или Администрирование, в зависимости от интерфейса) и выберем пункт Настройка плана счетов.
  2. Откроем гиперссылку Учет запасов.
  3. Найдем параметр По складам (местам хранения) и установим для него переключатель в положение По количеству и сумме.

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

Если перепроведение документов за прошлые периоды недопустимо, переход на количественно-суммовой учет осуществляют через так называемую «точку перехода»: остатки товаров списывают с незаполненных по сумме складов, включают настройку и оприходуют товары обратно на конкретные склады уже с суммами.

Решение 2: Расчет стоимости программным путем в запросе

Что делать, если менять настройки плана счетов нельзя, а получить оценочную стоимость товаров на конкретном складе в запросе все-таки нужно? В этом случае мы можем пойти по пути стандартного отчета «Остатки товаров».

Идея алгоритма проста: мы должны получить среднюю стоимость единицы номенклатуры в целом по организации (где сумма гарантированно присутствует), а затем умножить эту среднюю цену на количество товара, лежащего на конкретном складе.

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

Посмотрим на пример безопасного и эффективного запроса:


ВЫБРАТЬ
    ХозрасчетныйОстаткиОбщие.Субконто1 КАК Номенклатура,
    ХозрасчетныйОстаткиОбщие.СуммаОстаток КАК СуммаОстатокОбщая,
    ХозрасчетныйОстаткиОбщие.КоличествоОстаток КАК КоличествоОстатокОбщее,
    ВЫБОР
        КОГДА ХозрасчетныйОстаткиОбщие.КоличествоОстаток <> 0
            ТОГДА ХозрасчетныйОстаткиОбщие.СуммаОстаток / ХозрасчетныйОстаткиОбщие.КоличествоОстаток
        ИНАЧЕ 0
    КОНЕЦ КАК СтоимостьЗаЕдиницу
ПОМЕСТИТЬ ВТОстаткиНоменклатурыСредняяЦена
ИЗ
    РегистрБухгалтерии.Хозрасчетный.Остатки(
            &Период,
            Счет = &Счет,
            &ВидСубконтоНоменклатура,
            Организация = &Организация) КАК ХозрасчетныйОстаткиОбщие
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ХозрасчетныйОстаткиСклад.Субконто1 КАК Номенклатура,
    ХозрасчетныйОстаткиСклад.Субконто2 КАК Склад,
    ХозрасчетныйОстаткиСклад.КоличествоОстаток КАК КоличествоНаСкладе,
    ЕСТЬNULL(ВТОстаткиНоменклатурыСредняяЦена.СтоимостьЗаЕдиницу, 0) * ХозрасчетныйОстаткиСклад.КоличествоОстаток КАК РасчетнаяСуммаНаСкладе
ИЗ
    РегистрБухгалтерии.Хозрасчетный.Остатки(
            &Период,
            Счет = &Счет,
            &ВидыСубконтоНоменклатураИСклад,
            Организация = &Организация И Субконто2 = &Склад) КАК ХозрасчетныйОстаткиСклад
    ЛЕВОЕ СОЕДИНЕНИЕ ВТОстаткиНоменклатурыСредняяЦена КАК ВТОстаткиНоменклатурыСредняяЦена
    ПО ХозрасчетныйОстаткиСклад.Субконто1 = ВТОстаткиНоменклатурыСредняяЦена.Номенклатура
АВТОУПОРЯДОЧИВАНИЕ

Разберем логику работы этого запроса по шагам

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

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

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

Для корректной работы виртуальных таблиц остатков с субконто необходимо правильно инициализировать параметры в модуле вашей программы. Разберем, как заполнить массив видов субконто во встроенном языке:


// Определяем массив видов субконто для первого запроса (только Номенклатура)
МассивСубконтоНоменклатура = Новый Массив;
МассивСубконтоНоменклатура.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетный.Номенклатура);

// Определяем массив видов субконто для второго запроса (Номенклатура и Склад)
МассивСубконтоПолный = Новый Массив;
МассивСубконтоПолный.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетный.Номенклатура);
МассивСубконтоПолный.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетный.Склад);

// Передаем параметры в запрос
Запрос = Новый Запрос;
Запрос.Текст = "...(текст запроса)...";
Запрос.УстановитьПараметр("Период", Объект.ДатаОстатков);
Запрос.УстановитьПараметр("Счет", ПланыСчетов.Хозрасчетный.ТоварыНаСкладах); // 41.01
Запрос.УстановитьПараметр("Организация", Объект.Организация);
Запрос.УстановитьПараметр("Склад", Объект.Склад);
Запрос.УстановитьПараметр("ВидСубконтоНоменклатура", МассивСубконтоНоменклатура);
Запрос.УстановитьПараметр("ВидыСубконтоНоменклатураИСклад", МассивСубконтоПолный);

РезультатЗапроса = Запрос.Выполнить();

Ограничения и нюансы расчетного метода

Необходимо понимать, что данный расчетный метод дает точную оценку стоимости товаров на складах только при использовании метода оценки запасов «По средней».

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

← На главную