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