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