Когда число сохранено как текст в 1С, это может вызывать проблемы при расчетах и фильтрации. Есть несколько способов исправить это, причём “все сразу” — значит, скорее всего, вам понадобится обработка, работающая с большим объемом данных.
Общие принципы исправления:
- Определение полей, содержащих числа в виде текста: Необходимо точно определить, в каких полях (реквизитах) хранятся числа в виде текста. Преобразование текста в число: Используйте функции 1С для преобразования текстовых значений в числовые. Пакетная обработка: Для больших объемов данных используйте пакетную обработку, чтобы не перегружать систему. Резервное копирование: Перед выполнением массовых изменений обязательно сделайте резервную копию базы данных!
Способы исправления:
1. Использование консоли запросов (для опытных пользователей, точечные исправления):
- Консоль запросов позволяет выполнять SQL-подобные запросы к базе данных 1С. Этот способ подходит для исправления данных в небольшом количестве таблиц и полей.
// Пример запроса для обновления реквизита "Цена" в справочнике "Номенклатура"
ОБНОВИТЬ
Справочник. Номенклатура
УСТАНОВИТЬ
Цена = ЧИСЛО(ЦенаСтрокой) // Преобразуем текстовую цену в число
ГДЕ
НЕ Цена ЕСТЬ NULL
// где ЦенаСтрокой — реквизит справочника номенклатура, имеющий тип строка
Важно!!! Будьте предельно осторожны при использовании SQL-запросов напрямую к базе данных. Неправильный запрос может повредить данные. Сделайте резервную копию базы данных перед выполнением запросов на изменение данных. Замените Справочник. Номенклатура и ЦенаСтрокой на фактические имена. Условие НЕ Цена ЕСТЬ NULL исключает из обработки строки, в которых уже есть число.
2. Разработка внешней обработки (рекомендуемый способ для массового исправления):
- Разработка внешней обработки – это наиболее гибкий и безопасный способ исправления данных в 1С. Он позволяет контролировать процесс и обрабатывать данные пакетно.
Пример кода внешней обработки:
&НаСервере
Процедура ОбработатьСправочникНаСервере(ИмяСправочника, ИмяРеквизита)
Запрос = Новый Запрос;
Запрос. Текст =
"ВЫБРАТЬ
| "+ ИмяСправочника +".Ссылка КАК Ссылка,
| "+ ИмяСправочника +"."+ ИмяРеквизита +" КАК ТекстовоеЗначение
|ИЗ
| Справочник." + ИмяСправочника + " КАК "+ ИмяСправочника +"
|ГДЕ
| ТИПЗНАЧЕНИЯ("+ ИмяСправочника +"."+ ИмяРеквизита +") = ТИП("Строка")";
Выборка = Запрос. Выполнить().Выбрать();
Пока Выборка. Следующий() Цикл
Попытка
ЧисловоеЗначение = Число(Выборка. ТекстовоеЗначение);
Исключение
// Если преобразование не удалось, пропускаем элемент
Продолжить;
КонецПопытки;
Объект = Выборка. Ссылка. ПолучитьОбъект();
Объект[ИмяРеквизита] = ЧисловоеЗначение;
Попытка
Объект. Записать();
Исключение
Сообщить("Не удалось записать элемент: " + Выборка. Ссылка + " Ошибка: " + ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ОбработатьСправочник(Команда)
ИмяСправочника = "Номенклатура"; // Замените на имя вашего справочника
ИмяРеквизита = "Цена"; // Замените на имя вашего реквизита
ОбработатьСправочникНаСервере(ИмяСправочника, ИмяРеквизита);
Сообщить("Обработка завершена!");
КонецПроцедуры
Описание кода:
ОбработатьСправочникНаСервере(ИмяСправочника, ИмяРеквизита): Эта процедура выполняется на сервере и выполняет основную логику обработки.
- Запрос: Формирует запрос к базе данных для выбора ссылок на элементы справочника и значения текстового реквизита. Выборка: Выполняет запрос и получает выборку данных. Цикл: Перебирает элементы выборки.
- Преобразование в число: Пытается преобразовать текстовое значение реквизита в число. Если преобразование не удается (например, в тексте содержатся нечисловые символы), элемент пропускается. Получение объекта: Получает объект справочника по ссылке. Запись числового значения: Записывает числовое значение в реквизит справочника. Обработка ошибок: Обрабатывает возможные ошибки при записи элемента справочника.
ОбработатьСправочник(Команда): Эта процедура выполняется на клиенте и вызывает серверную процедуру ОбработатьСправочникНаСервере.
- Задание параметров: Укажите имя справочника и имя реквизита, которые нужно обработать. Вызов серверной процедуры: Вызывает серверную процедуру для обработки данных. Сообщение: Выводит сообщение об окончании обработки.
Инструкция по использованию:
Откройте 1С в режиме “Конфигуратор”. Создайте новую внешнюю обработку (Файл -> Новый -> Внешняя обработка). Скопируйте код в модуль объекта внешней обработки. Создайте команду на форме внешней обработки (например, кнопку “Обработать”). В обработчик команды на форме вставьте код клиентской процедуры ОбработатьСправочник(Команда). Сохраните внешнюю обработку (например, как “ОбработкаЧисел. epf”). Откройте 1С в режиме “Предприятие”. Откройте внешнюю обработку (Файл -> Открыть). Укажите имя справочника и имя реквизита в коде обработки (в процедуре ОбработатьСправочник). Нажмите кнопку “Обработать”. После завершения обработки проверьте данные в справочнике.
Плюсы:
- Более безопасно, чем прямой SQL. Можно обрабатывать данные пакетно, чтобы не перегружать систему. Можно настраивать правила преобразования данных. Можно вести протокол ошибок.
3. Использование обработки “Групповое изменение реквизитов” (если доступна в вашей конфигурации):
- В некоторых конфигурациях 1С есть встроенная обработка “Групповое изменение реквизитов”. Она позволяет изменять значения реквизитов у нескольких объектов одновременно. Откройте обработку “Групповое изменение реквизитов” (обычно находится в разделе “Сервис” или “Администрирование”). Укажите тип объекта (например, “Справочник. Номенклатура”). Укажите условие отбора (например, “Тип значения реквизита ‘Цена’ = Строка”). Укажите реквизит, который нужно изменить (“Цена”). В поле “Новое значение” используйте выражение Число(ТекущийОбъект. Цена) (или Val(ТекущийОбъект. Цена), если Число() не работает). Запустите обработку.
4. Преобразование при вводе данных (для предотвращения повторного возникновения проблемы):
- Если пользователи вводят данные вручную, добавьте проверку и автоматическое преобразование текстовых значений в числовые при записи объектов.
// Пример кода в обработчике события "ПередЗаписью" объекта
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Если ТипЗнч(ЭтотОбъект. Цена) = Тип("Строка") Тогда
Попытка
ЭтотОбъект. Цена = Число(ЭтотОбъект. Цена);
Исключение
Сообщить("Не удалось преобразовать цену в число!");
Отказ = Истина;
КонецПопытки;
КонецЕсли;
КонецПроцедуры
Важные моменты:
- Тип данных реквизита: Убедитесь, что тип данных реквизита, в который вы записываете числовые значения, установлен как “Число”. Разделитель дробной части: Убедитесь, что разделитель дробной части (точка или запятая) соответствует настройкам 1С и региональным настройкам компьютера. Используйте функцию Формат() для явного указания формата числа. Ошибки преобразования: Предусмотрите обработку ошибок при преобразовании текста в число. Если в тексте содержатся нечисловые символы, преобразование может завершиться с ошибкой. Производительность: При пакетной обработке больших объемов данных оптимизируйте код, чтобы избежать проблем с производительностью. Используйте транзакции для уменьшения нагрузки на базу данных. Делайте резервные копии!
Выбор способа исправления зависит от ваших навыков, объема данных и требований к безопасности. Рекомендуется начинать с разработки внешней обработки, так как этот способ обеспечивает наибольшую гибкость и контроль над процессом.