Выделение ячеек в 1С 8.3: мышью, цветом через СКД и программно

· 10 мин

Содержание

Чтобы выделить ячейки в 1С, протяните мышью по нужному диапазону отчёта или удерживайте Shift и нажимайте стрелки. Несвязанные диапазоны добавляются с Ctrl + щелчок, целая строка или колонка — щелчком по её заголовку. Это работает в любом табличном документе 1С 8.3: в отчётах, печатных формах, файлах .mxl.

Если же «выделить» значит покрасить ячейки по условию — это делают условным оформлением: в настройках отчёта на СКД или в управляемой форме. Программисту нужны ещё два инструмента: коллекция ВыделенныеОбласти и свойства области (ЦветФона, Шрифт). Ниже все три сценария по порядку, с кодом.

Где работает выделение и чем отличаются случаи

Слово «выделить» в 1С означает три разных действия. Путают их часто, поэтому сначала разведём.

Что нужноГдеЧем делается
Отметить диапазон, чтобы скопировать или посмотреть суммуОтчёт, печатная форма, .mxlМышь и клавиатура
Подсветить строки или суммы по условиюОтчёт на СКДУсловное оформление в настройках варианта
Подсветить строки в списке или табличной частиУправляемая формаУсловное оформление формы
Прочитать или задать выделение из кодаТабличный документ, таблица формыВыделенныеОбласти, ВыделенныеСтроки
Покрасить конкретные ячейки при выводеТабличный документСвойства области: ЦветФона, Шрифт, Обвести()

Выделение мышью — механизм платформы. Оно одинаково в Бухгалтерии 3.0, ЗУП 3.1, УТ 11 и любой другой конфигурации на 8.3. Отличаются только дополнительные удобства, которые даёт сама конфигурация, например подсчёт суммы.

Как выделить ячейки в отчёте мышью и клавиатурой

Табличный документ ведёт себя почти как лист Excel. Базовые приёмы:

  1. Диапазон. Нажмите на первую ячейку и, не отпуская кнопку, протяните до последней.
  2. Диапазон без мыши. Встаньте на первую ячейку, зажмите Shift и двигайтесь стрелками. Удобно, когда отчёт длинный и мышью легко промахнуться.
  3. Длинный диапазон. Щёлкните первую ячейку, прокрутите отчёт, затем Shift + щелчок по последней. Выделится всё между ними.
  4. Несколько отдельных областей. Выделите первую, затем держите Ctrl и выделяйте следующие. Так собирают, например, суммы по трём разным счетам.
  5. Строка или колонка целиком. Щелчок по номеру строки слева или по заголовку колонки сверху. Если заголовки скрыты, этот приём недоступен — тянуть придётся вручную.
  6. Весь документ. 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 + колёсико мыши

Через контекстное меню (правая кнопка по выделенному) доступны копирование и, в режиме редактирования, действия с ячейками. Состав меню зависит от того, разрешено ли редактировать документ.

Если ячейки не меняются, хотя выделены

Отчёты на СКД по умолчанию открываются только для просмотра. Выделять и копировать можно, а писать в ячейки и красить их — нет. В типовых отчётах на командной панели есть переключатель режима редактирования: включите его, и результат можно править вручную.

Ручные правки результата живут до следующего нажатия «Сформировать». После переформирования отчёт строится заново, и ваши цвета пропадут. Если подсветка нужна каждый раз — используйте условное оформление.

Подсветка ячеек в отчётах на СКД через условное оформление

Условное оформление — правильный способ «выделить» в отчёте суммы выше порога, отрицательные остатки, просроченные долги. Правило хранится в варианте отчёта и срабатывает при каждом формировании.

В режиме пользователя

В типовых конфигурациях на БСП порядок такой:

  1. Откройте отчёт и нажмите Настройки.
  2. Переключите вид настроек на расширенный.
  3. Перейдите на вкладку Оформление и добавьте новое правило.
  4. Задайте условие: например, поле Сумма больше 100 000.
  5. Задайте оформление: цвет фона, цвет текста или жирный шрифт.
  6. Укажите оформляемые поля — в каких колонках красить. Пустой список означает «все поля строки».
  7. Закройте настройки и сформируйте отчёт.

Чтобы правило не пропало, сохраните вариант: команда сохранения варианта отчёта в меню Ещё. Иначе после закрытия формы останутся прежние настройки.

Хотите подсветить всю строку, а не одну ячейку — оставьте «Оформляемые поля» пустыми. Хотите только сумму — добавьте туда одно поле Сумма.

В конфигураторе, в схеме компоновки

Разработчик задаёт то же самое в схеме: Настройки варианта → закладка Условное оформление. Колонки те же: Оформление, Условие, Оформляемые поля, Представление.

Правило из схемы видят все пользователи. Правило из пользовательских настроек — только тот, кто его создал, и только в своём варианте.

Из кода

Иногда условие известно только при формировании, например порог задаёт пользователь в параметре. Тогда правило добавляют программно, до вывода результата:

Элемент = КомпоновщикНастроек.Настройки.УсловноеОформление.Элементы.Добавить();
Элемент.Использование = Истина;
Элемент.Представление = "Крупные суммы";

ЭлементОтбора = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных("Сумма");
ЭлементОтбора.ВидСравнения   = ВидСравненияКомпоновкиДанных.Больше;
ЭлементОтбора.ПравоеЗначение = 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);
Область.Обвести(Линия, Линия, Линия, Линия);

Конструктор Новый Шрифт(Область.Шрифт, , , Истина) берёт текущий шрифт ячейки и меняет только жирность. Имя и размер остаются прежними.

Для отчёта на СКД так красить можно только после вывода результата. Надёжнее условное оформление: оно переживёт смену группировок и переформирование.

Частые ошибки при выделении ячеек и как их исправить

Диагностика: выберите симптом

Отдельно про переформирование в коде. Если вы красите ячейки после ПроцессорВывода.Вывести(), а потом пользователь меняет настройки и жмёт Сформировать, ваш код должен отработать снова. Вызывайте покраску из той же процедуры, что формирует отчёт, а не из отдельной команды.

Частые вопросы

Можно ли выделить ячейки в 1С и сразу увидеть количество, а не сумму?
В типовых отчётах — да: в поле над результатом переключите показатель с суммы на количество. В самописных формах это делается кодом.
Почему выделенные ячейки не копируются в Excel с форматированием?
Буфер переносит значения и простую разметку. Объединения, сложные границы и условное оформление надёжнее сохраняются, если сохранить отчёт файлом xlsx.
Сохраняется ли условное оформление при выгрузке отчёта в Excel?
Цвет и шрифт, применённые при формировании, выгружаются как обычное форматирование ячеек. Само правило в файл не попадает: в Excel это уже статичная заливка.
Как подсветить строку целиком, а не одну ячейку?
В правиле условного оформления оставьте список оформляемых полей пустым. Тогда оформление применится ко всей строке, где выполнено условие.
Работает ли выделение так же в веб-клиенте?
Мышь, Shift и Ctrl работают, но часть сочетаний клавиш браузер может перехватить себе. Если сочетание не срабатывает, выделяйте мышью по заголовкам строк и колонок.