Выделение ячеек в 1С 8.3: мышью, цветом через СКД и программно
Содержание
Чтобы выделить ячейки в 1С, протяните мышью по нужному диапазону отчёта или удерживайте Shift и нажимайте стрелки. Несвязанные диапазоны добавляются с Ctrl + щелчок, целая строка или колонка — щелчком по её заголовку. Это работает в любом табличном документе 1С 8.3: в отчётах, печатных формах, файлах .mxl.
Если же «выделить» значит покрасить ячейки по условию — это делают условным оформлением: в настройках отчёта на СКД или в управляемой форме. Программисту нужны ещё два инструмента: коллекция ВыделенныеОбласти и свойства области (ЦветФона, Шрифт). Ниже все три сценария по порядку, с кодом.
Где работает выделение и чем отличаются случаи
Слово «выделить» в 1С означает три разных действия. Путают их часто, поэтому сначала разведём.
| Что нужно | Где | Чем делается |
|---|---|---|
| Отметить диапазон, чтобы скопировать или посмотреть сумму | Отчёт, печатная форма, .mxl | Мышь и клавиатура |
| Подсветить строки или суммы по условию | Отчёт на СКД | Условное оформление в настройках варианта |
| Подсветить строки в списке или табличной части | Управляемая форма | Условное оформление формы |
| Прочитать или задать выделение из кода | Табличный документ, таблица формы | ВыделенныеОбласти, ВыделенныеСтроки |
| Покрасить конкретные ячейки при выводе | Табличный документ | Свойства области: ЦветФона, Шрифт, Обвести() |
Выделение мышью — механизм платформы. Оно одинаково в Бухгалтерии 3.0, ЗУП 3.1, УТ 11 и любой другой конфигурации на 8.3. Отличаются только дополнительные удобства, которые даёт сама конфигурация, например подсчёт суммы.
Как выделить ячейки в отчёте мышью и клавиатурой
Табличный документ ведёт себя почти как лист Excel. Базовые приёмы:
- Диапазон. Нажмите на первую ячейку и, не отпуская кнопку, протяните до последней.
- Диапазон без мыши. Встаньте на первую ячейку, зажмите
Shiftи двигайтесь стрелками. Удобно, когда отчёт длинный и мышью легко промахнуться. - Длинный диапазон. Щёлкните первую ячейку, прокрутите отчёт, затем
Shift+ щелчок по последней. Выделится всё между ними. - Несколько отдельных областей. Выделите первую, затем держите
Ctrlи выделяйте следующие. Так собирают, например, суммы по трём разным счетам. - Строка или колонка целиком. Щелчок по номеру строки слева или по заголовку колонки сверху. Если заголовки скрыты, этот приём недоступен — тянуть придётся вручную.
- Весь документ.
Ctrl+A.
После выделения Ctrl+C копирует ячейки в буфер. В Excel они вставляются таблицей, в Word — тоже таблицей, в блокнот — текстом с табуляциями.
Если нужно перенести в Excel весь отчёт, быстрее не копировать, а сохранить его: команда сохранения на панели отчёта, формат Лист Excel (.xlsx). Оформление и объединённые ячейки сохранятся лучше, чем через буфер.
Сумма выделенных ячеек в типовых отчётах
В типовых отчётах Бухгалтерии 3.0, ЗУП 3.1 и УТ 11 над результатом есть поле с суммой выделенных ячеек. Выделите числа — и сумма появится сразу, без калькулятора. Там же можно переключить показатель на среднее, минимум, максимум или количество.
Это функция конфигурации, а не платформы. В самописном отчёте или в печатной форме поля с суммой не будет, пока его не добавит программист. Как это сделать — в разделе про код.
Сумма считается по тексту ячеек. Если в отчёте числа выведены с пробелами-разделителями и знаком валюты, поле суммы типовой конфигурации справляется. В самописном подсчёте эту очистку придётся сделать самим.
Горячие клавиши и команды для работы с выделенным
Сводная таблица по табличному документу 1С 8.3:
| Действие | Клавиши / приём |
|---|---|
| Расширить выделение | Shift + стрелки |
| Добавить ещё одну область | Ctrl + выделение мышью |
| Выделить от текущей ячейки до указанной | Shift + щелчок |
| Выделить всё | Ctrl+A |
| Скопировать | Ctrl+C |
| Найти текст в отчёте | Ctrl+F |
| Изменить масштаб | Ctrl + колёсико мыши |
Через контекстное меню (правая кнопка по выделенному) доступны копирование и, в режиме редактирования, действия с ячейками. Состав меню зависит от того, разрешено ли редактировать документ.
Если ячейки не меняются, хотя выделены
Отчёты на СКД по умолчанию открываются только для просмотра. Выделять и копировать можно, а писать в ячейки и красить их — нет. В типовых отчётах на командной панели есть переключатель режима редактирования: включите его, и результат можно править вручную.
Ручные правки результата живут до следующего нажатия «Сформировать». После переформирования отчёт строится заново, и ваши цвета пропадут. Если подсветка нужна каждый раз — используйте условное оформление.
Подсветка ячеек в отчётах на СКД через условное оформление
Условное оформление — правильный способ «выделить» в отчёте суммы выше порога, отрицательные остатки, просроченные долги. Правило хранится в варианте отчёта и срабатывает при каждом формировании.
В режиме пользователя
В типовых конфигурациях на БСП порядок такой:
- Откройте отчёт и нажмите
Настройки. - Переключите вид настроек на расширенный.
- Перейдите на вкладку
Оформлениеи добавьте новое правило. - Задайте условие: например, поле
Суммабольше100 000. - Задайте оформление: цвет фона, цвет текста или жирный шрифт.
- Укажите оформляемые поля — в каких колонках красить. Пустой список означает «все поля строки».
- Закройте настройки и сформируйте отчёт.
Чтобы правило не пропало, сохраните вариант: команда сохранения варианта отчёта в меню Ещё. Иначе после закрытия формы останутся прежние настройки.
Хотите подсветить всю строку, а не одну ячейку — оставьте «Оформляемые поля» пустыми. Хотите только сумму — добавьте туда одно поле Сумма.
В конфигураторе, в схеме компоновки
Разработчик задаёт то же самое в схеме: Настройки варианта → закладка Условное оформление. Колонки те же: Оформление, Условие, Оформляемые поля, Представление.
Правило из схемы видят все пользователи. Правило из пользовательских настроек — только тот, кто его создал, и только в своём варианте.
Из кода
Иногда условие известно только при формировании, например порог задаёт пользователь в параметре. Тогда правило добавляют программно, до вывода результата:
Элемент = КомпоновщикНастроек.Настройки.УсловноеОформление.Элементы.Добавить();
Элемент.Использование = Истина;
Элемент.Представление = "Крупные суммы";
ЭлементОтбора = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Сумма");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше;
ЭлементОтбора.ПравоеЗначение = 100000;
ЭлементОтбора.Использование = Истина;
ПолеОформления = Элемент.Поля.Элементы.Добавить();
ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("Сумма");
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.СветлоЖелтый);
Элемент.Оформление.УстановитьЗначениеПараметра("Шрифт", Новый Шрифт(, , , Истина));
Поле в ПолеКомпоновкиДанных пишется так, как оно названо в наборе данных схемы, а не как подписано в отчёте. Для реквизита через точку: "Контрагент.ИНН".
Выделение строк и ячеек в управляемых формах программно
В управляемой форме у таблиц нет «ячеек» в смысле табличного документа. Есть строки и колонки-элементы. Поэтому задачи здесь две: подсветить по условию и работать с выделенными строками.
Подсветка в таблице формы
Условное оформление формы задаётся в редакторе формы (свойство формы Условное оформление) или в коде, обычно в ПриСозданииНаСервере. Код тот же, что для СКД, отличаются имена полей:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Элемент = УсловноеОформление.Элементы.Добавить();
ЭлементОтбора = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Количество");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Меньше;
ЭлементОтбора.ПравоеЗначение = 0;
ПолеОформления = Элемент.Поля.Элементы.Добавить();
ПолеОформления.Поле = Новый ПолеКомпоновкиДанных(Элементы.ТоварыКоличество.Имя);
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.Красный);
КонецПроцедуры
Здесь есть ловушка. В отборе указывают путь к данным (Объект.Товары.Количество). В оформляемых полях — имя элемента формы (ТоварыКоличество). Перепутаете — правило молча не сработает.
Для динамического списка удобнее оформление самого списка: Список.УсловноеОформление. Там поля указывают по именам полей списка, например "Сумма", без префикса.
Множественное выделение строк
Чтобы пользователь мог выделить несколько строк
с Ctrl и Shift, у элемента таблицы должно стоять свойство РежимВыделения = Множественный. Свойство РежимВыделенияСтроки решает, подсвечивается при выборе вся строка или одна ячейка.
Выделенные строки читаются через ВыделенныеСтроки — это массив идентификаторов:
&НаКлиенте
Процедура ОбработатьВыделенные(Команда)
Для Каждого Идентификатор Из Элементы.Товары.ВыделенныеСтроки Цикл
Строка = Объект.Товары.НайтиПоИдентификатору(Идентификатор);
Если Строка <> Неопределено Тогда
Строка.Скидка = 5;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Для динамического списка ВыделенныеСтроки возвращает не идентификаторы, а ключи строк — обычно ссылки на объекты. Их можно сразу передать на сервер.
Перевести курсор в нужную ячейку таблицы формы можно двумя свойствами: Элементы.Товары.ТекущаяСтрока (идентификатор строки) и Элементы.Товары.ТекущийЭлемент (колонка, например Элементы.ТоварыКоличество).
Как работать с выделенными областями табличного документа в коде
Это раздел для отчётов и обработок, где результат — табличный документ на форме.
Прочитать выделение и посчитать сумму
Коллекция ВыделенныеОбласти содержит все выделенные пользователем области. У каждой есть границы Верх, Низ, Лево, Право и ТипОбласти. При выделении целой строки границы колонок равны нулю, при выделении колонки — границы строк. Это нужно учесть, иначе цикл не пройдёт ни по одной ячейке.
Пример: команда считает сумму выделенных чисел в реквизите формы Результат типа ТабличныйДокумент.
&НаКлиенте
Процедура СуммаВыделенного(Команда)
Сумма = 0;
ТД = Результат;
Для Каждого Область Из ТД.ВыделенныеОбласти Цикл
Если ТипЗнч(Область) <> Тип("ОбластьЯчеекТабличногоДокумента") Тогда
Продолжить; // рисунки и прочие объекты пропускаем
КонецЕсли;
Верх = Область.Верх; Низ = Область.Низ;
Лево = Область.Лево; Право = Область.Право;
Если Область.ТипОбласти = ТипОбластиЯчеекТабличногоДокумента.Строки
Или Область.ТипОбласти = ТипОбластиЯчеекТабличногоДокумента.Таблица Тогда
Лево = 1; Право = ТД.ШиринаТаблицы;
КонецЕсли;
Если Область.ТипОбласти = ТипОбластиЯчеекТабличногоДокумента.Колонки
Или Область.ТипОбласти = ТипОбластиЯчеекТабличногоДокумента.Таблица Тогда
Верх = 1; Низ = ТД.ВысотаТаблицы;
КонецЕсли;
Для НомерСтроки = Верх По Низ Цикл
Для НомерКолонки = Лево По Право Цикл
Текст = ТД.Область(НомерСтроки, НомерКолонки, НомерСтроки, НомерКолонки).Текст;
Текст = СтрЗаменить(Текст, Символы.НПП, "");
Текст = СтрЗаменить(Текст, " ", "");
Текст = СтрЗаменить(Текст, ",", ".");
Если ПустаяСтрока(Текст) Тогда
Продолжить;
КонецЕсли;
Попытка
Сумма = Сумма + Число(Текст);
Исключение
// в ячейке не число — пропускаем
КонецПопытки;
КонецЦикла;
КонецЦикла;
КонецЦикла;
Сообщить("Сумма выделенного: " + Формат(Сумма, "ЧДЦ=2; ЧН=0"));
КонецПроцедуры
Чтобы сумма обновлялась сама, вызывайте подсчёт из обработчика ПриАктивизации поля табличного документа. Но не напрямую: событие срабатывает на каждое движение курсора. Подключите обработчик ожидания через ПодключитьОбработчикОжидания с паузой 0,2–0,5 секунды, и форма не будет тормозить на больших отчётах.
Выделение — состояние клиента. Читайте ВыделенныеОбласти в процедуре с &НаКлиенте. Если нужна серверная обработка, соберите на клиенте номера строк и колонок в массив и передайте его на сервер числами.
Выделить область программно
Поставить курсор и выделение из кода тоже можно, например после поиска:
Результат.ВыделенныеОбласти.Очистить();
Результат.ВыделенныеОбласти.Добавить(Результат.Область("R5C2:R12C4"));
Результат.ТекущаяОбласть = Результат.Область("R5C2");
Адрес R5C2:R12C4 читается как «строки с 5 по 12, колонки со 2 по 4». Вместо адреса можно передать имя области из макета, например Результат.Область("Итоги").
Покрасить ячейки при выводе
Если вы сами собираете документ из макета, цвет задают прямо у области перед выводом или после:
Область = Результат.Область(10, 2, 10, 6);
Область.ЦветФона = WebЦвета.СветлоЖелтый;
Область.Шрифт = Новый Шрифт(Область.Шрифт, , , Истина); // жирный
Линия = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная, 1);
Область.Обвести(Линия, Линия, Линия, Линия);
Конструктор Новый Шрифт(Область.Шрифт, , , Истина) берёт текущий шрифт ячейки и меняет только жирность. Имя и размер остаются прежними.
Для отчёта на СКД так красить можно только после вывода результата. Надёжнее условное оформление: оно переживёт смену группировок и переформирование.
Частые ошибки при выделении ячеек и как их исправить
Отдельно про переформирование в коде. Если вы красите ячейки после ПроцессорВывода.Вывести(), а потом пользователь меняет настройки и жмёт Сформировать, ваш код должен отработать снова. Вызывайте покраску из той же процедуры, что формирует отчёт, а не из отдельной команды.