Как получить себестоимость товаров из 1С:КА2 (Комплексная автоматизация 2) по номенклатуре, характеристике, серии и складу для внешней системы?

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

Коллеги, мы сталкиваемся с достаточно частой и технически сложной задачей: необходимо выгрузить детализированные данные о себестоимости товаров из системы 1С:Комплексная автоматизация 2 (КА2) для последующего использования во внешних аналитических системах (для этого есть готовый инструмент выгрузки запросов 1С в BI и СУБД), таких как Qlik Sense. Этот процесс требует глубокого понимания внутренних механизмов 1С, поскольку прямое извлечение данных из стандартных отчетов часто оказывается неэффективным, неполным или чрезмерно сложным для интерпретации внешней системой. Давайте вместе разберемся, как мы можем получить себестоимость за единицу с учетом дополнительных затрат, используя комбинацию аналитических ключей: номенклатура, характеристика, серия и склад, на определенную дату или за конкретный период.

Важно понимать, что стандартные отчеты 1С, например, "Себестоимость товаров организации" (чье конфигурационное имя может быть "АнализСебестоимостиТоваровРасширенный"), не просто извлекают данные из одной таблицы. Они строят свои запросы динамически, включают сложную логику, используют временные таблицы и множество условий, зависящих от пользовательских настроек. Для надежной и стабильной выгрузки нам потребуется обращаться напрямую к регистрам накопления, которые являются основой для формирования этих отчетов.

Фундамент себестоимости: Регистр накопления "Себестоимость товаров"

Центральным и наиболее важным источником информации для расчета и хранения себестоимости товаров в 1С:КА2 является РегистрНакопления.СебестоимостьТоваров. Этот регистр выступает в роли основного накопителя данных о движении товаров и всех связанных с ними затратах. Здесь фиксируются как прямые затраты на приобретение, так и информация, необходимая для последующего распределения дополнительных расходов, которые в итоге формируют полную (фактическую) себестоимость каждой единицы товара.

Внутри этого регистра мы найдем важнейшие ресурсы, такие как Количество и Сумма. Количество отражает движение товарных единиц, а Сумма — их стоимость. Критически важно понимать, что значение Сумма в этом регистре после выполнения регламентной процедуры "Закрытие месяца" уже будет содержать в себе распределенную часть дополнительных затрат. Это могут быть транспортные расходы, складские затраты, расходы на страхование и прочие косвенные затраты, которые согласно учетной политике предприятия должны быть включены в себестоимость товаров. До момента выполнения этой процедуры данные в регистре могут быть предварительными и не отражать полную фактическую себестоимость.

Ключевые измерения регистра "Себестоимость товаров"

Для нашей задачи по детализации себестоимости по номенклатуре, характеристике, серии и складу, нам необходимо обратить внимание на следующие измерения регистра СебестоимостьТоваров:

  1. Номенклатура: Ссылка на соответствующий элемент справочника "Номенклатура". Это основной идентификатор товара.
  2. Характеристика: Ссылка на элемент справочника "Характеристики номенклатуры". Используется, если учет ведется по характеристикам (цвет, размер и т.д.).
  3. Серия: Ссылка на элемент справочника "Серии номенклатуры". Применяется для учета товаров по серийным номерам, срокам годности и партиям.
  4. Склад: Ссылка на элемент справочника "Склады (места хранения)". Позволяет детализировать себестоимость по конкретным местам хранения.
  5. ВидЗапасов: Определяет категорию запасов (например, собственные товары, товары, принятые на комиссию). Это важно для корректного учета и разделения.
  6. КлючАналитикиУчетаНоменклатуры: Ссылка на вспомогательный справочник КлючиАналитикиУчетаНоменклатуры. Мы рассмотрим его подробнее далее, но уже сейчас отметим, что он играет важную роль в формировании уникальной комбинации аналитических разрезов.
  7. ДокументДвижения: Ссылка на документ, который сформировал движение по регистру. Позволяет отследить происхождение каждой записи.

Роль процедуры "Закрытие месяца"

Мы не можем переоценить важность процедуры "Закрытие месяца" в 1С:КА2 для формирования фактической себестоимости. Именно в ходе этой процедуры происходят следующие ключевые этапы:

  1. Распределение дополнительных расходов: Система анализирует зарегистрированные дополнительные расходы (транспортно-заготовительные, производственные, общехозяйственные и т.д.) и распределяет их на себестоимость товаров в соответствии с настроенной учетной политикой. Это может происходить пропорционально количеству, сумме, весу или другим базам распределения.
  2. Корректировка стоимости партий: Если применяется партионный учет или учет по средней скользящей, система корректирует себестоимость ранее списанных товаров, доводя ее до фактической.
  3. Формирование окончательных записей: По итогам всех расчетов в РегистрНакопления.СебестоимостьТоваров формируются окончательные записи, отражающие полную фактическую себестоимость единицы продукции или товара.

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

Получение себестоимости на дату (остатки)

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


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

В этом запросе &ДатаОкончания – это параметр, который передает дату, на которую нам нужны остатки. Условия КоличествоОстаток > 0 и СуммаОстаток >= 0 помогают отфильтровать актуальные позиции. Мы рассчитываем СебестоимостьЕдиницы путем деления СуммаОстаток на КоличествоОстаток, учитывая деление на ноль. В качестве готового решения можно использовать отчет по остаткам товаров организаций с себестоимостью на указанную дату.

Получение себестоимости за период (обороты)

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


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

Здесь &ДатаНачала и &ДатаОкончания определяют интересующий нас период. Параметр Регистратор в виртуальной таблице Обороты() позволяет сгруппировать движения по документам, их сформировавшим. Поле ВидДвижения поможет нам понять, было ли это Приход или Расход. Таким образом, мы можем получить себестоимость каждой единицы товара в момент ее прихода или списания — в этом поможет обработка экспорта результатов запросов 1С во внешние файлы.

Универсальный ключ аналитики: Справочник "Ключи аналитики учета номенклатуры"

Для повышения производительности и обеспечения гибкости в управлении аналитическими разрезами, в 1С:КА2 (и аналогичных конфигурациях, таких как 1С:ERP) активно используется Справочник.КлючиАналитикиУчетаНоменклатуры. Этот справочник сам по себе не содержит данных о себестоимости, но он является уникальным идентификатором для каждой возможной комбинации номенклатуры, ее характеристики, серии и склада.

Назначение и структура

Почему 1С применяет такой подход?

  1. Оптимизация хранения данных: Вместо того чтобы дублировать полные строки с описанием номенклатуры, характеристики, серии и склада в каждом движении регистра (что может быть очень ресурсоемко), система хранит лишь одну ссылку на уникальный "ключ" из этого справочника. Это значительно уменьшает объем базы данных и ускоряет операции с регистрами.
  2. Гибкость аналитики: Позволяет легко добавлять или изменять аналитические разрезы без необходимости перестраивать структуру основных регистров.
  3. Единый стандарт: Обеспечивает единый способ ссылки на комбинацию аналитик по всей системе.

Справочник КлючиАналитикиУчетаНоменклатуры содержит поля-ссылки на:

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

Как использовать в запросах

В регистре СебестоимостьТоваров мы находим измерение КлючАналитикиУчетаНоменклатуры, которое содержит ссылку на запись из этого справочника. Если нам необходимо получить данные о себестоимости, отфильтрованные или сгруппированные по конкретным значениям номенклатуры, характеристики, серии и склада, мы можем выполнить соединение регистра СебестоимостьТоваров с этим справочником. Таким образом, мы "расшифровываем" ключ аналитики до его составных частей.


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

В этом примере мы используем ЛЕВОЕ СОЕДИНЕНИЕ, чтобы гарантировать получение всех данных из регистра себестоимости, даже если по какой-то причине соответствующий ключ аналитики не найден (что маловероятно в рабочей базе). Условия (Параметр = &ВыбранныйПараметр ИЛИ &ВыбранныйПараметр ЕСТЬ NULL) позволяют нам делать параметры опциональными, то есть фильтровать по ним только тогда, когда они заданы. При возникновении расхождений можно использовать обработку для исправления ключей аналитики учета номенклатуры и видов запасов.

Почему стандартные отчеты 1С не подходят для прямого анализа

Многие разработчики, впервые сталкиваясь с задачей выгрузки данных из 1С, интуитивно пытаются "разобрать" стандартные отчеты, чтобы понять, откуда берутся данные. Однако этот подход редко приносит успех, и вот почему:

  1. Динамическое формирование запросов: Как уже было отмечено в исходном сообщении, многие отчеты 1С формируют текст запроса "на лету" в программном коде. Это значит, что в конфигураторе мы не увидим готового SQL-подобного запроса, а лишь код на встроенном языке, который его конструирует в зависимости от выбранных пользователем настроек, отборов, группировок и вариантов отчета. Отсутствие статического текста запроса делает невозможным его простое копирование.
  2. Сложность внутренней логики: Отчеты 1С могут использовать не один, а несколько запросов, объединять данные из различных регистров, справочников и документов. Часто применяются сложные конструкции с временными таблицами (ВТ), которые создаются, заполняются, обрабатываются и затем удаляются в течение одного сеанса формирования отчета. Такая логика может быть чрезвычайно запутанной и не предназначена для прямого воспроизведения во внешней системе.
  3. Разделение данных и представления: Отчеты 1С не только извлекают данные, но и форматируют их, выполняют дополнительные расчеты, агрегации, раскраску и прочие операции, которые относятся к представлению информации, а не к ее сырому виду. При попытке воспроизвести логику отчета, мы рискуем скопировать не только данные, но и лишнюю логику форматирования.
  4. Оптимизация производительности: Динамические запросы позволяют 1С максимально эффективно использовать ресурсы базы данных, формируя оптимальные запросы для конкретного набора условий, а не выполняя один общий тяжелый запрос.

Методы изучения динамических запросов для продвинутых задач

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

  1. Отладка в режиме 1С:Предприятие:

    Этот метод является наиболее прямым способом увидеть формируемый запрос. Мы действуем по шагам:

    1. Открываем конфигуратор и находим основной модуль отчета (часто это модуль объекта или модуль менеджера).
    2. Ищем места в коде, где создается объект Запрос и где происходит его выполнение (например, метод Запрос.Выполнить()).
    3. Устанавливаем точку останова непосредственно перед выполнением запроса.
    4. Запускаем 1С:Предприятие в режиме отладки (обычно кнопка F5 в конфигураторе).
    5. Открываем нужный отчет в пользовательском режиме и нажимаем кнопку "Сформировать".
    6. Отладчик остановится на установленной точке. В этот момент мы можем просмотреть значение переменной типа Запрос или строковой переменной, в которой хранится текст запроса (например, через окно "Выражения" или "Табло", введя Запрос.Текст, если переменная называется Запрос).

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

  2. Поиск функций формирования запроса:

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

Краткий обзор других связанных регистров

Помимо РегистрНакопления.СебестоимостьТоваров, в обсуждении упоминались и другие регистры. Давайте кратко рассмотрим их назначение, чтобы понять, насколько они применимы для нашей конкретной задачи.

  1. РегистрНакопления.ВыручкаИСебестоимостьПродаж:

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

  2. РегистрНакопления.ПрочиеДоходы и РегистрНакопления.ПрочиеРасходы:

    Эти регистры используются для учета разнообразных прочих доходов и расходов предприятия, которые не относятся к основной производственной или торговой деятельности. Их роль в формировании себестоимости косвенна: именно из этих регистров система берет данные о расходах, которые затем распределяются на себестоимость товаров в ходе процедуры "Закрытие месяца". Например, транспортные расходы, изначально учтенные в ПрочихРасходах, могут быть отнесены на себестоимость приобретенных товаров. Сами по себе эти регистры не содержат информацию о себестоимости товаров, а лишь данные о самих расходах/доходах до их распределения. Для получения полной себестоимости нам нужен именно РегистрНакопления.СебестоимостьТоваров.

Рекомендации по интеграции с Qlik Sense и внешними системами

При выгрузке данных из 1С в аналитическую систему, такую как Qlik Sense, мы рекомендуем придерживаться следующих принципов — для автоматизации этого процесса есть модуль автоматической выгрузки из 1С в BI-системы.

  1. Прямой доступ к регистрам: Всегда отдавайте предпочтение прямым запросам к регистрам накопления, в частности к РегистрНакопления.СебестоимостьТоваров. Этот подход обеспечивает максимальную прозрачность, контроль над извлекаемыми данными и предсказуемость результата.
  2. Учет процедуры "Закрытие месяца": Для получения абсолютно корректной и полной фактической себестоимости убедитесь, что все регламентные операции закрытия месяца выполнены за соответствующий период. Данные, полученные до полного закрытия месяца, всегда будут считаться предварительными и могут существенно отличаться от финальных показателей.
  3. Использование стандартных механизмов интеграции 1С: Для долгосрочной стабильной интеграции рассмотрите использование стандартных механизмов 1С для доступа к данным, таких как веб-сервисы OData (если конфигурация и релиз их поддерживают) или разработка собственных HTTP-сервисов на платформе 1С. Эти методы абстрагируют вас от прямой работы с СУБД, обеспечивают поддержку со стороны 1С и позволяют инкапсулировать сложную логику получения данных. Прямой доступ к таблицам базы данных (например, через ODBC к PostgreSQL или SQL Server) также технически возможен, но требует глубокого понимания структуры базы данных 1С, может нарушить лицензионные соглашения и не всегда поддерживается вендором при возникновении проблем.
  4. Оптимизация запросов и производительность: При формировании запросов помните о потенциальной нагрузке на базу данных. Извлекайте только необходимые поля, используйте максимально точные фильтры по дате и ключевым измерениям (номенклатура, склад и т.д.) и убедитесь, что в базе данных созданы необходимые индексы для ускорения выполнения ваших запросов.
  5. Версионирование и актуализация: Учитывайте, что структура регистров и их поведение могут меняться при обновлении конфигурации 1С. Ваша логика извлечения данных должна быть достаточно устойчивой к таким изменениям или требовать регулярной проверки.

В заключение, задача получения себестоимости из 1С:КА2 для внешней аналитики, хоть и требует погружения в технические детали, вполне решаема. Ключевым моментом является правильное и осознанное обращение к РегистрНакопления.СебестоимостьТоваров, понимание механизма "Закрытия месяца" и эффективное использование Справочник.КлючиАналитикиУчетаНоменклатуры. Мы должны быть готовы к тому, что стандартные отчеты скрывают сложную логику, и лучшим подходом для внешней системы будет формирование собственных, оптимизированных запросов, основанных на глубоком понимании внутренней структуры данных 1С.

← На главную