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