Как правильно получить себестоимость со счета 41.04 в запросе СКД для 1С:Бухгалтерия 2.0

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

При разработке внешних отчетов в конфигурации 1С:Бухгалтерия предприятия 2.0 на базе системы компоновки данных (СКД), программисты часто сталкиваются с ситуацией, когда запрос к виртуальным таблицам регистра бухгалтерии возвращает пустые значения или некорректные суммы по счету 41.04 (Покупные изделия). Особенно остро эта проблема проявляется при попытке сопоставить данные о выручке со счета 90.01 и данные о себестоимости со счета 90.02 в корреспонденции со счетами учета ТМЦ.

В этой статье мы подробно разберем, почему стандартное обращение к Субконто1 может не работать, как правильно настроить связи между таблицами и какие особенности платформы 1С:Предприятие 8 нужно учитывать при написании запросов к бухгалтерским регистрам.

Анализ проблемы: Почему Субконто1 может быть пустым?

Рассмотрим ситуацию, описанную автором темы. В запросе используется виртуальная таблица ХозрасчетныйОборотыДтКт. Автор пытается получить номенклатуру через СубконтоКт1, полагая, что на счете 41.04 первым субконто всегда является Номенклатура. Однако, как показывает практика работы с БП 2.0, визуальный порядок субконто в плане счетов в пользовательском режиме может отличаться от их фактического индекса в базе данных.

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

Шаг 1. Проверка порядка субконто

Проанализируем структуру плана счетов. Для того чтобы точно знать, какое поле использовать в запросе (Субконто1, Субконто2 или Субконто3), необходимо программно или через консоль запросов проверить порядок видов субконто для конкретного счета. Важно помнить, что в конфигураторе в предопределенных данных состав субконто может быть не заполнен, так как он формируется динамически при развертывании ИБ.

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

Шаг 2. Использование массива видов субконто в параметрах

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

Рассмотрим, как это выглядит в тексте запроса:


ВЫБРАТЬ
    ХозрасчетныйОборотыДтКт.СубконтоКт1 КАК Номенклатура,
    ХозрасчетныйОборотыДтКт.КоличествоОборотКт КАК Количество,
    ХозрасчетныйОборотыДтКт.СуммаОборот КАК СуммаСебестоимости
ИЗ
    РегистрБухгалтерии.Хозрасчетный.ОборотыДтКт(&НачПер, &КонПер, , СчетДт = &Сч9002, &МассивВидовСубконто, СчетКт = &Сч4104, , Организация = &Организация) КАК ХозрасчетныйОборотыДтКт

В данном случае, если в параметр &МассивВидовСубконто первым элементом передать ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Номенклатура, то поле СубконтоКт1 гарантированно будет содержать ссылку на справочник номенклатуры.

Шаг 3. Корректное соединение таблиц Продаж и Себестоимости

В исходном коде автора соединение выполняется по условию Sales.Номенклатура = PrimeCost.Номенклатура. Это является серьезной методологической ошибкой для бухгалтерского отчета. В Бухгалтерии 2.0 списание себестоимости (Дт 90.02 - Кт 41.04) происходит в момент проведения документа реализации. Следовательно, в одной записи регистра фиксируется и выручка, и списание стоимости.

Если мы соединяем данные только по номенклатуре, мы рискуем получить "кашу", если в выбранном периоде было несколько реализаций одной и той же позиции по разным ценам или разным контрагентам. Правильно выполнять соединение по полю Регистратор. Проанализируем правильную структуру соединения:


ВЫБРАТЬ
    Продажи.Номенклатура КАК Номенклатура,
    Продажи.Регистратор КАК Регистратор,
    Продажи.Выручка КАК Выручка,
    ЕСТЬNULL(Себестоимость.СуммаСписания, 0) КАК Себестоимость
ИЗ
    (ВЫБРАТЬ
        ХозрасчетныйОборотыДтКт.СубконтоКт3 КАК Номенклатура,
        ХозрасчетныйОборотыДтКт.СуммаОборот КАК Выручка,
        ХозрасчетныйОборотыДтКт.Регистратор КАК Регистратор
    ИЗ
        РегистрБухгалтерии.Хозрасчетный.ОборотыДтКт(&НачПер, &КонПер, Регистратор, , , СчетКт = &Сч9001, , ) КАК ХозрасчетныйОборотыДтКт) КАК Продажи
    ЛЕВОЕ СОЕДИНЕНИЕ 
    (ВЫБРАТЬ
        ХозрасчетныйОборотыДтКт.СубконтоКт1 КАК Номенклатура,
        ХозрасчетныйОборотыДтКт.СуммаОборот КАК СуммаСписания,
        ХозрасчетныйОборотыДтКт.Регистратор КАК Регистратор
    ИЗ
        РегистрБухгалтерии.Хозрасчетный.ОборотыДтКт(&НачПер, &КонПер, Регистратор, СчетДт = &Сч9002, , СчетКт = &Сч4104, , ) КАК ХозрасчетныйОборотыДтКт) КАК Себестоимость
    ПО Продажи.Регистратор = Себестоимость.Регистратор
        И Продажи.Номенклатура = Себестоимость.Номенклатура

Шаг 4. Учет особенностей счета 41.04 и регламентных операций

Важно помнить, что сумма себестоимости на счете 41.04 может быть окончательно сформирована только после выполнения обработки "Закрытие месяца" (в частности, операции "Корректировка стоимости номенклатуры"). Если отчет формируется за незакрытый период, суммы могут быть нулевыми (если ведется учет "по средней") или неточными.

Также стоит обратить внимание на то, что для получения полной картины себестоимости необходимо анализировать не только счет 41.04, но и 41.01, 43, а в некоторых случаях и 10 счет, если речь идет о реализации материалов. В запросе СКД это удобно реализовать через условие В ИЕРАРХИИ или перечисление счетов в параметре-списке.

Рекомендации по оптимизации запроса в СКД

  1. Использование виртуальной таблицы ДвиженияССубконто: Для получения детальных данных по проводкам эта таблица зачастую эффективнее, чем ОборотыДтКт, так как она позволяет обращаться к субконто напрямую через точку, если в запросе указан конкретный счет.
  2. Индексация: При соединении больших объемов данных по регистратору убедитесь, что в СКД правильно настроены связи на закладке "Связи наборов данных", если вы используете несколько наборов.
  3. Типизация параметров: Всегда устанавливайте тип параметров &Сч9001, &Сч4104 как ПланСчетовСсылка.Хозрасчетный. Это позволит избежать ошибок при сравнении ссылок в теле запроса.

Подводя итог, можно сказать, что решение проблемы "пустых значений" при обращении к счету 41.04 кроется в детальном анализе порядка субконто и обеспечении жесткой связи между выручкой и себестоимостью через документ-регистратор. Соблюдение этих правил позволит вам создавать надежные и точные отчеты для бухгалтерского учета.

← На главную