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