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

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

В практике разработчика 1С часто возникает задача автоматизации ввода данных. Одной из наиболее востребованных операций является программное создание документов отгрузки, таких как Реализация товаров и услуг. В данной статье мы подробно разберем, как правильно инициализировать объект документа, заполнить его основные реквизиты, сформировать табличную часть и обеспечить корректное проведение по регистрам учета.

Инициализация нового документа

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

Проанализируем базовый код создания объекта:


НовыйДокумент = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
НовыйДокумент.Дата = ТекущаяДата();
НовыйДокумент.УстановитьНовыйНомер();

Обратите внимание на метод УстановитьНовыйНомер(). Его вызов гарантирует, что документу будет присвоен следующий по порядку номер в соответствии с установленной периодичностью нумерации в конфигурации. Мы рекомендуем всегда устанавливать дату перед вызовом этого метода, так как номер может зависеть от периода (года или месяца).

Заполнение шапки документа

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

Разберем пример заполнения шапки с поиском ссылок по наименованию или коду (хотя в реальных задачах лучше использовать предопределенные значения или параметры):


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

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

Работа с табличной частью Товары

Перейдем к наиболее ответственной части — заполнению списка реализуемых товаров. В документах реализации табличная часть обычно называется Товары. Для добавления новой строки мы используем метод Добавить() объекта табличной части. Посмотрим, как это реализовано на практике.

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


// Добавляем первую строку
НоваяСтрока = НовыйДокумент.Товары.Добавить();
НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию("Товар 1");
НоваяСтрока.Количество = 10;
НоваяСтрока.Цена = 1500;
НоваяСтрока.Сумма = НоваяСтрока.Количество * НоваяСтрока.Цена;
НоваяСтрока.СтавкаНДС = Перечисления.СтавкиНДС.НДС20;
НоваяСтрока.СуммаНДС = НоваяСтрока.Сумма * 0.20;

// Добавляем вторую строку
НоваяСтрока = НовыйДокумент.Товары.Добавить();
НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию("Услуга по доставке");
НоваяСтрока.Количество = 1;
НоваяСтрока.Цена = 500;
НоваяСтрока.Сумма = 500;

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

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

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

Посмотрим на пример установки счетов учета:


НоваяСтрока.СчетУчета = ПланыСчетов.Хозрасчетный.ТоварыНаСкладах;
НоваяСтрока.СчетДоходов = ПланыСчетов.Хозрасчетный.ВыручкаНеОблагаемаяНДС;
// Установка счетов расчетов в шапке
НовыйДокумент.СчетУчетаРасчетовСКонтрагентом = ПланыСчетов.Хозрасчетный.РасчетыСПокупателями;

Запись и проведение документа

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

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

Разберем конструкцию с обработкой исключений, которая гарантирует стабильность работы программы:


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

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

Дополнительные возможности: заполнение по основанию

Часто реализация создается не с "нуля", а на основании другого документа, например, Заказа клиента. В 1С для этого предусмотрен стандартный механизм. Использование этого метода позволяет автоматически заполнить почти все реквизиты, включая табличную часть, на основе правил, описанных в конфигурации.

Рассмотрим пример создания на основании:


Основание = Документы.ЗаказКлиента.НайтиПоНомеру("ЗК-001", ТекущаяДата());
РеализацияНаОсн = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
РеализацияНаОсн.Заполнить(Основание);
РеализацияНаОсн.Дата = ТекущаяДата();
РеализацияНаОсн.Записать(РежимЗаписиДокумента.Проведение);

При использовании метода Заполнить() система вызывает обработчик ОбработкаЗаполнения в модуле объекта документа. Это самый "чистый" и правильный способ с точки зрения архитектуры 1С, так как он задействует все типовые проверки и алгоритмы, заложенные вендором или ведущим разработчиком.

Резюме и практические советы

Мы проанализировали полный цикл программного управления документом РеализацияТоваровУслуг. Подводя итог, выделим ключевые правила для успешной разработки:

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

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

← На главную