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

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

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

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

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


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

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

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

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


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

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

Проанализируем ситуацию с поиском договора: всегда указывайте владельца (контрагента) при поиске договора, иначе система может вернуть пустую ссылку или договор другого контрагента с тем же именем. Также убедитесь, что вид договора соответствует виду операции документа (например, "С поставщиком").

Работа с табличной частью документа

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

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


Для Каждого СтрокаДанных Из МассивТоваров Цикл
    НоваяСтрока = НовыйДокумент.Товары.Добавить();
    НоваяСтрока.Номенклатура = СтрокаДанных.Номенклатура;
    НоваяСтрока.Количество = СтрокаДанных.Количество;
    НоваяСтрока.Цена = СтрокаДанных.Цена;
    
    // Автоматический расчет суммы
    НоваяСтрока.Сумма = НоваяСтрока.Количество * НоваяСтрока.Цена;
    
    // Работа с НДС (если применимо в вашей конфигурации)
    НоваяСтрока.СтавкаНДС = Перечисления.СтавкиНДС.НДС20;
    НоваяСтрока.СуммаНДС = (НоваяСтрока.Сумма * 20) / 120; // Пример расчета "в том числе"
КонецЦикла;

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

Использование типовых механизмов заполнения

Если вы работаете в типовой конфигурации, многие действия можно упростить. Разберем, как вызвать стандартные обработчики при изменении реквизитов. Это позволит автоматически заполнить счета учета, ставки НДС и другие параметры, специфичные для конкретной номенклатуры.


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

Это крайне важный момент: прямое присвоение значений в обход типовой логики может привести к ошибкам в бухгалтерском или налоговом учете. Всегда проверяйте наличие экспортных процедур в модуле менеджера документа или общих модулях.

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

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

  1. РежимЗаписиДокумента.Запись — документ сохраняется как черновик, движения по регистрам не формируются.
  2. РежимЗаписиДокумента.Проведение — документ сохраняется и формирует движения в регистрах (бухгалтерские проводки, остатки товаров).

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

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

Дополнительные советы по оптимизации

При массовом создании документов (например, загрузка 1000 поступлений за раз) рекомендуется выполнять код в одной транзакции или использовать фоновые задания. Рассмотрим основные рекомендации:

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

← На главную