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