Как в 1С:Комплексная автоматизация 2 вывести себестоимость в акт списания материалов после закрытия месяца?

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

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

Анализ проблемы и архитектуры КА 2

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

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

Способ 1. Запрос к регистру накопления «Себестоимость товаров»

Это основной управленческий регистр. Однако важно понимать, что документ может делать несколько записей по одной и той же номенклатуре (например, из-за разных Видов запасов или партий). Для получения корректной суммы нужно суммировать все движения по регистратору.

Рассмотрим пример исправленной функции получения стоимости. Мы откажемся от избыточных конструкций Попытка...Исключение, которые скрывают ошибки, и напишем чистый запрос:


Функция ПолучитьСтоимостьСписания(ДокСсылка, Номенклатура) Экспорт
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
    "ВЫБРАТЬ
    |	СУММА(СебестоимостьТоваров.Количество) КАК Количество,
    |	СУММА(СебестоимостьТоваров.Стоимость) КАК Стоимость
    |ИЗ
    |	РегистрНакопления.СебестоимостьТоваров КАК СебестоимостьТоваров
    |ГДЕ
    |	СебестоимостьТоваров.Регистратор = &Документ
    |	И СебестоимостьТоваров.Номенклатура = &Номенклатура
    |	И СебестоимостьТоваров.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход)";
    
    Запрос.УстановитьПараметр("Документ", ДокСсылка);
    Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
    
    РезультатЗапроса = Запрос.Выполнить();
    
    СтруктураДанных = Новый Структура("Количество, Сумма", 0, 0);
    
    Если НЕ РезультатЗапроса.Пустой() Тогда
        Выборка = РезультатЗапроса.Выбрать();
        Выборка.Следующий();
        СтруктураДанных.Количество = Выборка.Количество;
        СтруктураДанных.Сумма = Выборка.Стоимость;
    КонецЕсли;
    
    Возврат СтруктураДанных;
    
КонецФункции

Важный нюанс: В этом регистре ресурс Стоимость обычно включает НДС или не включает его в зависимости от настроек учета и вида операции. Также после закрытия месяца могут появиться корректирующие записи с пустым количеством, но заполненной суммой — именно поэтому использование СУММА() по регистратору является обязательным.

Способ 2. Получение данных из регистра бухгалтерии «Хозрасчетный»

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

Выясним причину, почему это удобнее: в проводках по кредиту счета 10 (Материалы) уже аккумулирована вся итоговая стоимость, включая доп. расходы и корректировки месяца. Посмотрим на логику запроса:

  1. Выбираем записи регистра Хозрасчетный по регистратору (наш документ).
  2. Фильтруем по счету кредита (например, группа счетов 10).
  3. Связываем проводки с табличной частью документа по субконто (Номенклатура).

Запрос.Текст = 
"ВЫБРАТЬ
|	ХозрасчетныйДвиженияССубконто.Сумма КАК Сумма,
|	ХозрасчетныйДвиженияССубконто.СубконтоКт1 КАК Номенклатура
|ИЗ
|	РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто(&Период, &Период, Регистратор = &Документ) КАК ХозрасчетныйДвиженияССубконто
|ГДЕ
|	ХозрасчетныйДвиженияССубконто.СчетКт В ИЕРАРХИИ (ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Материалы))";

Этот метод гарантирует 100% совпадение печатной формы с оборотно-сальдовой ведомостью.

Способ 3. Использование типовых механизмов (ТОРГ-16)

Проанализируем совет из обсуждения: заимствование кода из формы ТОРГ-16. Несмотря на то, что для документа внутреннего потребления эта форма не всегда доступна "из коробки" в интерфейсе, механизм получения цен для нее универсален.

В КА 2 для формирования печатных форм часто используется менеджер временных таблиц. Рассмотрим, как это работает в типовых формах:

Вы можете найти в конфигураторе документ СписаниеТоваров, открыть его модуль менеджера и найти процедуру формирования данных для ТОРГ-16. Скопируйте логику формирования временной таблицы СтоимостьТоваров. Она учитывает все тонкости: от раздельного учета НДС до партионного учета.

Рекомендации по качеству кода

В исходном сообщении темы было много блоков Попытка...Исключение. Помните: использование Попытка при обращении к параметрам макета (например, Область.Параметры.Номер = НомерСтроки) — это плохая практика. Если параметра в макете нет, это ошибка разработки, которую нужно исправить на этапе создания макета, а не "заглушать" программно. В противном случае пользователь может получить документ с пустыми полями и даже не узнает об этом.

Резюме: Для реализации качественного Акта списания в КА 2:

  1. Убедитесь, что расчет себестоимости за месяц выполнен.
  2. Используйте суммирующие запросы к регистру СебестоимостьТоваров или напрямую к Хозрасчетному.
  3. Всегда проверяйте соответствие единиц измерения (хранения и отчетов), чтобы цена рассчиталась корректно.
← На главную