Как реализовать систему иерархических меток и управление контекстом в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Реализация логики обработки меток

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

  1. Разделение строки меток: Используем метод СтрРазделить для разбиения введенной строки на массив подстрок по разделителю (запятой).
  2. Анализ существующих меток: Для каждого элемента массива проводим поиск в справочнике меток с помощью заранее подготовленной серверной функции НайтиПодходящиеМетки.
  3. Обработка коллизий: Если поиск возвращает несколько вариантов, необходимо запустить диалог выбора для пользователя. Если вариант один — привязываем его к заметке. Если ни одного — создаем новую запись.

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

Пример программного кода обработки меток

Рассмотрим реализацию функции, которая подготавливает данные и запускает цепочку обработки:


Функция ПриИзмененииСтрокиМеток(Заметка, МеткиСтрокой, ОбработчикОповещенияОЗавершении) Экспорт
    // Формируем структуру контекста для передачи между вызовами
    Контекст = Новый Структура(\"ОбработчикОповещенияОЗавершении\", ОбработчикОповещенияОЗавершении);
    Контекст.Вставить(\"Заметка\", Заметка);
    Контекст.Вставить(\"Метки\", Новый Массив());
    Контекст.Вставить(\"Вопросы\", Новый Массив());

    СтрокиМеток = СтрРазделить(МеткиСтрокой, \",\", ложь);
    Для Каждого МеткаСтрокой Из СтрокиМеток Цикл
        МеткаСтрокой = СокрЛП(МеткаСтрокой);
        Если МеткаСтрокой = \"\" Тогда
            Продолжить;
        КонецЕсли;

        ПодходящиеМетки = ЗаметкиСервер.НайтиПодходящиеМетки(МеткаСтрокой);
        Если ПодходящиеМетки.Количество() = 0 Тогда
            МеткаСсылка = ЗаметкиСервер.СоздатьМетку(МеткаСтрокой);
            Контекст.Метки.Добавить(МеткаСсылка);
        ИначеЕсли ПодходящиеМетки.Количество() = 1 Тогда
            МеткаСсылка = ПодходящиеМетки[0];
            Контекст.Метки.Добавить(МеткаСсылка);
        Иначе
            СтруктураВопроса = Новый Структура();
            СтруктураВопроса.Вставить(\"Тип\", \"ВыборМеткиИзСписка\");
            С = Новый СписокЗначений();
            С.ЗагрузитьЗначения(ПодходящиеМетки);
            СтруктураВопроса.Вставить(\"СписокМеток\", С);
            Контекст.Вопросы.Добавить(СтруктураВопроса);
        КонецЕсли;
    КонецЦикла;

    ОО = Новый ОписаниеОповещения(\"ОбработкаВопросовПользователюПоВыборуМеткиИзСписка\", ЭтотОбъект);
    ВыполнитьОбработкуОповещения(ОО, Контекст);
КонецФункции

Управление асинхронными вызовами

При необходимости взаимодействия с пользователем в процессе обработки данных мы используем ОписаниеОповещения. Это обеспечивает правильную последовательность действий в управляемом интерфейсе:


Процедура ОбработкаВопросовПользователюПоВыборуМеткиИзСписка(Контекст, НеИспользуемыеПараметры) Экспорт
    Если Контекст.Вопросы.Количество() = 0 Тогда
        ВыполнитьОбработкуОповещения(Контекст.ОбработчикОповещенияОЗавершении, Контекст);
    Иначе
        Вопрос = Контекст.Вопросы[0];
        Контекст.Вопросы.Удалить(0);
        Если Вопрос.Тип = \"ВыборМеткиИзСписка\" Тогда
            ОО = Новый ОписаниеОповещения(\"ВопросПользователюПоВыборуМеткиИзСписка\", ЭтотОбъект, Контекст);
            Вопрос.СписокМеток.ПоказатьВыборЭлемента(ОО, \"Выберите метку из списка\");
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Советы по оптимизации и архитектуре

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

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

← На главную