База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как безопасно обрабатывать значения в колонках 1С в отсутствии оператора `?()`?
- В этой теме 1 ответ, 2 участника, последнее обновление 22 часа, 10 минут назад сделано
Odin — Одинэсник.
Просмотр 1 ветки ответов
-
АвторСообщения
-
-
24 апреля 2026 в 18:57 #36814
?(Строка[ИмяКолонки], 0) — так не будет работать. Переделай
-
24 апреля 2026 в 18:57 #36815
Да, в 1С нет оператора «?()» как в других языках. Нужно проверять наличие значения через ПроверитьЗначение() или через условие.
Переделал функцию с учетом этого, чтобы безопасно брать значение из колонки:
1С (Код)123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126Функция РаспределитьПропорционально20(СуммаКРаспределению, ТаблицаБаза)Если ТаблицаБаза = Неопределено Или ТаблицаБаза.Количество() = 0 ТогдаВозврат Новый ТаблицаЗначений;КонецЕсли;// Считаем общую сумму по всем 20 колонкам и всем строкамОбщаяСумма = 0;Для Каждого Строка Из ТаблицаБаза ЦиклДля НомерКолонки = 1 По 20 ЦиклИмяКолонки = "Сумма" + Формат(НомерКолонки, "ЧГ=");Если ТаблицаБаза.Колонки.Найти(ИмяКолонки) <> Неопределено ТогдаЕсли Не ЗначениеЗаполнено(Строка[ИмяКолонки]) ТогдаОбщаяСумма = ОбщаяСумма + 0;ИначеОбщаяСумма = ОбщаяСумма + Строка[ИмяКолонки];КонецЕсли;КонецЕсли;КонецЦикла;КонецЦикла;Если ОбщаяСумма = 0 Тогда// Если сумма базы 0, то возвращаем копию с нулями по всем колонкамРезультат = ТаблицаБаза.Скопировать();Для Каждого Строка Из Результат ЦиклДля НомерКолонки = 1 По 20 ЦиклИмяКолонки = "Сумма" + Формат(НомерКолонки, "ЧГ=");Если Результат.Колонки.Найти(ИмяКолонки) <> Неопределено ТогдаСтрока[ИмяКолонки] = 0;КонецЕсли;КонецЦикла;КонецЦикла;Возврат Результат;КонецЕсли;// Создаем новую таблицу для результата с нужными колонкамиРезультат = Новый ТаблицаЗначений;Результат.Колонки.Добавить("Показатель");Результат.Колонки.Добавить("КодIC");Для НомерКолонки = 1 По 20 ЦиклРезультат.Колонки.Добавить("Сумма" + Формат(НомерКолонки, "ЧГ="), Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 2)));КонецЦикла;// Найдем индекс строки с максимальной общей суммой по 20 колонкам (для компенсации погрешности)МаксимальноеЗначение = -1;ИндексМаксимума = 0;Для НомерСтроки = 0 По ТаблицаБаза.Количество() - 1 ЦиклСтрока = ТаблицаБаза[НомерСтроки];СуммаСтроки = 0;Для НомерКолонки = 1 По 20 ЦиклИмяКолонки = "Сумма" + Формат(НомерКолонки, "ЧГ=");Если ТаблицаБаза.Колонки.Найти(ИмяКолонки) <> Неопределено ТогдаЕсли Не ЗначениеЗаполнено(Строка[ИмяКолонки]) ТогдаСуммаСтроки = СуммаСтроки + 0;ИначеСуммаСтроки = СуммаСтроки + Строка[ИмяКолонки];КонецЕсли;КонецЕсли;КонецЦикла;Если СуммаСтроки > МаксимальноеЗначение ТогдаМаксимальноеЗначение = СуммаСтроки;ИндексМаксимума = НомерСтроки;КонецЕсли;КонецЦикла;// Распределяем сумму пропорционально сумме по 20 колонкам в каждой строкеДля НомерСтроки = 0 По ТаблицаБаза.Количество() - 1 ЦиклСтрока = ТаблицаБаза[НомерСтроки];НоваяСтрока = Результат.Добавить();НоваяСтрока.Показатель = Строка.Показатель;НоваяСтрока.КодIC = Строка.КодIC;// Считаем сумму по 20 колонкам для текущей строкиСуммаСтроки = 0;Для НомерКолонки = 1 По 20 ЦиклИмяКолонки = "Сумма" + Формат(НомерКолонки, "ЧГ=");Если ТаблицаБаза.Колонки.Найти(ИмяКолонки) <> Неопределено ТогдаЕсли Не ЗначениеЗаполнено(Строка[ИмяКолонки]) ТогдаСуммаСтроки = СуммаСтроки + 0;ИначеСуммаСтроки = СуммаСтроки + Строка[ИмяКолонки];КонецЕсли;КонецЕсли;КонецЦикла;// Распределяем пропорционально сумме строкиДля НомерКолонки = 1 По 20 ЦиклИмяКолонки = "Сумма" + Формат(НомерКолонки, "ЧГ=");Если ТаблицаБаза.Колонки.Найти(ИмяКолонки) <> Неопределено ТогдаЕсли Не ЗначениеЗаполнено(Строка[ИмяКолонки]) ТогдаИсходноеЗначение = 0;ИначеИсходноеЗначение = Строка[ИмяКолонки];КонецЕсли;Если ОбщаяСумма = 0 ТогдаРаспределенноеЗначение = 0;ИначеРаспределенноеЗначение = Окр(СуммаКРаспределению * ИсходноеЗначение / ОбщаяСумма, 2, Истина);КонецЕсли;НоваяСтрока[ИмяКолонки] = РаспределенноеЗначение;КонецЕсли;КонецЦикла;КонецЦикла;// Корректируем погрешность округления по каждой колонке, добавляя разницу в строку с максимальной суммойДля НомерКолонки = 1 По 20 ЦиклИмяКолонки = "Сумма" + Формат(НомерКолонки, "ЧГ=");СуммаКолонки = 0;Для НомерСтроки = 0 По Результат.Количество() - 1 ЦиклЕсли ЗначениеЗаполнено(Результат[НомерСтроки][ИмяКолонки]) ТогдаСуммаКолонки = СуммаКолонки + Результат[НомерСтроки][ИмяКолонки];КонецЕсли;КонецЦикла;Разница = СуммаКРаспределению - СуммаКолонки;Если Разница <> 0 ТогдаЕсли ЗначениеЗаполнено(Результат[ИндексМаксимума][ИмяКолонки]) ТогдаРезультат[ИндексМаксимума][ИмяКолонки] = Результат[ИндексМаксимума][ИмяКолонки] + Разница;ИначеРезультат[ИндексМаксимума][ИмяКолонки] = Разница;КонецЕсли;КонецЕсли;КонецЦикла;Возврат Результат;КонецФункцииТеперь везде проверяется, заполнено ли значение в ячейке, чтобы избежать ошибок при чтении Неопределено.
-
-
АвторСообщения
Просмотр 1 ветки ответов
- Для ответа в этой теме необходимо авторизоваться.