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