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