При автоматизации рутинных задач, таких как ежедневное обновление цен в учетных системах 1С, часто возникает потребность в «умной» обработке данных. Мы рассмотрим, как правильно организовать алгоритм, который не просто создает новые документы каждый день, а выполняет проверку: если документ на текущую дату уже существует, мы берем его в работу и обновляем, а если нет — создаем новый. Также разберем, как реализовать фильтрацию товаров, чтобы в документ попадали только те позиции, по которым действительно изменилась цена.
Первым делом нам необходимо выяснить, не создавался ли уже документ «Установка цен номенклатуры» сегодня. Для этого используем стандартный Запрос. Важно помнить: чтобы внести изменения в существующий документ, нам недостаточно иметь его Ссылка — необходимо получить его Объект.
Рассмотрим код для проверки наличия документа и его подготовки к редактированию:
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| УстановкаЦенНоменклатуры.Ссылка
|ИЗ
| Документ.УстановкаЦенНоменклатуры КАК УстановкаЦенНоменклатуры
|ГДЕ
| УстановкаЦенНоменклатуры.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания";
Запрос.УстановитьПараметр("ДатаНачала", НачалоДня(ТекущаяДата));
Запрос.УстановитьПараметр("ДатаОкончания", КонецДня(ТекущаяДата));
Результат = Запрос.Выполнить();
Если Не Результат.Пустой() Тогда
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
// Получаем объект для изменения
ДокументОбъект = Выборка.Ссылка.ПолучитьОбъект();
ДокументОбъект.Товары.Очистить(); // Очищаем старые строки перед перезаполнением
// ... (логика заполнения)
ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);
КонецЦикла;
Иначе
// Создаем новый документ, если ничего не найдено
Документ = Документы.УстановкаЦенНоменклатуры.СоздатьДокумент();
// ... (логика заполнения)
КонецЕсли;
Чтобы избежать лишних вычислений в цикле и не перегружать сервер, мы соберем все необходимые цены в один запрос. Использование оператора ВЫБОР КОГДА позволяет нам подготовить данные для сравнения прямо на уровне базы данных. Это значительно ускоряет работу обработки.
Совместим получение текущих данных регистра цен и расчет новых значений (с учетом курса):
ВЫБРАТЬ
Цены.Номенклатура,
Цены.Характеристика,
Цены.Цена КАК СтараяЦена,
ВЫБОР
КОГДА Цены.ВидЦены.Идентификатор = "Оптовая" ТОГДА Цены.Цена * Курсы.Курс
ИНАЧЕ 0
КОНЕЦ КАК ЦенаОПТ,
// ... аналогично для других видов цен
Цены.ВидЦены.Идентификатор КАК ИдентификаторВидаЦены
ИЗ
РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК Цены
ЛЕВОЕ СОЕДИНЕНИЕ
РегистрСведений.КурсыВалют.СрезПоследних КАК Курсы
ПО Цены.Валюта = Курсы.Валюта
ГДЕ
Цены.ВидЦены.Ссылка В(&МассивЦен)
Чтобы документ не разрастался до тысяч позиций, по которым цена не изменилась, мы вводим условие проверки. В цикле обхода выборки мы сравниваем рассчитанную новую цену с той, которая уже установлена как ИнтернетЦена. Добавляем строку в табличную часть документа Товары только в том случае, если значения отличаются.
Важные рекомендации:
Попытка...Исключение при записи документа, особенно если работа ведется в фоновом режиме по расписанию. Это позволит избежать остановки всей обработки из-за блокировки записи одним конкретным документом.Очистить() мы гарантируем, что старые, возможно ошибочные данные, не попадут в обновленный документ.Комментарий — это облегчает поиск и отладку в будущем.При соблюдении этих правил ваша обработка будет работать стабильно, корректно выполняя перерасчет цен и поддерживая актуальность данных без дублирования документов в системе.