При автоматизации учета в конфигурации 1С:Бухгалтерия предприятия КОРП 3.0 разработчики часто сталкиваются с необходимостью программного создания документов. Одной из неочевидных задач является заполнение аналитики (субконто), которая не предусмотрена в стандартной форме документа, но присутствует на счетах учета в плане счетов. Типичный пример — заполнение субконто Номенклатурная группа для счета 91.01 «Прочие доходы» при проведении документа Оприходование товаров.
В этой статье мы разберем, почему стандартные методы заполнения объекта не всегда работают, особенно если требуется сравнение оборотов товаров на складах между БП 3.0 и УТ 11.5, и проанализируем наиболее надежный способ решения этой задачи через работу с регистрами бухгалтерии.
Для начала проанализируем ситуацию. Документ Оприходование товаров в типовом решении рассчитан на работу со стандартными настройками плана счетов. В большинстве случаев корреспондирующим счетом для оприходования излишков выступает счет 91.01. В стандартной поставке этот счет имеет аналитику по статье прочих доходов и расходов. Однако в версии КОРП или при наличии кастомизаций на этот счет может быть добавлено дополнительное субконто — Номенклатурные группы.
Проблема заключается в том, что в табличной части документа и в его свойствах просто нет соответствующих полей для хранения этой аналитики. В некоторых случаях может потребоваться и ручная установка в счете учета ведения по подразделениям (Субконто0) для БП 3.0 КОРП. Следовательно, стандартный алгоритм проведения, заложенный в модуле объекта, «не знает» о необходимости заполнения третьего субконто. Даже если вы попытаетесь использовать ДополнительныеСвойства, типовой механизм проведения их проигнорирует, если не вносить изменения в сам модуль документа.
Наиболее эффективным и безопасным методом (особенно при написании внешних обработок) является пост-обработка движений. Мы разделим процесс на два этапа: программное создание/проведение документа и последующая перезапись его проводок в регистре Хозрасчетный.
Рассмотрим по шагам, как это реализовать в коде (для проверки которого подойдет анализ конфигураций, расширений, отчетов и обработок на наличие ошибок):
Товары) и записываем его с режимом проведения. При работе с товарами важно контролировать поиск расхождений между счетами 41.1 и ГТД в 1С:БП 3.0.Рассмотрим пример кода, который выполняет поиск созданных проводок и устанавливает в них Номенклатурную группу. Выясним причину, по которой мы используем специализированную функцию для установки субконто: это позволяет избежать ошибок, связанных с порядковым номером (индексом) субконто на счете.
// 1. Предположим, ДокОбъект — это уже созданный и проведенный документ ОприходованиеТоваров
СсылкаНаДокумент = ДокОбъект.Ссылка;
// 2. Получаем набор записей регистра бухгалтерии "Хозрасчетный"
НаборЗаписей = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(СсылкаНаДокумент);
НаборЗаписей.Прочитать();
// 3. Анализируем проводки и вносим изменения
Для Каждого Запись Из НаборЗаписей Цикл
// Проверяем, является ли счет кредита счетом прочих доходов
Если Запись.СчетКт = ПланыСчетов.Хозрасчетный.ПрочиеДоходы Тогда
// Используем стандартный метод общего модуля для безопасной установки субконто
// Это заполнит аналитику "Номенклатурные группы", на каком бы месте она ни стояла
БухгалтерскийУчет.УстановитьСубконто(Запись.СчетКт, Запись.СубконтоКт, "НоменклатурныеГруппы", МояНоменклатурнаяГруппа);
// Если нужно заполнить по номеру (индексу), можно использовать:
// БухгалтерскийУчет.УстановитьСубконто(Запись.СчетКт, Запись.СубконтоКт, 3, МояНоменклатурнаяГруппа);
КонецЕсли;
КонецЦикла;
// 4. Записываем изменения в регистр
НаборЗаписей.Записать();
Проанализируем несколько критических моментов, которые важны для стабильной работы системы:
Во-первых, помните о налоговом учете. В системе 1С:Бухгалтерия проводки по налоговому учету (НУ, ПР, ВР) часто хранятся в том же регистре Хозрасчетный. При установке субконто убедитесь, что аналитика заполнилась корректно для всех видов учета в записи. Метод БухгалтерскийУчет.УстановитьСубконто обычно справляется с этим автоматически.
Во-вторых, необходимо учитывать риск «затирания» данных. Если пользователь вручную зайдет в документ и нажмет кнопку «Провести», система заново вызовет стандартный алгоритм проведения, который ничего не знает о вашей номенклатурной группе. Ваша программная правка будет удалена. Если требуется гарантировать сохранение аналитики, рассмотрите возможность использования механизма Подписки на событие ОбработкаПроведения, чтобы код выполнялся автоматически при каждом проведении документа.
В-третьих, обратите внимание на параметр Записывать = Истина. При вызове метода НаборЗаписей.Записать() платформа обновляет данные в базе. Если вы забудете вызвать этот метод после завершения цикла, никакие изменения не вступят в силу, несмотря на то, что в памяти значения в переменной Запись будут изменены.
В некоторых сообщениях форума предлагается использовать ДополнительныеСвойства. Посмотрим на этот подход подробнее. Этот метод эффективен только в паре с изменением кода в Модуле объекта документа. Вы можете передать в структуру свойств нужную ссылку:
ДокОбъект.ДополнительныеСвойства.Вставить("ПрограммнаяНоменклатурнаяГруппа", МояГруппа);
ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);
Однако, чтобы это сработало, в процедуре ОбработкаПроведения внутри конфигурации должен быть написан код, который считывает это свойство и подставляет его в движения. Если вы не планируете менять типовую конфигурацию (находитесь на поддержке без возможности изменения), то метод с прямой правкой НабораЗаписей после проведения является единственным рабочим вариантом.
Таким образом, мы рассмотрели универсальный способ программного заполнения аналитики. Этот подход применим не только к Оприходованию товаров, но и к любым другим документам, где стандартный интерфейс не позволяет указать необходимые для учета субконто.