Как программно заполнить документ Установка цен номенклатуры в 1С:ERP для нескольких видов цен

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

Программное создание документа Установка цен номенклатуры в 1С:ERP (и в «1С:Комплексная автоматизация 2») существенно отличается от аналогичных задач в старых редакциях программ. Основная сложность заключается в том, что один документ может содержать цены сразу по множеству видов цен, и архитектура табличной части предполагает хранение каждой цены в отдельной строке. В этой статье мы разберем, как правильно спроектировать алгоритм заполнения, чтобы избежать перезаписи данных и обеспечить корректное проведение документа.

Анализ структуры документа

Прежде чем приступать к написанию кода, проанализируем структуру данных документа УстановкаЦенНоменклатуры. В отличие от простых документов, где в строке ТЧ указан товар и его цена, здесь используется более сложная схема:

  1. Табличная часть ВидыЦен: содержит список всех видов цен, которые будут установлены или изменены данным документом. Без заполнения этой части данные в основной таблице могут быть проигнорированы системой.
  2. Табличная часть Товары: содержит строки, где каждая строка — это уникальная комбинация Номенклатура + Характеристика + ВидЦены.

Если вам нужно установить три разных цены (например, «Оптовая», «Розничная» и «Дилерская») для одного товара, в табличной части Товары должно появиться три отдельные строки.

Типичная ошибка при заполнении

Рассмотрим ситуацию, с которой часто сталкиваются разработчики: попытка заполнить цены разных видов в одну и ту же строку или неправильное использование индексов в цикле. Если вы сначала добавляете строку с номенклатурой, а затем во внутреннем цикле пытаетесь «найти» её и обновить вид цены, вы просто перезапишете предыдущее значение. В итоге в документе останется только последний вид цены из вашего массива.

Правильный алгоритм заполнения (пошаговое руководство)

Для корректного заполнения документа мы будем использовать вложенные циклы. Внешний цикл будет перебирать товары (из вашего файла или таблицы значений), а внутренний — виды цен для каждого этого товара.

Разберем пример кода, который реализует эту логику:


// Создаем новый объект документа
НовДок = Документы.УстановкаЦенНоменклатуры.СоздатьДокумент();
НовДок.Дата = ТекущаяДата();
НовДок.Статус = Перечисления.СтатусыУстановокЦенНоменклатуры.Согласован;

// 1. Заполняем ТЧ ВидыЦен (обязательно для корректной работы)
Для Каждого ВидЦеныСсылка Из МассивЦен Цикл
    НоваяСтрокаВида = НовДок.ВидыЦен.Добавить();
    НоваяСтрокаВида.ВидЦены = ВидЦеныСсылка;
КонецЦикла;

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

НовДок.Записать(РежимЗаписиДокумента.Запись);

Важные технические нюансы

Проанализируем дополнительные параметры, которые критичны для успешного проведения документа в 1С:ERP:

  1. Статус документа: Обратите внимание на реквизит Статус. Если программно оставить его в значении «Не согласован» (по умолчанию), цены не попадут в регистры и не будут доступны для выбора в заказах и продажах. Всегда устанавливайте Перечисления.СтатусыУстановокЦенНоменклатуры.Согласован.
  2. Учет характеристик и упаковок: Если в вашей системе ведется учет по характеристикам, обязательно заполняйте поле Характеристика. Если цена задается за конкретную упаковку, заполните поле Упаковка, иначе система посчитает цену за базовую единицу измерения.
  3. Автоматический расчет зависимых цен: Если у вас есть «Розничная» цена, которая рассчитывается процентом от «Оптовой», вам не обязательно заполнять её вручную в цикле. Вы можете заполнить только базовые виды цен, а затем вызвать экспортный метод модуля объекта документа для пересчета: НовДок.РассчитатьЦены().
  4. Валюта: Поле Валюта в табличной части Товары должно строго соответствовать валюте, указанной в настройках Вида цены. В противном случае возникнет ошибка при проведении.

Контроль дублей и оптимизация

При программном формировании документа важно следить за тем, чтобы в табличную часть не попадали дублирующие строки (одинаковая номенклатура + характеристика + вид цены). Система 1С:ERP может выдать ошибку при попытке проведения такого документа.

Если данных очень много, рассмотрим использование метода Загрузить() для табличных частей. Однако для этого вам потребуется подготовить таблицу значений, чья структура колонок полностью совпадает с именами реквизитов табличной части документа. Это работает быстрее, чем добавление строк в цикле через Добавить().

Выясним причину, почему иногда цены «не видны» после загрузки: чаще всего это связано с тем, что документ записан, но не проведен, либо дата документа установлена позже, чем момент, в который вы пытаетесь увидеть эти цены (например, в подборе заказов). Проверяйте время документа — рекомендуется устанавливать его на начало дня (00:00:00), чтобы цены действовали в течение всех суток.

← На главную