Как программно заполнить субконто «Номенклатурная группа» в движениях документа «Оприходование товаров»

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

При автоматизации учета в конфигурации 1С:Бухгалтерия предприятия КОРП 3.0 разработчики часто сталкиваются с необходимостью программного создания документов. Одной из неочевидных задач является заполнение аналитики (субконто), которая не предусмотрена в стандартной форме документа, но присутствует на счетах учета в плане счетов. Типичный пример — заполнение субконто Номенклатурная группа для счета 91.01 «Прочие доходы» при проведении документа Оприходование товаров.

В этой статье мы разберем, почему стандартные методы заполнения объекта не всегда работают, особенно если требуется сравнение оборотов товаров на складах между БП 3.0 и УТ 11.5, и проанализируем наиболее надежный способ решения этой задачи через работу с регистрами бухгалтерии.

Почему не получается заполнить субконто напрямую в документе?

Для начала проанализируем ситуацию. Документ Оприходование товаров в типовом решении рассчитан на работу со стандартными настройками плана счетов. В большинстве случаев корреспондирующим счетом для оприходования излишков выступает счет 91.01. В стандартной поставке этот счет имеет аналитику по статье прочих доходов и расходов. Однако в версии КОРП или при наличии кастомизаций на этот счет может быть добавлено дополнительное субконто — Номенклатурные группы.

Проблема заключается в том, что в табличной части документа и в его свойствах просто нет соответствующих полей для хранения этой аналитики. В некоторых случаях может потребоваться и ручная установка в счете учета ведения по подразделениям (Субконто0) для БП 3.0 КОРП. Следовательно, стандартный алгоритм проведения, заложенный в модуле объекта, «не знает» о необходимости заполнения третьего субконто. Даже если вы попытаетесь использовать ДополнительныеСвойства, типовой механизм проведения их проигнорирует, если не вносить изменения в сам модуль документа.

Разбор решения: Корректировка движений после записи

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

Рассмотрим по шагам, как это реализовать в коде (для проверки которого подойдет анализ конфигураций, расширений, отчетов и обработок на наличие ошибок):

  1. Создание и проведение документа: Сначала мы заполняем основные реквизиты документа (организация, склад, табличная часть Товары) и записываем его с режимом проведения. При работе с товарами важно контролировать поиск расхождений между счетами 41.1 и ГТД в 1С:БП 3.0.
  2. Работа с набором записей: После того как документ сформировал стандартные проводки, мы программно открываем набор записей регистра бухгалтерии с отбором по нашему документу.
  3. Модификация субконто: В цикле обходим проводки, находим нужный счет кредита и устанавливаем значение субконто.
  4. Запись регистра: Сохраняем измененный набор записей.

Пример программного кода

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


// 1. Предположим, ДокОбъект — это уже созданный и проведенный документ ОприходованиеТоваров
СсылкаНаДокумент = ДокОбъект.Ссылка;

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

// 3. Анализируем проводки и вносим изменения
Для Каждого Запись Из НаборЗаписей Цикл
    
    // Проверяем, является ли счет кредита счетом прочих доходов
    Если Запись.СчетКт = ПланыСчетов.Хозрасчетный.ПрочиеДоходы Тогда
        
        // Используем стандартный метод общего модуля для безопасной установки субконто
        // Это заполнит аналитику "Номенклатурные группы", на каком бы месте она ни стояла
        БухгалтерскийУчет.УстановитьСубконто(Запись.СчетКт, Запись.СубконтоКт, "НоменклатурныеГруппы", МояНоменклатурнаяГруппа);
        
        // Если нужно заполнить по номеру (индексу), можно использовать:
        // БухгалтерскийУчет.УстановитьСубконто(Запись.СчетКт, Запись.СубконтоКт, 3, МояНоменклатурнаяГруппа);
    КонецЕсли;

КонецЦикла;

// 4. Записываем изменения в регистр
НаборЗаписей.Записать();

Важные нюансы при работе с КОРП-версией

Проанализируем несколько критических моментов, которые важны для стабильной работы системы:

Во-первых, помните о налоговом учете. В системе 1С:Бухгалтерия проводки по налоговому учету (НУ, ПР, ВР) часто хранятся в том же регистре Хозрасчетный. При установке субконто убедитесь, что аналитика заполнилась корректно для всех видов учета в записи. Метод БухгалтерскийУчет.УстановитьСубконто обычно справляется с этим автоматически.

Во-вторых, необходимо учитывать риск «затирания» данных. Если пользователь вручную зайдет в документ и нажмет кнопку «Провести», система заново вызовет стандартный алгоритм проведения, который ничего не знает о вашей номенклатурной группе. Ваша программная правка будет удалена. Если требуется гарантировать сохранение аналитики, рассмотрите возможность использования механизма Подписки на событие ОбработкаПроведения, чтобы код выполнялся автоматически при каждом проведении документа.

В-третьих, обратите внимание на параметр Записывать = Истина. При вызове метода НаборЗаписей.Записать() платформа обновляет данные в базе. Если вы забудете вызвать этот метод после завершения цикла, никакие изменения не вступят в силу, несмотря на то, что в памяти значения в переменной Запись будут изменены.

Использование механизма ДополнительныеСвойства

В некоторых сообщениях форума предлагается использовать ДополнительныеСвойства. Посмотрим на этот подход подробнее. Этот метод эффективен только в паре с изменением кода в Модуле объекта документа. Вы можете передать в структуру свойств нужную ссылку:


ДокОбъект.ДополнительныеСвойства.Вставить("ПрограммнаяНоменклатурнаяГруппа", МояГруппа);
ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);

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

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

← На главную