Как программно заполнить список документов или справочников и изменить их префиксы в 1С

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

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

В этой статье мы подробно разберем, как спроектировать универсальный механизм: от заполнения табличной части нужными типами метаданных до непосредственного программного изменения префиксов в номерах документов и кодах справочников.

Постановка задачи и анализ подходов

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

Рассмотрим основные этапы реализации этой задачи:

  1. Определение списка объектов метаданных, которые подлежат обработке.
  2. Вывод этого списка в табличную часть формы для наглядности.
  3. Программный обход выбранных типов объектов, выборка элементов из базы данных.
  4. Корректное строковое преобразование номера/кода с учетом ограничений длины.
  5. Безопасная запись измененных объектов без нарушения бизнес-логики.

Выясним причину, почему первоначальный подход автора темы с использованием динамического запроса через ОБЪЕДИНИТЬ ко всем таблицам базы данных оказался неэффективным. Такой запрос получается громоздким, медленным и уязвимым к синтаксическим ошибкам, если структура некоторых таблиц отличается. Гораздо оптимальнее использовать поэтапную обработку каждого класса метаданных в отдельности.

Шаг 1: Формирование списка объектов метаданных на форме

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

Проанализируем пример кода, который позволяет заполнить таблицу формы предопределенным массивом имен метаданных:


&НаСервере
Процедура ЗаполнитьДокументыНаСервере()
    
    // Очищаем табличную часть перед заполнением
    Объект.СписокОбъектов.Очистить();
    
    // Задаем строковый список документов для обработки
    МассивВыбранных = Новый Массив;
    МассивВыбранных.Добавить("ПриходнаяНакладная");
    МассивВыбранных.Добавить("РасходнаяНакладная");
    МассивВыбранных.Добавить("ПоступлениеБезналичныхДенежныхСредств");
    
    // Заполняем табличную часть формы данными
    Для Каждого ИмяДокумента Из МассивВыбранных Цикл
        
        // Находим объект метаданных для проверки его существования в конфигурации
        ОбъектМетаданных = Метаданные.Документы.Найти(ИмяДокумента);
        
        Если ОбъектМетаданных <> Неопределено Тогда
            НоваяСтрока = Объект.СписокОбъектов.Добавить();
            НоваяСтрока.ИмяМетаданных = ИмяДокумента;
            НоваяСтрока.СинонимОбъекта = ОбъектМетаданных.Синоним;
            НоваяСтрока.ТипОбъекта = "Документ";
        КонецЕсли;
        
    КонецЦикла;
    
КонецПроцедуры

В этом коде мы используем свойство Метаданные.Документы.Найти(), чтобы убедиться, что документ с таким именем действительно существует в текущей конфигурации. Это защищает код от падения в случае, если обработка запускается на другой версии конфигурации, где некоторые документы могут отсутствовать.

Шаг 2: Связывание строковых имен с менеджерами объектов 1С

У многих начинающих разработчиков возникает резонный вопрос: как использовать текстовую строку (например, "ПриходнаяНакладная"), хранящуюся в табличной части, для обращения к базе данных и выборки реальных документов?

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


// Вместо явного обращения:
Выборка = Документы.ПриходнаяНакладная.Выбрать();

// Мы используем динамическое обращение по имени:
ИмяОбъекта = "ПриходнаяНакладная";
МенеджерДокумента = Документы[ИмяОбъекта];
Выборка = МенеджерДокумента.Выбрать();

Этот элегантный способ позволяет написать абсолютно универсальный код, который будет работать с любым типом документа или справочника, переданным в качестве строкового параметра.

Шаг 3: Алгоритм программной замены префиксов

Теперь перейдем к самой ответственной части — обходу документов и непосредственному изменению их номеров. Нам необходимо выбрать только те документы, номера которых начинаются со старого префикса, заменить его на новый и записать объект назад в базу данных.

При массовом изменении ключевых реквизитов (таких как код или номер) критически важно использовать режим загрузки данных. Установка свойства ОбменДанными.Загрузка = Истина позволяет отключить тяжелые платформенные и прикладные проверки в обработчиках событий ПередЗаписью и ПриЗаписи, что в десятки раз ускоряет процесс и предотвращает нежелательное проведение или изменение движений регистров.

Рассмотрим подробный код серверной процедуры, выполняющей замену префикса для переданного типа документа:


&НаСервере
Процедура СменитьПрефиксУДокумента(ИмяДокумента, СтарыйПрефикс, НовыйПрефикс)
    
    // Получаем метаданные документа для определения ограничений длины номера
    МетаданныеОбъекта = Метаданные.Документы[ИмяДокумента];
    ПредельнаяДлинаНомера = МетаданныеОбъекта.ДлинаНомера;
    
    // Строим динамический запрос для выборки только нужных документов
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |	Таблица.Ссылка КАК Ссылка,
        |	Таблица.Номер КАК Номер
        |ИЗ
        |	Документ." + ИмяДокумента + " КАК Таблица
        |ГДЕ
        |	Таблица.Номер ПОДОБНО &СтарыйПрефиксШаблон";
    
    // Задаем шаблон поиска (все номера, начинающиеся со старого префикса)
    Запрос.УстановитьПараметр("СтарыйПрефиксШаблон", СтарыйПрефикс + "%");
    
    РезультатЗапроса = Запрос.Выполнить();
    Если РезультатЗапроса.Пустой() Тогда
        Возврат; // Документы со старым префиксом не найдены
    КонецЕсли;
    
    Выборка = РезультатЗапроса.Выбрать();
    
    Пока Выборка.Следующий() Цикл
        
        // Получаем объект для редактирования
        ДокОбъект = Выборка.Ссылка.ПолучитьОбъект();
        СтарыйНомер = Выборка.Номер;
        
        // Выполняем замену префикса в начале строки номера
        НовыйНомер = НовыйПрефикс + Сред(СтарыйНомер, СтрДлина(СтарыйПрефикс) + 1);
        
        // Проверяем, помещается ли новый номер в ограничения конфигуратора
        Если СтрДлина(НовыйНомер) > ПредельнаяДлинаНомера Тогда
            ЗаписьЖурналаРегистрации("СменаПрефиксов", УровеньЖурналаРегистрации.Предупреждение, , ,
                "Новый номер '" + НовыйНомер + "' превышает допустимую длину (" + ПредельнаяДлинаНомера + ") для документа: " + Выборка.Ссылка);
            Продолжить;
        КонецЕсли;
        
        ДокОбъект.Номер = НовыйНомер;
        
        // Включаем режим загрузки для отключения лишних проверок и подписок
        ДокОбъект.ОбменДанными.Загрузка = Истина;
        
        Попытка
            ДокОбъект.Записать(РежимЗаписиДокумента.Запись);
        Исключение
            ЗаписьЖурналаРегистрации("СменаПрефиксов", УровеньЖурналаРегистрации.Ошибка, , ,
                "Не удалось записать документ: " + Выборка.Ссылка + ". Ошибка: " + ОписаниеОшибки());
        КонецПопытки;
        
    КонецЦикла;
    
КонецПроцедуры

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

Важные подводные камни при изменении номеров в 1С

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

Альтернативный способ без написания кода

Если задача носит разовый характер, и у вас нет необходимости писать специализированную обработку для постоянного использования, стоит вспомнить о стандартных инструментах 1С.

В любой современной типовой конфигурации присутствует обработка «Групповое изменение реквизитов» (доступна в разделе НСИ и администрирование — Обслуживание — Корректировка данных).

С ее помощью можно решить задачу по шагам:

  1. Выбрать в списке обрабатываемых объектов нужные типы документов или справочников.
  2. Настроить условия отбора (например, "Ссылка.Дата в интервале..." или "Номер содержит...").
  3. В дополнительных настройках обработки включить «Режим разработчика» (это откроет возможность выполнения произвольного алгоритма на встроенном языке).
  4. Написать короткий скрипт замены номера прямо в специальном текстовом поле обработки и запустить выполнение.

Этот путь экономит время разработчика и использует проверенные временем стандартные механизмы безопасной транзакционной записи объектов в базе данных 1С.

← На главную