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

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

В практике разработки на платформе 1С:Предприятие 8 часто встречаются задачи по массовому изменению данных в справочниках. Одной из классических учебных задач (например, из курса "Простой склад") является написание обработки для автоматической замены значения реквизита — в данном случае, смены цвета товара с красного на зеленый. В этой статье мы подробно разберем, как реализовать такую обработку, проанализируем различные подходы к хранению данных и выберем наиболее эффективный метод программирования.

Анализ структуры хранения данных

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

  1. Перечисление: Цвет выбирается из фиксированного списка (например, Перечисления.Цвета.Красный). Это наиболее вероятный вариант для учебных задач.
  2. Справочник: Цвет является ссылкой на элемент другого справочника (например, Справочники.Цвета). В этом случае поиск нужного цвета осуществляется по наименованию или коду.
  3. Строка: Цвет записан обычным текстом. Это наименее надежный вариант, так как он допускает ошибки ввода (например, "красный" и "Красный ").

Рассмотрим подробнее каждый из подходов и реализуем универсальный алгоритм обработки данных.

Решение задачи через изменение данных в базе (объектный подход)

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

Проанализируем пример кода, который решает поставленную задачу для случая, если цвет — это Перечисление:


// Создаем новый запрос для получения только нужных товаров
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   Номенклатура.Ссылка КАК Ссылка
    |ИЗ
    |   Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    |   Номенклатура.Цвет = &ЦветКрасный";

// Устанавливаем параметр запроса — значение перечисления "Красный"
Запрос.УстановитьПараметр("ЦветКрасный", Перечисления.Цвета.Красный);

// Выполняем запрос и начинаем обход результатов
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();

Пока Выборка.Следующий() Цикл
    // Для изменения данных нам необходимо получить объект из ссылки
    ТоварОбъект = Выборка.Ссылка.ПолучитьОбъект();
    
    // Устанавливаем новое значение реквизита
    ТоварОбъект.Цвет = Перечисления.Цвета.Зеленый;
    
    // Важный момент: отключаем проверки, если это массовая техническая операция
    ТоварОбъект.ОбменДанными.Загрузка = Истина;
    
    // Записываем изменения в информационную базу
    Попытка
        ТоварОбъект.Записать();
        Сообщить("Цвет изменен для: " + ТоварОбъект.Наименование);
    Исключение
        Сообщить("Не удалось изменить товар: " + ОписаниеОшибки());
    КонецПопытки;
КонецЦикла;

Аргументация выбранного подхода

Почему мы выбрали именно такую схему решения? Проанализируем ключевые моменты:

Визуальное изменение цвета в форме списка

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

Разберем пример для Обычных форм, используя обработчик события списка:


Процедура СписокПриПолученииДанных(Элемент, ОформленияСтрок)
    // Перебираем оформление каждой видимой строки
    Для каждого ОформлениеСтроки из ОформленияСтрок Цикл
        
        // Проверяем значение реквизита "Цвет" в данных строки
        Если ОформлениеСтроки.ДанныеСтроки.Цвет = Перечисления.Цвета.Красный Тогда
            // Если в базе он красный, в интерфейсе "красим" его в зеленый
            ОформлениеСтроки.ЦветФона = WebЦвета.Зеленый;
            ОформлениеСтроки.ЦветТекста = WebЦвета.Белый;
        КонецЕсли;
        
    КонецЦикла;
КонецПроцедуры

Важное замечание: Данный код не меняет данные в таблицах SQL, он лишь меняет "картинку" для пользователя. Для решения исходной задачи "обработки товаров" следует использовать первый вариант с записью объектов.

Работа со справочником цветов

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


// Сначала найдем ссылку на "Зеленый" цвет в справочнике цветов
СсылкаЗеленый = Справочники.Цвета.НайтиПоНаименованию("Зеленый");

Если СсылкаЗеленый.Пустая() Тогда
    Сообщить("Цвет 'Зеленый' не найден в справочнике Цвета!");
    Возврат;
КонецЕсли;

// Далее используем аналогичный запрос, но ищем по ссылке на Красный цвет
СсылкаКрасный = Справочники.Цвета.НайтиПоНаименованию("Красный");
// ... (далее код аналогичен примеру с перечислениями)

Подводя итог, можно сказать, что решение задачи зависит от четкого понимания структуры метаданных. Мы рекомендуем всегда использовать Запросы для выборки данных и Попытка...Исключение при записи объектов, чтобы ваша обработка была надежной и быстрой.

← На главную