В практике работы с 1С иногда возникают специфические задачи, когда необходимо быстро наполнить информационную базу большим количеством документов — например, для тестирования производительности, демонстрации возможностей системы или по иным требованиям руководства. Рассмотрим ситуацию, когда в пустой базе 1С:Бухгалтерия предприятия 3.0 нужно создать приходные и расходные кассовые ордера за последние 5 лет по одному документу на каждый календарный день.
Общий объем работы составляет около 3650 документов (2 документа в день × 365 дней × 5 лет). Выполнять такую задачу вручную нецелесообразно. Проанализируем несколько эффективных способов автоматизации этого процесса: от простейшего программного кода до использования встроенных инструментов загрузки данных.
Это самый быстрый и изящный способ для тех, кто не хочет создавать внешние обработки в конфигураторе. В современных типовых конфигурациях на базе БСП (Библиотеки стандартных подсистем) инструмент «Групповое изменение реквизитов» позволяет выполнять произвольный код на встроенном языке 1С.
Разберем алгоритм действий по шагам:
Проанализируем и применим следующий код для генерации документов:
// Определяем начальную дату (5 лет назад)
ТекДата = '20190101090000';
// Укажем дату окончания периода
ДатаКонца = ТекущаяДата();
Пока ТекДата < ДатаКонца Цикл
// Создаем копию нашего эталонного объекта (переменная Объект доступна в контексте)
нОбъект = Объект.Скопировать();
// Очищаем номер, чтобы система присвоила новый автоматически
нОбъект.Номер = "";
// Устанавливаем дату текущей итерации цикла
нОбъект.Дата = ТекДата;
// Пробуем записать документ с проведением
Попытка
нОбъект.Записать(РежимЗаписиДокумента.Проведение);
// Увеличиваем дату на 24 часа (86400 секунд)
ТекДата = ТекДата + 86400;
Исключение
// Если возникла ошибка (например, незаполнены обязательные поля), выводим сообщение
Сообщить("Ошибка при создании документа за дату: " + ТекДата + " - " + ОписаниеОшибки());
Прервать;
КонецПопытки;
КонецЦикла;
Этот метод хорош тем, что метод Скопировать() переносит все настройки из вашего шаблона, включая счета учета, аналитику и налоговые признаки, что избавляет от необходимости прописывать их в коде вручную.
Если вам требуется более гибкая логика (например, создание разных сумм или выбор случайных контрагентов), лучше создать внешнюю обработку. Рассмотрим структуру кода, которую можно использовать в модуле команды или формы.
Выясним причину, почему важно использовать метод Заполнить(). В 1С:Бухгалтерия многие счета учета определяются программно при выборе вида операции или контрагента. Если мы создаем документ «с нуля» через СоздатьДокумент(), нам придется вручную указывать счета 50.01, 60.01 и так далее. Использование Скопировать() или Заполнить() решает эту проблему автоматически.
Посмотрим на пример кода для создания документов «с нуля» в цикле:
Процедура СоздатьДокументыПрограммно()
НачальнаяДата = ДобавитьМесяц(ТекущаяДата(), -60); // 5 лет назад
КонечнаяДата = ТекущаяДата();
ТекущийДень = НачальнаяДата;
Пока ТекущийДень <= КонечнаяДата Цикл
// Создаем Приходный кассовый ордер
ПКО = Документы.ПриходныйКассовыйОрдер.СоздатьДокумент();
ПКО.Дата = ТекущийДень;
// Важно: вызываем заполнение по умолчанию
ПКО.Заполнить(Неопределено);
ПКО.Организация = Справочники.Организации.НайтиПоНаименованию("Наша Организация");
ПКО.СуммаДокумента = 100;
ПКО.ВалютаДокумента = Константы.ВалютаРегламентированногоУчета.Получить();
// Установка нового номера согласно префиксу организации
ПКО.УстановитьНовыйНомер(ПКО.Организация.Префикс);
Попытка
ПКО.Записать(РежимЗаписиДокумента.Проведение);
Исключение
Сообщить("Не удалось провести ПКО от " + ТекущийДень);
КонецПопытки;
// Аналогично создаем Расходный кассовый ордер
РКО = Документы.РасходныйКассовыйОрдер.СоздатьДокумент();
РКО.Дата = ТекущийДень + 1; // Например, на 1 секунду позже
РКО.Заполнить(Неопределено);
РКО.Организация = ПКО.Организация;
РКО.СуммаДокумента = 100;
РКО.УстановитьНовыйНомер(РКО.Организация.Префикс);
Попытка
РКО.Записать(РежимЗаписиДокумента.Проведение);
Исключение
Сообщить("Не удалось провести РКО от " + ТекущийДень);
КонецПопытки;
// Переходим к следующему дню
ТекущийДень = ТекущийДень + 86400;
КонецЦикла;
КонецПроцедуры
Если вы не хотите работать с кодом 1С, можно подготовить данные во внешнем редакторе (например, в Excel или Google Таблицах) и воспользоваться встроенным механизмом загрузки.
Рассмотрим порядок действий:
Важный нюанс: этот способ требует наличия в базе уже созданных контрагентов и организаций, которые указаны в вашей таблице.
Проанализируем ситуацию с точки зрения корректности ведения учета. Массовое создание документов задним числом в пустой базе имеет несколько критических моментов:
1. Журнал регистрации. Помните, что платформа 1С фиксирует реальное время создания объектов. Даже если дата документа установлена в 2019 году, Журнал регистрации покажет, что документ был фактически создан в 2024 году. Это легко вычисляется при любом техническом аудите.
2. Кассовая дисциплина и лимит кассы. Если вы создаете приходы и расходы на одинаковые суммы каждый день, остаток в кассе будет нулевым. Однако, если суммы будут различаться, вы можете столкнуться с проблемой «отрицательных остатков» в кассе или превышения лимита. При программном создании документов проверка лимита кассы обычно не срабатывает, но отчет «Кассовая книга» покажет ошибки.
3. Нумерация документов. Чтобы не нарушить последовательность нумерации для будущих документов, всегда используйте метод УстановитьНовыйНомер(). Если вы просто скопируете документы с фиксированным номером, в будущем при попытке создать документ вручную система выдаст ошибку «Номер не уникален».
4. Влияние на налоги (УСН/ОСНО). Простого создания и проведения документа ПКО или РКО достаточно только для бухгалтерских проводок. Если ваша организация использует упрощенную систему налогообложения (УСН «Доходы минус расходы»), документы должны также сформировать записи в регистре накопления Книга учета доходов и расходов (раздел I). Это происходит автоматически при проведении, если правильно заполнены счета расчетов и корректно выбран вид операции (например, «Оплата от покупателя»).
Для быстрого решения задачи «здесь и сейчас» рекомендуем использовать Способ №1 (Групповое изменение реквизитов с произвольным алгоритмом). Это потребует минимум времени и не заставит вас писать полноценную внешнюю обработку. Если же вам нужно регулярно наполнять базу тестовыми данными, лучше один раз написать качественную обработку через Конфигуратор, предусмотрев в ней случайную генерацию сумм и проверку на праздничные/выходные дни.