При работе со старыми, но до сих пор активно используемыми конфигурациями на платформе 1С:Предприятие 8.1 разработчики и администраторы часто сталкиваются с необходимостью расширения функционала. Типичная задача — предоставить пользователю возможность вводить индивидуальный числовой показатель (например, максимальный лимит, пороговое значение или персональную скидку) в карточке элемента справочника, а затем программно находить наибольшее из этих значений.
В этой статье мы подробно разберем, как решить эту задачу на платформе 1С 8.1. Мы рассмотрим два принципиально разных подхода: классическое добавление реквизита через Конфигуратор и использование типового механизма свойств и категорий без изменения метаданных. Также мы исправим популярные заблуждения из обсуждений на форумах и детально разберем структуру поисковых запросов.
Давайте вместе разберем эту задачу по шагам.
---
Этот способ является наиболее очевидным для программиста. Он заключается в физическом изменении структуры базы данных путем добавления нового реквизита в нужный справочник.
Выясним последовательность действий для реализации этого варианта:
Номенклатура или Контрагенты). Если конфигурация находится на поддержке, предварительно потребуется зайти в меню Конфигурация -> Поддержка -> Настройка поддержки и включить возможность изменения.МаксимальныйЛимит.Число. Обязательно настроим разрядность (длину) и точность (количество знаков после запятой) в зависимости от бизнес-требований. Например, длина 15, точность 2.Важное предостережение: Изменение структуры типовой конфигурации автоматически снимает ее с полной поддержки. Это означает, что последующие обновления программы потребуют ручного сравнения и объединения конфигураций, что усложнит обслуживание системы в будущем.
После того как пользователи заполнят новое поле в карточках элементов, перед нами встает задача поиска наибольшего значения. Один из участников форума допустил забавную опечатку, спросив, можно ли найти значение «через парос». Разумеется, имелся в виду запрос.
Для поиска максимального числа среди всех элементов справочника мы составим запрос с использованием встроенного языка 1С. Проанализируем пример кода:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| МАКСИМУМ(СправочникНоменклатура.МаксимальныйЛимит) КАК МаксимальныйПоказатель
|ИЗ
| Справочник.Номенклатура КАК СправочникНоменклатура";
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Если Выборка.Следующий() Тогда
МаксимальноеЗначение = Выборка.МаксимальныйПоказатель;
Сообщить("Максимальное введенное значение: " + МаксимальноеЗначение);
КонецЕсли;
В данном примере мы используем агрегатную функцию МАКСИМУМ. Запрос сканирует всю таблицу справочника Номенклатура и мгновенно возвращает единственное наибольшее число из колонки МаксимальныйЛимит.
---
Для платформы 1С 8.1 это самое грамотное и элегантное решение, если требуется сохранить конфигурацию полностью типовой. В большинстве конфигураций того времени (таких как Управление торговлей 10.3 или Управление производственным предприятием 1.3) уже встроен мощный механизм дополнительных свойств.
Рассмотрим подробнее архитектуру этого механизма. Он базируется на двух объектах метаданных:
СвойстваОбъектов — здесь хранятся сами названия свойств (наш будущий «Лимит»).ЗначенияСвойствОбъектов — в этой периодической или непериодической таблице хранятся конкретные значения, привязанные к объектам справочника.Разберем по шагам, как настроить такое поле силами пользователя без привлечения программиста:
Максимальный показатель.Справочник "Номенклатура").Число, задав необходимый формат.Основное преимущество этого метода — конфигурация остается на полной поддержке, а пользователи получают необходимый функционал.
Так как данные свойств физически лежат не внутри таблицы справочника, а в регистре сведений, запрос для получения максимального значения будет выглядеть иначе. Нам потребуется обратиться к регистру ЗначенияСвойствОбъектов и сделать жесткий отбор по нашему свойству из ПВХ.
Посмотрим на пример такого запроса:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| МАКСИМУМ(ВЫРАЗИТЬ(РегистрЗначенияСвойств.Значение КАК ЧИСЛО(15, 2))) КАК МаксЗначение
|ИЗ
| РегистрСведений.ЗначенияСвойствОбъектов КАК РегистрЗначенияСвойств
|ГДЕ
| РегистрЗначенияСвойств.Свойство = &ПараметрСвойство
| И РегистрЗначенияСвойств.Объект ССЫЛКА Справочник.Номенклатура";
// Укажем ссылку на наше созданное свойство из Плана видов характеристик
Запрос.УстановитьПараметр("ПараметрСвойство", СсылкаНаНашеСвойство);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Если Выборка.Следующий() Тогда
Максимум = Выборка.МаксЗначение;
Сообщить("Найденный максимум среди свойств: " + Максимум);
КонецЕсли;
Обратите внимание на важный нюанс: Поле Значение в регистре сведений ЗначенияСвойствОбъектов имеет составной тип данных (так как свойства могут быть и строками, и датами, и справочниками). Чтобы агрегатная функция МАКСИМУМ отработала корректно, мы обязательно должны использовать конструкцию ВЫРАЗИТЬ(... КАК ЧИСЛО). Это преобразует тип значения к числовому формату прямо во время выполнения запроса на уровне СУБД.
---
В ходе обсуждения подобных задач на форумах (в частности, в Сообщении 9) часто можно встретить совет использовать механизм расширений конфигурации, чтобы добавить реквизиты, не снимая базу с поддержки.
Необходимо четко понимать, что в версии платформы 1С 8.1 расширений не существует. Этот функционал появился значительно позже — только в версии 1С 8.3.6 (в 2015 году). Платформа 8.1, выпущенная в 2007 году, предлагает исключительно два пути решения: либо прямое изменение метаданных в конфигураторе, либо использование ПВХ и регистров сведений в пользовательском режиме.
---
Если со временем вы перейдете на современные конфигурации, работающие на платформе 1С 8.3 под управлением Библиотеки стандартных подсистем (БСП), то обнаружите, что концепция «Свойств и категорий» развилась в два удобных инструмента:
Оба этих инструмента в современных версиях 1С настраиваются за считанные минуты прямо в режиме «1С:Предприятие» и без труда выводятся в отчеты за счет интеграции с Системой компоновки данных (СКД).
---
Подведем итог нашего анализа. Если перед вами стоит задача добавить числовое поле в справочник на платформе 1С 8.1, у вас есть два надежных пути:
Число напрямую в Конфигураторе и получайте его простым запросом с функцией МАКСИМУМ.ВЫРАЗИТЬ для приведения типа к числу.