В практике программирования на платформе 1С:Предприятие часто возникает задача автоматического создания документов. Это может потребоваться при загрузке данных из внешних систем (Excel, XML, JSON), при создании цепочек документов "на основании" или при переносе остатков. Рассмотрим подробно, как программно создать, заполнить и провести документ на примере конфигурации 1С:Бухгалтерия, хотя описанные принципы (работа с менеджером объекта) применимы и к другим конфигурациям, таким как Управление торговлей или ERP.
Проанализируем задачу на примере документа ПоступлениеТоваровУслуг. Разберем процесс по этапам: от создания нового объекта до его записи в базу данных.
Для создания нового документа в 1С используется метод менеджера документа СоздатьДокумент(). Этот метод создает новый объект в оперативной памяти, который еще не записан в базу данных.
В нашем случае мы обратимся к коллекции Документы, выберем нужный вид документа и вызовем метод создания.
// Создаем новый объект документа в памяти
НовыйДокумент = Документы.ПоступлениеТоваровУслуг.СоздатьДокумент();
На этом этапе НовыйДокумент — это объект типа ДокументОбъект.ПоступлениеТоваровУслуг, с которым мы будем работать дальше.
После создания объекта необходимо заполнить его основные реквизиты: дату, организацию, контрагента и договор. Рассмотрим важный нюанс: дату документа лучше устанавливать явно, включая время, чтобы соблюсти хронологию.
// Заполняем основные реквизиты шапки
НовыйДокумент.Дата = ТекущаяДата();
НовыйДокумент.Организация = Справочники.Организации.НайтиПоРеквизиту("ИНН", "1234567890"); // Пример поиска
НовыйДокумент.Контрагент = Справочники.Контрагенты.НайтиПоНаименованию("ООО Ромашка");
НовыйДокумент.ДоговорКонтрагента = Справочники.ДоговорыКонтрагентов.НайтиПоНаименованию("Основной договор", , НовыйДокумент.Контрагент);
НовыйДокумент.Склад = Справочники.Склады.НайтиПоНаименованию("Основной склад");
Важно: При заполнении реквизитов рекомендуется использовать ссылки на существующие объекты базы данных. Если вы загружаете данные извне, предварительно выполните поиск (например, методом НайтиПоРеквизиту или запросом), чтобы не создавать дубли.
Одной из частых ошибок начинающих программистов является ручное заполнение всех служебных полей (валюта, курс, счета учета). В типовых конфигурациях 1С существует механизм автозаполнения, который срабатывает при интерактивном вводе данных пользователем. Чтобы эмулировать это поведение программно, воспользуемся методом Заполнить(), если он предусмотрен в модуле объекта, либо специализированными процедурами обработки заполнения.
Однако в контексте "чистого" создания объекта часто полезно явно вызвать заполнение счетов учета расчетов с контрагентом, чтобы они подтянулись из регистра сведений «Счета учета расчетов с контрагентами».
// Пример вызова процедуры заполнения счетов (зависит от конфигурации)
// В БП 3.0 часто счета заполняются автоматически при записи или через специальные общие модули
// Но мы можем установить их явно, если знаем логику:
НовыйДокумент.СчетУчетаРасчетовПоАвансам = ПланыСчетов.Хозрасчетный.РасчетыПоАвансамВыданным; // 60.02
НовыйДокумент.СчетУчетаРасчетовСКонтрагентом = ПланыСчетов.Хозрасчетный.РасчетыСПоставщиками; // 60.01
Теперь перейдем к заполнению табличной части Товары. Процесс состоит из добавления новой строки и заполнения её свойств.
Рассмотрим код добавления номенклатуры:
// Добавляем новую строку в табличную часть "Товары"
НоваяСтрока = НовыйДокумент.Товары.Добавить();
// Заполняем данные строки
НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоАртикулу("ART-001");
НоваяСтрока.Количество = 10;
НоваяСтрока.Цена = 1000;
НоваяСтрока.Сумма = НоваяСтрока.Количество * НоваяСтрока.Цена;
НоваяСтрока.СтавкаНДС = Перечисления.СтавкиНДС.НДС20;
НоваяСтрока.СуммаНДС = НоваяСтрока.Сумма * 20 / 120; // Упрощенный расчет
Обратите внимание на заполнение счетов учета номенклатуры. В 1С:Бухгалтерии это критически важно для корректного формирования проводок. Если мы не заполним СчетУчета в табличной части, документ может не провестись или провестись некорректно.
Для автоматического заполнения счетов номенклатуры в БП 3.0 можно воспользоваться вызовом стандартной процедуры из общего модуля:
// Попытка автозаполнения счетов для строки (пример логики)
СчетаУчета = БухгалтерскийУчетПереопределяемый.ПолучитьСчетаУчетаНоменклатуры(
НовыйДокумент.Организация,
НоваяСтрока.Номенклатура,
НовыйДокумент.Склад
);
НоваяСтрока.СчетУчета = СчетаУчета.СчетУчета;
НоваяСтрока.СчетУчетаНДС = СчетаУчета.СчетУчетаНДС;
Финальный этап — запись объекта в базу данных. Здесь у нас есть два варианта: просто записать (черновик) или провести (сформировать движения по регистрам).
Используем метод Записать(), который принимает в качестве параметра режим записи.
РежимЗаписиДокумента.ЗаписьРежимЗаписиДокумента.ПроведениеРассмотрим пример с попыткой проведения и обработкой ошибок. Это хорошая практика, так как проведение может не удаться из-за незаполненных обязательных полей или нехватки остатков (в других документах).
Попытка
// Пытаемся сразу провести документ
НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);
Сообщить("Документ успешно создан и проведен: " + НовыйДокумент.Ссылка);
Исключение
// Если возникла ошибка (например, не заполнены счета), сообщаем об этом
Сообщить("Ошибка при проведении документа: " + ОписаниеОшибки());
// Можно попробовать просто записать, чтобы не потерять данные
НовыйДокумент.Записать(РежимЗаписиДокумента.Запись);
КонецПопытки;
При программном создании документов рекомендуем обратить внимание на следующие моменты:
Комментарий информацию о том, что документ создан автоматически (например, "Загружено из Excel"). Это поможет в дальнейшем при разборе полетов.УстановитьНовоеНомер() и при необходимости корректировать время.ЗаполнитьДокумент() из менеджера или специальных структур данных, которые конфигурация использует для генерации документов.Таким образом, мы разобрали базовый алгоритм работы с объектами документов. Используя приведенные конструкции, вы сможете автоматизировать ввод любых первичных документов в системе 1С.