Как программно перезаписать документ Установка цен номенклатуры при автоматической загрузке?

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

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

Этап 1: Поиск и получение объекта существующего документа

Первым делом нам необходимо выяснить, не создавался ли уже документ «Установка цен номенклатуры» сегодня. Для этого используем стандартный Запрос. Важно помнить: чтобы внести изменения в существующий документ, нам недостаточно иметь его Ссылка — необходимо получить его Объект.

Рассмотрим код для проверки наличия документа и его подготовки к редактированию:


Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ 
               | УстановкаЦенНоменклатуры.Ссылка 
               |ИЗ 
               | Документ.УстановкаЦенНоменклатуры КАК УстановкаЦенНоменклатуры 
               |ГДЕ 
               | УстановкаЦенНоменклатуры.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания";
Запрос.УстановитьПараметр("ДатаНачала", НачалоДня(ТекущаяДата));
Запрос.УстановитьПараметр("ДатаОкончания", КонецДня(ТекущаяДата));
Результат = Запрос.Выполнить();

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

Этап 2: Эффективная подготовка данных с помощью запроса

Чтобы избежать лишних вычислений в цикле и не перегружать сервер, мы соберем все необходимые цены в один запрос. Использование оператора ВЫБОР КОГДА позволяет нам подготовить данные для сравнения прямо на уровне базы данных. Это значительно ускоряет работу обработки.

Совместим получение текущих данных регистра цен и расчет новых значений (с учетом курса):


ВЫБРАТЬ 
    Цены.Номенклатура, 
    Цены.Характеристика,
    Цены.Цена КАК СтараяЦена,
    ВЫБОР 
        КОГДА Цены.ВидЦены.Идентификатор = "Оптовая" ТОГДА Цены.Цена * Курсы.Курс 
        ИНАЧЕ 0 
    КОНЕЦ КАК ЦенаОПТ,
    // ... аналогично для других видов цен
    Цены.ВидЦены.Идентификатор КАК ИдентификаторВидаЦены
ИЗ 
    РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК Цены
ЛЕВОЕ СОЕДИНЕНИЕ 
    РегистрСведений.КурсыВалют.СрезПоследних КАК Курсы 
    ПО Цены.Валюта = Курсы.Валюта
ГДЕ 
    Цены.ВидЦены.Ссылка В(&МассивЦен)

Этап 3: Фильтрация изменений и заполнение документа

Чтобы документ не разрастался до тысяч позиций, по которым цена не изменилась, мы вводим условие проверки. В цикле обхода выборки мы сравниваем рассчитанную новую цену с той, которая уже установлена как ИнтернетЦена. Добавляем строку в табличную часть документа Товары только в том случае, если значения отличаются.

Важные рекомендации:

  1. Всегда используйте Попытка...Исключение при записи документа, особенно если работа ведется в фоновом режиме по расписанию. Это позволит избежать остановки всей обработки из-за блокировки записи одним конкретным документом.
  2. Перед заполнением табличной части методом Очистить() мы гарантируем, что старые, возможно ошибочные данные, не попадут в обновленный документ.
  3. Для идентификации документа, созданного обработкой, удобно использовать реквизит Комментарий — это облегчает поиск и отладку в будущем.

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

← На главную