Создание элементов справочника программным путем — это одна из базовых задач, с которой сталкивается каждый начинающий разработчик в среде 1С. Часто это требуется для первоначального заполнения базы данных, тестирования производительности или при переносе данных из внешних систем. В этой статье мы подробно разберем, как автоматизировать этот процесс, как правильно формировать наименования в цикле и как оптимизировать код для работы с большими объемами данных.
Для начала важно прояснить один архитектурный момент, который часто путают новички. В 1С нельзя программно создавать сами справочники (как объекты метаданных) в режиме «Предприятие». Справочники создаются только в «Конфигураторе». Однако мы можем программно создавать неограниченное количество элементов (записей) внутри уже существующего справочника. Рассмотрим ситуацию, когда у нас уже есть справочник, например, Справочник1, и нам нужно создать в нем 100 элементов.
Для этого используется метод СоздатьЭлемент() менеджера справочника. Проанализируем стандартную последовательность действий:
СоздатьЭлемент(), который возвращает нам объект нового элемента.Записать(), чтобы сохранить данные в базе данных.Чтобы не писать код для каждого элемента вручную, мы воспользуемся циклом Для...По. Проанализируем, как правильно сконструировать наименование элемента, чтобы к нему добавлялся порядковый номер. Посмотрим на пример кода:
Процедура СоздатьЭлементыСправочника()
// Определяем количество итераций
Для Счетчик = 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С крайне важно также изучать состав БСП (Библиотеки стандартных подсистем), где уже реализовано множество готовых функций для работы со строками и объектами, что позволяет писать еще более компактный и надежный код.