При работе с устаревшими, но все еще надежными конфигурациями на платформе 1С:Предприятие 7.7, пользователи часто сталкиваются с необходимостью массового изменения данных. Типичный пример — копирование цен из одной категории в другую в иерархическом справочнике «Материалы» или «Номенклатура». В отличие от современных версий 1С или табличных редакторов типа Excel, в 1С 7.7 нет встроенной функции «скопировать колонку» нажатием правой кнопки мыши. Эту задачу необходимо решать либо программным путем, либо с помощью специализированных сервисных обработок.
В этой статье мы подробно разберем, как правильно подойти к решению этой задачи, рассмотрим нюансы работы с типами данных и приведем примеры кода для автоматизации процесса.
Прежде всего, проанализируем важный технический момент, упомянутый в обсуждении. То, что пользователь видит в форме списка как «колонки», на уровне базы данных является реквизитами справочника. Форма списка — это лишь визуальное представление. Поэтому задача «скопировать колонку» на языке программиста звучит так: «Перебрать все элементы справочника и присвоить значению Реквизита А значение Реквизита Б».
Перед началом работы крайне важно выяснить, является ли реквизит (цена) периодическим. В 1С 7.7 цены часто настраиваются как периодические, чтобы хранить историю их изменений на разные даты.
Периодический.Если мы попытаемся скопировать периодический реквизит как обычный, система либо выдаст ошибку, либо запишет данные некорректно (без привязки к нужной дате истории).
Рассмотрим самый гибкий способ — создание внешней обработки (файл с расширением .ert). Это позволит нам точно контролировать, какие элементы обрабатывать (например, только в определенных папках) и как именно копировать данные.
Шаг 1. Создание обработки. Откроем 1С в режиме «Конфигуратор», выберем меню «Файл» — «Новый» — «Внешний отчет (обработка)». В модуле этой обработки мы напишем алгоритм обхода справочника.
Шаг 2. Алгоритм для обычных реквизитов. Рассмотрим пример кода, где мы копируем данные из реквизита Цена3 в реквизит Цена2:
Процедура ВыполнитьКопирование()
Спр = СоздатьОбъект("Справочник.Материалы");
Спр.ВыбратьЭлементы();
Пока Спр.ПолучитьЭлемент() = 1 Цикл
// Проверяем, что это не папка (группа)
Если Спр.ЭтоГруппа() = 1 Тогда
Продолжить;
КонецЕсли;
// Копируем значение
Спр.Цена2 = Спр.Цена3;
// Записываем изменения в базу
Спр.Записать();
КонецЦикла;
Предупреждение("Копирование завершено!");
КонецПроцедуры
Шаг 3. Алгоритм для периодических реквизитов. Если цены периодические, нам нужно указать дату, на которую мы устанавливаем новое значение. Проанализируем пример кода с использованием объекта Периодический:
Процедура КопироватьПериодическиеЦены()
Спр = СоздатьОбъект("Справочник.Материалы");
Пер = СоздатьОбъект("Периодический");
РабочаяДата = ТекущаяДата(); // или любая нужная дата
Спр.ВыбратьЭлементы();
Пока Спр.ПолучитьЭлемент() = 1 Цикл
Если Спр.ЭтоГруппа() = 1 Тогда
Продолжить;
КонецЕсли;
// Получаем значение из Цена3 на текущую дату
ЗначениеЦены = Спр.Цена3.Получить(РабочаяДата);
// Устанавливаем значение в Цена2 через объект Периодический
Пер.ИспользоватьОбъект("Цена2", Спр.ТекущийЭлемент());
Пер.Значение = ЗначениеЦены;
Пер.ДатаЗнач = РабочаяДата;
Пер.Записать();
КонецЦикла;
КонецПроцедуры
Если в справочнике материалов десятки тысяч позиций, обработка может занять много времени, так как метод Записать() обращается к жесткому диску при каждом элементе. Выясним, как ускорить этот процесс. Мы можем обернуть цикл в транзакцию. Это заставит систему накопить изменения в памяти и записать их одним блоком.
НачатьТранзакцию();
Пока Спр.ПолучитьЭлемент() = 1 Цикл
// ... логика копирования ...
Спр.Записать();
КонецЦикла;
ЗафиксироватьТранзакцию();
Важно: Будьте осторожны с транзакциями на очень больших объемах данных (сотни тысяч записей), так как это может привести к временной блокировке базы данных для других пользователей.
Если вы не хотите писать код, можно воспользоваться готовыми инструментами, которые часто поставлялись с типовыми конфигурациями 1С 7.7 или разрабатывались сообществом. Одной из самых известных является обработка «Универсальный подбор и обработка объектов» (часто файл назывался UPr_Ele.ert).
Разберем, как ей пользоваться:
Объект.Цена2 = Объект.Цена3.Проанализируем критически важные правила безопасности при проведении подобных массовых операций:
1Cv7.md и файлы данных (папка DBF или база SQL).Цена3 имеет 2 знака после запятой, а Цена2 — 0 знаков, при копировании произойдет округление.Спр.ИспользоватьРодителя(СсылкаНаПапку) перед вызовом ВыбратьЭлементы().Копирование колонок в 1С 7.7 — это задача для программиста или опытного администратора. Основной путь решения заключается в написании небольшого скрипта, который в цикле обходит элементы справочника. Главное — учитывать периодичность реквизитов и всегда иметь под рукой актуальную резервную копию базы данных. Рассмотрим ситуацию как возможность научиться базовым навыкам манипуляции данными в 1С, что является фундаментом для любого специалиста по сопровождению программных продуктов.