При программном создании или изменении документов в 1С:Предприятии разработчики часто сталкиваются с проблемой незаполненных счетов бухгалтерского (БУ) и налогового учета (НУ). Попытка вызвать стандартные механизмы перезаполнения напрямую может приводить либо к появлению интерактивных диалогов (вопросов пользователю), либо к ошибкам проведения из-за отсутствия необходимых аналитик. В этой статье мы подробно разберем, как правильно и безболезненно автоматизировать заполнение счетов учета на примере конфигураций 1С:Управление производственным предприятием 1.3 (УПП) и 1С:Бухгалтерия предприятия 3.0 (БП). При необходимости полной миграции между этими конфигурациями перенос документов и остатков с сохранением всей истории учета выполняется через перенос данных из 1С:УПП 1.3 в 1С:БП 3.0.
В конфигурациях на обычных формах, таких как УПП 1.3 или Комплексная автоматизация 1.1, интерактивные функции часто «зашиты» в общие модули управления формами. Попытка вызвать метод СчетаУчетаВДокументах.ИнтерактивноПерезаполнитьСчетаУчета() при фоновом или программном создании документов вызовет модальный диалог или приведет к ошибке выполнения на сервере.
Для того чтобы обойти интерактивные вопросы и заполнить счета программно, рассмотрим правильный подход с использованием встроенных процедур самого объекта документа.
Использование метода объекта документа
У большинства документов поступления и реализации в УПП 1.3 в модуле объекта определена экспортная процедура ЗаполнитьСчетаУчетаВТабЧасти(). Она предназначена как раз для неинтерактивного заполнения аналитики. Разберем по шагам пример ее использования при создании документа «Поступление товаров и услуг»:
// Создаем новый документ программно
ДокПоступления = Документы.ПоступлениеТоваровУслуг.СоздатьДокумент();
ДокПоступления.Дата = ТекущаяДата();
ДокПоступления.Организация = Справочники.Организации.НайтиПоРеквизиту("ИНН", "7701020304");
ДокПоступления.Контрагент = Справочники.Контрагенты.НайтиПоКоду("00001");
ДокПоступления.ДоговорКонтрагента = ДокПоступления.Контрагент.ОсновнойДоговорКонтрагента;
// Устанавливаем флаги отражения в учете (это критически важно для заполнения счетов БУ и НУ!)
ДокПоступления.ОтражатьВБухгалтерскомУчете = Истина;
ДокПоступления.ОтражатьВНалоговомУчете = Истина;
// Заполняем табличную часть (для примера добавим одну строку)
НоваяСтрока = ДокПоступления.Товары.Добавить();
НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоКоду("00005");
НоваяСтрока.Количество = 10;
НоваяСтрока.Цена = 100;
НоваяСтрока.Сумма = 1000;
// Вызываем заполнение счетов БУ и НУ для табличной части "Товары"
// Параметры: ТабличнаяЧасть, ИмяТабличнойЧасти, ЗаполнятьБУ, ЗаполнятьНУ
ДокПоступления.ЗаполнитьСчетаУчетаВТабЧасти(ДокПоступления.Товары, "Товары", Истина, Истина);
// Если в документе есть услуги, заполняем их аналогично:
Если ДокПоступления.Услуги.Количество() > 0 Тогда
ДокПоступления.ЗаполнитьСчетаУчетаВТабЧасти(ДокПоступления.Услуги, "Услуги", Истина, Истина);
КонецЕсли;
// Записываем и проводим документ
ДокПоступления.Записать(РежимЗаписиДокумента.Проведение);
Этот способ позволяет корректно проинициализировать счета без необходимости изменения типового кода и без вызова лишних клиентских окон.
Некоторые разработчики пытаются решить проблему «в лоб» — путем добавления собственного параметра (например, ИспользуетсяОбработка) в типовую функцию общего модуля СчетаУчетаВДокументах.ИнтерактивноПерезаполнитьСчетаУчета(). Мы настоятельно не рекомендуем использовать данный подход. Изменение сигнатур типовых экспортных методов усложняет последующее обновление конфигурации 1С и может привести к непредсказуемым ошибкам при обновлении на новые релизы.
Вместо этого всегда используйте локальные методы объектов документов или создавайте собственные неинтерактивные общие модули-обертки.
В современных конфигурациях на управляемых формах (БП 3.0) архитектурный подход к заполнению счетов существенно изменился. Вся логика вынесена в специализированный общий модуль СчетаУчетаВДокументах. Здесь мы рассмотрим два основных сценария автоматического заполнения.
Наиболее изящный и лаконичный способ инициализации счетов в БП 3.0 заключается в передаче специального флага в свойствах объекта. Платформа 1С при записи документа перехватит этот флаг и заполнит все счета учета автоматически на основании настроек регистра сведений «Счета учета номенклатуры».
Давайте проанализируем пример кода:
// Получаем или создаем объект документа
ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();
// Передаем команду на автозаполнение счетов перед записью
ДокументОбъект.ДополнительныеСвойства.Вставить("ЗаполнитьСчетаУчетаПередЗаписью", Истина);
// Вызываем типовой метод заполнения и записываем документ
СчетаУчетаВДокументах.ЗаполнитьПередЗаписью(ДокументОбъект, РежимЗаписиДокумента.Запись);
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
Этот метод хорош тем, что он автоматически анализирует всю структуру документа и заполняет счета как в шапке, так и во всех имеющихся табличных частях.
Если вам требуется обновить счета только в определенной табличной части (например, при программном изменении состава номенклатуры внешней обработкой), используйте метод общего модуля:
// Заполнение счетов учета конкретной табличной части документа
СчетаУчетаВДокументах.ЗаполнитьСчетаУчетаВТабличнойЧасти(ДокументОбъект, "Товары");
Важное предупреждение: Обратите внимание, что в самых свежих версиях конфигурации 1С:Бухгалтерия метод ЗаполнитьСчетаУчетаВТабличнойЧасти может быть объявлен устаревшим. В таком случае рекомендуется использовать более универсальный метод:
// Заполнение счетов учета всего документа без интерактивного взаимодействия
СчетаУчетаВДокументах.Заполнить(ДокументОбъект, Неопределено);
Если вам необходимо перезаполнить счета, которые уже содержат старые (неверные) значения, обязательно очистите их перед вызовом процедуры заполнения, так как по умолчанию система заполняет только пустые реквизиты.
Часто программисты сталкиваются с ситуацией: код вызова заполнения счетов отрабатывает без ошибок, но колонки счетов учета в табличной части (БУ/НУ) все равно остаются незаполненными. Выясним основные причины этой проблемы. Если вы выполняете доработку алгоритмов проведения или перенос данных, выявление возможных расхождений в учете автоматизирует сравнение бухгалтерских и налоговых проводок между информационными базами.
СчетаУчетаНоменклатуры — для товаров, материалов и услуг.СчетаУчетаРасчетовСКонтрагентами — для расчетов с покупателями и поставщиками.Организация, Склад, ДоговорКонтрагента, Подразделение и Номенклатура, и только в самом конце вызывайте методы заполнения счетов учета.
Если перед вами встанет задача заполнения счетов учета в более современных ERP-решениях, важно понимать принципиальное архитектурное отличие. В документах систем 1С:ERP и 1С:КА счета БУ и НУ физически отсутствуют в реквизитах документов. Вы не найдете там колонок «Счет учета». При переходе на новую систему управления предприятием настроить эти механизмы и сохранить историю учета можно с помощью переноса данных из 1С:УПП 1.3 в 1С:ERP 2, автоматически переносящего документы и начальные остатки.
Отражение на счетах учета в ERP происходит через механизм Групп финансового учета (ГФУ). Настройка счетов привязывается к ГФУ номенклатуры или расчетов в специальном рабочем месте настройки отражения документов в регламентированном учете. Программное заполнение в данном случае сводится к назначению правильной ГФУ в справочниках номенклатуры и договоров, а сами проводки формируются динамически при запуске процедуры отражения в рег. учете.