В разработке на платформе 1С часто возникает задача не просто вывести число, а сделать это максимально адаптивно. Типичный пример: нужно отобразить число так, чтобы целые значения выглядели как целые (без запятой и нулей), а дробные — с сохранением значащих цифр, но без лишних "хвостов" из нулей. Для реализации такой логики, особенно в кастомных диалогах ввода, необходимо научиться программно "читать" форматную строку. Разберем, как это сделать эффективно.
Стандартная форматная строка 1С (например, "ЧДЦ=3; ЧРД=,") используется функциями Формат() и конструкторами платформы. Однако платформа не предоставляет встроенного метода, который бы вернул структуру параметров из этой строки. Нам это может понадобиться, чтобы:
ЧДЦ) для ограничения ввода в самописном поле.ЧРД).Рассмотрим несколько способов решения этой задачи, от простых "хаков" до профессиональных инструментов.
Проанализируем структуру форматной строки: она состоит из пар Ключ=Значение, разделенных точкой с запятой. Это в точности совпадает с синтаксисом многоязычных строк 1С. Мы можем воспользоваться этим сходством, передав форматную строку в функцию НСтр().
Рассмотрим пример, как получить конкретные параметры:
ФорматнаяСтрока = "ЧДЦ=3; ЧРД=,; ЧГ=3";
// Получаем количество знаков после запятой
КоличествоЗнаков = НСтр(ФорматнаяСтрока, "ЧДЦ");
// Получаем разделитель дробной части
РазделительДробной = НСтр(ФорматнаяСтрока, "ЧРД");
// Проверяем результат
Если ЗначениеЗаполнено(КоличествоЗнаков) Тогда
Сообщить("Точность: " + КоличествоЗнаков);
КонецЕсли;
Преимущества: это самый быстрый и короткий способ, не требующий написания собственных циклов. Если ключ в строке отсутствует, НСтр() просто вернет пустую строку.
Ограничения: метод может некорректно сработать, если внутри значений параметров встретятся спецсимволы, которые НСтр() интерпретирует по-своему (например, кавычки), но для стандартных параметров форматной строки числа это практически не встречается.
Если нам нужно извлечь сразу все параметры, не перебирая их по одному, или если форматная строка имеет сложную структуру, лучше использовать регулярные выражения. Это позволит превратить строку в полноценный объект Соответствие или Структура.
Разберем реализацию функции-парсера:
Функция РазобратьФорматнуюСтроку(Знач ВхСтрока) Экспорт
Результат = Новый Соответствие;
РегВыражение = Новый COMОбъект("VBScript.RegExp");
РегВыражение.Global = Истина;
РегВыражение.IgnoreCase = Истина;
РегВыражение.Multiline = Истина;
// Паттерн ищет конструкции Имя=Значение до точки с запятой
РегВыражение.Pattern = "([^;=]+)=([^;]+)";
Matches = РегВыражение.Execute(ВхСтрока);
Для Каждого Match Из Matches Цикл
Ключ = СокрЛП(Match.SubMatches(0));
Значение = СокрЛП(Match.SubMatches(1));
Результат.Вставить(Ключ, Значение);
КонецЦикла;
Возврат Результат;
КонецФункции
Этот метод позволяет за один проход получить все настройки и далее обращаться к ним программно. Проанализируем ситуацию: если в строке будет "ЧЦ=10; ЧДЦ=2", мы получим соответствие с двумя ключами.
Если ваша конфигурация построена на базе БСП, не нужно изобретать велосипед. В модуле СтроковыеФункцииКлиентСервер есть готовые инструменты для работы со строками вида "ключ=значение".
Посмотрим на пример использования функции РазложитьСтрокуВПараметры():
ПараметрыФормата = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВПараметры(ФорматнаяСтрока, ";", "=");
Если ПараметрыФормата.Свойство("ЧДЦ") Тогда
Точность = Число(ПараметрыФормата.ЧДЦ);
КонецЕсли;
Это наиболее "правильный" путь с точки зрения стандартов разработки 1С, так как он обеспечивает кроссплатформенность и не зависит от COM-объектов (в отличие от регулярных выражений).
Теперь, когда мы научились получать параметры (например, ЧДЦ — точность), решим основную задачу автора темы: как выводить 1.000 как 1, а 1.100 как 1.1.
Выясним причину проблемы: стандартная функция Формат() с параметром ЧДЦ всегда дополняет дробную часть нулями до указанной разрядности. Чтобы этого избежать, можно использовать комбинированный подход.
Вариант А: Использование функции Строка()
Если нам не нужно специфическое группирование разрядов, простая функция Строка(Число) в 1С автоматически отсекает незначащие нули.
Число1 = 1.000;
Число2 = 1.100;
Сообщить(Строка(Число1)); // Результат: "1"
Сообщить(Строка(Число2)); // Результат: "1,1"
Вариант Б: Программная обработка после форматирования
Если же нам важно сохранить разделители групп или другие параметры, мы можем сначала применить Формат(), а затем очистить результат:
Функция ФорматБезЛишнихНулей(Значение, ПараметрыФормата)
// Получаем строку с максимальной нужной точностью
Рез = Формат(Значение, ПараметрыФормата);
Разделитель = ","; // Можно получить программно через парсинг ЧРД
Если Найти(Рез, Разделитель) > 0 Тогда
// Убираем нули с конца
Пока Прав(Рез, 1) = "0" Цикл
Рез = Лев(Рез, СтрДлина(Рез) - 1);
КонецЦикла;
// Если после удаления нулей остался только разделитель - убираем и его
Если Прав(Рез, 1) = Разделитель Тогда
Рез = Лев(Рез, СтрДлина(Рез) - 1);
КонецЕсли;
КонецЕсли;
Возврат Рез;
КонецФункции
Автор темы планирует динамически менять ФорматРедактирования. Рассмотрим важный нюанс: при редактировании числа в поле ввода платформа ориентируется на параметр ЧДЦ. Если вы хотите разрешить пользователю вводить до 3 знаков, но не хотите видеть нули при просмотре, разделяйте Формат (для отображения) и ФорматРедактирования (для ввода).
Проанализируем пример настройки элемента формы:
// Для редактирования разрешаем 3 знака
Элементы.ПомяВводаЧисла.ФорматРедактирования = "ЧДЦ=3; ЧРД=,; ЧГ=0";
// Для вывода (в событии ПриИзменении или ПриЧтенииНаСервере)
// используем логику очистки нулей, описанную выше.
Таким образом, сочетание парсинга параметров форматной строки (через НСтр или БСП) и последующей строковой обработки позволяет реализовать гибкий и удобный интерфейс для работы с числовыми данными, адаптирующийся под конкретные нужды бизнес-логики.