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

В этой статье разберём 7 способов программного заполнения документов — от простых скриптов для начинающих до сложных интеграций через HTTP-сервисы и REST API. Каждый метод сопровождён практическими примерами кода, таблицами сравнения и предупреждениями о типичных ошибках. Особое внимание уделено автоматическому заполнению реквизитов на основе шаблонов и правил, что актуально для бухгалтерских документов (счёта, накладные) и складских операций (приходные ордера, перемещения).

1. Заполнение документа через встроенный язык 1С

Самый универсальный способ — использование встроенного языка 1С:Предприятие 8. Он подходит для одноразовых операций (например, массовое создание документов по шаблону) и для разработки постоянных обработок. Основные объекты, с которыми придётся работать: ДокументОбъект, ДокументСсылка и коллекции реквизитов.

Пример кода для создания и заполнения документа "Поступление товаров и услуг":

// Создаём новый документ

Док = Документы.ПоступлениеТоваровИУслуг.СоздатьДокумент();

// Заполняем реквизиты шапки

Док.Дата = ТекущаяДата();

Док.Контрагент = Справочники.Контрагенты.НайтиПоНаименованию("ООО Розница");

Док.Склад = Справочники.Склады.НайтиПоНаименованию("Основной склад");

// Добавляем строку табличной части

СтрокаТовары = Док.Товары.Добавить();

СтрокаТовары.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию("Стул офисный");

СтрокаТовары.Количество = 10;

СтрокаТовары.Цена = 1500;

СтрокаТовары.Сумма = СтрокаТовары.Количество * СтрокаТовары.Цена;

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

Док.Записать();

Док.Провести();

Ключевые моменты:

  • 🔹 Всегда проверяйте существование справочников через НайтиПоНаименованию() или НайтиПоКоду(), иначе код выдаст ошибку.
  • 🔹 Для табличных частей используйте методы Добавить(), Вставить() или Очистить().
  • 🔹 После заполнения обязательно вызывайте Записать() и Провести() (если документ проводимый).
⚠️ Внимание: При программном проведении документов отключаются стандартные проверки интерфейса (например, контроль остатков на складе). Используйте ПроверкаЗаполнения() перед записью, чтобы избежать ошибок.
💡

Для отладки кода используйте Сообщить() или точку останова (F9 в конфигураторе). Это поможет отследить, на каком этапе возникает ошибка заполнения.

2. Использование обработок заполнения

Если документ нужно заполнять по сложным правилам (например, на основе данных из Excel или другой системы), удобнее создать внешнюю обработку. Она позволяет:

  • 📊 Импортировать данные из файлов (.xlsx, .csv, .json).
  • 🔄 Применять шаблоны заполнения (например, автоматически подставлять ставку НДС в зависимости от типа номенклатуры).
  • 🔧 Настраивать интерфейс для пользователя (кнопки, поля ввода).

Пример структуры обработки для заполнения документа "Реализация товаров и услуг" из Excel:

// 1. Чтение файла Excel

ТаблицаДанных = Новый ТаблицаЗначений;

ТаблицаДанных.Загрузить(ПутьКФайлу, ФорматExcel);

// 2. Создание документа

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

Док.Дата = ТекущаяДата();

// 3. Заполнение шапки

Док.Контрагент = ТаблицаДанных[0].Контрагент;

Док.Склад = ТаблицаДанных[0].Склад;

// 4. Заполнение табличной части

Для Каждого Строка Из ТаблицаДанных Цикл

НоваяСтрока = Док.Товары.Добавить();

НоваяСтрока.Номенклатура = Строка.Номенклатура;

НоваяСтрока.Количество = Строка.Количество;

НоваяСтрока.Цена = Строка.Цена;

КонецЦикла;

Готовые обработки можно найти в каталоге Инфостарт или разработать самостоятельно в конфигураторе. Для работы с Excel потребуется подключить библиотеку OneScript.Excel или использовать стандартные методы .

Скачать шаблон обработки|Подключить библиотеки для работы с файлами|Проверить права доступа пользователя|Создать резервную копию базы перед массовым заполнением-->

3. Автоматическое заполнение по шаблонам

Для документов с повторяющейся структурой (например, ежемесячные акты выполненных работ) удобно использовать шаблоны заполнения. Они позволяют:

  • 📑 Сохранять типовую шапку документа (контрагент, договор, валюта).
  • 📋 Автоматически подставлять реквизиты на основе предыдущих документов.
  • 🔄 Копировать табличные части с корректировкой количества или цен.

Пример создания шаблона для документа "Счёт на оплату":

// Создаём шаблон на основе существующего документа

Шаблон = Документы.СчетНаОплату.СоздатьДокумент();

Шаблон.Контрагент = Справочники.Контрагенты.НайтиПоНаименованию("ООО Поставщик");

Шаблон.Договор = Шаблон.Контрагент.ДоговорыКонтрагентов.ПолучитьПоследний();

Шаблон.Валюта = Перечисления.Валюты.Рубль;

// Сохраняем шаблон в справочник

Справочники.ШаблоныДокументов.НовыйЭлемент();

НовыйШаблон.Наименование = "Счёт для ООО Поставщик";

НовыйШаблон.ДокументШаблон = Шаблон.ПолучитьОбъектДляЗаписи();

НовыйШаблон.Записать();

Чтобы использовать шаблон при создании нового документа:

Шаблон = Справочники.ШаблоныДокументов.НайтиПоНаименованию("Счёт для ООО Поставщик");

НовыйДокумент = Шаблон.ДокументШаблон.Копировать();

НовыйДокумент.Дата = ТекущаяДата(); // Обновляем дату

НовыйДокумент.Записать();

⚠️ Внимание: При использовании шаблонов проверяйте актуальность реквизитов (например, ставки НДС или курсы валют могут измениться). Автоматически обновляйте шаблоны через регламентные задания.

Встроенный язык 1С|Внешние обработки|Шаблоны|Интеграция через API|Не автоматизирую-->

4. Заполнение через обмен данными (XML, JSON)

Если данные поступают из внешних систем (например, интернет-магазин, CRM или банк), удобно использовать механизмы обмена данными. 1С:Предприятие поддерживает форматы XML, JSON, а также протоколы REST и SOAP.

Пример загрузки документа из JSON:

// 1. Чтение JSON-файла

ТекстJSON = Новый ЧтениеТекста(ПутьКФайлу);

СтруктураДанных = JSON.ПрочитатьJSON(ТекстJSON.Прочитать());

// 2. Создание документа

Док = Документы.ЗаказПокупателя.СоздатьДокумент();

Док.Дата = СтруктураДанных.Дата;

Док.Контрагент = Справочники.Контрагенты.НайтиПоНаименованию(СтруктураДанных.Контрагент);

// 3. Заполнение табличной части

Для Каждого Товар Из СтруктураДанных.Товары Цикл

Строка = Док.Товары.Добавить();

Строка.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(Товар.Наименование);

Строка.Количество = Товар.Количество;

Строка.Цена = Товар.Цена;

КонецЦикла;

Для регулярного обмена настройте планы обмена в конфигураторе или используйте HTTP-сервисы. Например, для интеграции с Bitrix24 или МойСклад:

// Пример отправки документа в МойСклад через API

Запрос = Новый HTTPЗапрос("https://api.moysklad.ru/api/remap/1.2/entity/customerorder");

Запрос.УстановитьЗаголовок("Authorization", "Basic " + Base64Строка(Логин + ":" + Пароль));

Запрос.УстановитьТекст(JSON.ЗаписатьJSON(ЭкспортныеДанные));

Ответ = Новый HTTPСоединение.ОтправитьДляПолученияДанных(Запрос);

Формат обменаПреимуществаНедостаткиКогда использовать
XMLСтандартизирован, поддерживается большинством системГромоздкий синтаксис, медленная обработкаОбмен с гос. системами (ЭДО, ФНС)
JSONКомпактный, быстрая обработкаМенее структурирован, чем XMLИнтеграция с веб-сервисами
CSVПростота чтения/записиНет поддержки иерархических данныхИмпорт/экспорт справочников
REST APIГибкость, поддержка современных системТребует настройки аутентификацииОнлайн-интеграция с CRM, маркетплейсами

5. Программное заполнение через расширения конфигурации

Если стандартные механизмы не покрывают ваши нужды, можно создать расширение конфигурации. Оно позволяет:

  • 🔧 Добавлять новые реквизиты в документы без изменения типовой конфигурации.
  • 🛠️ Переопределять процедуры заполнения (например, автоматически подставлять менеджера по умолчанию).
  • 📊 Интегрировать сторонние библиотеки для сложных расчётов.

Пример добавления обработчика заполнения документа "Заказ клиента":

// В модуле расширения

Процедура ДокументЗаказКлиентаПриСозданииНаСервере(Документ, СтандартнаяОбработка)

// Автоматически заполняем менеджера по умолчанию

Если Документ.Контрагент.Тип = Тип("СправочникСсылка.Контрагенты") Тогда

Документ.Менеджер = Документ.Контрагент.Ответственный;

КонецЕсли;

КонецПроцедуры

Расширения подключаются в конфигураторе через меню Конфигурация → Расширения. Они безопаснее, чем прямая модификация типовой конфигурации, так как не нарушают поддержку от .

Как отладить расширение?

Для отладки расширений используйте режим "Отладка" в конфигураторе. Установите точку останова в коде расширения и выполните действие, которое должно её вызвать (например, создание документа). Проверьте значения переменных в окне отладчика. Если расширение не срабатывает, убедитесь, что оно подключено к базе и имеет правильные права доступа.

6. Автоматизация через регламентные задания

Для регулярного заполнения документов (например, ежедневное создание актов сверки) используйте регламентные задания. Они позволяют:

  • ⏰ Запускать обработки по расписанию (ежедневно, еженедельно).
  • 🔄 Автоматически обновлять данные из внешних источников.
  • 📧 Отправлять уведомления о результатах выполнения.

Пример настройки регламентного задания для создания документов "Акт сверки":

// В модуле регламентного задания

Процедура ВыполнитьЗадание()

// Получаем список контрагентов

Запрос = Новый Запрос;

Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ КонтрагентыСсылка КАК Контрагент ИЗ Документ.АктСверки";

Результат = Запрос.Выполнить();

// Создаём акты сверки для каждого контрагента

Пока Результат.Следующий() Цикл

Док = Документы.АктСверки.СоздатьДокумент();

Док.Контрагент = Результат.Контрагент;

Док.Дата = ТекущаяДата();

Док.Записать();

КонецЦикла;

КонецПроцедуры

Чтобы создать регламентное задание:

  1. Откройте Администрирование → Регламентные задания.
  2. Нажмите Создать и выберите тип задания (например, Выполнение кода).
  3. Укажите расписание (ежедневно в 23:00) и код процедуры.
  4. Сохраните и запустите задание вручную для тестирования.
⚠️ Внимание: Регламентные задания выполняются на сервере . Убедитесь, что у пользователя, от имени которого запускается задание, достаточно прав на создание документов.

7. Интеграция с внешними системами через API

Для сложных интеграций (например, синхронизация с 1С:ERP или SAP) используйте HTTP-сервисы или REST API. Это позволяет:

  • 🌐 Обмениваться данными в реальном времени.
  • 🔒 Настраивать авторизацию по токенам или ключам API.
  • 📡 Обрабатывать большие объёмы данных асинхронно.

Пример создания HTTP-сервиса для приёма данных о заказах:

// В модуле HTTP-сервиса

Функция ПоступившиеЗаказы(Запрос)

// Получаем данные из тела запроса

Тело = Запрос.ПолучитьТекстПотока();

Данные = JSON.ПрочитатьJSON(Тело);

// Создаём документ "Заказ клиента"

Док = Документы.ЗаказКлиента.СоздатьДокумент();

Док.Контрагент = Справочники.Контрагенты.НайтиПоНаименованию(Данные.Контрагент);

Док.Дата = Данные.Дата;

// Заполняем табличную часть

Для Каждого Товар Из Данные.Товары Цикл

Строка = Док.Товары.Добавить();

Строка.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(Товар.Наименование);

Строка.Количество = Товар.Количество;

КонецЦикла;

Док.Записать();

Возврат "OK";

КонецФункции

Для настройки сервиса:

  1. В конфигураторе откройте Общие → HTTP-сервисы.
  2. Создайте новый сервис и укажите путь (например, /api/orders).
  3. В модуле сервиса опишите функции для обработки запросов.
  4. Опубликуйте сервис на веб-сервере .
💡

HTTP-сервисы требуют настройки SSL-сертификата для безопасного обмена данными. Используйте Let's Encrypt для бесплатных сертификатов.

FAQ: Частые вопросы по программному заполнению документов

Как программно заполнить документ, если номенклатура отсутствует в справочнике?

Если номенклатуры нет в справочнике, можно:

  1. Создать её автоматически:
    НоваяНоменклатура = Справочники.Номенклатура.СоздатьЭлемент();
    

    НоваяНоменклатура.Наименование = "Новый товар";

    НоваяНоменклатура.Артикул = "ART123";

    НоваяНоменклатура.Записать();

  2. Использовать Попытка...Исключение для обработки ошибок:
    Попытка
    

    Строка.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию("Несуществующий товар");

    Исключение

    Сообщить("Номенклатура не найдена: " + ОписаниеОшибки());

    КонецПопытки;

Можно ли программно заполнить печатную форму документа?

Да, для этого используйте объекты Макет и ТабличныйДокумент. Пример:

Макет = Документ.ПечатнаяФорма();

ТабДок = Новый ТабличныйДокумент;

ТабДок.Вывести(Макет);

// Заполняем данные в макете

ТабДок.Область("Номер").Параметры.Значение = Документ.Номер;

ТабДок.Область("Дата").Параметры.Значение = Документ.Дата;

Для сложных печатных форм используйте СКД (Система компоновки данных).

Как избежать ошибок при массовом заполнении документов?

Следуйте чек-листу:

  • 🔹 Проверяйте права доступа пользователя (должны быть права на создание/изменение документов).
  • 🔹 Используйте транзакции для массовых операций:
    НачатьТранзакцию();
    

    Попытка

    // Код заполнения документов

    ЗафиксироватьТранзакцию();

    Исключение

    ОтменитьТранзакцию();

    Сообщить("Ошибка: " + ОписаниеОшибки());

    КонецПопытки;

  • 🔹 Делайте резервную копию базы перед массовыми изменениями.
Какие есть ограничения при программном проведении документов?

При проведении документов через код:

  • 🚫 Не срабатывают интерактивные проверки (например, контроль остатков).
  • 🚫 Может нарушиться последовательность нумерации, если не использовать ПолучитьНовыйНомер().
  • 🚫 Некоторые документы требуют дополнительных реквизитов (например, "Отчёт о розничных продажах" нуждается в привязке к кассовому аппарату).

Используйте ПроверкаЗаполнения() перед проведением:

Если Не Док.ПроверкаЗаполнения() Тогда

Сообщить("Документ заполнен некорректно!");

Возврат;

КонецЕсли;

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

Для работы с Excel используйте:

  1. Стандартные методы 1С (для .xls):
    Таблица = Новый ТаблицаЗначений;
    

    Таблица.ПрочитатьExcel("C:\data.xlsx");

  2. Библиотеку OneScript.Excel (для .xlsx):
    Excel = Новый ExcelДокумент("C:\data.xlsx");
    

    Лист = Excel.Листы[0];

    Данные = Лист.ПолучитьДиапазон("A1:C10").Значения;

Для экспорта документов в Excel:

Таблица = Документ.Товары.Выгрузить();

Таблица.ЗаписатьExcel("C:\export.xlsx");