При разработке и доработке конфигураций на платформе 1С:Предприятие 7.7 (например, в популярном решении «Торговля и Склад») программисты часто сталкиваются с ситуацией, когда прямое присваивание значения реквизиту табличной части документа не дает желаемого результата. Рассмотрим классическую ситуацию: при попытке изменить значения в строке документа ПеремещениеТМЦ программным кодом значение количества обновляется успешно, а цена остается прежней или сбрасывается. Проанализируем причины такого поведения и разберем способы решения задачи.
Разберем типичный пример кода, который часто вызывает затруднения у начинающих разработчиков. Предположим, мы перебираем строки документа или работаем с конкретной строкой:
ПолучитьСтрокуПоНомеру(текСтр);
Количество = 10; // Работает
Цена = 100; // Может не сработать
Выясним причину, почему реквизит Цена может игнорировать попытку записи. Одной из наиболее вероятных причин является конфликт имен. В модулях формы 1С 7.7 часто объявлены локальные переменные или формальные параметры процедур с идентификаторами, совпадающими с именами реквизитов документа. Если в начале процедуры написано Перем Цена;, то любая попытка записи значения в Цена будет изменять локальную переменную, а не поле в табличной части документа.
Для гарантированного обращения к реквизиту объекта следует использовать специализированный метод УстановитьАтрибут(). Посмотрим на правильный пример кода:
ПолучитьСтрокуПоНомеру(текСтр);
Количество = 10;
УстановитьАтрибут("Цена", 100);
Использование УстановитьАтрибут позволяет платформе однозначно определить, что запись должна производиться именно в реквизит табличной части текущей строки документа, обходя любые локальные переменные с аналогичными именами.
Проанализируем ситуацию глубже. Даже если мы используем корректный метод записи, цена может «слетать» из-за встроенных алгоритмов пересчета. В документе ПеремещениеТМЦ логика работы с ценами жестко завязана на тип склада-получателя и склада-отправителя.
Рассмотрим основные правила, действующие в системе:
Цена часто носит справочный характер или вовсе блокируется, так как движения по регистрам ПартииНаличие формируются на основании партионного учета, а не цены, указанной в документе.ГлПересчетТабличнойЧасти.Если ваша задача — насильно установить свою цену, необходимо убедиться, что после вашего кода не вызываются типовые процедуры пересчета. В противном случае 1С вернет «эталонную» цену из справочника цен или рассчитает её заново по своим алгоритмам.
Для надежного изменения данных в табличной части документа (ТЧ) рекомендуется придерживаться следующей последовательности действий:
ПолучитьСтрокуПоНомеру() или в цикле ВыбратьСтроки() / ПолучитьСтроку().УстановитьАтрибут("Цена", НовЦена) для надежности.Сумма обычно не рассчитывается автоматически при программном изменении цены. Вам необходимо самостоятельно рассчитать и записать сумму, чтобы соблюдалось равенство Сумма = Цена * Количество.Форма.Обновить() для визуального отображения изменений пользователю.Пример комплексного изменения строки:
// Предположим, мы находимся в контексте документа
Если ВыбратьСтроки() = 1 Тогда
Пока ПолучитьСтроку() = 1 Цикл
НоваяЦена = 150.50;
НовоеКол = 5;
Количество = НовоеКол;
УстановитьАтрибут("Цена", НоваяЦена);
// Обязательно пересчитываем сумму вручную
Сумма = НовоеКол * НоваяЦена;
// Если в документе есть налоги (НДС), их также нужно пересчитать
// ГлПересчетНалогов(Контекст, "Цена"); // Пример вызова типовой функции
КонецЦикла;
КонецЕсли;
Важно помнить, что в документе ПеремещениеТМЦ цена в табличной части и цена проведения — это разные сущности. Если вы измените цену в ТЧ для перемещения на оптовый склад, себестоимость списания товара все равно будет взята из регистра ПартииНаличие по методу FIFO или LIFO (в зависимости от настроек учетной политики). Ручное изменение цены в документе без понимания того, как это повлияет на регистры ОстаткиТМЦ и Розница, может привести к серьезным ошибкам в учете.
Проанализируем совет из практики: если вам нужно видеть определенную цену в печатной форме перемещения, но при этом вы не хотите ломать механизмы партионного учета, иногда проще добавить в табличную часть дополнительный реквизит (например, ЦенаДляПечати) и заполнять его программно, не трогая основной реквизит Цена.
Таким образом, для решения проблемы «незаписываемой» цены в 1С 7.7 мы рекомендуем в первую очередь использовать метод УстановитьАтрибут и проверять наличие локальных переменных с тем же именем в модуле.