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