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

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

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

Давайте подробно разберем, почему возникает эта проблема, проанализируем внутренние механизмы работы системы ценообразования 1С и рассмотрим пошаговые решения для исправления данной ситуации.

Причина 1. Учет по характеристикам номенклатуры

Самая распространенная причина, из-за которой алгоритм проведения документа игнорирует строки табличной части, — это включенный учет по характеристикам для выбранных позиций номенклатуры при незаполненных характеристиках в самом документе.

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

Рассмотрим, как правильно доработать программный код создания документа, чтобы учесть этот нюанс:


// Получаем номенклатуру
НоменклатураСсылка = Справочники.Номенклатура.НайтиПоНаименованию(Строка.Наименование);

НоваяСтрока = ДокЦена.Товары.Добавить();
НоваяСтрока.Номенклатура = НоменклатураСсылка;

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

НоваяСтрока.Цена = Строка.Цена;

Обратите внимание, что при поиске элементов справочников методом НайтиПоНаименованию крайне важно передавать второй параметр как Истина. Это гарантирует поиск по точному соответствию наименования и предотвратит случайный подбор схожих элементов.

Причина 2. Ошибка программного вызова метода «Записать»

В процессе программной разработки может возникнуть ошибка вида «Недопустимое значение параметра (параметр номер '2')» при попытке выполнить следующую строку:


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

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

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

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

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

Причина 3. Переход на «Ценообразование 2.5» (УТ 11.5 / ERP 2.5)

Если вы работаете в современных версиях конфигураций (начиная с релизов 11.5/2.5), необходимо учитывать, что архитектура ценообразования претерпела значительные изменения. В системе появилось «Ценообразование версии 2.5».

В этой версии данные записываются не в старую табличную часть Товары и не в регистр сведений ЦеныНоменклатуры, а в новые объекты: табличную часть Товары2_5 и регистр сведений ЦеныНоменклатуры25 соответственно.

Если в вашей информационной базе включена функциональная опция нового ценообразования, а программный код по старой привычке заполняет ТЧ Товары, то при проведении документа система просто проигнорирует эти строки. Цены в новые регистры не запишутся.

Проанализируем пример кода, учитывающий актуальную версию ценообразования в базе данных:


// Проверяем, какая версия ценообразования используется в системе
ИспользуетсяЦенообразование25 = ЦенообразованиеВызовСервера.ИспользуетсяЦенообразование25();

Если ИспользуетсяЦенообразование25 Тогда
    // Заполняем новую табличную часть для версии 2.5
    НоваяСтрока = ДокЦена.Товары2_5.Добавить();
    НоваяСтрока.Номенклатура = НоменклатураСсылка;
    НоваяСтрока.ВидЦены = ВидЦеныДоб;
    НоваяСтрока.Цена = Строка.Цена;
    // Обязательно заполняем новые системные параметры, если они требуются
Иначе
    // Работаем по старой схеме (версия 2.0)
    ТабЧастьВидЦены = ДокЦена.ВидыЦен.Добавить();
    ТабЧастьВидЦены.ВидЦены = ВидЦеныДоб;
    
    НоваяСтрока = ДокЦена.Товары.Добавить();
    НоваяСтрока.Номенклатура = НоменклатураСсылка;
    НоваяСтрока.ВидЦены = ВидЦеныДоб;
    НоваяСтрока.Цена = Строка.Цена;
КонецЕсли;

Причина 4. Настройки «Вида цены» (Способ задания)

Иногда корень проблемы кроется в настройках самого элемента справочника ВидыЦен. Проверим параметры создаваемого или используемого вида цены:

  1. Способ задания цены: Если для вида цены установлен способ «Наценка на другой вид цен» или «Произвольный запрос к данным ИБ», то напрямую записать цену в регистр через документ УстановкаЦенНоменклатуры невозможно. Такие цены рассчитываются динамически «на лету» при обращении к ним. Для прямой записи цен способ задания должен быть строго равен «Ручное назначение».
  2. Статус вида цены: Убедитесь, что статус используемого вида цены установлен в значение «Действует». Если вид цены помечен как недействующий, система заблокирует движения по нему при проведении документов.

Причина 5. Не заполнена системная аналитика изменений

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

В строках табличной части обязательно устанавливайте флаг изменения цены:

НоваяСтрока.ЦенаИзмененаВручную = Истина;

Этот флаг сигнализирует алгоритмам проведения о необходимости перезаписи данного значения в регистр сведений.

Резюме и рекомендации

Для гарантированного проведения цен по регистрам придерживайтесь следующего чек-листа:

  1. Проверяйте использование характеристик у номенклатуры и всегда заполняйте реквизит Характеристика в документе, если учет по ним включен.
  2. Убедитесь, в какой версии ценообразования (2.0 или 2.5) работает ваша конфигурация, и заполняйте соответствующую табличную часть (Товары или Товары2_5).
  3. Используйте только неоперативный режим проведения при программной записи документа.
  4. Контролируйте настройки вида цены: способ заполнения должен быть ручным, а сам вид цены — со статусом «Действует».
← На главную