Почему при программном создании документа «Установка цен номенклатуры» данные не попадают в регистр сведений?

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

При автоматизации загрузки данных из внешних источников (например, Excel) программисты часто сталкиваются с ситуацией, когда документ Установка цен номенклатуры в конфигурации 1С:Управление торговлей 11 создается и записывается, но движения в регистре сведений Цены номенклатуры не появляются. Рассмотрим подробно причины этой проблемы и разберем правильные способы программного формирования документа, чтобы данные гарантированно попадали в регистр.

Анализ основных причин отсутствия движений

Проанализируем ситуацию: документ создан программно, заполнены товары и цены, флаг Проведен установлен в значение Истина, но регистр пуст. Основная причина кроется в том, что в современных конфигурациях (УТ 11, ERP, КА 2) процедура проведения документа — это сложный алгоритм, который проверяет множество условий. Если хотя бы одно условие не выполнено, система «молча» завершает проведение, не создавая записей в регистрах.

Ключевыми факторами являются:

  1. Статус документа: Это самая частая ошибка. Чтобы документ сделал движения, его реквизит Статус должен иметь значение Согласован. Если статус оставить пустым или в состоянии «На согласовании», типовой код проведения просто очистит движения.
  2. Заполнение таблицы «Виды цен»: Многие забывают, что помимо таблицы Товары, в документе есть табличная часть ВидыЦен. Если вид цены, указанный в строках товаров, не добавлен в эту ТЧ, система проигнорирует эти строки при проведении.
  3. Режим записи: Использование метода Записать(РежимЗаписиДокумента.Запись) при установленном флаге Проведен = Истина является некорректным. Необходимо использовать штатный режим проведения.
  4. Признак изменения цены: Для корректной фиксации цены в строке ТЧ Товары должен быть установлен флаг ЦенаИзмененаВручную.

Правильная реализация программного создания документа

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

Рассмотрим пример правильного кода:


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

КонецПроцедуры

Разбор нюансов нумерации и заполнения табличных частей

Выясним причину проблем с нумерацией, о которых упоминалось в теме. Если присваивать номер документа вручную (например, используя время в секундах), это может «сбить» счетчик автонумерации 1С. В результате пользователи при попытке создать документ вручную будут получать ошибку «Номер не уникален». Всегда используйте метод УстановитьНовыйНомер() перед записью документа.

Посмотрим подробнее на работу с табличной частью ВидыЦен. В УТ 11 эта таблица служит фильтром для проведения. Процедура ОбработкаПроведения в модуле объекта считывает список видов цен из этой таблицы и формирует движения только по ним. Если вы добавили товар с видом цены «Оптовая», но в ТЧ ВидыЦен указана только «Розничная», цена для оптовой в регистр не попадет.

Также проанализируем ситуацию с реквизитом ЦенаИзмененаВручную. В логике конфигурации Установка цен номенклатуры может выполнять расчетные функции (например, наценка на цену закупки). Если флаг ЦенаИзмененаВручную стоит в значении Ложь, система при проведении может попытаться пересчитать вашу цену по формуле, и если данных для расчета нет (например, не задана базовая цена), результат может стать нулевым.

Почему нельзя записывать движения вручную?

В Сообщении 7 автор темы предложил записывать данные напрямую в Движения.ЦеныНоменклатуры. Рассмотрим, почему это решение не рекомендуется:

Резюме: Чтобы документ Установка цен номенклатуры корректно работал, обеспечьте наличие статуса Согласован, заполните обе табличные части (Товары и ВидыЦен) и используйте метод Записать(РежимЗаписиДокумента.Проведение). Это гарантирует стабильную работу системы и корректное отражение цен в учете.

← На главную