При автоматизации работы в программах семейства «1С:Предприятие» (особенно в конфигурациях «Управление торговлей», «ERP Управление предприятием» или «Комплексная автоматизация») разработчики часто сталкиваются с ситуацией, когда документ УстановкаЦенНоменклатуры проводится без видимых ошибок, отображается в истории изменения цен, но фактически новые цены не появляются в прайс-листе и в регистре сведений ЦеныНоменклатуры. Ситуация повторяется как при программном проведении, так и при ручном перезаполнении документа.
Давайте подробно разберем, почему возникает эта проблема, проанализируем внутренние механизмы работы системы ценообразования 1С и рассмотрим пошаговые решения для исправления данной ситуации.
Самая распространенная причина, из-за которой алгоритм проведения документа игнорирует строки табличной части, — это включенный учет по характеристикам для выбранных позиций номенклатуры при незаполненных характеристиках в самом документе.
Если в карточке «Вида номенклатуры» или в самой карточке товара установлен флаг «Использовать характеристики», система ожидает, что цена будет установлена не просто на товар, а на конкретное сочетание товара и его характеристики. Когда документ проводится, внутренний поисковый запрос в модуле проведения проверяет соответствие разрезов учета. Если характеристика в строке табличной части Товары оставлена пустой, система исключает эту строку из движений по регистру цен, считая запись некорректной.
Рассмотрим, как правильно доработать программный код создания документа, чтобы учесть этот нюанс:
// Получаем номенклатуру
НоменклатураСсылка = Справочники.Номенклатура.НайтиПоНаименованию(Строка.Наименование);
НоваяСтрока = ДокЦена.Товары.Добавить();
НоваяСтрока.Номенклатура = НоменклатураСсылка;
// Проверяем, используются ли характеристики для данной номенклатуры
Если НоменклатураСсылка.ИспользоватьХарактеристики Тогда
// Если характеристики используются, обязательно находим и подставляем нужную
НоваяСтрока.Характеристика = Справочники.ХарактеристикиНоменклатуры.НайтиПоНаименованию(Строка.Характеристика, Истина, , НоменклатураСсылка);
Иначе
НоваяСтрока.Характеристика = Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка();
КонецЕсли;
НоваяСтрока.Цена = Строка.Цена;
Обратите внимание, что при поиске элементов справочников методом НайтиПоНаименованию крайне важно передавать второй параметр как Истина. Это гарантирует поиск по точному соответствию наименования и предотвратит случайный подбор схожих элементов.
В процессе программной разработки может возникнуть ошибка вида «Недопустимое значение параметра (параметр номер '2')» при попытке выполнить следующую строку:
ДокЦена.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Оперативный);
Выясним причину этого поведения. Документ УстановкаЦенНоменклатуры по своей специфике не поддерживает оперативное проведение в реальном времени, так как он фиксирует цены на определенную дату и время (периодический регистр сведений). Для него допустим только один режим проведения — неоперативный.
Правильный вариант записи и проведения документа выглядит так:
ДокЦена.Записать(РежимЗаписиДокумента.Проведение);
При таком вызове платформа автоматически выберет правильный режим проведения, и документ запишет движения в базу данных.
Если вы работаете в современных версиях конфигураций (начиная с релизов 11.5/2.5), необходимо учитывать, что архитектура ценообразования претерпела значительные изменения. В системе появилось «Ценообразование версии 2.5».
В этой версии данные записываются не в старую табличную часть Товары и не в регистр сведений ЦеныНоменклатуры, а в новые объекты: табличную часть Товары2_5 и регистр сведений ЦеныНоменклатуры25 соответственно.
Если в вашей информационной базе включена функциональная опция нового ценообразования, а программный код по старой привычке заполняет ТЧ Товары, то при проведении документа система просто проигнорирует эти строки. Цены в новые регистры не запишутся.
Проанализируем пример кода, учитывающий актуальную версию ценообразования в базе данных:
// Проверяем, какая версия ценообразования используется в системе
ИспользуетсяЦенообразование25 = ЦенообразованиеВызовСервера.ИспользуетсяЦенообразование25();
Если ИспользуетсяЦенообразование25 Тогда
// Заполняем новую табличную часть для версии 2.5
НоваяСтрока = ДокЦена.Товары2_5.Добавить();
НоваяСтрока.Номенклатура = НоменклатураСсылка;
НоваяСтрока.ВидЦены = ВидЦеныДоб;
НоваяСтрока.Цена = Строка.Цена;
// Обязательно заполняем новые системные параметры, если они требуются
Иначе
// Работаем по старой схеме (версия 2.0)
ТабЧастьВидЦены = ДокЦена.ВидыЦен.Добавить();
ТабЧастьВидЦены.ВидЦены = ВидЦеныДоб;
НоваяСтрока = ДокЦена.Товары.Добавить();
НоваяСтрока.Номенклатура = НоменклатураСсылка;
НоваяСтрока.ВидЦены = ВидЦеныДоб;
НоваяСтрока.Цена = Строка.Цена;
КонецЕсли;
Иногда корень проблемы кроется в настройках самого элемента справочника ВидыЦен. Проверим параметры создаваемого или используемого вида цены:
УстановкаЦенНоменклатуры невозможно. Такие цены рассчитываются динамически «на лету» при обращении к ним. Для прямой записи цен способ задания должен быть строго равен «Ручное назначение».При интерактивной работе в режиме 1С:Предприятие пользователь заполняет форму, на которой работает сложный интерфейсный код (динамическое дерево цен). При программном создании документа мы работаем напрямую с табличными частями. Чтобы система поняла, что цена строки действительно изменилась и её нужно переписать в регистр, необходимо правильно взводить служебные флаги.
В строках табличной части обязательно устанавливайте флаг изменения цены:
НоваяСтрока.ЦенаИзмененаВручную = Истина;
Этот флаг сигнализирует алгоритмам проведения о необходимости перезаписи данного значения в регистр сведений.
Для гарантированного проведения цен по регистрам придерживайтесь следующего чек-листа:
Характеристика в документе, если учет по ним включен.Товары или Товары2_5).