Как создать колонку с флажком в таблице значений 1С 7.7?

Программист 1С v7.7
← На главную

При работе в 1С 7.7, особенно при разработке пользовательских обработок, нередко возникает задача предоставления пользователю возможности множественного выбора строк из динамически формируемой таблицы. В современных версиях 1С (например, 8.x) это реализуется простой колонкой с флажком, но в 1С 7.7 требуются специфические подходы. Рассмотрим, как мы можем реализовать такую функциональность, используя стандартные возможности платформы.

Представим ситуацию: у нас есть обработка, которая загружает данные, например, выписку банка, в ТаблицаЗначений. Необходимо дать пользователю возможность отметить несколько платежей для дальнейшей обработки, например, для их разделения по нескольким накладным. Мы хотим видеть привычные флажки напротив каждой строки для удобного выбора.

Для решения этой задачи в 1С 7.7 мы можем использовать два основных подхода:

  1. Реализация флажка непосредственно в ТаблицаЗначений с помощью пиктограмм.
  2. Использование объекта СписокЗначений для множественного выбора в отдельном диалоговом окне.

1. Реализация флажка в ТаблицеЗначений с помощью пиктограмм

Этот метод позволяет интегрировать флажки прямо в таблицу на форме обработки, что наиболее приближено к современным интерфейсам. Основа подхода — использование графического файла с пиктограммами и программное управление их отображением.

Шаг 1: Подготовка графических ресурсов (пиктограмм)

Прежде всего, нам понадобится графический файл, который будет содержать изображения для состояний флажка. Это должен быть файл формата BMP.

  1. Создайте BMP-файл: Используйте любой графический редактор (даже стандартный Paint подойдет) для создания или редактирования BMP-файла.
  2. Размер и расположение пиктограмм: Каждая пиктограмма (изображение для пустого квадратика и квадратика с галочкой) должна иметь размер 16x15 пикселей. Эти пиктограммы должны быть расположены последовательно друг за другом в одном BMP-файле. Например, первая пиктограмма — пустой квадрат, вторая — квадрат с галочкой.
  3. Требования к файлу: Убедитесь, что файл сохранен в формате BMP, и обратите внимание на битность цвета (обычно 16 или 256 цветов достаточно). Прозрачность в BMP не поддерживается, поэтому фон пиктограмм будет соответствовать цвету фона.

Шаг 2: Настройка элемента ТаблицаЗначений на форме

После подготовки файла с пиктограммами, этот файл необходимо связать с элементом ТаблицаЗначений на форме вашей обработки.

  1. Откройте форму обработки: В конфигураторе откройте форму вашей обработки, на которой располагается ТаблицаЗначений.
  2. Укажите путь к картинке: Выберите элемент диалога ТаблицаЗначений. В его свойствах, на закладке «Картинка», укажите полный путь к вашему BMP-файлу с пиктограммами. Таким образом, платформа будет знать, откуда брать изображения для отображения.

Шаг 3: Программное создание колонки и отображение флажков

Теперь мы перейдем к программной части, где будем создавать колонку для флажков и управлять их отображением.

  1. Создание новой колонки: В процедуре, где вы динамически формируете колонки вашей ТаблицаЗначений (например, СоздатьКолонки()), добавьте новую колонку числового типа. Именно в этой колонке мы будем хранить номер пиктограммы (например, 0 или 1), которая будет отображаться.
  2. 
    Процедура СоздатьКолонки()
        Выписки.НоваяКолонка("Дата","Дата",,,"Дата",12);
        Выписки.НоваяКолонка("ВидДвижения",,,,"Вид движения",12);
        // ... другие колонки
        Выписки.НоваяКолонка("Флажок","Число",,,,3); // Новая колонка для флажка, тип "Число"
        // ...
    КонецПроцедуры
    

Здесь мы создали колонку с именем "Флажок", типом "Число" и шириной 3 символа.


Процедура ПриОткрытии()
    СоздатьКолонки();
    Выписки.ВыводитьПиктограммы("Флажок"); // Указываем, что в колонке "Флажок" нужно выводить пиктограммы
    // ...
    // Далее заполняем ТаблицуЗначений данными
    НоваяСтрока = Выписки.НоваяСтрока();
    // ... заполняем данные других колонок
    НоваяСтрока.Флажок = 0; // По умолчанию флажок снят (0 - номер пиктограммы для пустого квадрата)
    // ...
    НоваяСтрока = Выписки.НоваяСтрока();
    // ...
    НоваяСтрока.Флажок = 1; // Устанавливаем флажок (1 - номер пиктограммы для квадрата с галочкой)
    // ...
КонецПроцедуры

Параметр "Флажок" указывает имя колонки. Мы будем записывать в нее 0 или 1 (или другие числа, соответствующие индексам пиктограмм в вашем BMP-файле) для управления состоянием флажка.

Рассмотрим пример, который коллеги приводили на форуме, где несколько таких флажковых колонок использовались для визуализации остатков:


Т.НоваяКолонка("х", "Число",,,, 3); // Колонка 'х' для флажка
Т.НоваяКолонка("Остаток1", "Число",,,, 10);
Т.НоваяКолонка("у", "Число",,,, 3); // Колонка 'у' для флажка
Т.НоваяКолонка("Остаток2", "Число",,,, 10);
Т.НоваяКолонка("й", "Число",,,, 3); // Колонка 'й' для флажка
Т.НоваяКолонка("Остаток3", "Число",,,, 10);
Т.ВыводитьПиктограммы("х");
Т.ВыводитьПиктограммы("у");
Т.ВыводитьПиктограммы("й");

Этот пример наглядно демонстрирует, как мы можем применить метод ВыводитьПиктограммы() к нескольким колонкам.

Шаг 4: Обработка действий пользователя (переключение флажка)

Для того чтобы пользователь мог переключать состояние флажка, нам необходимо обработать событие, которое происходит при клике по ячейке таблицы.

  1. Используйте процедуру ПриНачалеРедактированияСтроки(): В модуле формы обработки нам нужна процедура ПриНачалеРедактированияСтроки(). Она срабатывает, когда пользователь пытается отредактировать ячейку.
  2. Проверка текущей колонки: Внутри этой процедуры мы должны проверить, является ли текущая колонка той, что содержит флажок. Для этого мы можем использовать метод Форма.ТекущаяКолонка().
  3. Изменение значения и перерисовка: Если текущая колонка — это наша колонка с флажком, мы изменяем значение в соответствующей ячейке текущей строки (например, с 0 на 1 или с 1 на 0). После изменения значения может потребоваться перерисовать элемент формы, чтобы изменения отобразились немедленно.
  4. 
    Процедура ПриНачалеРедактированияСтроки()
        Если Форма.ТекущаяКолонка() = "Флажок" Тогда
            Если Выписки.Флажок = 0 Тогда
                Выписки.Флажок = 1;
            Иначе
                Выписки.Флажок = 0;
            КонецЕсли;
            // Перерисовываем элемент формы, чтобы изменения отобразились сразу
            // (может потребоваться Форма.Обновить() или другой метод в зависимости от контекста)
            // В 7.7 часто достаточно изменения значения, чтобы пиктограмма обновилась
        КонецЕсли;
    КонецПроцедуры
    

Обратите внимание, что Выписки.Флажок здесь обращается к значению колонки "Флажок" в текущей строке ТаблицаЗначений Выписки.

2. Альтернативный подход с использованием объекта СписокЗначений

Если нам не требуется отображать флажки непосредственно в ТаблицаЗначений на форме, а достаточно отдельного диалога для выбора нескольких значений, мы можем использовать стандартный объект СписокЗначений.

Когда применять СписокЗначений?

Этот подход удобен, когда:

  1. Нам нужен быстрый множественный выбор без сложной реализации интерфейса.
  2. Необходимо выбрать элементы из списка, который не обязательно является основной ТаблицаЗначений на форме.
  3. Объем информации для каждой строки в списке выбора не слишком большой, так как стандартное поле списка имеет ограниченную ширину.

Шаг 1: Создание и заполнение СписокЗначений

Сначала мы создаем объект СписокЗначений и наполняем его элементами, из которых пользователь будет выбирать.


Процедура СформироватьСписокДляВыбора()
    Сз = СоздатьОбъект("СписокЗначений");
    // Добавляем значения в список. Первый параметр - само значение, второй - его представление.
    Сз.ДобавитьЗначение("ДокументПоступления123 от 01.01.2024", "Накладная №123 от 01.01.2024");
    Сз.ДобавитьЗначение("ДокументПоступления456 от 02.01.2024", "Накладная №456 от 02.01.2024");
    Сз.ДобавитьЗначение("ДокументПоступления789 от 03.01.2024", "Накладная №789 от 03.01.2024");
    
    // ... здесь мы можем заполнить Сз данными из нашей ТаблицыЗначений или другого источника
    // Например, если у нас есть ТаблицаЗначений с накладными:
    // Для Каждого СтрокаТЗ Из ТаблицаНакладных Цикл
    //     Сз.ДобавитьЗначение(СтрокаТЗ.Документ, СтрокаТЗ.ПредставлениеДокумента);
    // КонецЦикла;
КонецПроцедуры

Как мы видим, метод ДобавитьЗначение() принимает два параметра: само значение (которое мы будем использовать в логике) и его строковое представление (которое увидит пользователь).

Шаг 2: Открытие диалога выбора и обработка результата

После заполнения СписокЗначений, мы вызываем метод ОтметитьЗначения(), который открывает стандартное диалоговое окно со списком, где напротив каждого элемента есть флажок.


Процедура ВыбратьНакладные()
    Перем ВыбЗнач; // Используем для хранения выбранных значений, если это необходимо
    ВыбЗнач = ""; // Инициализируем пустой строкой, либо ранее выбранными значениями
    
    Сз = СоздатьОбъект("СписокЗначений");
    Сз.ДобавитьЗначение("ХерпоймиЧто","ХерПоймиЧто"); // Пример из форума
    Сз.ДобавитьЗначение("ТОЧтоНадо","ТОЧтоНадо");
    
    // Открываем диалоговое окно для выбора значений
    // Параметры:
    // 1. ВыбЗнач - для предварительного выделения значений или сохранения результата (не обязательно)
    // 2. "Выберите необходимые накладные" - Заголовок окна
    // 3. 0 - Режим выбора (0 - множественный выбор, 1 - одиночный)
    // 4. "ОК;Отмена" - Кнопки диалога
    Если Сз.ОтметитьЗначения(ВыбЗнач,"Выберите необходимые накладные",0,"ОК;Отмена") = 1 Тогда
        // Если пользователь нажал "ОК", обрабатываем выбранные значения
        Для а = 1 По Сз.РазмерСписка() Цикл
            Если Сз.Пометка(А) = 1 Тогда // Проверяем, отмечено ли значение
                Сообщить("Выбрано: " + Сз.ПолучитьЗначение(А));
                // Здесь мы можем добавить выбранное значение в другую таблицу,
                // выполнить дополнительные действия и т.д.
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;
КонецПроцедуры

Метод ОтметитьЗначения() возвращает 1, если пользователь нажал кнопку "ОК", и 0, если "Отмена". После успешного выбора мы можем перебрать все элементы СписокЗначений с помощью цикла и для каждого элемента проверить его свойство Пометка(А), которое вернет 1, если значение было отмечено флажком, и 0 в противном случае.

Таким образом, мы рассмотрели два эффективных способа организации множественного выбора в 1С 7.7. Выбор конкретного подхода зависит от требований к интерфейсу и сложности задачи. Если нам нужна полная интеграция флажков непосредственно в динамическую таблицу на форме, используем метод с пиктограммами. Если же достаточно отдельного диалога для выбора, СписокЗначений будет более простым и быстрым решением.

← На главную