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

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Создание элементов справочника программным путем — это одна из базовых задач, с которой сталкивается каждый начинающий разработчик в среде 1С. Часто это требуется для первоначального заполнения базы данных, тестирования производительности или при переносе данных из внешних систем. В этой статье мы подробно разберем, как автоматизировать этот процесс, как правильно формировать наименования в цикле и как оптимизировать код для работы с большими объемами данных.

Основные принципы создания объектов метаданных

Для начала важно прояснить один архитектурный момент, который часто путают новички. В 1С нельзя программно создавать сами справочники (как объекты метаданных) в режиме «Предприятие». Справочники создаются только в «Конфигураторе». Однако мы можем программно создавать неограниченное количество элементов (записей) внутри уже существующего справочника. Рассмотрим ситуацию, когда у нас уже есть справочник, например, Справочник1, и нам нужно создать в нем 100 элементов.

Для этого используется метод СоздатьЭлемент() менеджера справочника. Проанализируем стандартную последовательность действий:

  1. Обращаемся к менеджеру нужного справочника.
  2. Вызываем метод СоздатьЭлемент(), который возвращает нам объект нового элемента.
  3. Заполняем необходимые реквизиты (Наименование, Код и другие).
  4. Вызываем метод Записать(), чтобы сохранить данные в базе данных.

Реализация задачи с помощью цикла

Чтобы не писать код для каждого элемента вручную, мы воспользуемся циклом Для...По. Проанализируем, как правильно сконструировать наименование элемента, чтобы к нему добавлялся порядковый номер. Посмотрим на пример кода:


Процедура СоздатьЭлементыСправочника()
    
    // Определяем количество итераций
    Для Счетчик = 1 По 100 Цикл
        
        // 1. Создаем объект нового элемента
        НовыйЭлемент = Справочники.Справочник1.СоздатьЭлемент();
        
        // 2. Формируем наименование с порядковым номером
        // Используем функцию Формат, чтобы избежать появления разделителей групп разрядов (пробелов)
        НовыйЭлемент.Наименование = "Элемент № " + Формат(Счетчик, "ЧГ=0");
        
        // 3. Записываем элемент в базу данных
        Попытка
            НовыйЭлемент.Записать();
        Исключение
            Сообщить("Не удалось записать элемент " + Счетчик + ": " + ОписаниеОшибки());
        КонецПопытки;
        
    КонецЦикла;
    
КонецПроцедуры

Разберем важный нюанс: использование функции Формат() с параметром ЧГ=0. В системе 1С по умолчанию для чисел больше 999 используется разделитель групп (например, "1 000"). Если мы просто напишем "Элемент " + Счетчик, то при достижении тысячи в наименовании появится лишний пробел, что может нарушить сортировку или логику поиска. Параметр ЧГ=0 (или ЧГ=) гарантирует, что число будет представлено в виде сплошной строки цифр.

Оптимизация производительности: использование транзакций

Если нам нужно создать не 100, а 10 000 или 100 000 элементов, код выше будет работать медленно. Это связано с тем, что метод Записать() при каждом вызове инициирует отдельную транзакцию в базе данных. Чтобы ускорить процесс в десятки раз, мы можем обернуть весь цикл в одну общую транзакцию. Рассмотрим, как это сделать:


НачатьТранзакцию();

Попытка
    Для Счетчик = 1 По 10000 Цикл
        НовыйЭлемент = Справочники.Справочник1.СоздатьЭлемент();
        НовыйЭлемент.Наименование = "Тестовый элемент " + Формат(Счетчик, "ЧГ=0");
        НовыйЭлемент.Записать();
    КонецЦикла;
    
    // Если все элементы созданы без ошибок, фиксируем изменения
    ЗафиксироватьТранзакцию();
    Сообщить("Все элементы успешно созданы.");
Исключение
    // В случае любой ошибки откатываем все изменения назад
    ОтменитьТранзакцию();
    Сообщить("Произошла ошибка, создание элементов отменено: " + ОписаниеОшибки());
КонецПопытки;

Важный совет: При массовом создании элементов также полезно использовать свойство ОбменДанными.Загрузка = Истина. Это отключит лишние проверки в модуле объекта справочника, что дополнительно ускорит запись и предотвратит срабатывание ненужных бизнес-процессов или подписок на события.

Работа со сложными строками: извлечение чисел

В процессе обсуждения подобных задач часто возникает сопутствующий вопрос: как работать со строками, содержащими числа, например, для вычисления их суммы. Представим ситуацию, когда у вас есть строка вида "10 20 30 40", и вам нужно получить общую сумму этих чисел.

Выясним причину, почему это может быть сложно: в строке могут быть лишние пробелы или даже буквы. Рассмотрим элегантное решение, использующее функции работы со строками в 1С:


Функция ВычислитьСуммуИзСтроки(ВходящаяСтрока)
    
    // 1. Заменяем пробелы на символы сложения
    // Чтобы избежать проблем с несколькими пробелами, сначала можно очистить строку
    ВременнаяСтрока = СтрЗаменить(ВходящаяСтрока, " ", "+");
    
    // 2. Используем функцию Вычислить(), которая умеет исполнять арифметические выражения в строках
    Попытка
        Результат = Вычислить(ВременнаяСтрока);
        Возврат Результат;
    Исключение
        Возврат 0;
    КонецПопытки;
    
КонецФункции

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


// Пример для современных версий платформы 8.3
СтрокаЗадачи = "Товар 1: 100 руб, Товар 2: 250 руб";
Цифры = "0123456789";

// Разделяем строку, используя все символы, кроме цифр, как разделители
МассивЧисел = СтрРазделить(СтрокаЗадачи, СтрСоединить(СтрРазделить(СтрокаЗадачи, Цифры, Ложь)), Ложь);

Сумма = 0;
Для Каждого ЧислоИзСтроки Из МассивЧисел Цикл
    Сумма = Сумма + Число(ЧислоИзСтроки);
КонецЦикла;

Контекст исполнения и выводы

Помните, что создание объектов в 1С всегда должно происходить на сервере. Если вы создаете обработку, процедура заполнения справочника должна иметь префикс &НаСервере. На клиенте работа с объектами справочников невозможна — там доступны только ссылки и программные формы.

Подводя итог, мы выяснили, что задача создания элементов сводится к правильному использованию цикла, методов объекта и функций форматирования. Для профессиональной работы во франчайзи 1С крайне важно также изучать состав БСП (Библиотеки стандартных подсистем), где уже реализовано множество готовых функций для работы со строками и объектами, что позволяет писать еще более компактный и надежный код.

← На главную