Разработка и Конфигурация · 11 мин
Как перезаполнить счет-фактуру в 1С программно
Как программно перезаполнить счет-фактуру в 1С: методы Заполнить(), обновление основания, обработки, типичные ошибки и проверка результата.
Перезаполнение счета-фактуры программным способом требуется, когда изменился документ-основание (реализация, поступление, корректировка), а счет-фактура хранит устаревшие суммы, реквизиты контрагента или табличную часть. В типовых конфигурациях 1С (Бухгалтерия предприятия, Управление торговлей, ERP) для этого предусмотрены штатные механизмы заполнения, которые можно вызвать из кода — без ручного перебора реквизитов.
Главный принцип: счет-фактура в типовых решениях почти всегда строится по данным основания. Поэтому корректное «перезаполнение» — это повторный вызов процедуры заполнения по основанию, а не прямое изменение отдельных полей. Ручная установка реквизитов в обход штатной логики часто приводит к расхождениям с регистрами НДС и ошибкам при формировании книги продаж.
Ниже разобраны рабочие способы: через методы объекта документа, через типовые процедуры общих модулей, через групповую обработку и внешние обработки. Каждый вариант сопровождается условиями применения и проверкой результата.
В каких случаях требуется программное перезаполнение
Типовая ситуация — изменение документа-основания после выписки счета-фактуры. Например, в реализации исправили количество, цены или ставки НДС, а счет-фактура остался со старыми данными. Проведенный по регистрам НДС счет-фактура начинает конфликтовать с основанием, и отчеты по НДС показывают расхождения.
Вторая группа причин — изменение нормативных данных: обновился адрес контрагента, КПП, номер договора или код вида операции. Эти реквизиты подставляются в счет-фактуру в момент заполнения, и старые документы хранят устаревшие значения.
Третья причина — массовая обработка после загрузки данных из другой системы или после переноса остатков, когда счета-фактуры созданы «пустыми» и их нужно заполнить по найденным основаниям. Здесь без программного перезаполнения обойтись практически невозможно из-за объема.
Базовый способ: метод Заполнить() объекта документа
Самый прямой путь — получить объект счета-фактуры и вызвать его метод Заполнить(), передав документ-основание. В типовых конфигурациях обработчик заполнения реализован в модуле объекта и повторяет логику интерактивного ввода на основании.
СчетФактураОбъект = СсылкаСчетФактура.ПолучитьОбъект();
Основание = СчетФактураОбъект.ДокументОснование;
Если ЗначениеЗаполнено(Основание) Тогда
СчетФактураОбъект.Заполнить(Основание);
СчетФактураОбъект.Записать(РежимЗаписиДокумента.Проведение);
КонецЕсли;
Метод Заполнить() срабатывает только если в модуле объекта реализована процедура ОбработкаЗаполнения. В типовых конфигурациях она есть, но в самописных или сильно доработанных решениях её может не быть — тогда вызов ничего не сделает или упадет с ошибкой. Проверяйте наличие обработчика до массового запуска.
Обратите внимание: перед перезаполнением объект может потребовать отмены проведения. Если документ проведен, безопаснее сначала вызвать Записать(РежимЗаписиДокумента.ОтменаПроведения), затем заполнить и провести заново. Некоторые типовые обработчики заполнения сами корректно работают с проведенным документом, но явная отмена проведения снижает риск ошибок блокировок регистров.
Объект = Ссылка.ПолучитьОбъект();
Объект.Записать(РежимЗаписиДокумента.ОтменаПроведения);
Объект.Заполнить(Объект.ДокументОснование);
Объект.Записать(РежимЗаписиДокумента.Проведение);Перезаполнение через типовые процедуры общих модулей
В конфигурациях на БСП и в типовых учетных решениях часть логики заполнения вынесена в общие модули. Например, в Бухгалтерии предприятия заполнение счета-фактуры по основанию выполняют процедуры модуля менеджера документа и общие процедуры учета НДС. В ERP и УТ аналогичную роль играют модули менеджеров документов и механизм ввода на основании.
Точные имена процедур зависят от конфигурации и её версии, поэтому универсальный рецепт такой: откройте в конфигураторе модуль объекта документа «СчетФактураВыданный» (или «СчетФактура»), найдите процедуру ОбработкаЗаполнения и посмотрите, какие экспортные процедуры она вызывает. Эти же процедуры можно вызвать из своего кода, передав структуру параметров или основание.
Преимущество подхода — вы используете ту же логику, что и интерактивное перезаполнение, включая заполнение дополнительных реквизитов, кодов вида операции и табличных частей. Недостаток — при обновлении конфигурации сигнатуры процедур могут измениться, и код потребует адаптации.
Как найти нужную процедуру в конфигураторе
Откройте модуль объекта документа, выполните поиск по слову «Заполнить» и «ОбработкаЗаполнения». Трассируйте вызовы до экспортных процедур общих модулей. Полезно также посмотреть команду формы «Заполнить» или обработчик кнопки перезаполнения, если он есть в интерфейсе, — он покажет точную цепочку вызовов, которую использует типовое решение.
Групповое перезаполнение через обработку
Для массовой обработки пишется внешняя обработка или процедура в расширении. Логика стандартная: запросом выбираются счета-фактуры за период с заполненным основанием, затем в цикле каждый объект перезаполняется и записывается.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СчетФактура.Ссылка КАК Ссылка,
| СчетФактура.ДокументОснование КАК Основание
|ИЗ
| Документ.СчетФактураВыданный КАК СчетФактура
|ГДЕ
| СчетФактура.Дата МЕЖДУ &НачалоПериода И &КонецПериода
| И НЕ СчетФактура.ПометкаУдаления";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Объект = Выборка.Ссылка.ПолучитьОбъект();
Попытка
Объект.Заполнить(Выборка.Основание);
Объект.Записать(РежимЗаписиДокумента.Проведение);
Исключение
ЗаписьЖурналаРегистрации("Перезаполнение СФ",
УровеньЖурналаРегистрации.Ошибка, , ,
Строка(Выборка.Ссылка) + ": " + ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
Ключевые правила для групповой обработки: оборачивайте запись каждого документа в попытку-исключение, логируйте ошибки, не прерывайте весь цикл из-за одного проблемного документа. Если документов много, выполняйте обработку порциями и в монопольном или малонагруженном режиме, чтобы избежать конфликтов блокировок.
Перезаполнение на управляемых формах и через расширение
Если дорабатывать конфигурацию нельзя, механизм перезаполнения добавляется через расширение. В расширении заимствуется модуль объекта или форма документа, добавляется своя команда «Перезаполнить», которая вызывает типовую процедуру заполнения. Такой подход сохраняет конфигурацию на поддержке и упрощает обновления.
Для интерактивной работы бухгалтера удобно добавить кнопку в форму документа: она вызывает серверную процедуру, которая повторно заполняет объект по основанию и перечитывает форму. Это безопаснее, чем просить пользователя удалять и пересоздавать счет-фактуру вручную.
Проверка результата и типичные ошибки
После перезаполнения сверьте ключевые показатели: сумму документа, сумму НДС, контрагента и его ИНН/КПП, валюту и табличную часть. Самый надежный способ — сравнить данные счета-фактуры с данными основания и проверить проведение по регистрам НДС.
Типовая ошибка — перезаполнение документа с пустым или удаленным основанием: обработчик либо очищает табличную часть, либо завершается с ошибкой. Всегда проверяйте ЗначениеЗаполнено(Основание) и отсутствие пометки удаления у основания до вызова заполнения.
Вторая частая проблема — расхождение проводок и регистров НДС после перезаписи без перепроведения. Если документ записан в режиме простой записи, движения не обновятся. Для учетных документов используйте РежимЗаписиДокумента.Проведение.
Как проверить результат
Совпадают с итогами документа-основания
Расхождения сумм, старые значения после изменения основания
Документ проведен, движения по регистрам НДС соответствуют новым данным
Документ записан, но движения не обновились
Номер и дата корректны, исправления не сброшены
Сброшен номер или признак исправления
Книга продаж/покупок формируется без расхождений с основанием
В отчетах двойные строки или отсутствуют записи
Когда программное перезаполнение не подходит
Если счет-фактура включен в закрытый период с установленной датой запрета редактирования, запись завершится ошибкой. В этом случае нужно либо временно сдвинуть дату запрета (с согласования ответственных), либо оформлять исправительный счет-фактуру текущим периодом — это методологически правильнее.
Также не стоит перезаполнять документы, по которым уже сдана декларация по НДС, без оценки последствий: изменение сумм потребует уточненной декларации. Программное перезаполнение здесь технически возможно, но решение должно приниматься с учетом учетных последствий, а не только технических.
Как выбрать действие
Часто задаваемые вопросы
Можно ли перезаполнить счет-фактуру без снятия с проведения?
Технически объект можно изменить и записать с режимом проведения без явной отмены — платформа сама перезапишет движения. Однако явная отмена проведения перед заполнением снижает риск ошибок блокировок и делает поведение предсказуемым, особенно при обменах и подписках на события.
Почему после Заполнить() табличная часть стала пустой?
Чаще всего причина в пустом или помеченном на удаление основании либо в том, что основание не содержит данных для заполнения (например, не проведено). Проверьте заполненность реквизита основания и состояние документа-основания до вызова метода.
Как перезаполнить только отдельные реквизиты, а не весь документ?
Вызовите штатную процедуру заполнения, а затем программно установите нужные реквизиты поверх — например, восстановите номер или код вида операции. Полностью ручная установка всех полей в обход типовой логики не рекомендуется: она хрупка при обновлениях и не учитывает связанные регистры.
Работает ли этот подход во всех конфигурациях?
Общий принцип одинаков, но имена документов, реквизитов и процедур различаются: в Бухгалтерии это «СчетФактураВыданный», в других решениях структура иная. Перед написанием кода изучите модуль объекта и обработчик заполнения конкретной конфигурации нужной версии.
Что делать, если при массовой обработке часть документов не записалась?
Разберите журнал регистрации или собственный лог: типичные причины — дата запрета редактирования, блокировки других пользователей, незаполненные обязательные реквизиты после изменения основания. Повторите обработку только для документов с ошибками после устранения причины.
Что важно запомнить
Перезаполнение счета-фактуры в 1С выполняется вызовом штатного метода Заполнить() по документу-основанию с последующим проведением. Перед массовой обработкой делайте резервную копию, логируйте ошибки и проверяйте результат на одном документе. Для закрытых периодов используйте исправительные счета-фактуры вместо перезаписи.