К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как перезаполнить счет-фактуру в 1С программно

Как программно перезаполнить счет-фактуру в 1С: методы Заполнить(), обновление основания, обработки, типичные ошибки и проверка результата.

Перезаполнение счета-фактуры программным способом требуется, когда изменился документ-основание (реализация, поступление, корректировка), а счет-фактура хранит устаревшие суммы, реквизиты контрагента или табличную часть. В типовых конфигурациях 1С (Бухгалтерия предприятия, Управление торговлей, ERP) для этого предусмотрены штатные механизмы заполнения, которые можно вызвать из кода — без ручного перебора реквизитов.

Главный принцип: счет-фактура в типовых решениях почти всегда строится по данным основания. Поэтому корректное «перезаполнение» — это повторный вызов процедуры заполнения по основанию, а не прямое изменение отдельных полей. Ручная установка реквизитов в обход штатной логики часто приводит к расхождениям с регистрами НДС и ошибкам при формировании книги продаж.

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

В каких случаях требуется программное перезаполнение

Типовая ситуация — изменение документа-основания после выписки счета-фактуры. Например, в реализации исправили количество, цены или ставки НДС, а счет-фактура остался со старыми данными. Проведенный по регистрам НДС счет-фактура начинает конфликтовать с основанием, и отчеты по НДС показывают расхождения.

Вторая группа причин — изменение нормативных данных: обновился адрес контрагента, КПП, номер договора или код вида операции. Эти реквизиты подставляются в счет-фактуру в момент заполнения, и старые документы хранят устаревшие значения.

Третья причина — массовая обработка после загрузки данных из другой системы или после переноса остатков, когда счета-фактуры созданы «пустыми» и их нужно заполнить по найденным основаниям. Здесь без программного перезаполнения обойтись практически невозможно из-за объема.

Базовый способ: метод Заполнить() объекта документа

Самый прямой путь — получить объект счета-фактуры и вызвать его метод Заполнить(), передав документ-основание. В типовых конфигурациях обработчик заполнения реализован в модуле объекта и повторяет логику интерактивного ввода на основании.

СчетФактураОбъект = СсылкаСчетФактура.ПолучитьОбъект();

Основание = СчетФактураОбъект.ДокументОснование;

Если ЗначениеЗаполнено(Основание) Тогда

СчетФактураОбъект.Заполнить(Основание);

СчетФактураОбъект.Записать(РежимЗаписиДокумента.Проведение);

КонецЕсли;

Метод Заполнить() срабатывает только если в модуле объекта реализована процедура ОбработкаЗаполнения. В типовых конфигурациях она есть, но в самописных или сильно доработанных решениях её может не быть — тогда вызов ничего не сделает или упадет с ошибкой. Проверяйте наличие обработчика до массового запуска.

Обратите внимание: перед перезаполнением объект может потребовать отмены проведения. Если документ проведен, безопаснее сначала вызвать Записать(РежимЗаписиДокумента.ОтменаПроведения), затем заполнить и провести заново. Некоторые типовые обработчики заполнения сами корректно работают с проведенным документом, но явная отмена проведения снижает риск ошибок блокировок регистров.

bsl
Объект = Ссылка.ПолучитьОбъект();
Объект.Записать(РежимЗаписиДокумента.ОтменаПроведения);
Объект.Заполнить(Объект.ДокументОснование);
Объект.Записать(РежимЗаписиДокумента.Проведение);

Перезаполнение через типовые процедуры общих модулей

В конфигурациях на БСП и в типовых учетных решениях часть логики заполнения вынесена в общие модули. Например, в Бухгалтерии предприятия заполнение счета-фактуры по основанию выполняют процедуры модуля менеджера документа и общие процедуры учета НДС. В ERP и УТ аналогичную роль играют модули менеджеров документов и механизм ввода на основании.

Точные имена процедур зависят от конфигурации и её версии, поэтому универсальный рецепт такой: откройте в конфигураторе модуль объекта документа «СчетФактураВыданный» (или «СчетФактура»), найдите процедуру ОбработкаЗаполнения и посмотрите, какие экспортные процедуры она вызывает. Эти же процедуры можно вызвать из своего кода, передав структуру параметров или основание.

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

Как найти нужную процедуру в конфигураторе

Откройте модуль объекта документа, выполните поиск по слову «Заполнить» и «ОбработкаЗаполнения». Трассируйте вызовы до экспортных процедур общих модулей. Полезно также посмотреть команду формы «Заполнить» или обработчик кнопки перезаполнения, если он есть в интерфейсе, — он покажет точную цепочку вызовов, которую использует типовое решение.

Групповое перезаполнение через обработку

Для массовой обработки пишется внешняя обработка или процедура в расширении. Логика стандартная: запросом выбираются счета-фактуры за период с заполненным основанием, затем в цикле каждый объект перезаполняется и записывается.

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| СчетФактура.Ссылка КАК Ссылка,

| СчетФактура.ДокументОснование КАК Основание

|ИЗ

| Документ.СчетФактураВыданный КАК СчетФактура

|ГДЕ

| СчетФактура.Дата МЕЖДУ &НачалоПериода И &КонецПериода

| И НЕ СчетФактура.ПометкаУдаления";

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл

Объект = Выборка.Ссылка.ПолучитьОбъект();

Попытка

Объект.Заполнить(Выборка.Основание);

Объект.Записать(РежимЗаписиДокумента.Проведение);

Исключение

ЗаписьЖурналаРегистрации("Перезаполнение СФ",

УровеньЖурналаРегистрации.Ошибка, , ,

Строка(Выборка.Ссылка) + ": " + ОписаниеОшибки());

КонецПопытки;

КонецЦикла;

Ключевые правила для групповой обработки: оборачивайте запись каждого документа в попытку-исключение, логируйте ошибки, не прерывайте весь цикл из-за одного проблемного документа. Если документов много, выполняйте обработку порциями и в монопольном или малонагруженном режиме, чтобы избежать конфликтов блокировок.

Перезаполнение на управляемых формах и через расширение

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

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

Проверка результата и типичные ошибки

После перезаполнения сверьте ключевые показатели: сумму документа, сумму НДС, контрагента и его ИНН/КПП, валюту и табличную часть. Самый надежный способ — сравнить данные счета-фактуры с данными основания и проверить проведение по регистрам НДС.

Типовая ошибка — перезаполнение документа с пустым или удаленным основанием: обработчик либо очищает табличную часть, либо завершается с ошибкой. Всегда проверяйте ЗначениеЗаполнено(Основание) и отсутствие пометки удаления у основания до вызова заполнения.

Вторая частая проблема — расхождение проводок и регистров НДС после перезаписи без перепроведения. Если документ записан в режиме простой записи, движения не обновятся. Для учетных документов используйте РежимЗаписиДокумента.Проведение.

Типичные ошибки
01
Запись в режиме Записать() без проведения — движения по регистрам НДС остаются старыми, книга продаж расходится с документом
02
Перезаполнение без проверки основания — при пустом основании табличная часть очищается и данные теряются
03
Массовая обработка без транзакции и логирования — при сбое невозможно понять, какие документы обработаны
04
Ручная установка сумм вместо вызова штатного заполнения — появляются расхождения с основанием и ошибки при обновлении конфигурации
Контрольные точки

Как проверить результат

Сумма и НДС счета-фактуры
Норма

Совпадают с итогами документа-основания

Тревожный признак

Расхождения сумм, старые значения после изменения основания

Проведение и движения
Норма

Документ проведен, движения по регистрам НДС соответствуют новым данным

Тревожный признак

Документ записан, но движения не обновились

Номер и дата
Норма

Номер и дата корректны, исправления не сброшены

Тревожный признак

Сброшен номер или признак исправления

Отчеты по НДС
Норма

Книга продаж/покупок формируется без расхождений с основанием

Тревожный признак

В отчетах двойные строки или отсутствуют записи

Когда программное перезаполнение не подходит

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

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

Маршрут решения

Как выбрать действие

Основание изменилось, период открытПерезаполните счет-фактуру вызовом Заполнить(Основание) и перепроведите
Период закрыт датой запретаОформите исправительный счет-фактуру текущим периодом
Документов много после загрузки данныхИспользуйте групповую обработку с логированием и предварительной проверкой на одном документе
Конфигурацию нельзя изменятьДобавьте команду перезаполнения через расширение

Часто задаваемые вопросы

Можно ли перезаполнить счет-фактуру без снятия с проведения?

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

Почему после Заполнить() табличная часть стала пустой?

Чаще всего причина в пустом или помеченном на удаление основании либо в том, что основание не содержит данных для заполнения (например, не проведено). Проверьте заполненность реквизита основания и состояние документа-основания до вызова метода.

Как перезаполнить только отдельные реквизиты, а не весь документ?

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

Работает ли этот подход во всех конфигурациях?

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

Что делать, если при массовой обработке часть документов не записалась?

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

Итог

Что важно запомнить

Перезаполнение счета-фактуры в 1С выполняется вызовом штатного метода Заполнить() по документу-основанию с последующим проведением. Перед массовой обработкой делайте резервную копию, логируйте ошибки и проверяйте результат на одном документе. Для закрытых периодов используйте исправительные счета-фактуры вместо перезаписи.