Почему не заполняется субконто из табличной части в 1С:УПП и как это исправить?

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

При работе с конфигурацией «Управление производственным предприятием» (УПП) программисты часто сталкиваются с ситуацией, когда после добавления нового субконто на счет бухгалтерского учета данные в него не попадают автоматически, даже если в документе есть соответствующие реквизиты. Рассмотрим ситуацию на примере счета 10.19 (материалы в эксплуатации), где к стандартной аналитике Номенклатура потребовалось добавить Подразделение и Работники.

Анализируем причину проблемы: почему «магия» не сработала?

В более простых конфигурациях, таких как «Бухгалтерия предприятия», механизмы формирования проводок более прямолинейны. В УПП же реализована сложная многослойная архитектура. Многие начинающие разработчики ожидают, что система 1С сама сопоставит типы данных: если в табличной части есть поле с типом СправочникСсылка.ФизическиеЛица и у счета есть субконто такого же типа, то значение должно «встать» само. Однако это не так.

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

Где искать код формирования проводок в УПП?

Проанализируем структуру документа, например, «Передача материалов в эксплуатацию». Если мы заглянем в модуль объекта, то не увидим привычного формирования набора записей регистра Хозрасчетный внутри процедуры ОбработкаПроведения. В УПП принят другой подход:

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

Важный совет: не ищите код формирования проводок в модуле формы. В УПП (особенно в обычных формах) логика проведения всегда отделена от интерфейса и находится в модуле объекта или общих модулях.

Вариант решения №1: Изменение типового кода (не рекомендуется для обновляемых баз)

Рассмотрим пример того, как можно дописать заполнение субконто напрямую в коде, который генерирует проводки. Предположим, мы нашли место в общем модуле, где формируется запись для счета 10.19 (или забалансового МЦ.04). Нам нужно использовать метод БухгалтерскийУчет.УстановитьСубконто().

Посмотрим на пример кода:


НоваяПроводка = РегистрБухгалтерииНаборЗаписей.Добавить();
НоваяПроводка.Организация = СтруктураШапкиДокумента.Организация;
НоваяПроводка.Период = СтруктураШапкиДокумента.Дата;
НоваяПроводка.СчетДт = ПланыСчетов.Хозрасчетный.НайтиПоКоду("10.19");

// Заполняем стандартные субконто
БухгалтерскийУчет.УстановитьСубконто(НоваяПроводка.СчетДт, НоваяПроводка.СубконтоДт, "Номенклатура", СтрокаВыборки.Номенклатура);

// Заполняем наше новое субконто "Работники" (ФизЛицо) из табличной части
БухгалтерскийУчет.УстановитьСубконто(НоваяПроводка.СчетДт, НоваяПроводка.СубконтоДт, "РаботникиОрганизации", СтрокаВыборки.ФизЛицо);

// Заполняем "Подразделение" из шапки документа
БухгалтерскийУчет.УстановитьСубконто(НоваяПроводка.СчетДт, НоваяПроводка.СубконтоДт, "Подразделения", СтруктураШапкиДокумента.ПодразделениеОрганизации);

В этом примере СтрокаВыборки — это текущая строка табличной части, данные которой обрабатываются в цикле проведения.

Вариант решения №2: Использование подписки на события (рекомендуемый путь)

Чтобы не «ломать» типовую конфигурацию и облегчить будущие обновления, лучше всего использовать Подписку на событие ОбработкаПроведения для нужного документа. Рассмотрим этот алгоритм по шагам:

  1. Создаем в конфигураторе новую подписку на событие.
  2. В качестве источника выбираем документ ПередачаМатериаловВЭксплуатацию.
  3. Событие — ОбработкаПроведения.
  4. В обработчике (в новом общем модуле) пишем код, который будет анализировать уже сформированные документом движения.

Пример кода в обработчике подписки:


Процедура ПриПроведенииДозаполнитьСубконто(Источник, Отказ, РежимПроведения) Экспорт
    // Получаем движения по хозрасчетному регистру
    НаборЗаписей = Источник.Движения.Хозрасчетный;
    НаборЗаписей.Прочитать(); // Читаем то, что уже записал типовой механизм
    
    Для Каждого Запись Из НаборЗаписей Цикл
        Если Запись.СчетДт = ПланыСчетов.Хозрасчетный.НайтиПоКоду("10.19") Тогда
            // Находим соответствующую строку в ТЧ документа по номеру строки или номенклатуре
            // В данном примере упрощенно считаем, что данные есть в ТЧ
            СтрокаТЧ = Источник.Материалы.Найти(Запись.СубконтоДт.Номенклатура, "Номенклатура");
            Если СтрокаТЧ <> Неопределено Тогда
                БухгалтерскийУчет.УстановитьСубконто(Запись.СчетДт, Запись.СубконтоДт, "РаботникиОрганизации", СтрокаТЧ.ФизЛицо);
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    
    // Записываем измененные движения
    НаборЗаписей.Записать();
КонецПроцедуры

Важный нюанс: Регистры накопления

Проанализируем ситуацию глубже. В УПП бухгалтерская проводка — это лишь часть учета. Основные отчеты (например, «Ведомость по материалам в эксплуатации») строятся не по счетам бухгалтерии, а по регистрам накопления (например, МатериалыВЭксплуатации). Если вы добавили субконто на счет 10.19, но не добавили аналогичное измерение в соответствующий регистр накопления, данные в бухгалтерском балансе и в управленческих отчетах перестанут сходиться.

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

О порядке субконто (на примере счета 1330 «Товары»)

Разберем также вопрос о последовательности субконто. Иногда возникает желание изменить порядок, например: Номенклатура -> Партии -> Склад.

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

Таким образом, для корректного отображения субконто в УПП необходимо либо точечно внедряться в механизмы формирования проводок в общих модулях, либо использовать механизм подписок на события для постобработки движений, не забывая при этом о синхронности данных между бухгалтерским счетом и регистрами накопления.

← На главную