Как скопировать данные из одной колонки (реквизита) в другую в справочнике 1С 7.7

Программист 1С v7.7 Управленческий учет
← На главную

При работе с устаревшими, но все еще надежными конфигурациями на платформе 1С:Предприятие 7.7, пользователи часто сталкиваются с необходимостью массового изменения данных. Типичный пример — копирование цен из одной категории в другую в иерархическом справочнике «Материалы» или «Номенклатура». В отличие от современных версий 1С или табличных редакторов типа Excel, в 1С 7.7 нет встроенной функции «скопировать колонку» нажатием правой кнопки мыши. Эту задачу необходимо решать либо программным путем, либо с помощью специализированных сервисных обработок.

В этой статье мы подробно разберем, как правильно подойти к решению этой задачи, рассмотрим нюансы работы с типами данных и приведем примеры кода для автоматизации процесса.

Понимание структуры данных: Реквизиты vs Колонки

Прежде всего, проанализируем важный технический момент, упомянутый в обсуждении. То, что пользователь видит в форме списка как «колонки», на уровне базы данных является реквизитами справочника. Форма списка — это лишь визуальное представление. Поэтому задача «скопировать колонку» на языке программиста звучит так: «Перебрать все элементы справочника и присвоить значению Реквизита А значение Реквизита Б».

Типы реквизитов: Обычные и Периодические

Перед началом работы крайне важно выяснить, является ли реквизит (цена) периодическим. В 1С 7.7 цены часто настраиваются как периодические, чтобы хранить историю их изменений на разные даты.

  1. Обычный реквизит: Значение одинаково всегда, независимо от даты. Копирование выполняется простым присваиванием.
  2. Периодический реквизит: Значение привязано к дате. Для копирования таких данных потребуется использование специального объекта Периодический.

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

Способ 1: Написание собственной обработки (Программный метод)

Рассмотрим самый гибкий способ — создание внешней обработки (файл с расширением .ert). Это позволит нам точно контролировать, какие элементы обрабатывать (например, только в определенных папках) и как именно копировать данные.

Шаг 1. Создание обработки. Откроем 1С в режиме «Конфигуратор», выберем меню «Файл» — «Новый» — «Внешний отчет (обработка)». В модуле этой обработки мы напишем алгоритм обхода справочника.

Шаг 2. Алгоритм для обычных реквизитов. Рассмотрим пример кода, где мы копируем данные из реквизита Цена3 в реквизит Цена2:


Процедура ВыполнитьКопирование()
    Спр = СоздатьОбъект("Справочник.Материалы");
    Спр.ВыбратьЭлементы();
    Пока Спр.ПолучитьЭлемент() = 1 Цикл
        // Проверяем, что это не папка (группа)
        Если Спр.ЭтоГруппа() = 1 Тогда
            Продолжить;
        КонецЕсли;
        
        // Копируем значение
        Спр.Цена2 = Спр.Цена3;
        
        // Записываем изменения в базу
        Спр.Записать();
    КонецЦикла;
    Предупреждение("Копирование завершено!");
КонецПроцедуры

Шаг 3. Алгоритм для периодических реквизитов. Если цены периодические, нам нужно указать дату, на которую мы устанавливаем новое значение. Проанализируем пример кода с использованием объекта Периодический:


Процедура КопироватьПериодическиеЦены()
    Спр = СоздатьОбъект("Справочник.Материалы");
    Пер = СоздатьОбъект("Периодический");
    РабочаяДата = ТекущаяДата(); // или любая нужная дата
    
    Спр.ВыбратьЭлементы();
    Пока Спр.ПолучитьЭлемент() = 1 Цикл
        Если Спр.ЭтоГруппа() = 1 Тогда
            Продолжить;
        КонецЕсли;
        
        // Получаем значение из Цена3 на текущую дату
        ЗначениеЦены = Спр.Цена3.Получить(РабочаяДата);
        
        // Устанавливаем значение в Цена2 через объект Периодический
        Пер.ИспользоватьОбъект("Цена2", Спр.ТекущийЭлемент());
        Пер.Значение = ЗначениеЦены;
        Пер.ДатаЗнач = РабочаяДата;
        Пер.Записать();
    КонецЦикла;
КонецПроцедуры

Способ 2: Оптимизация с помощью транзакций

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


НачатьТранзакцию();
Пока Спр.ПолучитьЭлемент() = 1 Цикл
    // ... логика копирования ...
    Спр.Записать();
КонецЦикла;
ЗафиксироватьТранзакцию();

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

Способ 3: Использование универсальных обработок

Если вы не хотите писать код, можно воспользоваться готовыми инструментами, которые часто поставлялись с типовыми конфигурациями 1С 7.7 или разрабатывались сообществом. Одной из самых известных является обработка «Универсальный подбор и обработка объектов» (часто файл назывался UPr_Ele.ert).

Разберем, как ей пользоваться:

  1. Запустите обработку в режиме «1С:Предприятие».
  2. Выберите справочник «Материалы».
  3. Настройте фильтр (например, по конкретной группе товаров).
  4. Перейдите на вкладку «Обработка» и выберите действие «Произвольный алгоритм» или «Изменение реквизита».
  5. В поле формулы напишите: Объект.Цена2 = Объект.Цена3.
  6. Нажмите «Выполнить».

Меры предосторожности и риски

Проанализируем критически важные правила безопасности при проведении подобных массовых операций:

Резюме

Копирование колонок в 1С 7.7 — это задача для программиста или опытного администратора. Основной путь решения заключается в написании небольшого скрипта, который в цикле обходит элементы справочника. Главное — учитывать периодичность реквизитов и всегда иметь под рукой актуальную резервную копию базы данных. Рассмотрим ситуацию как возможность научиться базовым навыкам манипуляции данными в 1С, что является фундаментом для любого специалиста по сопровождению программных продуктов.

← На главную