Как программно создать, заполнить и провести документ "Реализация товаров и услуг" в 1С:Управление торговлей 8.3?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

В процессе работы с системами 1С:Предприятие часто возникает необходимость автоматизировать рутинные операции, такие как создание и заполнение типовых документов. Одна из таких задач – программное создание документа "Реализация товаров и услуг". Это может быть актуально при интеграции с другими системами, импорте данных, массовом формировании документов или реализации сложной бизнес-логики, которая требует динамического создания документов на основе определенных условий.

В этой статье мы подробно разберем, как осуществить программное создание, заполнение всех необходимых реквизитов и проведение документа "Реализация товаров и услуг" в конфигурации "1С:Управление торговлей" версии 8.3, работающей в режиме управляемых форм. Мы пройдемся по всем ключевым шагам, от создания нового объекта до его записи и проведения, а также рассмотрим важные аспекты работы с табличными частями и реквизитами.

Шаг 1: Создание объекта документа "Реализация товаров и услуг"

Первым делом нам необходимо получить ссылку на менеджер документа Документы.РеализацияТоваровУслуг и с его помощью создать новый объект документа. Этот объект будет представлять собой экземпляр будущего документа, который мы будем заполнять. Создание происходит методом СоздатьДокумент().

Рассмотрим пример кода для создания нового, еще не записанного в базу данных, документа:


// Получаем менеджер документа "Реализация товаров и услуг"
МенеджерДокумента = Документы.РеализацияТоваровУслуг;

// Создаем новый объект документа
НовыйДокумент = МенеджерДокумента.СоздатьДокумент();

// Устанавливаем дату документа (обычно текущая или по заданию)
НовыйДокумент.Дата = ТекущаяДата();

// Сообщаем о создании нового документа
Сообщить("Новый документ 'Реализация товаров и услуг' создан.");

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

Шаг 2: Заполнение реквизитов шапки документа

Следующий важный этап – заполнение основных реквизитов шапки документа. К ним относятся такие ключевые данные, как Организация, Контрагент, Договор, Склад, Валюта, Вид операции и другие. Правильное заполнение этих реквизитов критически важно для корректного формирования проводок и учета.

Мы должны убедиться, что все ссылочные объекты (Организация, Контрагент и т.д.) существуют в базе данных. Если их нет, потребуется сначала создать и записать их.

Проанализируем пример заполнения реквизитов шапки:


// Примеры получения ссылок на существующие в базе объекты
// Для реальной работы необходимо получить эти ссылки из справочников по наименованию, коду или УИД
Организация = Справочники.Организации.НайтиПоНаименованию("Наша Организация");
Контрагент = Справочники.Контрагенты.НайтиПоНаименованию("Покупатель ООО");

// Предположим, у контрагента есть договор, найдем его
ДоговорСКонтрагентом = Неопределено;
Если Контрагент <> Неопределено Тогда
    ВыборкаДоговоров = Контрагент.ДоговорыКонтрагентов.НайтиПоНаименованию("Основной договор с покупателем");
    Если ВыборкаДоговоров <> Неопределено Тогда
        ДоговорСКонтрагентом = ВыборкаДоговоров.ПолучитьОбъект().Ссылка;
    Иначе
        // Создадим новый договор, если его нет (упрощенный пример)
        НовыйДоговор = Справочники.ДоговорыКонтрагентов.СоздатьЭлемент();
        НовыйДоговор.Наименование = "Основной договор с покупателем";
        НовыйДоговор.Владелец = Контрагент;
        НовыйДоговор.Организация = Организация;
        НовыйДоговор.ВидДоговора = Перечисления.ВидыДоговоровКонтрагентов.СПокупателем;
        Попытка
            НовыйДоговор.Записать();
            ДоговорСКонтрагентом = НовыйДоговор.Ссылка;
        Исключение
            Сообщить("Ошибка при создании договора: " + ОписаниеОшибки());
        КонецПопытки;
    КонецЕсли;
КонецЕсли;

Склад = Справочники.Склады.НайтиПоНаименованию("Основной склад");
ВалютаДокумента = Справочники.Валюты.НайтиПоКоду("643"); // Российский рубль

// Заполнение реквизитов шапки документа
НовыйДокумент.Организация = Организация;
НовыйДокумент.Контрагент = Контрагент;
НовыйДокумент.Договор = ДоговорСКонтрагентом;
НовыйДокумент.Склад = Склад;
НовыйДокумент.ВалютаДокумента = ВалютаДокумента;
НовыйДокумент.ЦенаВключаетНДС = Истина; // Или Ложь, в зависимости от условий
НовыйДокумент.ВидОперации = Перечисления.ВидыОперацийРеализацияТоваровУслуг.Реализация; // Стандартная реализация
НовыйДокумент.Комментарий = "Создано программно для автоматизации продаж.";

// Дополнительные реквизиты, если они используются в вашей конфигурации
// НовыйДокумент.Подразделение = Справочники.Подразделения.НайтиПоНаименованию("Отдел продаж");
// НовыйДокумент.Менеджер = Справочники.Пользователи.НайтиПоИмени("Иванов И.И.");

Сообщить("Реквизиты шапки документа заполнены.");

Здесь мы видим, как мы находим необходимые ссылочные объекты. В реальной работе вам может потребоваться более сложная логика поиска или создания этих объектов. Обратите внимание, что для ДоговорСКонтрагентом мы предусмотрели создание нового договора, если он не найден, что делает код более устойчивым.

Шаг 3: Заполнение табличной части "Товары"

Документ "Реализация товаров и услуг" имеет как минимум одну, а чаще две табличные части: "Товары" и "Услуги". Начнем с заполнения табличной части "Товары", которая содержит информацию о продаваемых номенклатурных позициях.

Для добавления строк в табличную часть мы используем метод Добавить() для соответствующей табличной части объекта документа (НовыйДокумент.Товары). Каждая новая строка – это объект, реквизиты которого мы затем заполняем.

Посмотрим на пример добавления нескольких товаров:


// Очистим табличную часть на всякий случай, если в ней уже что-то было (например, при копировании)
НовыйДокумент.Товары.Очистить();

// Пример 1: Добавление первого товара
Номенклатура1 = Справочники.Номенклатура.НайтиПоНаименованию("Монитор LCD 27\"");
Если Номенклатура1 <> Неопределено Тогда
    НоваяСтрокаТовары1 = НовыйДокумент.Товары.Добавить();
    НоваяСтрокаТовары1.Номенклатура = Номенклатура1;
    НоваяСтрокаТовары1.Количество = 5;
    НоваяСтрокаТовары1.Цена = 15000;
    НоваяСтрокаТовары1.Сумма = НоваяСтрокаТовары1.Количество * НоваяСтрокаТовары1.Цена;
    НоваяСтрокаТовары1.СтавкаНДС = Перечисления.СтавкиНДС.НДС20; // Или НДС18, НДС10, БезНДС
    // Для конфигураций УТ/КА/ERP также важно заполнять такие реквизиты, как
    // ХарактеристикаНоменклатуры, СерияНоменклатуры, ЕдиницаИзмерения, ВидЦены
    // Если это требуется по учету
    // НоваяСтрокаТовары1.ЕдиницаИзмерения = Номенклатура1.ЕдиницаИзмерения;
    // НоваяСтрокаТовары1.ВидЦены = Справочники.ВидыЦен.НайтиПоНаименованию("Оптовая");
Иначе
    Сообщить("Номенклатура 'Монитор LCD 27\"' не найдена.");
КонецЕсли;

// Пример 2: Добавление второго товара
Номенклатура2 = Справочники.Номенклатура.НайтиПоНаименованию("Клавиатура беспроводная");
Если Номенклатура2 <> Неопределено Тогда
    НоваяСтрокаТовары2 = НовыйДокумент.Товары.Добавить();
    НоваяСтрокаТовары2.Номенклатура = Номенклатура2;
    НоваяСтрокаТовары2.Количество = 10;
    НоваяСтрокаТовары2.Цена = 1200;
    НоваяСтрокаТовары2.Сумма = НоваяСтрокаТовары2.Количество * НоваяСтрокаТовары2.Цена;
    НоваяСтрокаТовары2.СтавкаНДС = Перечисления.СтавкиНДС.НДС20;
Иначе
    Сообщить("Номенклатура 'Клавиатура беспроводная' не найдена.");
КонецЕсли;

Сообщить("Табличная часть 'Товары' заполнена.");

В этом примере мы сначала получаем ссылки на объекты Номенклатура, а затем для каждой добавляемой позиции создаем новую строку в табличной части Товары и заполняем ее реквизиты: Номенклатура, Количество, Цена, Сумма и СтавкаНДС. Важно помнить, что некоторые реквизиты, такие как ЕдиницаИзмерения, ХарактеристикаНоменклатуры, СерияНоменклатуры, могут быть обязательными в зависимости от настроек вашей учетной политики и самой номенклатуры.

Обратим особое внимание на расчет поля Сумма. В большинстве случаев оно рассчитывается как произведение Количество на Цена. Однако, если у вас сложная логика ценообразования или скидок, возможно, потребуется более сложный расчет или использование стандартных механизмов подбора цен, которые мы рассмотрим далее.

Шаг 4: Заполнение табличной части "Услуги" (если применимо)

Если ваша реализация включает не только товары, но и услуги, вам потребуется заполнить соответствующую табличную часть "Услуги". Принцип ее заполнения аналогичен заполнению табличной части "Товары".

Разберем пример добавления услуги:


// Очистим табличную часть "Услуги"
НовыйДокумент.Услуги.Очистить();

// Пример 1: Добавление услуги
НоменклатураУслуга = Справочники.Номенклатура.НайтиПоНаименованию("Доставка товаров");
Если НоменклатураУслуга <> Неопределено Тогда
    НоваяСтрокаУслуги1 = НовыйДокумент.Услуги.Добавить();
    НоваяСтрокаУслуги1.Номенклатура = НоменклатураУслуга;
    НоваяСтрокаУслуги1.Количество = 1;
    НоваяСтрокаУслуги1.Цена = 500;
    НоваяСтрокаУслуги1.Сумма = НоваяСтрокаУслуги1.Количество * НоваяСтрокаУслуги1.Цена;
    НоваяСтрокаУслуги1.СтавкаНДС = Перечисления.СтавкиНДС.НДС20;
    // Для услуг также могут быть специфические реквизиты, например
    // НоваяСтрокаУслуги1.СтатьяРасходов = Справочники.СтатьиРасходов.НайтиПоНаименованию("Транспортные расходы");
Иначе
    Сообщить("Номенклатура 'Доставка товаров' не найдена.");
КонецЕсли;

Сообщить("Табличная часть 'Услуги' заполнена.");

Здесь мы видим те же основные реквизиты: Номенклатура (в данном случае это номенклатура с типом "Услуга"), Количество (часто 1 для услуг), Цена, Сумма и СтавкаНДС. Убедитесь, что выбранная номенклатура действительно является услугой в вашей базе, чтобы избежать ошибок при проведении.

Шаг 5: Расчет сумм, НДС и проведение документа

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

Рассмотрим шаги для завершения работы с документом:

  1. Запись документа: Сначала документ нужно записать в базу данных. Это сохранит все введенные нами данные, но пока не сформирует никаких движений по регистрам.
  2. Проведение документа: После успешной записи документ можно провести. Проведение – это процесс формирования движений по регистрам (бухгалтерским, управленческим, складским и т.д.) на основании данных документа.

Посмотрим на пример кода для записи и проведения:


Попытка
    // Важно: Перед записью и проведением часто необходимо выполнить расчеты,
    // специфичные для конфигурации. В УТ/КА/ERP это может быть вызов
    // серверных процедур модуля менеджера документа или форм.
    // Например, для расчета цен, скидок, налогов.
    // Если этого не сделать, документ может провестись некорректно или вообще не провестись.

    // В упрощенном варианте, при полном ручном заполнении всех сумм,
    // достаточно просто Записать() и Провести().
    // Однако, для корректной работы с типовыми механизмами,
    // иногда требуется вызывать методы вроде "РассчитатьСуммыДокумента" или аналоги.
    // Если используются типовые механизмы расчета, мы можем воспользоваться ими.

    // Пример вызова процедур заполнения и расчетов из модуля менеджера документа (если они публичные)
    // Документы.РеализацияТоваровУслуг.РассчитатьСуммыДокумента(НовыйДокумент);
    // Документы.РеализацияТоваровУслуг.ЗаполнитьЦеныИВалюту(НовыйДокумент);
    // И так далее. Это сильно зависит от конкретной конфигурации и ее версии.

    // Мы для примера просто записываем и проводим, предполагая,
    // что все суммы и НДС рассчитаны и заполнены корректно.

    // Записываем документ
    НовыйДокумент.Записать(РежимЗаписиДокумента.Запись);
    Сообщить("Документ успешно записан. Ссылка: " + НовыйДокумент.Ссылка);

    // Проводим документ
    НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);
    Сообщить("Документ успешно проведен.");

Исключение
    Сообщить("Ошибка при записи/проведении документа: " + ОписаниеОшибки());
    Если НовыйДокумент.ПолучитьСтатусВозврата() Тогда
        Сообщить("Документ не был записан/проведен.");
    КонецЕсли;
КонецПопытки;

Здесь мы используем метод Записать() с параметром РежимЗаписиДокумента.Запись для сохранения документа и затем с РежимЗаписиДокумента.Проведение для его проведения. Важно использовать блок Попытка...Исключение для корректной обработки возможных ошибок, которые могут возникнуть при записи или проведении документа (например, если не хватает остатков на складе, не заполнены обязательные реквизиты и т.д.).

В некоторых случаях, особенно в более сложных конфигурациях вроде 1С:ERP Управление предприятием или 1С:Комплексная автоматизация, для корректного заполнения и проведения документа может потребоваться вызов дополнительных серверных процедур, которые отвечают за расчеты, заполнение дополнительных табличных частей (например, связанные с себестоимостью, налоговым учетом) и контроль данных. Эти процедуры обычно находятся в модулях менеджера документа или специализированных общих модулях.

Например, в типовых конфигурациях для автоматического расчета сумм НДС и итогов часто используется метод РассчитатьСуммыДокумента() или ЗаполнитьЦеныПоВидуЦены(). Если вы заполняете документ полностью "вручную", как в наших примерах, убедитесь, что все суммы, ставки НДС и другие зависимые поля рассчитаны верно. В противном случае, проведение может быть некорректным или вызвать ошибки.

Альтернативные подходы и лучшие практики

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

  1. Использование стандартных подсистем: Во многих типовых конфигурациях 1С (УТ, КА, ERP) реализованы стандартные подсистемы, которые помогают в работе с документами. Например, подсистема "Заполнение документов" может предоставлять универсальные механизмы для заполнения табличных частей на основе различных источников данных (заказов, прайс-листов и т.д.). Использование таких подсистем позволяет сократить объем собственного кода и повысить его надежность, так как они уже протестированы и поддерживаются разработчиками 1С.
  2. Заполнение через копирование: Если вам нужно создать много однотипных документов, можно сначала создать один "шаблонный" документ вручную или программно, а затем использовать его для копирования. Метод Скопировать() у объекта документа позволяет создать полную копию со всеми реквизитами и табличными частями. Затем вы можете изменить только нужные поля в скопированном документе.
  3. Транзакции: При создании нескольких связанных документов или выполнении сложных операций, включающих создание документа, рекомендуется использовать транзакции. Транзакция гарантирует, что либо все изменения будут успешно применены (зафиксированы), либо в случае ошибки все изменения будут отменены (откачены), что предотвращает появление неконсистентных данных в базе.
  4. 
    НачатьТранзакцию();
    Попытка
        // Здесь код по созданию и заполнению документа "Реализация товаров и услуг"
        // ...
        НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);
        // Возможно, создание других связанных документов, например, "Счет-фактура"
        // ...
    
        ЗафиксироватьТранзакцию();
        Сообщить("Все операции успешно выполнены в рамках транзакции.");
    Исключение
        ОтменитьТранзакцию();
        Сообщить("Операция отменена из-за ошибки: " + ОписаниеОшибки());
    КонецПопытки;
    
  5. Обработка ошибок: Всегда предусматривайте детальную обработку ошибок. Сообщайте пользователю или записывайте в журнал регистрации максимально полную информацию об ошибке, включая значения реквизитов, при которых произошел сбой. Это значительно упростит отладку и поддержку вашего кода.
  6. Использование серверных вызовов: В управляемом приложении старайтесь выносить всю логику по работе с данными на сервер. Это соответствует архитектуре платформы и повышает безопасность и производительность.

Программное создание документов в 1С – это мощный инструмент для автоматизации, который требует внимательного подхода и понимания структуры данных и механизмов работы конфигурации. Мы рассмотрели основные шаги и предоставили примеры кода, которые помогут вам в решении этой задачи. Всегда тестируйте свой код в тестовой базе данных перед применением его на продуктивной системе.

← На главную