При работе в 1С 7.7, особенно при разработке пользовательских обработок, нередко возникает задача предоставления пользователю возможности множественного выбора строк из динамически формируемой таблицы. В современных версиях 1С (например, 8.x) это реализуется простой колонкой с флажком, но в 1С 7.7 требуются специфические подходы. Рассмотрим, как мы можем реализовать такую функциональность, используя стандартные возможности платформы.
Представим ситуацию: у нас есть обработка, которая загружает данные, например, выписку банка, в ТаблицаЗначений. Необходимо дать пользователю возможность отметить несколько платежей для дальнейшей обработки, например, для их разделения по нескольким накладным. Мы хотим видеть привычные флажки напротив каждой строки для удобного выбора.
Для решения этой задачи в 1С 7.7 мы можем использовать два основных подхода:
ТаблицаЗначений с помощью пиктограмм.СписокЗначений для множественного выбора в отдельном диалоговом окне.Этот метод позволяет интегрировать флажки прямо в таблицу на форме обработки, что наиболее приближено к современным интерфейсам. Основа подхода — использование графического файла с пиктограммами и программное управление их отображением.
Прежде всего, нам понадобится графический файл, который будет содержать изображения для состояний флажка. Это должен быть файл формата BMP.
После подготовки файла с пиктограммами, этот файл необходимо связать с элементом ТаблицаЗначений на форме вашей обработки.
ТаблицаЗначений.ТаблицаЗначений. В его свойствах, на закладке «Картинка», укажите полный путь к вашему BMP-файлу с пиктограммами. Таким образом, платформа будет знать, откуда брать изображения для отображения.Теперь мы перейдем к программной части, где будем создавать колонку для флажков и управлять их отображением.
ТаблицаЗначений (например, СоздатьКолонки()), добавьте новую колонку числового типа. Именно в этой колонке мы будем хранить номер пиктограммы (например, 0 или 1), которая будет отображаться.
Процедура СоздатьКолонки()
Выписки.НоваяКолонка("Дата","Дата",,,"Дата",12);
Выписки.НоваяКолонка("ВидДвижения",,,,"Вид движения",12);
// ... другие колонки
Выписки.НоваяКолонка("Флажок","Число",,,,3); // Новая колонка для флажка, тип "Число"
// ...
КонецПроцедуры
Здесь мы создали колонку с именем "Флажок", типом "Число" и шириной 3 символа.
ВыводитьПиктограммы() объекта ТаблицаЗначений.
Процедура ПриОткрытии()
СоздатьКолонки();
Выписки.ВыводитьПиктограммы("Флажок"); // Указываем, что в колонке "Флажок" нужно выводить пиктограммы
// ...
// Далее заполняем ТаблицуЗначений данными
НоваяСтрока = Выписки.НоваяСтрока();
// ... заполняем данные других колонок
НоваяСтрока.Флажок = 0; // По умолчанию флажок снят (0 - номер пиктограммы для пустого квадрата)
// ...
НоваяСтрока = Выписки.НоваяСтрока();
// ...
НоваяСтрока.Флажок = 1; // Устанавливаем флажок (1 - номер пиктограммы для квадрата с галочкой)
// ...
КонецПроцедуры
Параметр "Флажок" указывает имя колонки. Мы будем записывать в нее 0 или 1 (или другие числа, соответствующие индексам пиктограмм в вашем BMP-файле) для управления состоянием флажка.
Рассмотрим пример, который коллеги приводили на форуме, где несколько таких флажковых колонок использовались для визуализации остатков:
Т.НоваяКолонка("х", "Число",,,, 3); // Колонка 'х' для флажка
Т.НоваяКолонка("Остаток1", "Число",,,, 10);
Т.НоваяКолонка("у", "Число",,,, 3); // Колонка 'у' для флажка
Т.НоваяКолонка("Остаток2", "Число",,,, 10);
Т.НоваяКолонка("й", "Число",,,, 3); // Колонка 'й' для флажка
Т.НоваяКолонка("Остаток3", "Число",,,, 10);
Т.ВыводитьПиктограммы("х");
Т.ВыводитьПиктограммы("у");
Т.ВыводитьПиктограммы("й");
Этот пример наглядно демонстрирует, как мы можем применить метод ВыводитьПиктограммы() к нескольким колонкам.
Для того чтобы пользователь мог переключать состояние флажка, нам необходимо обработать событие, которое происходит при клике по ячейке таблицы.
ПриНачалеРедактированияСтроки(): В модуле формы обработки нам нужна процедура ПриНачалеРедактированияСтроки(). Она срабатывает, когда пользователь пытается отредактировать ячейку.Форма.ТекущаяКолонка().
Процедура ПриНачалеРедактированияСтроки()
Если Форма.ТекущаяКолонка() = "Флажок" Тогда
Если Выписки.Флажок = 0 Тогда
Выписки.Флажок = 1;
Иначе
Выписки.Флажок = 0;
КонецЕсли;
// Перерисовываем элемент формы, чтобы изменения отобразились сразу
// (может потребоваться Форма.Обновить() или другой метод в зависимости от контекста)
// В 7.7 часто достаточно изменения значения, чтобы пиктограмма обновилась
КонецЕсли;
КонецПроцедуры
Обратите внимание, что Выписки.Флажок здесь обращается к значению колонки "Флажок" в текущей строке ТаблицаЗначений Выписки.
Если нам не требуется отображать флажки непосредственно в ТаблицаЗначений на форме, а достаточно отдельного диалога для выбора нескольких значений, мы можем использовать стандартный объект СписокЗначений.
Этот подход удобен, когда:
ТаблицаЗначений на форме.Сначала мы создаем объект СписокЗначений и наполняем его элементами, из которых пользователь будет выбирать.
Процедура СформироватьСписокДляВыбора()
Сз = СоздатьОбъект("СписокЗначений");
// Добавляем значения в список. Первый параметр - само значение, второй - его представление.
Сз.ДобавитьЗначение("ДокументПоступления123 от 01.01.2024", "Накладная №123 от 01.01.2024");
Сз.ДобавитьЗначение("ДокументПоступления456 от 02.01.2024", "Накладная №456 от 02.01.2024");
Сз.ДобавитьЗначение("ДокументПоступления789 от 03.01.2024", "Накладная №789 от 03.01.2024");
// ... здесь мы можем заполнить Сз данными из нашей ТаблицыЗначений или другого источника
// Например, если у нас есть ТаблицаЗначений с накладными:
// Для Каждого СтрокаТЗ Из ТаблицаНакладных Цикл
// Сз.ДобавитьЗначение(СтрокаТЗ.Документ, СтрокаТЗ.ПредставлениеДокумента);
// КонецЦикла;
КонецПроцедуры
Как мы видим, метод ДобавитьЗначение() принимает два параметра: само значение (которое мы будем использовать в логике) и его строковое представление (которое увидит пользователь).
После заполнения СписокЗначений, мы вызываем метод ОтметитьЗначения(), который открывает стандартное диалоговое окно со списком, где напротив каждого элемента есть флажок.
Процедура ВыбратьНакладные()
Перем ВыбЗнач; // Используем для хранения выбранных значений, если это необходимо
ВыбЗнач = ""; // Инициализируем пустой строкой, либо ранее выбранными значениями
Сз = СоздатьОбъект("СписокЗначений");
Сз.ДобавитьЗначение("ХерпоймиЧто","ХерПоймиЧто"); // Пример из форума
Сз.ДобавитьЗначение("ТОЧтоНадо","ТОЧтоНадо");
// Открываем диалоговое окно для выбора значений
// Параметры:
// 1. ВыбЗнач - для предварительного выделения значений или сохранения результата (не обязательно)
// 2. "Выберите необходимые накладные" - Заголовок окна
// 3. 0 - Режим выбора (0 - множественный выбор, 1 - одиночный)
// 4. "ОК;Отмена" - Кнопки диалога
Если Сз.ОтметитьЗначения(ВыбЗнач,"Выберите необходимые накладные",0,"ОК;Отмена") = 1 Тогда
// Если пользователь нажал "ОК", обрабатываем выбранные значения
Для а = 1 По Сз.РазмерСписка() Цикл
Если Сз.Пометка(А) = 1 Тогда // Проверяем, отмечено ли значение
Сообщить("Выбрано: " + Сз.ПолучитьЗначение(А));
// Здесь мы можем добавить выбранное значение в другую таблицу,
// выполнить дополнительные действия и т.д.
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Метод ОтметитьЗначения() возвращает 1, если пользователь нажал кнопку "ОК", и 0, если "Отмена". После успешного выбора мы можем перебрать все элементы СписокЗначений с помощью цикла и для каждого элемента проверить его свойство Пометка(А), которое вернет 1, если значение было отмечено флажком, и 0 в противном случае.
Таким образом, мы рассмотрели два эффективных способа организации множественного выбора в 1С 7.7. Выбор конкретного подхода зависит от требований к интерфейсу и сложности задачи. Если нам нужна полная интеграция флажков непосредственно в динамическую таблицу на форме, используем метод с пиктограммами. Если же достаточно отдельного диалога для выбора, СписокЗначений будет более простым и быстрым решением.