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

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

В современных редакциях конфигураций на базе 1С:Предприятие 8.3, таких как Управление торговлей 11.5, ERP Управление предприятием и Комплексная автоматизация, процесс программного создания документов значительно усложнился. Часто программисты сталкиваются с ситуацией: документ создается, заполняется, записывается в режиме проведения, статус установлен как «Согласован», но в регистре сведений Цены номенклатуры пусто. В этой статье мы подробно разберем, почему это происходит и какие скрытые механизмы платформы нужно задействовать, чтобы цены успешно зафиксировались в системе.

Анализ исходной ситуации

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


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

// Заполнение видов цен
СтрокаВЦ = НовыйДокумент.ВидыЦен.Добавить();
СтрокаВЦ.ВидЦены = ВыбранныйВидЦены;

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

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

Несмотря на успешное выполнение кода и отсутствие системных ошибок, движений по регистру может не быть. Разберем пошагово причины этой проблемы.

Причина 1: Подсистема Ценообразование 2.5

В последних версиях УТ 11.5 используется обновленная подсистема ценообразования. Одной из ее ключевых особенностей является оптимизация записи движений. Проанализируем механизм: если вы пытаетесь установить цену, которая уже действует на данный момент (абсолютно совпадает по значению), система может принять решение не создавать избыточную запись в регистре. Однако это лишь верхушка айсберга.

Причина 2: Пропущенный Идентификатор строки

Это самая частая причина отсутствия движений при программном заполнении. В табличных частях современных конфигураций используется реквизит КлючСтроки или ИдентификаторСтроки. В типовых механизмах при интерактивном (ручном) заполнении этот уникальный GUID генерируется автоматически. При программном вызове метода Добавить() этот реквизит остается пустым.

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

Причина 3: Некорректное заполнение характеристик и упаковок

Даже если в вашей базе не ведется учет по характеристикам, поля Характеристика и Упаковка в табличной части Товары не должны содержать Неопределено. Проанализируем ситуацию: в запросах проведения часто используется ВНУТРЕННЕЕ СОЕДИНЕНИЕ по этим полям. Если вместо пустой ссылки там окажется Неопределено, строка будет отсеяна из выборки.

Важно: Всегда инициализируйте эти поля значениями Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка() и Справочники.УпаковкиЕдиницыИзмерения.ПустаяСсылка().

Причина 4: Статус документа и флаги согласования

В УТ 11.5 за проведение отвечают сразу два механизма: реквизит Статус и логический флаг Согласован (в зависимости от настроек программы). Рассмотрим нюанс: в некоторых релизах статус «Согласован» — это лишь промежуточный этап. Проверьте, не требуется ли статус «Действует». Кроме того, если в системе включено использование статусов, документ в статусе «Не согласован» никогда не создаст движений по регистрам сведений цен, даже если он проведен как объект.

Рекомендуемое решение: Использование типовых методов

Вместо прямого перебора и добавления строк в таблицу Товары, мы рекомендуем использовать встроенные механизмы конфигурации. Разберем, как правильно инициализировать документ, чтобы заполнились все служебные параметры.

Перед записью документа обязательно вызовите метод объекта ЗаполнитьПараметрыДокумента(). Это заполнит внутренние структуры, необходимые для корректного формирования движений. Рассмотрим пример улучшенного кода:


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

Как проверить результат в отладчике?

Если движения все равно не появляются, проанализируем ситуацию через отладку. Выясним причину, выполнив следующие шаги:

  1. Откройте модуль объекта Документ.УстановкаЦенНоменклатуры.
  2. Найдите процедуру ОбработкаПроведения.
  3. Установите точку останова на моменте формирования набора записей.
  4. Проверьте содержимое временных таблиц, которые формируются внутри модуля. Если таблица товаров пуста после выполнения запросов, значит, либо не совпали КлючСтроки, либо виды цен не соответствуют тем, что указаны в таблице Товары.

Подведем итог: Для успешного программного создания документа «Установка цен номенклатуры» в УТ 11.5 недостаточно заполнить только реквизиты Номенклатура и Цена. Необходимо обеспечить уникальность КлючСтроки, корректно заполнить пустые ссылки характеристик и вызвать метод ЗаполнитьПараметрыДокумента(). Только в этом случае механизмы подсистемы Ценообразование 2.5 отработают штатно и зафиксируют данные в регистрах.

← На главную