Шеф Петрович о конвейере кулинарных чудес
🎩 ЧТО ТАКОЕ ОБРАБОТКА В 1С?
"Марковка! Обработка — это как кухонный комбайн. Ты загружаешь сырые данные, нажимаешь кнопку — и получаешь готовое блюдо!"
Без обработки:
1000 накладных. Каждую проверяешь вручную, правишь ошибки. Месяц работы.
С обработкой:
Загрузил 1000 накладных → запустил обработку → через 5 минут все проверены и исправлены.
🛠️ 3 ВИДА ОБРАБОТОК (как кухонная техника)
1. ОБРАБОТКА ЗАПОЛНЕНИЯ — "ПОЛУФАБРИКАТЫ"
plaintext
ЧТО ДЕЛАЕТ: Заполняет документы автоматически
ПРИМЕРЫ:
- "Заполнить цены по последней закупке"
- "Рассчитать скидки по объёму"
- "Установить ставки НДС"
КАК В ЖИЗНИ: Замороженные пельмени. Быстро, стандартно, без ручной лепки.
2. ГРУППОВАЯ ОБРАБОТКА — "КОНВЕЙЕР"
plaintext
ЧТО ДЕЛАЕТ: Выполняет одно действие с множеством объектов
ПРИМЕРЫ:
- "Провести все неоплаченные счета"
- "Удалить старые резервные копии"
- "Переоценить все товары на складе"
КАК В ЖИЗНИ: Конвейер по нарезке овощей. Кинул мешок картошки — получил нарезанную.
3. УНИВЕРСАЛЬНАЯ ОБРАБОТКА — "МУЛЬТИВАРКА"
plaintext
ЧТО ДЕЛАЕТ: Делает всё что угодно (программируемая)
ПРИМЕРЫ:
- "Миграция данных из старой системы"
- "Сравнение двух баз данных"
- "Выгрузка в Excel с особыми правилами"
КАК В ЖИЗНИ: Мультиварка. И суп сварить, и торт испечь, и йогурт сделать.
🎯 5 САМЫХ ПОЛЕЗНЫХ ОБРАБОТОК ДЛЯ НАЧИНАЮЩИХ
ОБРАБОТКА 1: "Массовое изменение реквизитов"
plaintext
ПРОБЛЕМА: Нужно у 500 товаров сменить поставщика
РЕШЕНИЕ:
1. Создаём обработку с таблицей товаров
2. Добавляем поле "Новый поставщик"
3. Заполняем таблицу
4. Нажимаем "Выполнить"
5. Все 500 товаров обновлены за 10 секунд
КОД-ПРИМЕР:
Для Каждого Строка Из ТаблицаТоваров Цикл
Товар = Строка.Товар;
Товар.Поставщик = Строка.НовыйПоставщик;
Товар.Записать();
КонецЦикла;
ОБРАБОТКА 2: "Очистка тестовых данных"
plaintext
ПРОБЛЕМА: База забита тестовыми документами
РЕШЕНИЕ:
1. Обработка ищет документы с определителем "ТЕСТ"
2. Предлагает список для удаления
3. Удаляет всё за один клик
БЕЗОПАСНОСТЬ: Всегда спрашивает подтверждение!
ОБРАБОТКА 3: "Перенос остатков"
plaintext
ПРОБЛЕМА: Закрыли старый склад, открыли новый
РЕШЕНИЕ:
1. Обработка читает остатки со старого склада
2. Создаёт документы перемещения
3. Рассчитывает оптимальные партии
4. Проводит все документы автоматически
ОБРАБОТКА 4: "Сравнение цен"
plaintext
ПРОБЛЕМА: Цены у конкурентов дешевле
РЕШЕНИЕ:
1. Загружаем прайс-лист конкурента (Excel)
2. Обработка сравнивает с нашими ценами
3. Выделяет красным, где мы дороже
4. Предлагает новые цены
5. Применяет скидки автоматически
ОБРАБОТКА 5: "Резервное копирование настроек"
plaintext
ПРОБЛЕМА: При обновлении слетают настройки пользователей
РЕШЕНИЕ:
1. Обработка выгружает все настройки
2. Сохраняет в XML-файл
3. После обновления — загружает обратно
4. Пользователи даже не замечают изменений
⚠️ 7 ГЛАВНЫХ ОШИБОК ПРИ СОЗДАНИИ ОБРАБОТОК
Ошибка 1: "Нет прогресс-бара"
plaintext
НЕПРАВИЛЬНО: Обработка 10 минут "висит"
ПРАВИЛЬНО:
Обработка 1000 элементов из 10000 (10%)
Элементы в секунду: 150
Осталось времени: 1 минута
Код прогресс-бара:
bsl
ВсегоЭлементов = 10000;
Обработано = 0;
Для Каждого Элемент Из Коллекция Цикл
// Обработка...
Обработано = Обработано + 1;
Процент = Обработано / ВсегоЭлементов * 100;
ОбработкаПрерывания("Обработка...", Процент);
КонецЦикла;
Ошибка 2: "Нет проверки прав"
plaintext
ОПАСНО: Любой пользователь может запустить
БЕЗОПАСНО:
Если Не ПравДоступна("Администратор") Тогда
Сообщить("Нет прав!");
Возврат;
КонецЕсли;
Ошибка 3: "Обработка без отмены"
plaintext
ПРОБЛЕМА: Запустил — передумал — не остановить
РЕШЕНИЕ:
1. Кнопка "Отмена"
2. Проверка ОбработкаПрерывания() в цикле
3. Возможность паузы
Ошибка 4: "Нет лога выполнения"
plaintext
ПЛОХО: Обработка упала — непонятно на каком элементе
ХОРОШО:
Лог.Добавить("Начало обработки товара: " + Товар.Наименование);
Попытка
// Обработка
Исключение
Лог.Добавить("Ошибка: " + ОписаниеОшибки());
КонецПопытки;
Ошибка 5: "Перезапись без предупреждения"
plaintext
ОПАСНО: Тихо меняет данные
БЕЗОПАСНО:
Сообщить("Будет изменено 150 записей. Продолжить?",
РежимДиалогаВопрос.ДаНет);
Если Результат = КодВозвратаДиалога.Нет Тогда
Возврат;
КонецЕсли;
Ошибка 6: "Нет отката при ошибке"
plaintext
ПЛОХО: Из 100 элементов обработалось 50, 51-й упал,
50 изменений остались
ХОРОШО:
НачатьТранзакцию();
Попытка
// Обработка всех элементов
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
Сообщить("Отменено из-за ошибки");
КонецПопытки;
Ошибка 7: "Игнорирование производительности"
plaintext
МЕДЛЕННО (1000 запросов):
Для Каждого Товар Из Товары Цикл
Запрос = Новый Запрос("ВЫБРАТЬ Цена ИЗ ...");
// 1000 отдельных запросов!
КонецЦикла;
БЫСТРО (1 запрос):
Запрос = Новый Запрос("ВЫБРАТЬ ВСЕ Цены...");
Результат = Запрос.Выполнить();
// Один запрос, вся информация
🎓 ПРАКТИЧЕСКИЙ ПРИМЕР: "ОБРАБОТКА МАССОВОЙ ПЕРЕОЦЕНКИ"
Шаг 1: Дизайн формы
plaintext
ФОРМА ОБРАБОТКИ:
┌─────────────────────────────────┐
│ МАССОВАЯ ПЕРЕОЦЕНКА ТОВАРОВ │
├─────────────────────────────────┤
│ [x] Только выбранные группы │
│ [ ] Все товары │
│ │
│ Тип изменения: │
│ ● Наценка в % [10] % │
│ ○ Скидка в % [ ] % │
│ ○ Новая цена [ ] руб. │
│ │
│ [Выбрать группы товаров...] │
│ │
│ [ВЫПОЛНИТЬ] [ОТМЕНА] [ЛОГ] │
└─────────────────────────────────┘
Шаг 2: Код обработки
bsl
Процедура Выполнить()
// Проверка прав
Если Не ПравДоступна("ИзменениеЦен") Тогда
Сообщить("Нет прав на изменение цен!");
Возврат;
КонецЕсли;
// Подтверждение
Если Не Подтвердить("Изменить цены у " + ВсегоТоваров + " товаров?") Тогда
Возврат;
КонецЕсли;
// Транзакция для безопасности
НачатьТранзакцию();
Попытка
ВсегоТоваров = Товары.Количество();
Обработано = 0;
Для Каждого Товар Из Товары Цикл
// Прогресс-бар
Обработано = Обработано + 1;
ОбработкаПрерывания("Обработка...",
Обработано / ВсегоТоваров * 100);
// Проверка отмены
Если НужноПрервать() Тогда
Прервать();
КонецЕсли;
// Изменение цены
СтараяЦена = Товар.Цена;
Если ТипИзменения = "Наценка" Тогда
НоваяЦена = СтараяЦена * (1 + Процент / 100);
ИначеЕсли ТипИзменения = "Скидка" Тогда
НоваяЦена = СтараяЦена * (1 - Процент / 100);
КонецЕсли;
Товар.Цена = НоваяЦена;
// Логирование
Лог.Добавить(Товар.Наименование + ": " +
СтараяЦена + " → " + НоваяЦена);
// Запись
Товар.Записать();
КонецЦикла;
// Фиксация
ЗафиксироватьТранзакцию();
Сообщить("Готово! Обработано: " + Обработано + " товаров");
Исключение
// Откат при ошибке
ОтменитьТранзакцию();
Сообщить("Ошибка! Все изменения отменены: " +
ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры;
Шаг 3: Логирование
bsl
Процедура ПоказатьЛог()
// Создаём табличный документ
Документ = Новый ТабличныйДокумент;
// Заголовок
Документ.Область("A1").Текст = "Лог переоценки";
Документ.Область("A1").Шрифт = Новый Шрифт(, , Истина);
// Заголовки столбцов
Документ.Область("A3").Текст = "Товар";
Документ.Область("B3").Текст = "Старая цена";
Документ.Область("C3").Текст = "Новая цена";
Документ.Область("D3").Текст = "Изменение";
// Данные
Строка = 4;
Для Каждого Запись Из Лог Цикл
Документ.Область("A" + Строка).Текст = Запись.Товар;
Документ.Область("B" + Строка).Текст = Запись.СтараяЦена;
Документ.Область("C" + Строка).Текст = Запись.НоваяЦена;
Изменение = (Запись.НоваяЦена - Запись.СтараяЦена) /
Запись.СтараяЦена * 100;
Документ.Область("D" + Строка).Текст = Формат(Изменение,
"ЧДЦ=2; ЧРД=.,");
Строка = Строка + 1;
КонецЦикла;
// Показываем
Документ.Показать();
КонецПроцедуры;
🚀 5 СОВЕТОВ ДЛЯ ПРОДВИНУТЫХ ОБРАБОТОК
Совет 1: "Пакетная обработка"
plaintext
ПРОБЛЕМА: 100 000 товаров не обработать за один раз
РЕШЕНИЕ: Разбить на пакеты по 1000
- Пакет 1: товары 1-1000
- Пакет 2: товары 1001-2000
- Можно останавливаться и продолжать
- Меньше нагрузка на память
Совет 2: "Многопоточность"
plaintext
ДЛЯ СЛОЖНЫХ ВЫЧИСЛЕНИЙ:
1. Разбиваем данные на части
2. Каждую часть обрабатываем в отдельном потоке
3. Собираем результаты
УСКОРЕНИЕ: В 4-8 раз на многоядерных процессорах
Совет 3: "Инкрементальная обработка"
plaintext
ВМЕСТО: Каждый раз обрабатывать всё
ЛУЧШЕ: Обрабатывать только изменения с прошлого раза
- Быстрее
- Меньше нагрузки
- Можно запускать чаще
Совет 4: "Обработка по расписанию"
plaintext
НАСТРАИВАЕМ:
- Каждый день в 2:00 ночи
- Каждый понедельник в 9:00
- Каждое 1-е число месяца
ПРЕИМУЩЕСТВА:
- В нерабочее время
- Автоматически
- Без участия пользователя
Совет 5: "Обработка как сервис"
plaintext
ПРЕВРАЩАЕМ обработку в:
1. REST API сервис
2. Веб-сервис
3. Фоновое задание
МОЖНО вызывать из:
- Других систем
- Мобильных приложений
- По HTTP запросам
🏁 ЗАКЛЮЧЕНИЕ ОТ ШЕФА:
"Марковка, запомни главное про обработки:
ОБРАБОТКА — ЭТО СИЛА УМНОЖЕНИЯ!
Одна минута твоего времени × обработка = часы сэкономленного времени пользователей.
Начни с малого:
- Неделя 1: Простая обработка заполнения
- Неделя 2: Групповая обработка с прогресс-баром
- Неделя 3: Универсальная обработка с настройками
- Неделя 4: Обработка с транзакциями и откатом
Всегда думай о:
- Безопасности — кто может запустить?
- Надёжности — что если упадёт?
- Производительности — сколько времени займёт?
- Удобстве — поймёт ли пользователь?
И никогда не делай обработку без:
✅ Прогресс-бара
✅ Подтверждения
✅ Логирования
✅ Отката при ошибке
✅ Проверки прав
Обработки — это как кухонные роботы:
- Блендер (обработка заполнения) — для быстрых задач
- Духовка (групповая обработка) — для больших объёмов
- Мультиварка (универсальная обработка) — для всего
Удачи! И помни: лучшая обработка — та, которую пользователь даже не замечает, потому что всё работает само!" ⚙️🤖
📌 ШПАРГАЛКА ДЛЯ БЫСТРОГО СТАРТА:
plaintext
ШАБЛОН ПРОСТОЙ ОБРАБОТКИ:
1. Форма с параметрами
2. Кнопка "Выполнить"
3. Проверка прав
4. Подтверждение действия
5. НачатьТранзакцию()
6. Прогресс-бар в цикле
7. Логирование
8. ЗафиксироватьТранзакцию()
9. Сообщение о результате
ЧЕК-ЛИСТ ПЕРЕД ЗАПУСКОМ:
☑ Сделана резервная копия
☑ Проверено на тестовых данных
☑ Прогресс-бар работает
☑ Есть кнопка "Отмена"
☑ Логи пишутся
☑ Права проверяются
☑ Подтверждение запрашивается