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