В процессе разработки на платформе 1С:Предприятие 8.3 часто возникает задача автоматизации ввода данных. Одной из самых распространенных операций является программное создание документа РеализацияТоваровУслуг. Это может потребоваться при интеграции с внешними системами, загрузке данных из Excel или при реализации сложных бизнес-цепочек. В данной статье мы подробно разберем, как правильно инициализировать объект, заполнить ключевые реквизиты и программно провести документ.
Для начала работы нам необходимо создать экземпляр объекта документа. Мы будем использовать менеджер документа. Проанализируем базовый код создания:
// Создаем новый объект документа
НовыйДокумент = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
// Устанавливаем дату и номер (номер обычно присваивается автоматически при записи)
НовыйДокумент.Дата = ТекущаяДата();
НовыйДокумент.УстановитьНовыйНомер();
Важно помнить, что метод УстановитьНовыйНомер() рекомендуется вызывать перед первой записью объекта, чтобы соблюсти сквозную нумерацию в системе.
Рассмотрим подробнее заполнение основных полей, без которых документ не сможет быть корректно проведен или отражен в учете. К таким полям относятся Организация, Контрагент, Договор и Склад. Выясним причину, почему важно проверять соответствие договора и контрагента: в 1С жесткая связь между этими объектами, и неверный договор заблокирует проведение.
Разберем по шагам заполнение шапки:
НовыйДокумент.Организация = Справочники.Организации.НайтиПоНаименованию("Наша компания");
НовыйДокумент.Контрагент = Справочники.Контрагенты.НайтиПоРеквизиту("ИНН", "7701010101");
НовыйДокумент.ДоговорКонтрагента = Справочники.ДоговорыКонтрагентов.НайтиПоНаименованию("Основной договор", Ложь, НовыйДокумент.Контрагент);
НовыйДокумент.Склад = Справочники.Склады.НайтиПоНаименованию("Основной склад");
НовыйДокумент.ВалютаДокумента = Справочники.Валюты.НайтиПоКоду("643"); // Рубли
Совет: Вместо поиска по наименованию в реальных задачах лучше использовать поиск по уникальному идентификатору (GUID) или предопределенные значения, чтобы избежать ошибок при изменении названий в справочниках.
Теперь перейдем к самому ответственному этапу — заполнению списка товаров. Посмотрим на пример добавления строк в табличную часть Товары. Мы должны не только указать номенклатуру, но и рассчитать суммы, налоги и счета учета.
Проанализируем алгоритм добавления строки:
// Добавляем новую строку в табличную часть
НоваяСтрока = НовыйДокумент.Товары.Добавить();
// Заполняем данные товара
НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию("Программный продукт 1С");
НоваяСтрока.Количество = 1;
НоваяСтрока.Цена = 5000;
НоваяСтрока.СтавкаНДС = Перечисления.СтавкиНДС.НДС20;
// Автоматический расчет суммы
НоваяСтрока.Сумма = НоваяСтрока.Количество * НоваяСтрока.Цена;
В типовых конфигурациях (таких как ERP, УТ 11 или БП 3.0) часто используются вспомогательные модули для расчета налогов. Рассмотрим подробнее: если мы хотим, чтобы система сама рассчитала НДС, можно воспользоваться экспортными процедурами типовых конфигураций, но в простом случае расчет выполняется вручную или через параметры документа.
Для корректного заполнения всех колонок (например, СуммаНДС) рекомендуется использовать методы типовых конфигураций, если они доступны. Если мы работаем в "чистой" конфигурации или пишем универсальный механизм, расчет будет выглядеть так:
Если НоваяСтрока.СтавкаНДС = Перечисления.СтавкиНДС.НДС20 Тогда
НоваяСтрока.СуммаНДС = НоваяСтрока.Сумма * 20 / 120; // Если НДС в том числе
ИначеЕсли НоваяСтрока.СтавкаНДС = Перечисления.СтавкиНДС.НДС18 Тогда
НоваяСтрока.СуммаНДС = НоваяСтрока.Сумма * 18 / 118;
КонецЕсли;
Также важно заполнить счета учета, если документ создается в 1С:Бухгалтерия. Для этого используется реквизит СчетУчета и СчетДоходов.
Завершающим этапом является фиксация данных в базе. В 1С существует два режима записи: просто сохранение (РежимЗаписиДокумента.Запись) и проведение (РежимЗаписиДокумента.Проведение). Проведение документа создает движения по регистрам (остатки товаров, взаиморасчеты).
Разберем процесс записи с обработкой ошибок:
Попытка
// Сначала записываем объект
НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);
Сообщить("Документ успешно создан и проведен: " + НовыйДокумент.Ссылка);
Исключение
// Если возникла ошибка (например, не хватило остатков)
Сообщить("Ошибка при проведении: " + КраткоеОписаниеОшибки());
КонецПопытки;
Использование блока Попытка...Исключение критически важно при программном создании документов, так как система может отказать в проведении по множеству причин: отсутствие товара на складе, закрытый период или незаполненные обязательные поля.
Часто требуется заполнить документ на основании другого объекта, например, Заказа клиента. В этом случае мы можем использовать метод Заполнить(), который инициализирует документ по правилам, описанным в модуле объекта.
Рассмотрим этот вариант:
Основание = Документы.ЗаказКлиента.НайтиПоНомеру("001");
НовыйДокумент = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
НовыйДокумент.Заполнить(Основание); // Система сама перенесет товары и контрагента
НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);
Этот способ является наиболее предпочтительным в типовых решениях, так как он минимизирует количество кода и сохраняет логику типовой конфигурации. Мы проанализировали основные методы работы с документом РеализацияТоваровУслуг. Применяя данные подходы, вы сможете эффективно автоматизировать складской и торговый учет в вашей системе.