1с обращение к процедуре объекта как к функции свернуть
Привожу ещё одну любопытную реализацию задачи по свёртке значений в разных объектах 1С. Итак, чтобы свернуть значения таблицы, массива или строки можно воспользоваться одной из предложенных ниже функций:
- СвернутьСтроку(Стр, СтрНачальныйРазделитель, СтрИтоговыйРазделитель) – Убирает повторяющиеся в строке значения. Значения разделены между собой указанным разделителем. Также можно поменять этот разделитель после преобразования.
- СвернутьМассив(пМассив) – Убирает повторяющиеся в массиве значения.
- СвернутьТаблицу(Таб, ИсключаяПоля, ПоляСуммы, СуммироватьВсеЧисла) – Убирает повторяющиеся значения в таблице. Процедура аналогична методу ТаблицаЗначений.Свернуть(КолонкиГруппировок, КолонкиСуммирования).
Реализация функций в 1С следующая:
1. Функция «Свернуть строку».
// Сворачивает в строке используемые повторяющиеся значения. // // Параметры: // Стр - <Строка> - Исходная строка; // СтрНачальныйРазделитель - <Строка> - Разделитель для разбора строки, по умолчанию ","; // СтрИтоговыйРазделитель - <Строка> - Разделитель, используемый в собранной строке. // По умолчанию ",". // // Возвращаемое значение: // <Строка> - Собранная строка. // Функция СвернутьСтроку(Стр, СтрНачальныйРазделитель = ",", СтрИтоговыйРазделитель = ", ") Экспорт Результат = ""; МассивСтр = РазобратьСтрокуВМассивПоРазделителю(Стр, СтрНачальныйРазделитель); ЗаполненныйМассив = Новый Массив; Для Каждого Элемент Из МассивСтр Цикл Если ЗаполненныйМассив.Найти(Элемент) = Неопределено Тогда ЗаполненныйМассив.Добавить(Элемент); Результат = Результат + СтрИтоговыйРазделитель + Элемент; КонецЕсли; КонецЦикла; Результат = Сред(Результат, СтрДлина(СтрИтоговыйРазделитель)+1); Возврат Результат; КонецФункции;
2. Функция «Свернуть массив».
// Сворачивает в массиве повторяющиеся значения. // // Параметры: // пМассив - <Массив> - Исходный массив. // // Возвращаемое значение: // <Массив> - Свёрнутый массив. // Функция СвернутьМассив(пМассив) Экспорт Если пМассив.Количество() > 1 Тогда ТЗ = Новый ТаблицаЗначений; ИмяКолонки = "Колонка1"; ТЗ.Колонки.Добавить(ИмяКолонки); Для Индекс = 0 По пМассив.Количество()-1 Цикл ТЗ.Добавить(); КонецЦикла; ТЗ.ЗагрузитьКолонку(пМассив, ИмяКолонки); ТЗ.Свернуть(ИмяКолонки, ""); Возврат ТЗ.ВыгрузитьКолонку(ИмяКолонки); Иначе Результат = Новый Массив; Для Каждого Элемент Из пМассив Цикл Результат.Добавить(Элемент); КонецЦикла; Возврат Результат; КонецЕсли; КонецФункции;
3. Процедура «Свернуть таблицу». Отличается от процедуры по умолчанию тем, что сворачивает все поля за исключением указанных и имеет дополнительную возможность распознавать колонки с числами.
// Сворачивает в таблице повторяющиеся значения. // // Параметры: // Таб - <ТаблицаЗначений> - Исходная таблица; // ИсключаяПоля - <Строка> - Колонки таблицы, исключаемые из рассмотрения; // ПоляСуммы - <Строка> - Поля для суммирования строк; // СуммироватьВсеЧисла - <Булево> - Команда на суммирование всех колонок с числами (поля добавляются к полям суммы). // Процедура СвернутьТаблицу(Таб, ИсключаяПоля = "НомерСтроки", ПоляСуммы = "", СуммироватьВсеЧисла = Ложь) Экспорт МассивИсключаяПоля = ?(ИсключаяПоля = "", Новый Массив, ПреобразоватьВМассив(ИсключаяПоля)); Если СуммироватьВсеЧисла Тогда МассивПоляСуммы = Новый Массив; Для Каждого Колонка Из Таб.Колонки Цикл МассивТипов = Колонка.ТипЗначения.Типы(); Если МассивТипов.Найти(Тип("Число")) <> Неопределено И (МассивТипов.Количество() = 1 ИЛИ (МассивТипов.Количество() = 2 И (МассивТипов.Найти(Тип("Null")) <> Неопределено ИЛИ МассивТипов.Найти(Тип("Неопределено")) <> Неопределено)) ИЛИ (МассивТипов.Количество() = 3 И МассивТипов.Найти(Тип("Null")) <> Неопределено И МассивТипов.Найти(Тип("Неопределено")) <> Неопределено)) Тогда ПоляСуммы = ?(ПустаяСтрока(ПоляСуммы), "", ПоляСуммы + ", ") + Колонка.Имя; МассивПоляСуммы.Добавить(Колонка.Имя); КонецЕсли; КонецЦикла; Иначе МассивПоляСуммы = ?(ПоляСуммы = "", Новый Массив, ПреобразоватьВМассив(ПоляСуммы)); КонецЕсли; СтрКолонки = ""; Для Каждого Колонка Из Таб.Колонки Цикл Если МассивПоляСуммы.Найти(Колонка.Имя) = Неопределено И МассивИсключаяПоля.Найти(Колонка.Имя) = Неопределено Тогда СтрКолонки = СтрКолонки + ", " + Колонка.Имя; КонецЕсли; КонецЦикла; СтрКолонки = Сред(СтрКолонки, 3); Таб.Свернуть(СтрКолонки, ПоляСуммы); КонецПроцедуры;
Также в данном коде используются следующие вспомогательные функции:
- ПреобразоватьВМассив(Объект, Проверка) – Преобразует объект в массив.
- РазобратьСтрокуВМассивПоРазделителю(Стр, СтрРазделитель, ИгнорироватьПустые) – Разбирает предложенную строку в массив.
Код вспомогательных функций на 1С:
// Преобразует в массив переменную любого типа данных. // // Параметры: // Объект - Произвольный - произвольный объект данных; // Проверка - <Булево> - Осуществление проверки на заполненное значение. // // Возвращаемое значение: // <Массив> - Массив с теми же данными. // Функция ПреобразоватьВМассив(Объект, Проверка = Ложь) Экспорт ОбъектМассив = Новый Массив; Если НЕ Проверка ИЛИ ЗначениеЗаполнено(Объект) Тогда Если ТипЗнч(Объект) = Тип("Массив") Тогда ОбъектМассив = Объект; ИначеЕсли ТипЗнч(Объект) = Тип("СписокЗначений") Тогда ОбъектМассив = Объект.ВыгрузитьЗначения(); ИначеЕсли ТипЗнч(Объект) = Тип("Строка") Тогда ОбъектМассив = РазобратьСтрокуВМассивПоРазделителю(Объект); ИначеЕсли ТипЗнч(Объект) = Тип("Структура") Тогда Для Каждого Элемент Из Объект Цикл ОбъектМассив.Добавить(Элемент.Значение); КонецЦикла; Иначе ОбъектМассив.Добавить(Объект); КонецЕсли; КонецЕсли; Возврат ОбъектМассив; КонецФункции; // Разбирает строку в массив подстрок по разделителю. // При этом пробелы между подстроками не учитываются. // // Параметры: // Стр - исходная строка; // СтрРазделитель - разделитель, по умолчанию ","; // ИгнорироватьПустые - игнорировать ли пустые места между разделителями. // // Возвращаемое значение: // Массив строк // Функция РазобратьСтрокуВМассивПоРазделителю(Знач Стр, СтрРазделитель = ",", ИгнорироватьПустые = Ложь) Экспорт Результат = Новый Массив; ВхождениеРазделителя = Найти(Стр, СтрРазделитель); Пока ВхождениеРазделителя <> 0 Цикл ЧастьДоРазделителя = СокрЛП(Лев(Стр, ВхождениеРазделителя - 1)); Если НЕ (ИгнорироватьПустые И ПустаяСтрока(ЧастьДоРазделителя)) Тогда Результат.Добавить(ЧастьДоРазделителя); КонецЕсли; Стр = СокрЛП(Сред(Стр, ВхождениеРазделителя + 1)); ВхождениеРазделителя = Найти(Стр, СтрРазделитель); КонецЦикла; Если НЕ (ИгнорироватьПустые И ПустаяСтрока(Стр)) Тогда Результат.Добавить(СокрЛП(Стр)); КонецЕсли; Возврат Результат; КонецФункции;
Смело используйте эти и другие функции для реализации своих проектов. Удачи!
Если вам понравилась эта статья или у вас к ней есть замечания, напишите об этом, пожалуйста, в комментариях ниже.
ТЗ формируется в цикле. Это выгруженные результаты запросов. И каждый раз это новая ТЗ. Все ТЗ я выгружаю в итоговую ТЗСпец и сворачиваю. В результате ошибка."Обращение к процедуре объекта как к функции " Не могу понять, в чем дело. Подскажите, кто сталкивался, как боролись?
да что-то ты нам не тот кусок кода даешь. в представленном все норм, акромя КонецЦикла
видимо там ТЗСпец = ТЗСпец.Свернуть("Номенклатура","Количество");
тогда скопируй как у тебя на самом деле или там у тебя секретный код
я, копируя, затираю предыдущие данные. А мне надо дописывать к существующим. вот код: РассчитатьИзПолуфабрикатов(стр.Номенклатура) - возвращает ТЗ, в которой результат запроса.
да я ничего не поменял. Всё как и было. Ошибка на "Свернуть. "
А точно ошибка именно на этом "Свернуть", может где ещё есть, например в РассчитатьИзПолуфабрикатов?
я отладчиком построчно смотрю. РассчитатьИзПолуфабрикатов возвращает ТЗ. вот последние строки из функции:
а у тебя в отладчике в окне вызова никакого мусора не торчит?
нет)) сейчас попробовал Результат свернуть еще до возврата из функции - не сворачивает по той же ошибке. Что за хрень?
В запросе случайно временные таблицы не используешь?
прямо вот так в окне вызова пишешь ТЗСпец.Свернуть("Номенклатура","Количество")?
Не знаю почему,может кто-то объяснит. Всё сработало сейчас. Хотя упорно отладчик продолжает выдавать ошибку. Всем спасибо за идеи.
Учись отладчиком пользоваться, смотри просто ТЗСпец
Ты все-таки скажи ошибка в отладчике выходит или при работе в режиме Предприятие?
хватит мучать отладчик, ну не сможет он тебе показать результат работы процедуры по причине его отсутствия
Ясное дело, в табло отладчика или в окне будет эта ошибка.
В отладчике можно смотреть значения переменных и функций.
раньше не сталкивался с таким. Хотя часто какую-то мелочь смотрю таким образом в отладчике до того,как написать.
Вы не правильно поняли. Я ж не результат функции смотрю. Результат есть. Я отладчиком смотрю уже последнюю строчку после того,как функция отработала
Ты скажи, чего ты хотел получить от указания в табло МояТаблица.Свернуть?
Ты смотрел значения переменных. А тут пытаешься вызывать процедуру.
Это ты не понял, нельзя смотреть результат ТЗСпец.Свернуть("Номенклатура","Количество"), его просто нет. Результат содержится в переменной ТЗСпец.
Изменение фона ячейки в зависимости от значения ячейки
Подскажите пжт, как при формировании отчета и вывода его в таблицу в 1с 7.7 программно менять цвет.
MS Office Excel Перенос информации из ячейки в часть данных другой ячейки
День добрый. Добросовестно искал ответ на свой вопрос в течение 20 минут, ничего не нашел. .
Откорректировать макрос так, чтобы поиск осуществлялся не с ячейки А1, а с ячейки C21
Как в этом макросе прописать, чтобы поиск осуществлялся в столбике "С", но с 21-ой строки? Sub.
Индекс выбранной ячейки DataGridView при смене ячейки через Tab
Добрый день, Коллеги! Подскажите, как получить индекс ячейки в DataGridWiew, находящейся в.
можно. каждый раз перед добавлением новой строки, циклом проверять список уже добавленных и при совпадении наименований строку не добавлять. а в нужной строке изменять сумму. но это же бред )
с таблицей значений все куда проще
extendedflowers, а можете на примере показать с ТЗ как-то так. в общем виде. думаю под свой вариант переделаете, лень разбираться в коде. А если у меня количество и сумма как тогда прописатьДобавлено через 15 минут
extendedflowers, У меня Наименование и нужно объединить Кол1, Сумма1, Кол2, Сумма2, Кол3, Сумма3, Кол4, Сумма4
тз.свернуть("наименование", "количество, сумма");
а зачем столько параметров кол1, кол2, кол3? у тебя же в макете табличная часть.
У меня кол1 и сумма это 1 квартал, и так далее по кварталам выдает количество и сумму
Добавлено через 2 минуты
Все равно ошибка
: Обращение к процедуре объекта как к функции (свернуть)
ТЗСвернутая = ТЗ.свернуть("Наименование", "Кол1, Сумма1", "Кол2, Сумма2", "Кол3, Сумма3", "Кол4, Сумма4");
неправильно:
ТЗСвернутая = ТЗ.свернуть("Наименование", "Кол1, Сумма1", "Кол2, Сумма2", "Кол3, Сумма3", "Кол4, Сумма4");
правильно:
ТЗ.свернуть("Наименование", "Кол1, Сумма1,Кол2, Сумма2,Кол3, Сумма3,Кол4, Сумма4");
свернуть("группируемыеПоляЧерезЗПТ","СуммируемыеПоляЧерезЗПТ ") - это процедура, абашто 1с и ругается
ну тогда тз.свернуть("наименование", "кол1, сумма1, кол2, сумма2, кол3, сумма3, кол4, сумма4"); ТЗ.свернуть("Наименование", "Кол1, Сумма1,Кол2, Сумма2,Кол3, Сумма3,Кол4, Сумма4");Для Каждого Стр из ТЗ Цикл
Че та я не так сделал, у меня нет данные
Добавлено через 2 минутызачем в эксельку лукаться, после того как вы выгрузили все в ТЗ?
мне нужно проверить ячейку я делаю так
у вас уже всё в ТЗ, забудте про экселькуЕсли СокрЛП(Стр.Наименование) ="" Тогда Продолжить КонецЕсли; wladimir_ui, у меня в диспетчере много excek как сделать чтобы они не висели после того как высосали из эксельки нужные данные - занулите ненужные теперь переменные (ExcelПриложение, ExcelФайл, ExcelЛист, и т.д.):
ExcelПриложение = Неопределено;
ExcelФайл = Неопределено;
ExcelЛист = Неопределено;
Изменение содержимого одной ячейки Datagridview после изменения другой ячейки
Здравствуйте. Есть Datagridview с 2 столбцами. Столбцы типа ComboBox. В 1 столбце уже забиты.
Как задать значение для ячейки в зависимости от значения другой ячейки
Здравствуйте! Подскажите, как задать значение для ячейки в зависимости от значения другой ячейки.
Как задать ширину ячейки, равную четверти ширины другой ячейки
Добрый день Имеется Grid, надо задать ширину одной ячейки, равную четверти ширине другой.
Удаление части текста ячейки, который совпадает с текстом соседней ячейки
Добрый день. Заранее извиняюсь, за возможный повтор темы. Ситуация следующая: Есть таблица на.
Читайте также: