Почему удаляются строки из табличной части документа Установка цен номенклатуры

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

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

Механизм автоматической очистки строк

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

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

Наиболее частой причиной, как мы выяснили из обсуждения, является зависимость одного вида цен от другого. Если для товара «Мегамарт» цена рассчитывается на основании «Закупочной цены», а сама закупочная цена на дату документа не установлена, результат формулы будет равен нулю. Рассмотрим алгоритм, который срабатывает «под капотом» системы:


// Упрощенная логика расчета цены в документе
Для Каждого СтрокаТЧ Из ТабличнаяЧастьЦены Цикл
    БазоваяЦена = ПолучитьДействующуюЦену(СтрокаТЧ.Номенклатура, ВидЦеныВлияющий, Объект.Дата);
    Если БазоваяЦена = 0 Тогда
        // Если база не найдена, результат вычисления по формуле обнуляется
        СтрокаТЧ.Цена = 0;
    Иначе
        СтрокаТЧ.Цена = БазоваяЦена * КоэффициентНаценки;
    КонецЕсли;
    
    // Если итоговая цена 0, строка подлежит удалению
    Если СтрокаТЧ.Цена = 0 Тогда
        УдалитьСтрокуТЧ(СтрокаТЧ);
    КонецЕсли;
КонецЦикла;

Проанализируем ситуацию: если вы видите, что строка пропадает после выполнения команды «Рассчитать вычисляемые», первым делом проверьте наличие записей в регистре ЦеныНоменклатуры по тем видам цен, которые являются влияющими (базовыми) для вашего вида цен.

Проблема времени документа и последовательности записей

Представим ситуацию: мы создаем два документа в один день. Первый документ устанавливает базовую цену, а второй — зависимую. Если время документа с зависимой ценой меньше или совпадает со временем базового документа, система при поиске среза последних данных на момент времени документа может просто «не увидеть» новую базовую цену. Рассмотрим, как это исправить:

  1. Проверьте время создания документов. Если оба документа созданы, например, в 12:00:00, попробуйте изменить время зависимого документа на 12:00:01.
  2. Используйте типовую обработку «Цены номенклатуры», которая позволяет создавать цепочку зависимых цен в правильной последовательности.
  3. Убедитесь, что документ с базовыми ценами проведен, а не просто записан. Непроведенные документы не делают записей в регистр, и расчет по ним невозможен.

Влияние настроек округления

Иногда формула отрабатывает корректно, но итоговая цена становится нулевой из-за правил округления. Заглянем в настройки объекта ВидыЦен. Если у вас установлена очень маленькая базовая цена и настроено округление, например, «до 100 рублей в меньшую сторону», то любая цена ниже 100 рублей превратится в ноль. В этом случае система также удалит строку из документа.

Посмотрим на пример:
Базовая цена = 50 руб.
Наценка = 10%.
Расчетная цена = 55 руб.
Правило округления = «Округлять до 100 в меньшую сторону».
Итог = 0 руб. (строка удаляется).

Использование схем компоновки данных (СКД) и отборов

Если способ задания цены в вашем виде цен настроен как «Произвольный запрос к данным ИБ» или используются «Наценки по сегментам», система проверяет соответствие товара заданным фильтрам. Проанализируем ситуацию, когда товар перестал попадать в сегмент номенклатуры, указанный в настройках вида цен. При расчете система увидит, что для данного товара цена не может быть определена в рамках текущей настройки, и исключит его из списка установки цен.

Как провести диагностику и решить проблему

Выясним пошагово, что нужно сделать, чтобы строки перестали пропадать:

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

Важный нюанс: В некоторых версиях 1С:УТ 11 реализован механизм оптимизации, который скрывает строки, если новая рассчитанная цена полностью совпадает с текущей уже действующей ценой. Однако в большинстве случаев это приводит не к удалению строки, а к отсутствию движений по ней. Если же строка именно пропадает при нажатии «Рассчитать», ищите проблему в «пустой» базе для расчета.

Таким образом, мы выяснили, что удаление строк — это защитный механизм системы, предотвращающий запись некорректных (нулевых) цен. Внимательный анализ цепочки зависимостей и временных меток документов позволит вам успешно решить эту задачу.

← На главную