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